/* 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