blob: 40a04321839b8f08b98d5fe2fc5acbc42504c7cd [file] [log] [blame]
/******************************************************************************
*
* Copyright 2013 Altera 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:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO
* EVENT SHALL THE AUTHOR 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.
*
******************************************************************************/
/*! \file Altera - ALT_SOCAL */
#ifndef __ALTERA_SOCAL_H__
#define __ALTERA_SOCAL_H__
#ifndef __ASSEMBLY__
#ifdef __cplusplus
#include <cstddef>
#include <cstdbool>
#include <cstdint>
#else /* __cplusplus */
#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>
#endif /* __cplusplus */
#endif /* __ASSEMBLY__ */
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/*!
* \addtogroup ALT_SOCAL_UTIL SoCAL Utilities
*
* This file contains utility and support functions for the Altera SoCAL.
* @{
*/
#ifdef __ASSEMBLY__
#define ALT_CAST(type, ptr) ptr
#else /* __ASSEMBLY__ */
/*! Cast the pointer to specified pointer type.
*
* Note: This macro expands to \e ptr value only for assembler language
* targets.
*
* \param type The pointer type to cast to
* \param ptr The pointer to apply the type cast to
*/
#define ALT_CAST(type, ptr) ((type) (ptr))
#endif /* __ASSEMBLY__ */
/*!
* \addtogroup ALT_SOCAL_UTIL_RW_FUNC SoCAL Memory Read/Write Utilities
*
* This section implements read and write functionality for various
* memory untis. The memory unit terms used for these functions are
* consistent with those used in the ARM Architecture Reference Manual
* ARMv7-A and ARMv7-R edition manual. The terms used for units of memory are:
*
* Unit of Memory | Abbreviation | Size in Bits
* :---------------|:-------------|:------------:
* Byte | byte | 8
* Half Word | hword | 16
* Word | word | 32
* Double Word | dword | 64
*
* @{
*/
/*! Write the 8 bit byte to the destination address in device memory.
* \param dest - Write destination pointer address
* \param src - 8 bit data byte to write to memory
*/
#define alt_write_byte(dest, src) (*ALT_CAST(volatile uint8_t *, (dest)) = (src))
/*! Read and return the 8 bit byte from the source address in device memory.
* \param src Read source pointer address
* \returns 8 bit data byte value
*/
#define alt_read_byte(src) (*ALT_CAST(volatile uint8_t *, (src)))
/*! Write the 16 bit half word to the destination address in device memory.
* \param dest - Write destination pointer address
* \param src - 16 bit data half word to write to memory
*/
#define alt_write_hword(dest, src) (*ALT_CAST(volatile uint16_t *, (dest)) = (src))
/*! Read and return the 16 bit half word from the source address in device memory.
* \param src Read source pointer address
* \returns 16 bit data half word value
*/
#define alt_read_hword(src) (*ALT_CAST(volatile uint16_t *, (src)))
/*! Write the 32 bit word to the destination address in device memory.
* \param dest - Write destination pointer address
* \param src - 32 bit data word to write to memory
*/
#define alt_write_word(dest, src) (*ALT_CAST(volatile uint32_t *, (dest)) = (src))
/*! Read and return the 32 bit word from the source address in device memory.
* \param src Read source pointer address
* \returns 32 bit data word value
*/
#define alt_read_word(src) (*ALT_CAST(volatile uint32_t *, (src)))
/*! Write the 64 bit double word to the destination address in device memory.
* \param dest - Write destination pointer address
* \param src - 64 bit data double word to write to memory
*/
#define alt_write_dword(dest, src) (*ALT_CAST(volatile uint64_t *, (dest)) = (src))
/*! Read and return the 64 bit double word from the source address in device memory.
* \param src Read source pointer address
* \returns 64 bit data double word value
*/
#define alt_read_dword(src) (*ALT_CAST(volatile uint64_t *, (src)))
/*! @} */
/*!
* \addtogroup ALT_SOCAL_UTIL_SC_FUNC SoCAL Memory Bit Set/Clr/XOR/Replace Utilities
*
* This section implements useful macros to set, clear, change, and replace
* selected bits within a word in memory or a memory-mapped register.
* @{
*
*/
/*! Set selected bits in the 8 bit byte at the destination address in device memory.
* \param dest - Destination pointer address
* \param bits - Bits to set in destination byte
*/
#define alt_setbits_byte(dest, bits) (alt_write_byte(dest, alt_read_byte(dest) | (bits)))
/*! Clear selected bits in the 8 bit byte at the destination address in device memory.
* \param dest - Destination pointer address
* \param bits - Bits to clear in destination byte
*/
#define alt_clrbits_byte(dest, bits) (alt_write_byte(dest, alt_read_byte(dest) & ~(bits)))
/*! Change or toggle selected bits in the 8 bit byte at the destination address in device memory.
* \param dest - Destination pointer address
* \param bits - Bits to change in destination byte
*/
#define alt_xorbits_byte(dest, bits) (alt_write_byte(dest, alt_read_byte(dest) ^ (bits)))
/*! Replace selected bits in the 8 bit byte at the destination address in device memory.
* \param dest - Destination pointer address
* \param msk - Bits to replace in destination byte
* \param src - Source bits to write to cleared bits in destination byte
*/
#define alt_replbits_byte(dest, msk, src) (alt_write_byte(dest,(alt_read_byte(dest) & ~(msk)) | ((src) & (msk))))
/*! Set selected bits in the 16 bit halfword at the destination address in device memory.
* \param dest - Destination pointer address
* \param bits - Bits to set in destination halfword
*/
#define alt_setbits_hword(dest, bits) (alt_write_hword(dest, alt_read_hword(dest) | (bits)))
/*! Clear selected bits in the 16 bit halfword at the destination address in device memory.
* \param dest - Destination pointer address
* \param bits - Bits to clear in destination halfword
*/
#define alt_clrbits_hword(dest, bits) (alt_write_hword(dest, alt_read_hword(dest) & ~(bits)))
/*! Change or toggle selected bits in the 16 bit halfword at the destination address in device memory.
* \param dest - Destination pointer address
* \param bits - Bits to change in destination halfword
*/
#define alt_xorbits_hword(dest, bits) (alt_write_hword(dest, alt_read_hword(dest) ^ (bits)))
/*! Replace selected bits in the 16 bit halfword at the destination address in device memory.
* \param dest - Destination pointer address
* \param msk - Bits to replace in destination halfword
* \param src - Source bits to write to cleared bits in destination halfword
*/
#define alt_replbits_hword(dest, msk, src) (alt_write_hword(dest,(alt_read_hword(dest) & ~(msk)) | ((src) & (msk))))
/*! Set selected bits in the 32 bit word at the destination address in device memory.
* \param dest - Destination pointer address
* \param bits - Bits to set in destination word
*/
#define alt_setbits_word(dest, bits) (alt_write_word(dest, alt_read_word(dest) | (bits)))
/*! Clear selected bits in the 32 bit word at the destination address in device memory.
* \param dest - Destination pointer address
* \param bits - Bits to clear in destination word
*/
#define alt_clrbits_word(dest, bits) (alt_write_word(dest, alt_read_word(dest) & ~(bits)))
/*! Change or toggle selected bits in the 32 bit word at the destination address in device memory.
* \param dest - Destination pointer address
* \param bits - Bits to change in destination word
*/
#define alt_xorbits_word(dest, bits) (alt_write_word(dest, alt_read_word(dest) ^ (bits)))
/*! Replace selected bits in the 32 bit word at the destination address in device memory.
* \param dest - Destination pointer address
* \param msk - Bits to replace in destination word
* \param src - Source bits to write to cleared bits in destination word
*/
#define alt_replbits_word(dest, msk, src) (alt_write_word(dest,(alt_read_word(dest) & ~(msk)) | ((src) & (msk))))
/*! Set selected bits in the 64 bit doubleword at the destination address in device memory.
* \param dest - Destination pointer address
* \param bits - Bits to set in destination doubleword
*/
#define alt_setbits_dword(dest, bits) (alt_write_dword(dest, alt_read_dword(dest) | (bits)))
/*! Clear selected bits in the 64 bit doubleword at the destination address in device memory.
* \param dest - Destination pointer address
* \param bits - Bits to clear in destination doubleword
*/
#define alt_clrbits_dword(dest, bits) (alt_write_dword(dest, alt_read_dword(dest) & ~(bits)))
/*! Change or toggle selected bits in the 64 bit doubleword at the destination address in device memory.
* \param dest - Destination pointer address
* \param bits - Bits to change in destination doubleword
*/
#define alt_xorbits_dword(dest, bits) (alt_write_dword(dest, alt_read_dword(dest) ^ (bits)))
/*! Replace selected bits in the 64 bit doubleword at the destination address in device memory.
* \param dest - Destination pointer address
* \param msk - Bits to replace in destination doubleword
* \param src - Source bits to write to cleared bits in destination word
*/
#define alt_replbits_dword(dest, msk, src) (alt_write_dword(dest,(alt_read_dword(dest) & ~(msk)) | ((src) & (msk))))
/*! @} */
/*! @} */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __ALTERA_SOCAL_H__ */