/* ---------------------------------------------------------------------------- | |
* ATMEL Microcontroller Software Support | |
* ---------------------------------------------------------------------------- | |
* 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: | |
* | |
* - Redistributions of source code must retain the above copyright notice, | |
* this list of conditions and the disclaimer below. | |
* | |
* Atmel's name may not be used to endorse or promote products derived from | |
* this software without specific prior written permission. | |
* | |
* DISCLAIMER: 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 | |
* 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 _BITBANDING_ | |
#define _BITBANDING_ | |
/** | |
* \file bitbanding.h | |
* | |
* Include Defines & macros for bit-banding. | |
*/ | |
/*---------------------------------------------------------------------------- | |
* Header files | |
*----------------------------------------------------------------------------*/ | |
#include <stdint.h> | |
/*---------------------------------------------------------------------------- | |
* Global Macros | |
*----------------------------------------------------------------------------*/ | |
/** | |
* \brief Check if the address is in bit banding sram region. | |
* | |
* \note The address should be in area of 0x2000000 ~ 0x200FFFFF | |
* | |
* \param x The address to check. | |
*/ | |
#define IS_BITBAND_SRAM_ADDR(x) \ | |
( ((uint32_t)(x)) >= 0x20000000 && \ | |
((uint32_t)(x)) < (0x20000000+0x100000) ) | |
/** | |
* \brief Check if the address is in bit banding peripheral region | |
* | |
* \note The address should be in area of 0x4000000 ~ 0x400FFFFF | |
* \param x The address to check | |
*/ | |
#define IS_BITBAND_PERIPH_ADDR(x) \ | |
( ((uint32_t)(x)) >= 0x40000000 && \ | |
((uint32_t)(x)) < (0x40000000+0x100000) ) | |
/** | |
* \brief Calculate bit band alias address. | |
* | |
* Calculate the bit band alias address and return a pointer address to word. | |
* | |
* \param addr The byte address of bitbanding bit. | |
* \param bit The bit position of bitbanding bit. | |
* \callergraph | |
*/ | |
#define BITBAND_ALIAS_ADDRESS(addr, bit) \ | |
((volatile uint32_t*)((((uint32_t)(addr) & 0xF0000000) + 0x02000000) \ | |
+((((uint32_t)(addr)&0xFFFFF)*32)\ | |
+( (uint32_t)(bit)*4)))) | |
/** | |
* \brief Bit write through bit banding. | |
* | |
* \param addr32 32-bit aligned byte address where the bit exists. | |
* \param bit Bit position. | |
* \param val The value that the bit is set to. | |
* \callergraph | |
*/ | |
#define WRITE_BITBANDING(addr32, bit, val) do {\ | |
*BITBAND_ALIAS_ADDRESS(addr32,bit) = (val); \ | |
} while (0); | |
/** | |
* \brief Toggle bit through bit banding | |
* | |
* \param addr32 32-bit aligned byte address where the bit exists. | |
* \param bit Bit position. | |
*/ | |
#define TOGGLE_BITBANDING(addr32, bit) do {\ | |
volatile uint32_t * p = \ | |
BITBAND_ALIAS_ADDRESS(addr32,bit); \ | |
if (*p) *p = 0; \ | |
else *p = 1; \ | |
}while(0); | |
#endif /* #ifndef _BITBANDING_ */ |