blob: 2e515c63f8f307a6b8f57c75098ae36752cddb7e [file] [log] [blame]
/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
/*This file is prepared for Doxygen automatic documentation generation.*/
/*! \file *********************************************************************
*
* \brief NEWLIB_ADDONS miscellaneous macros include file for AVR32.
*
* - Compiler: GNU GCC for AVR32
* - Supported devices: All AVR32 devices can be used.
* - AppNote:
*
* \author Atmel Corporation: http://www.atmel.com \n
* Support and FAQ: http://support.atmel.no/
*
******************************************************************************/
/* Copyright (c) 2009 Atmel Corporation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The name of Atmel may not be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* 4. This software may only be redistributed and used in connection with an Atmel
* AVR product.
*
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*
*/
#ifndef __AVR32_NEWLIB_ADDONS_IO_H__
#define __AVR32_NEWLIB_ADDONS_IO_H__
#include <_ansi.h>
_BEGIN_STD_C
typedef char u8;
typedef unsigned int u32;
#define __raw_writeb(v,a) (*(volatile unsigned char *)(a) = (v))
#define __raw_writew(v,a) (*(volatile unsigned short *)(a) = (v))
#define __raw_writel(v,a) (*(volatile unsigned int *)(a) = (v))
#define __raw_readb(a) (*(volatile unsigned char *)(a))
#define __raw_readw(a) (*(volatile unsigned short *)(a))
#define __raw_readl(a) (*(volatile unsigned int *)(a))
/* As long as I/O is only performed in P4 (or possibly P3), we're safe */
#define writeb(v,a) __raw_writeb(v,a)
#define writew(v,a) __raw_writew(v,a)
#define writel(v,a) __raw_writel(v,a)
#define readb(a) __raw_readb(a)
#define readw(a) __raw_readw(a)
#define readl(a) __raw_readl(a)
/* Memory segments when segmentation is enabled */
#define P0SEG 0x00000000
#define P1SEG 0x80000000
#define P2SEG 0xa0000000
#define P3SEG 0xc0000000
#define P4SEG 0xe0000000
/* Returns the privileged segment base of a given address */
#define PXSEG(a) (((unsigned long)(a)) & 0xe0000000)
/* Returns the physical address of a PnSEG (n=1,2) address */
#define PHYSADDR(a) (((unsigned long)(a)) & 0x1fffffff)
/*
* Map an address to a certain privileged segment
*/
#define P1SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P1SEG))
#define P2SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P2SEG))
#define P3SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P3SEG))
#define P4SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P4SEG))
#define cached(addr) P1SEGADDR(addr)
#define uncached(addr) P2SEGADDR(addr)
#define physaddr(addr) PHYSADDR(addr)
#define BF(field, value) \
({ union { \
struct { \
unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \
unsigned long __val: field ## _SIZE ; \
}; \
unsigned long __ul; \
} __tmp; \
__tmp.__ul = 0; \
__tmp.__val = value; \
__tmp.__ul;})
#define BF_D(field, value) \
({ union { \
struct { \
unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \
unsigned long long __val: field ## _SIZE ; \
}; \
unsigned long long __ul; \
} __tmp; \
__tmp.__ul = 0; \
__tmp.__val = value; \
__tmp.__ul;})
#define BFINS(var, field, value) \
{ union {\
struct { \
unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \
unsigned long __val: field ## _SIZE ; \
}; \
unsigned long __ul; \
} __tmp; \
__tmp.__ul = var; \
__tmp.__val = value; \
var = __tmp.__ul;}
#define BFEXT(var, field) \
({ union {\
struct { \
unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \
unsigned long __val: field ## _SIZE ; \
}; \
unsigned long __ul; \
} __tmp; \
__tmp.__ul = var; \
__tmp.__val; })
#define BFINS_D(var, field, value) \
{ union {\
struct { \
unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \
unsigned long long __val: field ## _SIZE ; \
}; \
unsigned long long __ul; \
} __tmp; \
__tmp.__ul = var; \
__tmp.__val = value; \
var = __tmp.__ul;}
#define BFEXT_D(var, field) \
({ union {\
struct { \
unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \
unsigned long long __val: field ## _SIZE ; \
}; \
unsigned long long __ul; \
} __tmp; \
__tmp.__ul = var; \
__tmp.__val; })
_END_STD_C
#endif