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