/utility/bitbanding.h
http://github.com/Tinkerforge/bricklib · C Header · 108 lines · 23 code · 11 blank · 74 comment · 5 complexity · 55e894e1dccdedbc4eabcee362d85149 MD5 · raw file
- /* ----------------------------------------------------------------------------
- * 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_ */