1546 lines
64 KiB
C
1546 lines
64 KiB
C
/**
|
|
* @file xmc_ebu.h
|
|
* @date 2017-06-24
|
|
*
|
|
* @cond
|
|
*********************************************************************************************************************
|
|
* XMClib v2.1.16 - XMC Peripheral Driver Library
|
|
*
|
|
* Copyright (c) 2015-2017, Infineon Technologies AG
|
|
* 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 following
|
|
* disclaimer.
|
|
*
|
|
* 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.
|
|
*
|
|
* Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote
|
|
* products derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDER OR CONTRIBUTORS 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.
|
|
*
|
|
* To improve the quality of the software, users are encouraged to share modifications, enhancements or bug fixes with
|
|
* Infineon Technologies AG dave@infineon.com).
|
|
*********************************************************************************************************************
|
|
*
|
|
* Change History
|
|
* --------------
|
|
*
|
|
* 2015-06-20:
|
|
* - Initial
|
|
*
|
|
* 2016-03-30:
|
|
* - Added ebu_data_hold_cycles_for_read_accesses to XMC_EBU_BUS_READ_CONFIG_t
|
|
* - Added ebu_device_addressing_mode and ebu_data_hold_cycles_for_write_accesses to XMC_EBU_BUS_WRITE_CONFIG_t
|
|
*
|
|
* 2017-06-24:
|
|
* - Changed XMC_EBU_AddressSelectEnable() to make sure arbitartion mode is active
|
|
*
|
|
* @endcond
|
|
*
|
|
*/
|
|
|
|
#ifndef XMC_EBU_H
|
|
#define XMC_EBU_H
|
|
|
|
/**********************************************************************************************************************
|
|
* HEADER FILES
|
|
*********************************************************************************************************************/
|
|
|
|
#include <xmc_common.h>
|
|
#if defined (EBU)
|
|
#include <xmc_scu.h>
|
|
|
|
/**
|
|
* @addtogroup XMClib XMC Peripheral Library
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @addtogroup EBU
|
|
* @brief External Bus Unit (EBU) driver for the XMC45/XMC47/XMC48 microcontroller
|
|
*
|
|
* The External Bus Unit (EBU) controls the transactions between external memories or
|
|
* peripheral units, and the internal memories and peripheral units. Several external
|
|
* device configurations are supported; e.g. Asynchronous static memories, SDRAM
|
|
* and various flash memory types. It supports multiple programmable address regions.
|
|
*
|
|
* The EBU low level driver provides functions to configure and initialize the EBU
|
|
* hardware peripheral.
|
|
* @{
|
|
*/
|
|
|
|
/**********************************************************************************************************************
|
|
* MACROS
|
|
**********************************************************************************************************************/
|
|
|
|
/**
|
|
* A convenient symbol for the EBU peripheral base address
|
|
*/
|
|
#if defined (EBU)
|
|
# define XMC_EBU ((XMC_EBU_t *)EBU_BASE)
|
|
#else
|
|
# error 'EBU' base peripheral pointer not defined
|
|
#endif
|
|
|
|
|
|
/*
|
|
* This macro is used in the LLD for assertion checks (XMC_ASSERT).
|
|
*/
|
|
#define XMC_EBU_CHECK_MODULE_PTR(p) ((p) == XMC_EBU)
|
|
|
|
/**********************************************************************************************************************
|
|
* ENUMS
|
|
**********************************************************************************************************************/
|
|
|
|
/**
|
|
* Status return values for EBU low level driver
|
|
*/
|
|
typedef enum XMC_EBU_STATUS
|
|
{
|
|
XMC_EBU_STATUS_OK = 0U, /**< Operation successful */
|
|
XMC_EBU_STATUS_BUSY = 1U, /**< Busy with a previous request */
|
|
XMC_EBU_STATUS_ERROR = 3U /**< Operation unsuccessful */
|
|
} XMC_EBU_STATUS_t;
|
|
|
|
/**
|
|
* EBU clock divide ratio
|
|
*/
|
|
typedef enum XMC_EBU_CLOCK_DIVIDE_RATIO
|
|
{
|
|
XMC_EBU_CLOCK_DIVIDED_BY_1 = 0U, /**< Clock divided by 1 */
|
|
XMC_EBU_CLOCK_DIVIDED_BY_2 = 1U, /**< Clock divided by 2 */
|
|
XMC_EBU_CLOCK_DIVIDED_BY_3 = 2U, /**< Clock divided by 3 */
|
|
XMC_EBU_CLOCK_DIVIDED_BY_4 = 3U /**< Clock divided by 4 */
|
|
} XMC_EBU_CLOCK_DIVIDE_RATIO_t;
|
|
|
|
/**
|
|
* EBU DIV2 clocking mode
|
|
*/
|
|
typedef enum XMC_EBU_DIV2_CLK_MODE
|
|
{
|
|
XMC_EBU_DIV2_CLK_MODE_OFF = 0U, /**< Divider 2 clock mode OFF */
|
|
XMC_EBU_DIV2_CLK_MODE_ON = 1U /**< Divider 2 clock mode ON */
|
|
} XMC_EBU_DIV2_CLK_MODE_t;
|
|
|
|
/**
|
|
* EBU clocking mode
|
|
*/
|
|
typedef enum XMC_EBU_CLK_MODE
|
|
{
|
|
XMC_EBU_CLK_MODE_ASYNCHRONOUS_TO_AHB = 0U, /**< EBU is using standard clocking mode */
|
|
XMC_EBU_CLK_MODE_SYNCHRONOUS_TO_CPU = 1U /**< EBU is running at AHB bus clock divided by 2 */
|
|
} XMC_EBU_CLK_MODE_t;
|
|
|
|
/**
|
|
* EBU arbitration mode
|
|
*/
|
|
typedef enum XMC_EBU_ARB_MODE
|
|
{
|
|
XMC_EBU_ARB_MODE_NOT_SELECTED = 0U, /**< No Bus arbitration mode selected */
|
|
XMC_EBU_ARB_MODE_ARBITER_MODE = 1U, /**< Arbiter Mode arbitration mode selected */
|
|
XMC_EBU_ARB_MODE_PARTICIPANT_MODE = 2U, /**< Participant arbitration mode selected */
|
|
XMC_EBU_ARB_MODE_SOLE_MASTER_MODE = 3U /**< Sole Master arbitration mode selected */
|
|
} XMC_EBU_ARB_MODE_t;
|
|
|
|
/**
|
|
* EBU ALE mode
|
|
*/
|
|
typedef enum XMC_EBU_ALE_MODE
|
|
{
|
|
XMC_EBU_ALE_OUTPUT_IS_INV_ADV = 0U, /**< Output is ADV */
|
|
XMC_EBU_ALE_OUTPUT_IS_ALE = 1U /**< Output is ALE */
|
|
} XMC_EBU_ALE_MODE_t;
|
|
|
|
/**
|
|
* EBU clock status
|
|
*/
|
|
typedef enum XMC_EBU_CLK_STATUS
|
|
{
|
|
XMC_EBU_CLK_STATUS_DISABLE_BIT = EBU_CLC_DISS_Msk, /**< EBU Disable Status Bit */
|
|
XMC_EBU_CLK_STATUS_MODE = EBU_CLC_SYNCACK_Msk, /**< EBU Clocking Mode Status */
|
|
XMC_EBU_CLK_STATUS_DIV2_MODE = EBU_CLC_DIV2ACK_Msk, /**< DIV2 Clocking Mode Status */
|
|
XMC_EBU_CLK_STATUS_DIV_RATIO = EBU_CLC_EBUDIVACK_Msk /**< EBU Clock Divide Ratio Status */
|
|
} XMC_EBU_CLK_STATUS_t;
|
|
|
|
/**
|
|
* EBU address selection
|
|
*/
|
|
typedef enum XMC_EBU_ADDRESS_SELECT
|
|
{
|
|
XMC_EBU_ADDRESS_SELECT_MEMORY_REGION_ENABLE = EBU_ADDRSEL0_REGENAB_Msk, /**< Memory Region Enable */
|
|
XMC_EBU_ADDRESS_SELECT_ALTERNATE_REGION_ENABLE = EBU_ADDRSEL0_ALTENAB_Msk, /**< Alternate Region Enable */
|
|
XMC_EBU_ADDRESS_SELECT_MEMORY_REGION_WRITE_PROTECT = EBU_ADDRSEL0_WPROT_Msk /**< Memory Region Write Protect */
|
|
} XMC_EBU_ADDRESS_SELECT_t;
|
|
|
|
/**
|
|
* EBU bus write configuration status
|
|
*/
|
|
typedef enum XMC_EBU_BUSWCON_SELECT
|
|
{
|
|
XMC_EBU_BUSWCON_SELECT_NAN_WORKAROUND = EBU_BUSWCON0_NAA_Msk, /**< Enable flash non-array access workaround */
|
|
XMC_EBU_BUSWCON_SELECT_DEVICE_ADDRESSING_MODE = EBU_BUSWCON0_PORTW_Msk, /**< Device Addressing Mode */
|
|
} XMC_EBU_BUSWCON_SELECT_t;
|
|
|
|
/**
|
|
* EBU burst length for synchronous burst
|
|
*/
|
|
typedef enum XMC_EBU_BURST_LENGTH_SYNC
|
|
{
|
|
XMC_EBU_BURST_LENGTH_SYNC_1_DATA_ACCESS = 0U, /**< 1 data access (default after reset) */
|
|
XMC_EBU_BURST_LENGTH_SYNC_2_DATA_ACCESSES = 1U, /**< 2 data access */
|
|
XMC_EBU_BURST_LENGTH_SYNC_4_DATA_ACCESSES = 2U, /**< 3 data access */
|
|
XMC_EBU_BURST_LENGTH_SYNC_8_DATA_ACCESSES = 3U, /**< 4 data access */
|
|
} XMC_EBU_BURST_LENGTH_SYNC_t;
|
|
|
|
/**
|
|
* EBU burst buffer mode
|
|
*/
|
|
typedef enum XMC_EBU_BURST_BUFFER_SYNC_MODE
|
|
{
|
|
XMC_EBU_BURST_BUFFER_SYNC_LENGTH_SYNC_ENABLE = 0U, /**< Burst buffer length defined by value in FETBLEN */
|
|
XMC_EBU_BURST_BUFFER_SYNC_SINGLE_MODE = 1U /**< All data required for transaction (single burst transfer) */
|
|
} XMC_EBU_BURST_BUFFER_SYNC_MODE_t;
|
|
|
|
/**
|
|
* Read single stage synchronization
|
|
*/
|
|
typedef enum XMC_EBU_READ_STAGES_SYNC
|
|
{
|
|
XMC_EBU_READ_STAGES_SYNC_TWO = 0U, /**< Two stages of synchronization used (maximum margin) */
|
|
XMC_EBU_READ_STAGES_SYNC_ONE = 1U /**< One stage of synchronization used (minimum latency) */
|
|
} XMC_EBU_READ_STAGES_SYNC_t;
|
|
|
|
/**
|
|
* EBU burst flash clock feedback enable/disable
|
|
*/
|
|
typedef enum XMC_EBU_BURST_FLASH_CLOCK_FEEDBACK
|
|
{
|
|
XMC_EBU_BURST_FLASH_CLOCK_FEEDBACK_DISABLE = 0U, /**< BFCLK feedback not used */
|
|
XMC_EBU_BURST_FLASH_CLOCK_FEEDBACK_ENABLE = 1U /**< BFCLK feedback used */
|
|
} XMC_EBU_BURST_FLASH_CLOCK_FEEDBACK_t;
|
|
|
|
/**
|
|
* EBU burst flash clock mode select
|
|
*/
|
|
typedef enum XMC_EBU_BURST_FLASH_CLOCK_MODE
|
|
{
|
|
XMC_EBU_BURST_FLASH_CLOCK_MODE_RUN_CONTINUOSLY = 0U, /**< Burst flash clock runs continuously */
|
|
XMC_EBU_BURST_FLASH_CLOCK_MODE_DISABLED_BETWEEN_ACCESSES = 1U /**< Burst flash clock disabled */
|
|
} XMC_EBU_BURST_FLASH_CLOCK_MODE_t;
|
|
|
|
/**
|
|
* EBU flash non-array access
|
|
*/
|
|
typedef enum XMC_EBU_FLASH_NON_ARRAY_ACCESS
|
|
{
|
|
XMC_EBU_FLASH_NON_ARRAY_ACCESS_DISNABLE = 0U, /**< Disable non-array access */
|
|
XMC_EBU_FLASH_NON_ARRAY_ACCESS_ENABLE = 1U /**< Enable non-array access */
|
|
} XMC_EBU_FLASH_NON_ARRAY_ACCESS_t;
|
|
|
|
/**
|
|
* EBU early chip select for synchronous burst
|
|
*/
|
|
typedef enum XMC_EBU_EARLY_CHIP_SELECT_SYNC_BURST
|
|
{
|
|
XMC_EBU_EARLY_CHIP_SELECT_DELAYED = 0U, /**< Chip select delayed */
|
|
XMC_EBU_EARLY_CHIP_SELECT_NOT_DELAYED = 1U /**< Chip select not delayed */
|
|
} XMC_EBU_EARLY_CHIP_SELECT_SYNC_BURST_t;
|
|
|
|
/**
|
|
* EBU early burst signal enable for synchronous burst
|
|
*/
|
|
typedef enum XMC_EBU_BURST_SIGNAL_SYNC_BURST
|
|
{
|
|
XMC_EBU_BURST_SIGNAL_SYNC_BURST_ADV_DELAYED = 0U, /**< Chip select delayed */
|
|
XMC_EBU_BURST_SIGNAL_SYNC_BURST_ADV_NOT_DELAYED = 1U /**< Chip select not delayed */
|
|
} XMC_EBU_BURST_SIGNAL_SYNC_BURST_t;
|
|
|
|
/**
|
|
* EBU burst address wrapping
|
|
*/
|
|
typedef enum XMC_EBU_BURST_ADDRESS_WRAPPING
|
|
{
|
|
XMC_EBU_BURST_ADDRESS_WRAPPING_DISABLED = 0U, /**< Automatically re-aligns any non-aligned synchronous burst access */
|
|
XMC_EBU_BURST_ADDRESS_WRAPPING_ENABLED = 1U /**< Starts any burst access at address specified by the AHB request */
|
|
} XMC_EBU_BURST_ADDRESS_WRAPPING_t;
|
|
|
|
/**
|
|
* EBU reversed polarity at WAIT
|
|
*/
|
|
typedef enum XMC_EBU_WAIT_SIGNAL_POLARITY
|
|
{
|
|
XMC_EBU_WAIT_SIGNAL_POLARITY_PIN_ACTIVE_LOW = 0U, /**< OFF, input at WAIT pin is active low */
|
|
XMC_EBU_WAIT_SIGNAL_POLARITY_PIN_ACTIVE_HIGH = 1U /**< Polarity reversed, input at WAIT pin is active high */
|
|
} XMC_EBU_WAIT_SIGNAL_POLARITY_t;
|
|
|
|
/**
|
|
* EBU byte control signal control
|
|
*/
|
|
typedef enum XMC_EBU_BYTE_CONTROL
|
|
{
|
|
XMC_EBU_BYTE_CONTROL_FOLLOWS_CHIP_SELECT_TIMMING = 0U, /**< Control signals follow chip select timing */
|
|
XMC_EBU_BYTE_CONTROL_FOLLOWS_CONTROL_SIGNAL_TIMMING = 1U, /**< Control signals follow control signal timing */
|
|
XMC_EBU_BYTE_CONTROL_FOLLOWS_WRITE_ENABLE_SIGNAL_TIMMING = 2U /**< Control signals follow write enable timing */
|
|
} XMC_EBU_BYTE_CONTROL_t;
|
|
|
|
/**
|
|
* EBU device addressing mode
|
|
*/
|
|
typedef enum XMC_EBU_DEVICE_ADDRESSING_MODE
|
|
{
|
|
XMC_EBU_DEVICE_ADDRESSING_MODE_16_BITS = 1U, /**< Address will only be driven onto AD[15:0] */
|
|
XMC_EBU_DEVICE_ADDRESSING_MODE_TWIN_16_BITS_MULTIPLEXED = 2U, /**< Lower 16b will be driven onto A[15:0] & AD[15:0] */
|
|
XMC_EBU_DEVICE_ADDRESSING_MODE_32_BITS_MULTIPLEXED = 3U /**< Full address driven onto A[15:0] & AD[15:0] */
|
|
} XMC_EBU_DEVICE_ADDRESSING_MODE_t;
|
|
|
|
/**
|
|
* EBU external wait control
|
|
*/
|
|
typedef enum XMC_EBU_WAIT_CONTROL
|
|
{
|
|
XMC_EBU_WAIT_CONTROL_OFF = 0U, /**< Default after reset; Wait control off */
|
|
XMC_EBU_WAIT_CONTROL_SYNC_EARLY_WAIT_ASYNC_ASYNC_INPUT_AT_WAIT = 1U, /**< SYNC: Wait for page load (Early WAIT);
|
|
ASYNC: Asynchronous input at WAIT */
|
|
XMC_EBU_WAIT_CONTROL_SYNC_WAIT_WITH_DATA_ASYNC_SYNC_INPUT_AT_WAIT = 2U, /**< SYNC: Wait for page load (WAIT with data);
|
|
ASYNC: Synchronous input at WAIT; */
|
|
XMC_EBU_WAIT_CONTROL_SYNC_ABORT_AND_RETRY_ACCESS = 3U /**< SYNC: Abort and retry access; */
|
|
} XMC_EBU_WAIT_CONTROL_t;
|
|
|
|
/**
|
|
* EBU asynchronous address phase
|
|
*/
|
|
typedef enum XMC_EBU_ASYNCHRONOUS_ADDRESS_PHASE
|
|
{
|
|
XMC_EBU_ASYNCHRONOUS_ADDRESS_PHASE_CLOCK_ENABLED_AT_BEGINNING_OF_ACCESS = 0U, /**< Enabled at beginning of access */
|
|
XMC_EBU_ASYNCHRONOUS_ADDRESS_PHASE_CLOCK_ENABLED_AFTER_ADDRESS_PHASE = 1U /**< Enabled after address phase */
|
|
} XMC_EBU_ASYNCHRONOUS_ADDRESS_PHASE_t;
|
|
|
|
/**
|
|
* EBU device type for region
|
|
*/
|
|
typedef enum XMC_EBU_DEVICE_TYPE
|
|
{
|
|
XMC_EBU_DEVICE_TYPE_MUXED_ASYNCHRONOUS_TYPE = 0U, /**< Device type muxed asynchronous */
|
|
XMC_EBU_DEVICE_TYPE_MUXED_BURST_TYPE = 1U, /**< Device type muxed burst */
|
|
XMC_EBU_DEVICE_TYPE_NAND_FLASH = 2U, /**< Device type NAND flash */
|
|
XMC_EBU_DEVICE_TYPE_MUXED_CELLULAR_RAM = 3U, /**< Device type muxed cellular RAM */
|
|
XMC_EBU_DEVICE_TYPE_DEMUXED_ASYNCHRONOUS_TYPE = 4U, /**< Device type de-muxed asynchronous */
|
|
XMC_EBU_DEVICE_TYPE_DEMUXED_BURST_TYPE = 5U, /**< Device type de-muxed burst */
|
|
XMC_EBU_DEVICE_TYPE_DEMUXED_PAGE_MODE = 6U, /**< Device type de-muxed page mode */
|
|
XMC_EBU_DEVICE_TYPE_DEMUXED_CELLULAR_RAM = 7U, /**< Device type de-muxed cellular RAM */
|
|
XMC_EBU_DEVICE_TYPE_SDRAM = 8U /**< Device type SDRAM */
|
|
} XMC_EBU_DEVICE_TYPE_t;
|
|
|
|
/**
|
|
* EBU lock chip select
|
|
*/
|
|
typedef enum XMC_EBU_LOCK_CHIP_SELECT
|
|
{
|
|
XMC_EBU_LOCK_CHIP_SELECT_DISABLED = 0U, /**< Chip select cannot be locked */
|
|
XMC_EBU_LOCK_CHIP_SELECT_ENABLED = 1U /**< Chip select automatically locked after a write operation */
|
|
} XMC_EBU_LOCK_CHIP_SELECT_t;
|
|
|
|
/**
|
|
* EBU Frequency of external clock at pin BFCLKO
|
|
*/
|
|
typedef enum XMC_EBU_FREQUENCY_EXT_CLK_PIN
|
|
{
|
|
XMC_EBU_FREQ_EXT_CLK_PIN_EQUAL_TO_INT_CLK = 0U, /**< Equal to INT_CLK frequency */
|
|
XMC_EBU_FREQ_EXT_CLK_PIN_HALF_OF_INT_CLK = 1U, /**< 1/2 of INT_CLK frequency */
|
|
XMC_EBU_FREQ_EXT_CLK_PIN_THIRD_OF_INT_CLK = 2U, /**< 1/3 of INT_CLK frequency */
|
|
XMC_EBU_FREQ_EXT_CLK_PIN_QUARTER_OF_INT_CLK = 3U /**< 1/4 of INT_CLK frequency */
|
|
} XMC_EBU_FREQ_EXT_CLK_PIN_t;
|
|
|
|
/**
|
|
* EBU extended data
|
|
*/
|
|
typedef enum XMC_EBU_EXT_DATA
|
|
{
|
|
XMC_EBU_EXT_DATA_OUTPUT_EVERY_1_BFCLK_CYCLES = 0U, /**< External memory outputs data every BFCLK cycle */
|
|
XMC_EBU_EXT_DATA_OUTPUT_EVERY_2_BFCLK_CYCLES = 1U, /**< External memory outputs data every two BFCLK cycles */
|
|
XMC_EBU_EXT_DATA_OUTPUT_EVERY_4_BFCLK_CYCLES = 2U, /**< External memory outputs data every four BFCLK cycles */
|
|
XMC_EBU_EXT_DATA_OUTPUT_EVERY_8_BFCLK_CYCLES = 3U /**< External memory outputs data every eight BFCLK cycles */
|
|
} XMC_EBU_EXT_DATA_t;
|
|
|
|
/**
|
|
* EBU SDRAM clock mode select
|
|
*/
|
|
typedef enum XMC_EBU_SDRAM_CLK_MODE
|
|
{
|
|
XMC_EBU_SDRAM_CLK_MODE_CONTINUOUSLY_RUNS = 0U, /**< Clock continuously running */
|
|
XMC_EBU_SDRAM_CLK_MODE_DISABLED_BETWEEN_ACCESSES = 1U /**< Clock disabled between accesses */
|
|
} XMC_EBU_SDRAM_CLK_MODE_t;
|
|
|
|
/**
|
|
* EBU power save mode used for gated clock mode
|
|
*/
|
|
typedef enum XMC_EBU_SDRAM_PWR_MODE
|
|
{
|
|
XMC_EBU_SDRAM_PWR_MODE_PRECHARGE_BEFORE_CLK_STOP = 0U, /**< Precharge before clock stop */
|
|
XMC_EBU_SDRAM_PWR_MODE_AUTO_PRECHARGE_BEFORE_CLK_STOP = 1U, /**< Auto-precharge before clock stop */
|
|
XMC_EBU_SDRAM_PWR_MODE_ACTIVE_PWR_DOWN = 2U, /**< Active power down (stop clock without precharge) */
|
|
XMC_EBU_SDRAM_PWR_MODE_CLK_STOP_PWR_DOWN = 3U /**< Clock stop power down */
|
|
} XMC_EBU_SDRAM_PWR_MODE_t;
|
|
|
|
/**
|
|
* EBU disable SDRAM clock output
|
|
*/
|
|
typedef enum XMC_EBU_SDRAM_CLK_OUTPUT
|
|
{
|
|
XMC_EBU_SDRAM_CLK_OUTPUT_ENABLED = 0U, /**< Clock output enabled */
|
|
XMC_EBU_SDRAM_CLK_OUTPUT_DISABLED = 1U /**< Clock output disabled */
|
|
} XMC_EBU_SDRAM_CLK_OUTPUT_t;
|
|
|
|
/**
|
|
* EBU mask for bank tag
|
|
*/
|
|
typedef enum XMC_EBU_SDRAM_MASK_FOR_BANKM_TAG
|
|
{
|
|
XMC_EBU_SDRAM_MASK_FOR_BANK_TAG_ADDRESS_21_to_20 = 1U, /**< Mask for bank tag addresses 21 to 20 */
|
|
XMC_EBU_SDRAM_MASK_FOR_BANK_TAG_ADDRESS_22_to_21 = 2U, /**< Mask for bank tag addresses 22 to 21 */
|
|
XMC_EBU_SDRAM_MASK_FOR_BANK_TAG_ADDRESS_23_to_22 = 3U, /**< Mask for bank tag addresses 23 to 22 */
|
|
XMC_EBU_SDRAM_MASK_FOR_BANK_TAG_ADDRESS_24_to_23 = 4U, /**< Mask for bank tag addresses 24 to 23 */
|
|
XMC_EBU_SDRAM_MASK_FOR_BANK_TAG_ADDRESS_25_to_24 = 5U, /**< Mask for bank tag addresses 25 to 24 */
|
|
XMC_EBU_SDRAM_MASK_FOR_BANK_TAG_ADDRESS_26_to_25 = 6U, /**< Mask for bank tag addresses 26 to 25 */
|
|
XMC_EBU_SDRAM_MASK_FOR_BANK_TAG_ADDRESS_26 = 7U /**< Mask for bank tag addresses 26 */
|
|
} XMC_EBU_SDRAM_MASK_FOR_BANK_TAG_t;
|
|
|
|
/**
|
|
* EBU Mask for row tag
|
|
*/
|
|
typedef enum XMC_EBU_SDRAM_MASK_FOR_ROW_TAG
|
|
{
|
|
XMC_EBU_SDRAM_MASK_FOR_ROW_TAG_ADDRESS_26_to_9 = 1U, /**< Mask for row tag addresses 26 to 9 */
|
|
XMC_EBU_SDRAM_MASK_FOR_ROW_TAG_ADDRESS_26_to_10 = 2U, /**< Mask for row tag addresses 26 to 10 */
|
|
XMC_EBU_SDRAM_MASK_FOR_ROW_TAG_ADDRESS_26_to_11 = 3U, /**< Mask for row tag addresses 26 to 11 */
|
|
XMC_EBU_SDRAM_MASK_FOR_ROW_TAG_ADDRESS_26_to_12 = 4U, /**< Mask for row tag addresses 26 to 12 */
|
|
XMC_EBU_SDRAM_MASK_FOR_ROW_TAG_ADDRESS_26_to_13 = 5U /**< Mask for row tag addresses 26 to 13 */
|
|
} XMC_EBU_SDRAM_MASK_FOR_ROW_TAG_t;
|
|
|
|
/**
|
|
* Number of address bits from bit 0 to be used for column address
|
|
*/
|
|
typedef enum XMC_EBU_SDRAM_WIDTH_OF_COLUMN_ADDRESS
|
|
{
|
|
XMC_EBU_SDRAM_WIDTH_OF_COLUMN_ADDRESS_8_to_0 = 1U, /**< Address [8:0] */
|
|
XMC_EBU_SDRAM_WIDTH_OF_COLUMN_ADDRESS_9_to_0 = 2U, /**< Address [9:0] */
|
|
XMC_EBU_SDRAM_WIDTH_OF_COLUMN_ADDRESS_10_to_0 = 3U /**< Address [10:0] */
|
|
} XMC_EBU_SDRAM_WIDTH_OF_COLUMN_ADDRESS_t;
|
|
|
|
/**
|
|
* Number of clocks between a READ command and the availability of data
|
|
*/
|
|
typedef enum XMC_EBU_SDRAM_CAS_LATENCY
|
|
{
|
|
XMC_EBU_SDRAM_CAS_LATENCY_2_CLKS = 2U, /**< 2 clocks between a READ command and the availability of data */
|
|
XMC_EBU_SDRAM_CAS_LATENCY_3_CLKS = 3U /**< 3 clocks between a READ command and the availability of data */
|
|
} XMC_EBU_SDRAM_CAS_LATENCY_t;
|
|
|
|
/**
|
|
* Number of locations can be accessed with a single command
|
|
*/
|
|
typedef enum XMC_EBU_SDRAM_BURST_LENGTH
|
|
{
|
|
XMC_EBU_SDRAM_BURST_LENGTH_1_LOCATION = 0U, /**< One location accessed with a single command */
|
|
XMC_EBU_SDRAM_BURST_LENGTH_2_LOCATION = 1U, /**< Two location accessed with a single command */
|
|
XMC_EBU_SDRAM_BURST_LENGTH_4_LOCATION = 2U, /**< Four location accessed with a single command */
|
|
XMC_EBU_SDRAM_BURST_LENGTH_8_LOCATION = 3U, /**< Eight location accessed with a single command */
|
|
XMC_EBU_SDRAM_BURST_LENGTH_16_LOCATION = 4U /**< Sixteen location accessed with a single command */
|
|
} XMC_EBU_SDRAM_BURST_LENGTH_t;
|
|
|
|
/**
|
|
* EBU SDRAM status
|
|
*/
|
|
typedef enum XMC_EBU_SDRAM_STATUS
|
|
{
|
|
XMC_EBU_SDRAM_STATUS_RX_ERROR = EBU_SDRSTAT_SDERR_Msk, /**< Detected an error when returning read data */
|
|
XMC_EBU_SDRAM_STATUS_BUSY = EBU_SDRSTAT_SDRMBUSY_Msk, /**< The status of power-up initialization sequence */
|
|
XMC_EBU_SDRAM_STATUS_REFRESH_ERROR = EBU_SDRSTAT_REFERR_Msk /**< Failed previous refresh req collides with new req */
|
|
} XMC_EBU_SDRAM_STATUS_t;
|
|
|
|
/**
|
|
* SDRAM refresh status
|
|
*/
|
|
typedef enum XMC_EBU_SDRAM_RFRSH_STATUS
|
|
{
|
|
XMC_EBU_SDRAM_RFRSH_STATUS_SELF_REFRESH_ENTRY_STATUS = EBU_SDRMREF_SELFRENST_Msk, /**< Self refresh entry command issue successful */
|
|
XMC_EBU_SDRAM_RFRSH_STATUS_SELF_REFRESH_EXIT_STATUS = EBU_SDRMREF_SELFREXST_Msk /**< Self refresh exit command issue successful */
|
|
} XMC_EBU_SDRAM_RFRSH_STATUS_t;
|
|
|
|
|
|
/**********************************************************************************************************************
|
|
* DATA STRUCTURES
|
|
*********************************************************************************************************************/
|
|
|
|
/* Anonymous structure/union guard start */
|
|
#if defined(__CC_ARM)
|
|
#pragma push
|
|
#pragma anon_unions
|
|
#elif defined (__TASKING__)
|
|
#pragma warning 586
|
|
#endif
|
|
|
|
/**
|
|
* Clock configuration values of EBU <br>
|
|
*
|
|
* The structure presents a convenient way to set/obtain the clock configuration
|
|
* values for clock mode, div2 clock mode and clock divide ratio of EBU.
|
|
* The XMC_EBU_Init() can be used to populate the structure with the clock
|
|
* configuration values of the EBU module.
|
|
*/
|
|
typedef struct XMC_EBU_CLK_CONFIG
|
|
{
|
|
union
|
|
{
|
|
uint32_t raw0;
|
|
struct
|
|
{
|
|
uint32_t : 16;
|
|
uint32_t ebu_clk_mode : 1; /**< Clocking mode (::XMC_EBU_CLK_MODE_t) */
|
|
uint32_t ebu_div2_clk_mode : 1; /**< DIV2 clocking mode (::XMC_EBU_DIV2_CLK_MODE_t) */
|
|
uint32_t ebu_clock_divide_ratio : 2; /**< Clock divide ratio (::XMC_EBU_CLOCK_DIVIDE_RATIO_t) */
|
|
uint32_t : 12;
|
|
};
|
|
};
|
|
} XMC_EBU_CLK_CONFIG_t;
|
|
|
|
/**
|
|
* Mode configuration values for EBU <br>
|
|
*
|
|
* The structure presents a convenient way to set/obtain the mode configuration,
|
|
* SDRAM tristate, external clock, arbitration, timeout control and ALE mode for
|
|
* EBU. The XMC_EBU_Init() can be used to populate the structure with the
|
|
* clock configuration values of the EBU module.
|
|
*/
|
|
typedef struct XMC_EBU_MODE_CONFIG
|
|
{
|
|
union
|
|
{
|
|
uint32_t raw0;
|
|
struct
|
|
{
|
|
uint32_t : 2;
|
|
uint32_t ebu_sdram_tristate : 1; /**< 0 - SDRAM cannot be shared; 1 - SDRAM can be shared */
|
|
uint32_t : 1;
|
|
uint32_t ebu_extlock : 1; /**< 0 - ext bus is not locked after the EBU gains ownership; 1 - ext bus is not locked */
|
|
uint32_t ebu_arbsync : 1; /**< 0 - arbitration inputs are sync; 1 - arbitration inputs are async */
|
|
uint32_t ebu_arbitration_mode : 2; /**< Arbitration mode selection (::XMC_EBU_ARB_MODE_t) */
|
|
uint32_t bus_timeout_control : 8; /**< Determines num of inactive cycles leading to a bus timeout after the EBU gains ownership <br>
|
|
00H: Timeout is disabled <br>
|
|
01H: Timeout is generated after 1 x 8 clock cycles <br>
|
|
FFH: Timeout is generated after 255 x 8 clock cycles <br> */
|
|
uint32_t : 15;
|
|
uint32_t ebu_ale_mode : 1; /**< ALE mode. Switch the ADV output to be an active high ALE signal instead of active low ADV. (::XMC_EBU_ALE_MODE_t) */
|
|
};
|
|
};
|
|
} XMC_EBU_MODE_CONFIG_t;
|
|
|
|
/**
|
|
* GPIO mode configuration for the allocated EBU ports <br>
|
|
* Configuring this structure frees the allocated EBU ports for GPIO
|
|
* functionality. The XMC_EBU_Init() is used to populate the structure
|
|
* with the GPIO mode for the allocated EBU ports.
|
|
*/
|
|
typedef struct XMC_EBU_FREE_PINS_TO_GPIO
|
|
{
|
|
union
|
|
{
|
|
uint32_t raw0;
|
|
struct
|
|
{
|
|
uint32_t : 16;
|
|
uint32_t address_pins_gpio : 9; /**< 0 - Address bit required for addressing memory; 1 - Address bit available as GPIO */
|
|
uint32_t adv_pin_gpio : 1; /**< Adv pin to GPIO mode */
|
|
uint32_t : 6;
|
|
};
|
|
};
|
|
} XMC_EBU_FREE_PINS_TO_GPIO_t;
|
|
|
|
/**
|
|
* Read configuration for a region of EBU <br>
|
|
*
|
|
* The structure presents a convenient way to set/obtain the read and read timing
|
|
* configuration for a region for EBU. The XMC_EBU_ConfigureRegion() can be
|
|
* used to populate the structure with the read configuration values for EBU.
|
|
*/
|
|
typedef struct XMC_EBU_BUS_READ_CONFIG
|
|
{
|
|
/* EBU read configuration parameters */
|
|
union
|
|
{
|
|
uint32_t raw0;
|
|
struct
|
|
{
|
|
uint32_t ebu_burst_length_sync : 3; /**< Burst length for synchronous burst (::XMC_EBU_BURST_LENGTH_SYNC_t) */
|
|
uint32_t ebu_burst_buffer_sync_mode : 1; /**< Burst buffer mode (::XMC_EBU_BURST_BUFFER_SYNC_MODE_t) */
|
|
uint32_t ebu_read_stages_synch : 1; /**< Read single stage synchronization */
|
|
uint32_t ebu_burst_flash_clock_feedback : 1; /**< Burst flash clock feedback enable/disable (::XMC_EBU_BURST_FLASH_CLOCK_FEEDBACK_t) */
|
|
uint32_t ebu_burst_flash_clock_mode : 1; /**< Burst flash clock mode select (::XMC_EBU_BURST_FLASH_CLOCK_MODE_t) */
|
|
uint32_t ebu_flash_non_array_access : 1; /**< flash non-array access (::XMC_EBU_FLASH_NON_ARRAY_ACCESS_t) */
|
|
uint32_t : 8;
|
|
uint32_t ebu_early_chip_select_sync_burst : 1; /**< Early chip select for sync burst (::XMC_EBU_EARLY_CHIP_SELECT_SYNC_BURST_t) */
|
|
uint32_t ebu_burst_signal_sync : 1; /**< Early burst signal enable for synchronous burst (::XMC_EBU_BURST_SIGNAL_SYNC_BURST_t) */
|
|
uint32_t ebu_burst_address_wrapping : 1; /**< Burst address wrapping (::XMC_EBU_BURST_ADDRESS_WRAPPING_t) */
|
|
uint32_t ebu_wait_signal_polarity : 1; /**< Reversed polarity at WAIT (::XMC_EBU_WAIT_SIGNAL_POLARITY_t) */
|
|
uint32_t ebu_byte_control : 2; /**< Byte control signal control (::XMC_EBU_BYTE_CONTROL_t) */
|
|
uint32_t ebu_device_addressing_mode : 2; /**< Device addressing mode (::XMC_EBU_DEVICE_ADDRESSING_MODE_t) */
|
|
uint32_t ebu_wait_control : 2; /**< External wait control (::XMC_EBU_WAIT_CONTROL_t) */
|
|
uint32_t ebu_asynchronous_address_phase : 1; /**< Asynchronous address phase (::XMC_EBU_ASYNCHRONOUS_ADDRESS_PHASE_t) */
|
|
uint32_t : 1;
|
|
uint32_t ebu_device_type : 4; /**< Device type for region (::XMC_EBU_DEVICE_TYPE_t) */
|
|
};
|
|
};
|
|
/* EBU read access parameters */
|
|
union
|
|
{
|
|
uint32_t raw1;
|
|
struct
|
|
{
|
|
/**
|
|
* Recovery Cycles between Different Regions: <br>
|
|
* This bit field determines the number of clock cycles of the Recovery Phase between consecutive accesses directed to different regions or different types of access.<br>
|
|
* 0000B: No recovery phase clock cycles available <br>
|
|
* 0001B: 1 clock cycle selected <br>
|
|
* ... <br>
|
|
* 1110B: 14 clock cycles selected <br>
|
|
* 1111B: 15 clock cycles selected <br>
|
|
*/
|
|
uint32_t ebu_recovery_cycles_between_different_regions : 4;
|
|
/**
|
|
* Recovery cycles after read accesses: <br>
|
|
* This bit field determines the basic number of clock cycles of the Recovery Phase at the end of read accesses.<br>
|
|
* 000B: No recovery phase clock cycles available <br>
|
|
* 001B: 1 clock cycle selected <br>
|
|
* ... <br>
|
|
* 110B: 6 clock cycles selected <br>
|
|
* 111B: 7 clock cycles selected <br>
|
|
*/
|
|
uint32_t ebu_recovery_cycles_after_read_accesses : 3;
|
|
/**
|
|
* Programmed wait states for read accesses: <br>
|
|
* Number of programmed wait states for read accesses. For synchronous accesses, this will always be adjusted so that the phase exits on a rising edge of the external clock.<br>
|
|
* 00000B: 1 wait state <br>
|
|
* 00001B: 1 wait state <br>
|
|
* 00010B: 2 wait state <br>
|
|
* ... <br>
|
|
* 11110B: 30 wait states <br>
|
|
* 11111B: 31 wait states <br>
|
|
*/
|
|
uint32_t ebu_programmed_wait_states_for_read_accesses : 5;
|
|
/**
|
|
* Data Hold Cycles for Read Accesses <br>
|
|
* This bit field determines the basic number of Data Hold phase clock cycles during read accesses. It has no effect in the current implementation<br>
|
|
*/
|
|
uint32_t ebu_data_hold_cycles_for_read_accesses: 4;
|
|
/**
|
|
* Frequency of external clock at pin BFCLKO (::XMC_EBU_FREQ_EXT_CLK_PIN_t)
|
|
*/
|
|
uint32_t ebu_freq_ext_clk_pin : 2;
|
|
/**
|
|
* EBU Extended data (::XMC_EBU_EXT_DATA_t)
|
|
*/
|
|
uint32_t ebu_ext_data : 2;
|
|
/**
|
|
* Command delay cycles: <br>
|
|
* This bit field determines the basic number of Command Delay phase clock cycles.<br>
|
|
* 0000B: 0 clock cycle selected <br>
|
|
* 0001B: 1 clock cycle selected <br>
|
|
* ... <br>
|
|
* 1110B: 14 clock cycles selected <br>
|
|
* 1111B: 15 clock cycles selected <br>
|
|
*/
|
|
uint32_t command_delay_lines : 4;
|
|
/**
|
|
* Address hold cycles: <br>
|
|
* This bit field determines the number of clock cycles of the address hold phase.<br>
|
|
* 0000B: 0 clock cycle selected <br>
|
|
* 0001B: 1 clock cycle selected <br>
|
|
* ... <br>
|
|
* 1110B: 14 clock cycles selected <br>
|
|
* 1111B: 15 clock cycles selected <br>
|
|
*/
|
|
uint32_t address_hold_cycles : 4;
|
|
/**
|
|
* Address Cycles:
|
|
* This bit field determines the number of clock cycles of the address phase.<br>
|
|
* 0000B: 1 clock cycle selected <br>
|
|
* 0001B: 1 clock cycle selected <br>
|
|
* ... <br>
|
|
* 1110B: 14 clock cycles selected <br>
|
|
* 1111B: 15 clock cycles selected <br>
|
|
*/
|
|
uint32_t address_cycles : 4;
|
|
};
|
|
};
|
|
} XMC_EBU_BUS_READ_CONFIG_t;
|
|
|
|
/**
|
|
* Write configuration for a region of EBU <br>
|
|
*
|
|
* The structure presents a convenient way to set/obtain the write and write timing
|
|
* configurations for a region of EBU. The XMC_EBU_ConfigureRegion() can be used
|
|
* to populate the structure with the write configuration values of EBU.
|
|
*/
|
|
typedef struct XMC_EBU_BUS_WRITE_CONFIG
|
|
{
|
|
/* EBU write configuration parameters */
|
|
union
|
|
{
|
|
uint32_t raw0;
|
|
struct
|
|
{
|
|
uint32_t ebu_burst_length_sync : 3; /**< Burst length for synchronous burst (::XMC_EBU_BURST_LENGTH_SYNC_t) */
|
|
uint32_t ebu_burst_buffer_sync_mode : 1; /**< Burst buffer mode (::XMC_EBU_BURST_BUFFER_SYNC_MODE_t) */
|
|
uint32_t : 12;
|
|
uint32_t ebu_early_chip_select_sync_burst : 1; /**< Early chip select for sync burst (::XMC_EBU_EARLY_CHIP_SELECT_SYNC_BURST_t) */
|
|
uint32_t ebu_burst_signal_sync : 1; /**< Early burst signal enable for synchronous burst (::XMC_EBU_BURST_SIGNAL_SYNC_BURST_t) */
|
|
uint32_t : 1;
|
|
uint32_t ebu_wait_signal_polarity : 1; /**< Reversed polarity at WAIT (::XMC_EBU_WAIT_SIGNAL_POLARITY_t) */
|
|
uint32_t ebu_byte_control : 2; /**< Byte control signal control (::XMC_EBU_BYTE_CONTROL_t) */
|
|
uint32_t ebu_device_addressing_mode : 2; /**< Device addressing mode (::XMC_EBU_DEVICE_ADDRESSING_MODE_t) */
|
|
uint32_t ebu_wait_control : 2; /**< External wait control (::XMC_EBU_WAIT_CONTROL_t) */
|
|
uint32_t ebu_asynchronous_address_phase : 1; /**< Asynchronous address phase (::XMC_EBU_ASYNCHRONOUS_ADDRESS_PHASE_t) */
|
|
uint32_t ebu_lock_chip_select : 1; /**< Lock chip select (::XMC_EBU_LOCK_CHIP_SELECT_t) */
|
|
uint32_t ebu_device_type : 4; /**< Device type for region (::XMC_EBU_DEVICE_TYPE_t) */
|
|
};
|
|
};
|
|
/* EBU write access parameters */
|
|
union
|
|
{
|
|
uint32_t raw1;
|
|
struct
|
|
{
|
|
/**
|
|
* Recovery cycles between different regions: <br>
|
|
* This bit field determines the number of clock cycles of the Recovery Phase between consecutive accesses directed to different regions or different types of access.<br>
|
|
* 0000B: No recovery phase clock cycles available <br>
|
|
* 0001B: 1 clock cycle selected <br>
|
|
* ... <br>
|
|
* 1110B: 14 clock cycles selected <br>
|
|
* 1111B: 15 clock cycles selected <br>
|
|
*/
|
|
uint32_t ebu_recovery_cycles_between_different_regions : 4;
|
|
|
|
/**
|
|
* Recovery cycles after write accesses: <br>
|
|
* This bit field determines the basic number of clock cycles of the Recovery Phase at the end of write accesses.<br>
|
|
* 000B: No recovery phase clock cycles available <br>
|
|
* 001B: 1 clock cycle selected <br>
|
|
* ... <br>
|
|
* 110B: 6 clock cycles selected <br>
|
|
* 111B: 7 clock cycles selected <br>
|
|
*/
|
|
uint32_t ebu_recovery_cycles_after_write_accesses : 3;
|
|
|
|
/**
|
|
* Programmed wait states for write accesses: <br>
|
|
* Number of programmed wait states for write accesses. For synchronous accesses, this will always be adjusted so that the phase exits on a rising edge of the external clock.<br>
|
|
* 00000B: 1 wait state <br>
|
|
* 00001B: 1 wait state <br>
|
|
* 00010B: 2 wait state <br>
|
|
* ... <br>
|
|
* 11110B: 30 wait states <br>
|
|
* 11111B: 31 wait states <br>
|
|
*/
|
|
uint32_t ebu_programmed_wait_states_for_write_accesses : 5;
|
|
|
|
/**
|
|
* Data Hold Cycles for Write Accesses
|
|
* This bit field determines the basic number of Data Hold phase clock cycles during write accesses.<br>
|
|
* 0000B: No recovery phase clock cycles available <br>
|
|
* 0001B: 1 clock cycle selected <br>
|
|
* ... <br>
|
|
* 1110B: 14 clock cycles selected <br>
|
|
* 1111B: 15 clock cycles selected <br>
|
|
*/
|
|
uint32_t ebu_data_hold_cycles_for_write_accesses : 4;
|
|
/**<
|
|
* Frequency of external clock at pin BFCLKO (::XMC_EBU_FREQ_EXT_CLK_PIN_t)
|
|
*/
|
|
uint32_t ebu_freq_ext_clk_pin : 2;
|
|
/**
|
|
* EBU extended data (::XMC_EBU_EXT_DATA_t)
|
|
*/
|
|
uint32_t ebu_ext_data : 2;
|
|
/**
|
|
* Command delay cycles: <br>
|
|
* This bit field determines the basic number of Command Delay phase clock cycles.<br>
|
|
* 0000B: 0 clock cycle selected <br>
|
|
* 0001B: 1 clock cycle selected <br>
|
|
* ... <br>
|
|
* 1110B: 14 clock cycles selected <br>
|
|
* 1111B: 15 clock cycles selected <br>
|
|
*/
|
|
uint32_t command_delay_lines : 4;
|
|
/** Address hold cycles: <br>
|
|
* This bit field determines the number of clock cycles of the address hold phase.<br>
|
|
* 0000B: 0 clock cycle selected <br>
|
|
* 0001B: 1 clock cycle selected <br>
|
|
* ... <br>
|
|
* 1110B: 14 clock cycles selected <br>
|
|
* 1111B: 15 clock cycles selected <br>
|
|
*/
|
|
uint32_t address_hold_cycles : 4;
|
|
/**
|
|
* Address cycles: <br>
|
|
* This bit field determines the number of clock cycles of the address phase.<br>
|
|
* 0000B: 1 clock cycle selected <br>
|
|
* 0001B: 1 clock cycle selected <br>
|
|
* ... <br>
|
|
* 1110B: 14 clock cycles selected <br>
|
|
* 1111B: 15 clock cycles selected <br>
|
|
*/
|
|
uint32_t address_cycles : 4;
|
|
};
|
|
};
|
|
}XMC_EBU_BUS_WRITE_CONFIG_t;
|
|
|
|
/**
|
|
* SDRAM configuration structure <br>
|
|
*
|
|
* The structure is a placeholder for setting (and obtaining) the SDRAM configuration,
|
|
* operation mode configuration and the right refresh parameters. The XMC_EBU_ConfigureSdram()
|
|
* can be used to populate the structure with the SDRAM operation mode and
|
|
* refresh parameters configuration.
|
|
*/
|
|
typedef struct XMC_EBU_SDRAM_CONFIG
|
|
{
|
|
/* EBU SDRAM control parameters */
|
|
union
|
|
{
|
|
uint32_t raw0;
|
|
struct
|
|
{
|
|
/**
|
|
* Number of clock cycles between row activate command and a precharge
|
|
* command
|
|
*/
|
|
uint32_t ebu_row_precharge_delay_counter : 4;
|
|
/**
|
|
* (CRFSH) Number of refresh commands issued during powerup init sequence:
|
|
* Perform CRFSH + 1 refresh cycles
|
|
*/
|
|
uint32_t ebu_init_refresh_commands_counter : 4;
|
|
/**
|
|
* (CRSC) Number of NOP cycles after a mode register set command:
|
|
* Insert CRSC + 1 NOP cycles
|
|
*/
|
|
uint32_t ebu_mode_register_set_up_time : 2;
|
|
/**
|
|
* (CRP) Number of NOP cycles inserted after a precharge command:
|
|
* Insert CRP + 1 NOP cycles
|
|
*/
|
|
uint32_t ebu_row_precharge_time_counter : 2;
|
|
/**
|
|
* Number of address bits from bit 0 to be used for column address
|
|
*/
|
|
uint32_t ebu_sdram_width_of_column_address : 2;
|
|
/**
|
|
* (CRCD) Number of NOP cycles between a row address and a column
|
|
* address: Insert CRCD + 1 NOP cycles
|
|
*/
|
|
uint32_t ebu_sdram_row_to_column_delay_counter : 2;
|
|
/**
|
|
* Row cycle time counter: Insert (CRCE * 8) + CRC + 1 NOP cycles
|
|
*/
|
|
uint32_t ebu_sdram_row_cycle_time_counter : 3;
|
|
/**
|
|
* Mask for row tag
|
|
*/
|
|
uint32_t ebu_sdram_mask_for_row_tag : 3;
|
|
/**
|
|
* Mask for bank tag
|
|
*/
|
|
uint32_t ebu_sdram_mask_for_bank_tag : 3;
|
|
/**
|
|
* Extension to the Row cycle time counter (CRCE)
|
|
*/
|
|
uint32_t ebu_sdram_row_cycle_time_counter_extension : 3;
|
|
/**
|
|
* Disable SDRAM clock output
|
|
*/
|
|
uint32_t ebu_sdram_clk_output : 1;
|
|
/**
|
|
* Power Save Mode used for gated clock mode
|
|
*/
|
|
uint32_t ebu_sdram_pwr_mode : 2;
|
|
/**
|
|
* SDRAM clock mode select
|
|
*/
|
|
uint32_t ebu_sdram_clk_mode : 1;
|
|
};
|
|
};
|
|
/* EBU SDRAM mode parameters */
|
|
union
|
|
{
|
|
uint32_t raw1;
|
|
struct
|
|
{
|
|
/**
|
|
* Number of locations can be accessed with a single command
|
|
*/
|
|
uint32_t ebu_sdram_burst_length : 3;
|
|
uint32_t : 1;
|
|
/**
|
|
* Number of clocks between a READ command and the availability
|
|
* of data
|
|
*/
|
|
uint32_t ebu_sdram_casclk_mode : 3;
|
|
uint32_t : 8;
|
|
/**
|
|
* Cold start
|
|
*/
|
|
uint32_t ebu_sdram_cold_start: 1;
|
|
/**
|
|
* Value to be written to the extended mode register of a mobile
|
|
* SDRAM device
|
|
*/
|
|
uint32_t ebu_sdram_extended_operation_mode : 12;
|
|
/**
|
|
* Value to be written to the bank select pins of a mobile SDRAM
|
|
* device during an extended mode register write operation
|
|
*/
|
|
uint32_t ebu_sdram_extended_operation_bank_select : 4;
|
|
};
|
|
};
|
|
/* EBU SDRAM refresh parameters */
|
|
union
|
|
{
|
|
uint32_t raw2;
|
|
struct
|
|
{
|
|
/**
|
|
* Number of refresh counter period:
|
|
* Refresh period is 'num_refresh_counter_period' x 64 clock cycles
|
|
*/
|
|
uint32_t ebu_sdram_num_refresh_counter_period : 6;
|
|
/**
|
|
* Number of refresh commands
|
|
*/
|
|
uint32_t ebu_sdram_num_refresh_cmnds : 3;
|
|
uint32_t : 1;
|
|
/**
|
|
* If 1, the self refresh exit command is issued to all SDRAM devices
|
|
* regardless of their attachment to type 0 or type 1
|
|
*/
|
|
uint32_t ebu_sdram_self_refresh_exit : 1;
|
|
uint32_t : 1;
|
|
/**
|
|
* If "1", the self refresh entry command is issued to all SDRAM devices,
|
|
* regardless regardless of their attachment to type 0 or type 1
|
|
*/
|
|
uint32_t ebu_sdram_self_refresh_entry : 1;
|
|
/**
|
|
* If 1, memory controller will automatically issue the "self refresh
|
|
* entry" command to all SDRAM devices when it gives up control of the
|
|
* external bus. It will also automatically issue "self refresh exit"
|
|
* when it regains control of the bus
|
|
*/
|
|
uint32_t ebu_sdram_auto_self_refresh : 1;
|
|
/**
|
|
* Extended number of refresh counter period
|
|
*/
|
|
uint32_t ebu_sdram_extended_refresh_counter_period : 2;
|
|
/**
|
|
* Number of NOP cycles inserted after a self refresh exit before a
|
|
* command is permitted to the SDRAM/DDRAM
|
|
*/
|
|
uint32_t ebu_sdram_self_refresh_exit_delay : 8;
|
|
/**
|
|
* If 1, an auto refresh cycle will be performed; If 0, no refresh will
|
|
* be performed
|
|
*/
|
|
uint32_t ebu_sdram_auto_refresh : 1;
|
|
/**
|
|
* Number of NOPs after the SDRAM controller exits power down before an
|
|
* active command is permitted
|
|
*/
|
|
uint32_t ebu_sdram_delay_on_power_down_exit : 3;
|
|
uint32_t : 4;
|
|
};
|
|
};
|
|
} XMC_EBU_SDRAM_CONFIG_t;
|
|
|
|
/* Anonymous structure/union guard end */
|
|
#if defined (__CC_ARM)
|
|
#pragma pop
|
|
#elif defined (__TASKING__)
|
|
#pragma warning restore
|
|
#endif
|
|
|
|
/**
|
|
* EBU region initialization with read configurations <br>
|
|
*
|
|
* The structure presents a convenient way to set/obtain the read and read timing
|
|
* configurations for a region of EBU. The XMC_EBU_ConfigureRegion() can be
|
|
* used to populate the structure with the read configuration values of EBU
|
|
*/
|
|
typedef struct XMC_EBU_REGION_READ_CONFIG
|
|
{
|
|
const uint32_t ebu_region_no; /**< Number of region*/
|
|
XMC_EBU_BUS_READ_CONFIG_t ebu_bus_read_config; /**< Read configuration and access parameters structure */
|
|
} XMC_EBU_REGION_READ_CONFIG_t;
|
|
|
|
/**
|
|
* EBU region initialization with write configurations <br>
|
|
*
|
|
* The structure presents a convenient way to set/obtain the write and write
|
|
* timing configurations for a region of EBU. The XMC_EBU_ConfigureRegion()
|
|
* can be used to populate the structure with the write configuration
|
|
* values of EBU.
|
|
*/
|
|
typedef struct XMC_EBU_REGION_WRITE_CONFIG
|
|
{
|
|
const uint32_t ebu_region_no; /**< Number of refresh counter period */
|
|
XMC_EBU_BUS_WRITE_CONFIG_t ebu_bus_write_config; /**< Write configuration and access parameters structure */
|
|
} XMC_EBU_REGION_WRITE_CONFIG_t;
|
|
|
|
/**
|
|
* EBU region initialization with read and write configurations <br>
|
|
*
|
|
* The structure presents a convenient way to set/obtain the read, read timing,
|
|
* write and write timing configurations for a region of EBU. The
|
|
* XMC_EBU_ConfigureRegion() can be used to populate the structure with the
|
|
* region read and write configuration values of EBU.
|
|
*/
|
|
typedef struct XMC_EBU_REGION
|
|
{
|
|
XMC_EBU_REGION_READ_CONFIG_t read_config;
|
|
XMC_EBU_REGION_WRITE_CONFIG_t write_config;
|
|
} XMC_EBU_REGION_t;
|
|
|
|
/**
|
|
* EBU global configurations <br>
|
|
*
|
|
* The structure presents a convenient way to set/obtain the global configurations
|
|
* of the EBU like clock, mode and GPIO mode. The XMC_EBU_Init() can be
|
|
* used to populate the structure with the region read and write configuration
|
|
* values of EBU.
|
|
*/
|
|
typedef struct XMC_EBU_CONFIG
|
|
{
|
|
XMC_EBU_CLK_CONFIG_t ebu_clk_config; /**< Clock configuration structure */
|
|
XMC_EBU_MODE_CONFIG_t ebu_mode_config; /**< Mode configuration structure */
|
|
XMC_EBU_FREE_PINS_TO_GPIO_t ebu_free_pins_to_gpio; /**< Free allocated EBU ports for GPIO */
|
|
} XMC_EBU_CONFIG_t;
|
|
|
|
/**
|
|
* External Bus Unit (EBU) device structure <br>
|
|
*
|
|
* The structure represents a collection of all hardware registers
|
|
* used to configure the EBU peripheral on the XMC4500 microcontroller.
|
|
* The registers can be accessed with ::XMC_EBU.
|
|
*/
|
|
typedef struct
|
|
{
|
|
__IO uint32_t CLC;
|
|
__IO uint32_t MODCON;
|
|
__I uint32_t ID;
|
|
__IO uint32_t USERCON;
|
|
__I uint32_t RESERVED0[2];
|
|
__IO uint32_t ADDRSEL[4];
|
|
struct
|
|
{
|
|
__IO uint32_t RDCON;
|
|
__IO uint32_t RDAPR;
|
|
__IO uint32_t WRCON;
|
|
__IO uint32_t WRAPR;
|
|
} BUS[4];
|
|
__IO uint32_t SDRMCON;
|
|
__IO uint32_t SDRMOD;
|
|
__IO uint32_t SDRMREF;
|
|
__I uint32_t SDRSTAT;
|
|
} XMC_EBU_t;
|
|
|
|
/**********************************************************************************************************************
|
|
* API PROTOTYPES
|
|
**********************************************************************************************************************/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @param config Constant pointer to a constant ::XMC_EBU_CONFIG_t structure containing the
|
|
* clock mode and clock configuration.
|
|
* @return XMC_EBU_STATUS_t Always returns XMC_EBU_STATUS_OK (Only register assignment statements)
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Initialize the EBU peripheral <br>
|
|
*
|
|
* \par
|
|
* The function enables the EBU peripheral, configures time values for clock mode, div2
|
|
* clock mode, mode configuration, SDRAM tristate, external clock, arbitration, timeout
|
|
* control, ALE mode and configuration to free up the allocated EBU ports for GPIO
|
|
* functionality (if required).
|
|
*/
|
|
XMC_EBU_STATUS_t XMC_EBU_Init(XMC_EBU_t *const ebu, const XMC_EBU_CONFIG_t *const config);
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @param config Constant pointer to a constant ::XMC_EBU_SDRAM_CONFIG_t structure containing
|
|
* the SDRAM configuration, operation mode configuration and right refresh
|
|
* parameters
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Configures the SDRAM <br>
|
|
*
|
|
* \par
|
|
* The function enables the SDRAM, sets SDRAM configuration parameters such as operation
|
|
* mode and refresh parameters. Please see ::XMC_EBU_SDRAM_CONFIG_t for more information.
|
|
*/
|
|
void XMC_EBU_ConfigureSdram(XMC_EBU_t *const ebu, const XMC_EBU_SDRAM_CONFIG_t *const config);
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @param region Constant pointer to a constant ::XMC_EBU_REGION_t structure containing the
|
|
* read, read timing, write and write timing configurations for a region of
|
|
* EBU
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Configures the SDRAM <br>
|
|
*
|
|
* \par
|
|
* The function configures the EBU region read, read timing, write and write timing parameter
|
|
* configuration. It also configures the region registers for read and write accesses. Please
|
|
* see ::XMC_EBU_REGION_t for more information.
|
|
*
|
|
*/
|
|
void XMC_EBU_ConfigureRegion(XMC_EBU_t *const ebu, const XMC_EBU_REGION_t *const region);
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Enable EBU peripheral <br>
|
|
*
|
|
* \par
|
|
* The function de-asserts the peripheral reset. The peripheral needs to be initialized.
|
|
* It also enables the control of the EBU.
|
|
*
|
|
* \par<b>Related APIs:</b><br>
|
|
* XMC_EBU_Disable(), XMC_SCU_RESET_AssertPeripheralReset()
|
|
*/
|
|
__STATIC_INLINE void XMC_EBU_Enable(XMC_EBU_t *const ebu)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_Enable: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
XMC_SCU_RESET_DeassertPeripheralReset(XMC_SCU_PERIPHERAL_RESET_EBU);
|
|
ebu->CLC &= ~EBU_CLC_DISR_Msk;
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Disable EBU peripheral <br>
|
|
*
|
|
* \par
|
|
* The function asserts the peripheral reset. It also disables the control of the EBU.
|
|
*
|
|
* \par<b>Related APIs:</b><br>
|
|
* XMC_EBU_Enable(), XMC_SCU_RESET_DeassertPeripheralReset()
|
|
*/
|
|
__STATIC_INLINE void XMC_EBU_Disable(XMC_EBU_t *const ebu)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_Disable: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
ebu->CLC |= EBU_CLC_DISR_Msk;
|
|
XMC_SCU_RESET_AssertPeripheralReset(XMC_SCU_PERIPHERAL_RESET_EBU);
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @param clk_status Constant structure ::XMC_EBU_CLK_STATUS_t, containing the
|
|
* disable status, clock mode status, DIV2 clock mode status
|
|
* and clock divide ratio
|
|
* @return Status Returns clock status, disable status, clock mode status, DIV2 clock
|
|
* mode status and clock divide ratio
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Gets the clock status of EBU peripheral <br>
|
|
*
|
|
* \par
|
|
* The function returns the clock staus of the EBU peripheral. The return value will
|
|
* indicate the following parameters: <br>
|
|
* 1) Is EBU disabled? <br>
|
|
* 2) Clocking mode <br>
|
|
* 3) DIV2 clocking mode <br>
|
|
* 4) Clock divide ratio <br>
|
|
*
|
|
* \par<b>Related APIs:</b><br>
|
|
* XMC_EBU_Enable(), XMC_EBU_Disable() and XMC_EBU_CLKDivideRatio()
|
|
*/
|
|
__STATIC_INLINE uint32_t XMC_EBU_GetCLKStatus(XMC_EBU_t *const ebu, const XMC_EBU_CLK_STATUS_t clk_status)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_GetCLKStatus: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
return (uint32_t)(ebu->CLC & clk_status);
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @param clock_divide_ratio Structure ::XMC_EBU_CLOCK_DIVIDE_RATIO_t, containing the
|
|
* clock division factors of 1, 2, 3 and 4 respectively
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Sets the clock divide ratio for EBU peripheral <br>
|
|
*
|
|
* \par
|
|
* The function sets the CLC.EBUDIV bit-field to configure the clock divide ratio
|
|
* value (input clock divide by factor).
|
|
*
|
|
* \par<b>Related APIs:</b><br>
|
|
* XMC_EBU_Enable(), XMC_EBU_Disable() and XMC_EBU_GetCLKStatus()
|
|
*/
|
|
__STATIC_INLINE void XMC_EBU_CLKDivideRatio(XMC_EBU_t *ebu, XMC_EBU_CLOCK_DIVIDE_RATIO_t clock_divide_ratio)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_CLKDivideRatio: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
ebu->CLC |= ((clock_divide_ratio << EBU_CLC_EBUDIV_Pos) & EBU_CLC_EBUDIV_Msk);
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Sets the SDRAM self refresh exit (Power up) <br>
|
|
*
|
|
* \par
|
|
* The function sets the SDRMREF.SELFREX bit to issue the self refresh command to
|
|
* all the SDRAM units. This ensures that the SDRAM units come out of the power down
|
|
* mode. The function also resets the bit SDRMREF.SELFRENST(Self refresh entry status).
|
|
*/
|
|
__STATIC_INLINE void XMC_EBU_SdramSetSelfRefreshExit(XMC_EBU_t *const ebu)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_SdramSetSelfRefreshExit: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
ebu->SDRMREF |= EBU_SDRMREF_SELFREX_Msk;
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Sets the SDRAM self refresh entry <br>
|
|
*
|
|
* \par
|
|
* The function sets the SDRMREF.SELFREN bit-field to issue the self refresh command
|
|
* to all the SDRAM units. This ensures that the SDRAM units enter the power down mode
|
|
* after pre-charge. The function also resets the bit SDRMREF.SELFREXST(Self refresh
|
|
* exit status).
|
|
*/
|
|
__STATIC_INLINE void XMC_EBU_SdramSetSelfRefreshEntry(XMC_EBU_t *const ebu)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_SdramSetSelfRefreshEntry: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
ebu->SDRMREF |= EBU_SDRMREF_SELFREN_Msk;
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Resets the SDRAM self refresh exit (Power up) <br>
|
|
*
|
|
* \par
|
|
* The function resets the SDRMREF.SELFREX bit-field to stop issuing the self
|
|
* refresh command to all the SDRAM units connected to the bus. This ensures that
|
|
* the SDRAM units don't come out of the power down mode.
|
|
*
|
|
*/
|
|
__STATIC_INLINE void XMC_EBU_SdramResetSelfRefreshExit(XMC_EBU_t *const ebu)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_SdramResetSelfRefreshExit: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
ebu->SDRMREF &= ~EBU_SDRMREF_SELFREX_Msk;
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Resets the SDRAM self refresh entry <br>
|
|
*
|
|
* \par
|
|
* The function resets the SDRMREF.SELFREN bit-field to stop issuing the self
|
|
* refresh command to all the SDRAM units. This ensures that the SDRAM units
|
|
* don't go into the power down mode after the pre-charge is all done.
|
|
*
|
|
*/
|
|
__STATIC_INLINE void XMC_EBU_SdramResetSelfRefreshEntry(XMC_EBU_t *const ebu)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_SdramResetSelfRefreshEntry: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
ebu->SDRMREF &= ~EBU_SDRMREF_SELFREN_Msk;
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Sets the SDRAM auto refresh on self refresh exit <br>
|
|
*
|
|
* \par
|
|
* The function sets the SDRMREF.ARFSH bit-field to enable an auto refresh cycle
|
|
* on existing self refresh before the self refresh exit delay.
|
|
*
|
|
* \par<b>Related APIs: </b><br>
|
|
* XMC_EBU_SdramDisableAutoRefreshSelfRefreshExit()
|
|
*/
|
|
__STATIC_INLINE void XMC_EBU_SdramEnableAutoRefreshSelfRefreshExit(XMC_EBU_t *const ebu)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_SdramEnableAutoRefreshSelfRefreshExit: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
ebu->SDRMREF |= EBU_SDRMREF_ARFSH_Msk;
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Resets the SDRAM auto refresh on self refresh exit <br>
|
|
*
|
|
* \par
|
|
* The function resets the SDRMREF.ARFSH bit to disable an auto refresh cycle
|
|
* on existing self refresh before the self refresh exit delay. No refresh will be
|
|
* performed.
|
|
*
|
|
* \par<b>Related APIs: </b><br>
|
|
* XMC_EBU_SdramEnableAutoRefreshSelfRefreshExit()
|
|
*/
|
|
__STATIC_INLINE void XMC_EBU_SdramDisableAutoRefreshSelfRefreshExit(XMC_EBU_t *const ebu)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_SdramDisableAutoRefreshSelfRefreshExit: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
ebu->SDRMREF &= ~EBU_SDRMREF_ARFSH_Msk;
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Sets the SDRAM automatic self refresh <br>
|
|
*
|
|
* \par
|
|
* The function sets the SDRMREF.AUTOSELFR bit-field. When set, the memory controller
|
|
* automatically issues the self refresh entry command to all SDRAM units
|
|
* devices when it gives up control of the external bus. It will also automatically
|
|
* issue the self refresh exit command when it regains control of the bus.
|
|
*
|
|
* \par<b>Related APIs: </b><br>
|
|
* XMC_EBU_SdramDisableAutomaticSelfRefresh()
|
|
*/
|
|
__STATIC_INLINE void XMC_EBU_SdramEnableAutomaticSelfRefresh(XMC_EBU_t *const ebu)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_SdramEnableAutomaticSelfRefresh: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
ebu->SDRMREF |= EBU_SDRMREF_AUTOSELFR_Msk;
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Resets the SDRAM automatic self refresh <br>
|
|
*
|
|
* \par
|
|
* The function resets the SDRMREF.AUTOSELFR bit-field. When reset, the memory controller
|
|
* doesn't issue the self refresh entry command when it gives up control of the external
|
|
* bus. It will also not issue the self refresh exit command when it regains control of
|
|
* the bus.
|
|
*
|
|
* \par<b>Related APIs: </b><br>
|
|
* XMC_EBU_SdramEnableAutomaticSelfRefresh()
|
|
*/
|
|
__STATIC_INLINE void XMC_EBU_SdramDisableAutomaticSelfRefresh(XMC_EBU_t *const ebu)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_SdramDisableAutomaticSelfRefresh: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
ebu->SDRMREF &= ~EBU_SDRMREF_AUTOSELFR_Msk;
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @return bool Returns if the arbitration mode is selected or not
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Check if arbitration mode of EBU peripheral is selected
|
|
*
|
|
* \par
|
|
* The bit field ARBMODE of MODCON indicates the selected arbitration mode of the
|
|
* EBU. The follwing are the supported arbitration modes: <br>
|
|
* 1) Arbiter Mode arbitration mode <br>
|
|
* 2) Participant arbitration mode <br>
|
|
* 3) Sole Master arbitration mode <br>
|
|
*
|
|
* If any of the above modes are selected, the function returns "true". It returns
|
|
* false otherwise.
|
|
*
|
|
* \par<b>Related APIs: </b><br>
|
|
* XMC_EBU_Init() \n\n\n
|
|
*/
|
|
__STATIC_INLINE bool XMC_EBU_IsBusAribitrationSelected(XMC_EBU_t *const ebu)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_IsBusAribitrationSelected: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
return (bool)((ebu->MODCON & EBU_MODCON_ARBMODE_Msk) != 0);
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @param ebu_addr_select_en Choose between a memory region enable or an alternate region enable
|
|
* @param ebu_region_n A valid region number for which enable and protection settings
|
|
* need to be configured
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Controls the enable and protection settings of a region <br>
|
|
*
|
|
* \par
|
|
* The function controls the enable and protection settings of a memory or alternate
|
|
* region. It configures the memory region enable, alternate region enable and the memory
|
|
* region's write protection. The bit-fields ADDRSEL.REGENAB, ADDRSEL.ALTENAB and
|
|
* ADDRSEL.WPROT are configured.
|
|
*
|
|
* \par<b>Related APIs: </b><br>
|
|
* XMC_EBU_AddressSelectDisable()
|
|
*/
|
|
__STATIC_INLINE void XMC_EBU_AddressSelectEnable(XMC_EBU_t *const ebu,
|
|
uint32_t ebu_addr_select_en,
|
|
const uint32_t ebu_region_n)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_AddressSelectEnable: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
ebu->ADDRSEL[ebu_region_n] |= ebu_addr_select_en;
|
|
while (!XMC_EBU_IsBusAribitrationSelected(ebu));
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @param ebu_addr_select_dis Choose between a memory region disable or an alternate
|
|
* region disable
|
|
* @param ebu_region_n A valid region number for which disable and protection
|
|
* settings configured
|
|
* @return None
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Controls the disable and protection settings of a region <br>
|
|
*
|
|
* \par
|
|
* The function controls the disable and protection settings of a memory or alternate
|
|
* region. It configures the memory region disable, alternate region disable and the
|
|
* memory region write protect disable for write accesses. The bits ADDRSEL.REGENAB,
|
|
* ADDRSEL.ALTENAB and ADDRSEL.WPROT are configured.
|
|
*
|
|
* \par<b>Related APIs: </b><br>
|
|
* XMC_EBU_AddressSelectEnable()
|
|
*/
|
|
__STATIC_INLINE void XMC_EBU_AddressSelectDisable(XMC_EBU_t *const ebu,
|
|
uint32_t ebu_addr_select_dis,
|
|
const uint32_t ebu_region_n)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_AddressSelectDisable: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
ebu->ADDRSEL[ebu_region_n] &= ~ebu_addr_select_dis;
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @param ebu_buswcon_status Enumeration of type ::XMC_EBU_BUSWCON_SELECT_t, representing
|
|
* values for non-array access and device addressing modes.
|
|
* @param ebu_region_n A valid region number for which status pertaining to WRITE is required
|
|
* @return Status Status of non-array access and device addressing mode
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Gets WRITE specific status for a region <br>
|
|
*
|
|
* \par
|
|
* The function gets status of the various WRITE specific settings for a region. Status for
|
|
* non-array access enable and device addressing mode are obtained. The status bits of the
|
|
* BUSWCON register are returned.
|
|
*
|
|
* \par<b>Related APIs: </b><br>
|
|
* XMC_EBU_ConfigureRegion()
|
|
*/
|
|
__STATIC_INLINE uint32_t XMC_EBU_GetBusWriteConfStatus(XMC_EBU_t *const ebu,
|
|
const XMC_EBU_BUSWCON_SELECT_t ebu_buswcon_status,
|
|
const uint32_t ebu_region_n)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_GetBusWriteConfStatus: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
return (ebu->BUS[ebu_region_n].WRCON & ebu_buswcon_status);
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @return Status SDRAM error or busy states
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Gets SDRAM error or busy states <br>
|
|
*
|
|
* \par
|
|
* The function gets SDRAM read error, refresh error and busy states. The bit-fields of SDRSTAT
|
|
* indicate the various states. REFERR reflects a failed previous refresh request collision
|
|
* with a new request. SDRMBUSY indicates the status of power-up initialization sequence. It
|
|
* indicates if it is running or not running. SDERR indicates if the SDRAM controller has
|
|
* detected an error when returning the read data.
|
|
*
|
|
* \par<b>Related APIs: </b><br>
|
|
* XMC_EBU_ConfigureSdram()
|
|
*/
|
|
__STATIC_INLINE uint32_t XMC_EBU_SdramGetStatus(XMC_EBU_t *const ebu)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_SdramGetStatus: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
return (uint32_t)(ebu->SDRSTAT);
|
|
}
|
|
|
|
/**
|
|
* @param ebu Constant pointer to ::XMC_EBU_t, pointing to the EBU base address
|
|
* @param sdram_rfrsh_status Constant enum of type ::XMC_EBU_SDRAM_RFRSH_STATUS_t
|
|
* @return Status Status of self refresh entry and exit command issue
|
|
*
|
|
* \par<b>Description: </b><br>
|
|
* Gets SDRAM refresh status <br>
|
|
*
|
|
* \par
|
|
* The function gets SDRAM refresh status for self refresh entry/exit command successful issue.
|
|
* The bit-fields of SDRMREF indicate various states: <br>
|
|
* SELFRENST reflects successful issue of self refresh entry command <br>
|
|
* SELFREXST reflects successful issue of self refresh exit command <br>
|
|
*
|
|
* \par<b>Related APIs: </b><br>
|
|
* XMC_EBU_SdramResetSelfRefreshEntry(), XMC_EBU_SdramResetSelfRefreshExit()
|
|
*/
|
|
__STATIC_INLINE uint32_t XMC_EBU_SdramGetRefreshStatus(XMC_EBU_t *const ebu,
|
|
const XMC_EBU_SDRAM_RFRSH_STATUS_t sdram_rfrsh_status)
|
|
{
|
|
XMC_ASSERT("XMC_EBU_SdramGetRefreshStatus: Invalid module pointer", XMC_EBU_CHECK_MODULE_PTR(ebu));
|
|
return (uint32_t)(ebu->SDRMREF & sdram_rfrsh_status);
|
|
}
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#endif /* defined (EBU) */
|
|
|
|
#endif /* XMC_EBU_H */
|