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