mirror of
https://github.com/arduino/Arduino.git
synced 2024-12-03 14:24:15 +01:00
109 lines
3.9 KiB
C
109 lines
3.9 KiB
C
/* ----------------------------------------------------------------------------
|
|
* 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_ */
|