empty_project_28377D/device/driverlib/emif.h

1367 lines
46 KiB
C
Raw Permalink Normal View History

//###########################################################################
//
// FILE: emif.h
//
// TITLE: C28x EMIF driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
#ifndef EMIF_H
#define EMIF_H
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
#ifdef __cplusplus
extern "C"
{
#endif
//*****************************************************************************
//
//! \addtogroup emif_api EMIF
//! @{
//
//*****************************************************************************
#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_emif.h"
#include "inc/hw_memcfg.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "cpu.h"
#include "debug.h"
//*****************************************************************************
//
// Defines for the API.
//
//*****************************************************************************
//*****************************************************************************
//
// Defines to specify access protection to EMIF_setAccessProtection().
//
//*****************************************************************************
//! This flag is used to specify whether CPU fetches are allowed/blocked
//! for EMIF.
#define EMIF_ACCPROT0_FETCHPROT MEMCFG_EMIF1ACCPROT0_FETCHPROT_EMIF1
//! This flag is used to specify whether CPU writes are allowed/blocked
//! for EMIF.
#define EMIF_ACCPROT0_CPUWRPROT MEMCFG_EMIF1ACCPROT0_CPUWRPROT_EMIF1
//! This flag is used to specify whether DMA writes are allowed/blocked
//! for EMIF. It is valid only for EMIF1 instance.
#define EMIF_ACCPROT0_DMAWRPROT MEMCFG_EMIF1ACCPROT0_DMAWRPROT_EMIF1
//*****************************************************************************
//
// Define to mask out the bits in the EMIF1ACCPROT0 register that aren't
// associated with EMIF1 access protection.
//
//*****************************************************************************
#define EMIF_ACCPROT0_MASK_EMIF1 \
((uint16_t)MEMCFG_EMIF1ACCPROT0_FETCHPROT_EMIF1 |\
(uint16_t)MEMCFG_EMIF1ACCPROT0_CPUWRPROT_EMIF1 |\
(uint16_t)MEMCFG_EMIF1ACCPROT0_DMAWRPROT_EMIF1)
//*****************************************************************************
//
// Define to mask out the bits in the EMIF2ACCPROT0 register that aren't
// associated with EMIF2 access protection.
//
//*****************************************************************************
#define EMIF_ACCPROT0_MASK_EMIF2 \
((uint16_t)MEMCFG_EMIF2ACCPROT0_FETCHPROT_EMIF2 |\
(uint16_t)MEMCFG_EMIF2ACCPROT0_CPUWRPROT_EMIF2)
//*****************************************************************************
//
// Define to mask out the bits in the ASYNC_CSx_CR register that
// aren't associated with async configuration.
//
//*****************************************************************************
#define EMIF_ASYNC_CS_CR_MASK ((uint32_t)EMIF_ASYNC_CS2_CR_R_HOLD_M | \
(uint32_t)EMIF_ASYNC_CS2_CR_R_STROBE_M | \
(uint32_t)EMIF_ASYNC_CS2_CR_R_SETUP_M | \
(uint32_t)EMIF_ASYNC_CS2_CR_W_HOLD_M | \
(uint32_t)EMIF_ASYNC_CS2_CR_W_STROBE_M | \
(uint32_t)EMIF_ASYNC_CS2_CR_W_SETUP_M | \
(uint32_t)EMIF_ASYNC_CS2_CR_TA_M)
//*****************************************************************************
//
// Define to mask out the bits in the INT_MSK register that aren't associated
// with interrupts.
//
//*****************************************************************************
#define EMIF_ASYNC_INT_MASK ((uint16_t)EMIF_INT_MSK_SET_AT_MASK_SET | \
(uint16_t)EMIF_INT_MSK_SET_LT_MASK_SET | \
(uint16_t)EMIF_INT_MSK_SET_WR_MASK_SET_M)
//*****************************************************************************
//
// Defines to specify interrupt sources to EMIF_enableAsyncInterrupt() and
// EMIF_disableAsyncInterrupt().Three interrupts are available for asynchronous
// memory interface: Masked Asyncronous Timeout(AT) to indicate EMxWAIT signal
// remains active even after maximum wait cycles are reached. Masked Line Trap
// (LT) to indicate illegal memory access or invalid cache line size.
// Masked Wait Rise(WR) to indicate rising edge on EMxWAIT is detected.
//
//*****************************************************************************
//! This flag is used to allow/block EMIF to generate Masked Asynchronous
//! Timeout interrupt.
#define EMIF_ASYNC_INT_AT EMIF_INT_MSK_SET_AT_MASK_SET
//! This flag is used to allow/block EMIF to generate Masked Line Trap
//! interrupt.
#define EMIF_ASYNC_INT_LT EMIF_INT_MSK_SET_LT_MASK_SET
//! This flag is used to allow/block EMIF to generate Masked Wait Rise
//! interrupt.
#define EMIF_ASYNC_INT_WR EMIF_INT_MSK_SET_WR_MASK_SET_M
//*****************************************************************************
//
// Define for key for EMIF1MSEL register that enables the register write.
//
//*****************************************************************************
#define EMIF_MSEL_KEY 0x93A5CE70U
//*****************************************************************************
//
// Define to mask out the bits in the SDRAM_CR register that aren't
// associated with SDRAM configuration parameters.
//
//*****************************************************************************
#define EMIF_SYNC_SDRAM_CR_MASK ((uint32_t)EMIF_SDRAM_CR_PAGESIGE_M | \
(uint32_t)EMIF_SDRAM_CR_IBANK_M | \
(uint32_t)EMIF_SDRAM_CR_BIT_11_9_LOCK | \
(uint32_t)EMIF_SDRAM_CR_CL_M | \
(uint32_t)EMIF_SDRAM_CR_NM | \
(uint32_t)EMIF_SDRAM_CR_SR)
//*****************************************************************************
//
// Define to mask out the bits in the SDRAM_TR register that aren't
// associated with SDRAM timings parameters.
//
//*****************************************************************************
#define EMIF_SYNC_SDRAM_TR_MASK ((uint32_t)EMIF_SDRAM_TR_T_RRD_M | \
(uint32_t)EMIF_SDRAM_TR_T_RC_M | \
(uint32_t)EMIF_SDRAM_TR_T_RAS_M | \
(uint32_t)EMIF_SDRAM_TR_T_WR_M | \
(uint32_t)EMIF_SDRAM_TR_T_RCD_M | \
(uint32_t)EMIF_SDRAM_TR_T_RP_M | \
(uint32_t)EMIF_SDRAM_TR_T_RFC_M)
//*****************************************************************************
//
//! Values that can be passed to EMIF_setAsyncMode(),
//! EMIF_setAsyncTimingParams(), EMIF_setAsyncDataBusWidth(),
//! EMIF_enableAsyncExtendedWait() and EMIF_disableAsyncExtendedWait()
//! as the \e offset parameter. Three chip selects are available in
//! asynchronous memory interface so there are three configuration registers
//! available for each EMIF instance. All the three chip select offsets are
//! valid for EMIF1 while only EMIF_ASYNC_CS2_OFFSET is valid for EMIF2.
//
//*****************************************************************************
typedef enum
{
EMIF_ASYNC_CS2_OFFSET = EMIF_O_ASYNC_CS2_CR, //!<Async chip select 2 offset
EMIF_ASYNC_CS3_OFFSET = EMIF_O_ASYNC_CS3_CR, //!<Async chip select 3 offset
EMIF_ASYNC_CS4_OFFSET = EMIF_O_ASYNC_CS4_CR //!<Async chip select 4 offset
} EMIF_AsyncCSOffset;
//*****************************************************************************
//
//! Values that can be passed to EMIF_setAsyncDataBusWidth() as the
//! \e width parameter.
//
//*****************************************************************************
typedef enum
{
EMIF_ASYNC_DATA_WIDTH_8 = 0x0000U, //!<ASRAM/FLASH with 8 bit data bus
EMIF_ASYNC_DATA_WIDTH_16 = 0x0001U, //!<ASRAM/FLASH with 16 bit data bus
EMIF_ASYNC_DATA_WIDTH_32 = 0x0002U //!<ASRAM/FLASH with 32 bit data bus
} EMIF_AsyncDataWidth;
//*****************************************************************************
//
//! Values that can be passed to EMIF_setAsyncMode() as the \e mode parameter.
//
//*****************************************************************************
typedef enum
{
EMIF_ASYNC_STROBE_MODE = 0x80000000U, //!<Enables ASRAM/FLASH strobe mode
EMIF_ASYNC_NORMAL_MODE = 0x00000000U //!<Disables ASRAM/FLASH strobe mode
} EMIF_AsyncMode;
//*****************************************************************************
//
//! Values that can be passed to EMIF_setAsyncWaitPolarity() as the
//! \e polarity parameter.
//
//*****************************************************************************
typedef enum
{
EMIF_ASYNC_WAIT_POLARITY_LOW = 0x00000000U,//!<EMxWAIT pin polarity is low
EMIF_ASYNC_WAIT_POLARITY_HIGH = 0x10000000U//!<EMxWAIT pin polarity is high
} EMIF_AsyncWaitPolarity;
//*****************************************************************************
//
//! Values that can be passed to EMIF_selectController() as the
//! \e select parameter.
//
//*****************************************************************************
typedef enum
{
EMIF_CONTROLLER_CPU1_NG = 0x00000000U, //!<CPU1 is controller but not grabbed
EMIF_CONTROLLER_CPU1_G = 0x00000001U, //!<CPU1 is controller & grabbed
EMIF_CONTROLLER_CPU2_G = 0x00000002U, //!<CPU2 is controller & grabbed
EMIF_CONTROLLER_CPU1_NG2 = 0x00000003U //!<CPU1 is controller but not grabbed
} EMIF_ControllerSelect;
//*****************************************************************************
//
//! Values that can be passed to EMIF_setSyncMemoryConfig() as the
//! \e config parameter member.
//
//*****************************************************************************
typedef enum
{
EMIF_SYNC_NARROW_MODE_TRUE = 0x00004000U, //!< MemBusWidth=SystemBusWidth/2
EMIF_SYNC_NARROW_MODE_FALSE = 0x00000000U //!< MemBusWidth=SystemBusWidth
} EMIF_SyncNarrowMode;
//*****************************************************************************
//
//! Values that can be passed to EMIF_setSyncMemoryConfig() as the
//! \e config parameter member.
//
//*****************************************************************************
typedef enum
{
EMIF_SYNC_BANK_1 = 0x00000000U, //!< 1 Bank SDRAM device
EMIF_SYNC_BANK_2 = 0x00000010U, //!< 2 Bank SDRAM device
EMIF_SYNC_BANK_4 = 0x00000020U //!< 4 Bank SDRAM device
} EMIF_SyncBank;
//*****************************************************************************
//
//! Values that can be passed to EMIF_setSyncMemoryConfig() as the
//! \e config parameter member.
//
//*****************************************************************************
typedef enum
{
EMIF_SYNC_CAS_LAT_2 = 0x00000500U, //!< SDRAM with CAS Latency 2
EMIF_SYNC_CAS_LAT_3 = 0x00000700U //!< SDRAM with CAS Latency 3
} EMIF_SyncCASLatency;
//*****************************************************************************
//
//! Values that can be passed to EMIF_setSyncMemoryConfig() as the
//! \e config parameter member.
//
//*****************************************************************************
typedef enum
{
EMIF_SYNC_COLUMN_WIDTH_8 = 0x00000000U, //!< 256-word pages in SDRAM
EMIF_SYNC_COLUMN_WIDTH_9 = 0x00000001U, //!< 512-word pages in SDRAM
EMIF_SYNC_COLUMN_WIDTH_10 = 0x00000002U, //!< 1024-word pages in SDRAM
EMIF_SYNC_COLUMN_WIDTH_11 = 0x00000003U //!< 2048-word pages in SDRAM
} EMIF_SyncPageSize;
//*****************************************************************************
//
//! Values that can be passed to EMIF_setAsyncTimingParams() as the
//! \e tParam parameter.
//
//*****************************************************************************
typedef struct
{
uint32_t rSetup; //!< Read Setup Cycles
uint32_t rStrobe; //!< Read Strobe Cycles
uint32_t rHold; //!< Read Hold Cycles
uint32_t wSetup; //!< Write Setup Cycles
uint32_t wStrobe; //!< Write Strobe Cycles
uint32_t wHold; //!< Write Hold Cycles
uint32_t turnArnd; //!< TurnAround Cycles
} EMIF_AsyncTimingParams;
//*****************************************************************************
//
//! Values that can be passed to EMIF_setSyncMemoryConfig() as the
//! \e config parameter.
//
//*****************************************************************************
typedef struct
{
EMIF_SyncNarrowMode narrowMode; //!< Read Setup Cycles
EMIF_SyncBank iBank; //!< Banks available in SDRAM device
EMIF_SyncCASLatency casLatency; //!< CAS Latency for SDRAM device
EMIF_SyncPageSize pageSize; //!< Pagesize of SDRAM device
} EMIF_SyncConfig;
//*****************************************************************************
//
//! Values that can be passed to EMIF_setSyncTimingParameters() as the
//! \e tParam parameter.
//
//*****************************************************************************
typedef struct
{
uint32_t tRfc; //!< Auto refresh time
uint32_t tRp; //!< Row precharge time
uint32_t tRcd; //!< RAS to CAS delay
uint32_t tWr; //!< Write recovery time
uint32_t tRas; //!< Row active time
uint32_t tRc; //!< Read cycle time
uint32_t tRrd; //!< Row active to row active delay
} EMIF_SyncTimingParams;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks an EMIF base address.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! This function determines if EMIF module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
#ifdef DEBUG
static inline bool
EMIF_isBaseValid(uint32_t base)
{
return(
(base == EMIF1_BASE) ||
(base == EMIF2_BASE)
);
}
#endif
//*****************************************************************************
//
//! \internal
//! Checks an EMIF Configuration Register address.
//!
//! \param configBase is the configuration address of the EMIF instance used.
//!
//! This function determines if EMIF1 module configuration address is valid.
//!
//! \return Returns \b true if the configuration address is valid and \b false
//! otherwise.
//
//*****************************************************************************
#ifdef DEBUG
static inline bool
EMIF_isEMIF1ConfigBaseValid(uint32_t configBase)
{
return(configBase == EMIF1CONFIG_BASE);
}
#endif
//*****************************************************************************
//
//! \internal
//! Checks an EMIF Configuration Register address.
//!
//! \param configBase is the configuration address of the EMIF instance used.
//!
//! This function determines if EMIF2 module configuration address is valid.
//!
//! \return Returns \b true if the configuration address is valid and \b false
//! otherwise.
//
//*****************************************************************************
#ifdef DEBUG
static inline bool
EMIF_isEMIF2ConfigBaseValid(uint32_t configBase)
{
return(configBase == EMIF2CONFIG_BASE);
}
#endif
//*****************************************************************************
//
//! Selects the EMIF Controller.
//!
//! \param configBase is the configuration address of the EMIF instance used.
//!
//! \param select is the required controller configuration for EMIF1.
//!
//! This function selects the controller for an EMIF1 instance among CPU1 or
//! CPU2.<em> It is valid only for EMIF1 instance and not for EMIF2 instance.
//! Valid value for configBase parameter is EMIF1CONFIG_BASE. </em> Valid
//! values for select parameter can be \e EMIF_CONTROLLER_CPU1_NG,
//! \e EMIF_CONTROLLER_CPU1_G, \e EMIF_CONTROLLER_CPU2_G or
//! \e EMIF_CONTROLLER_CPU1_NG2.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_selectController(uint32_t configBase, EMIF_ControllerSelect select)
{
//
// Check the arguments.
//
ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase));
//
// Sets the bits that enables EMIF1 controller selection.
//
EALLOW;
HWREG(configBase + MEMCFG_O_EMIF1MSEL) = (EMIF_MSEL_KEY | (uint32_t)select);
EDIS;
}
//*****************************************************************************
//
//! Sets the access protection.
//!
//! \param configBase is the configuration address of the EMIF instance used.
//!
//! \param access is the required access protection configuration.
//!
//! This function sets the access protection for an EMIF instance from CPU
//! and DMA. The \e access parameter can be any of \b EMIF_ACCPROT0_FETCHPROT,
//! \b EMIF_ACCPROT0_CPUWRPROT \b EMIF_ACCPROT0_DMAWRPROT values or their
//! combination. <em> EMIF_ACCPROT0_DMAWRPROT value is valid as access parameter
//! for EMIF1 instance only </em>.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_setAccessProtection(uint32_t configBase, uint16_t access)
{
uint16_t temp;
//
// Check the arguments.
//
ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase) ||
EMIF_isEMIF2ConfigBaseValid(configBase));
if(configBase == EMIF1CONFIG_BASE)
{
ASSERT(access <= EMIF_ACCPROT0_MASK_EMIF1);
temp = EMIF_ACCPROT0_MASK_EMIF1;
}
else
{
ASSERT(access <= EMIF_ACCPROT0_MASK_EMIF2);
temp = EMIF_ACCPROT0_MASK_EMIF2;
}
//
// Sets the bits that enables access protection config.
//
EALLOW;
HWREGH(configBase + MEMCFG_O_EMIF1ACCPROT0) =
(HWREGH(configBase + MEMCFG_O_EMIF1ACCPROT0) & ~(temp)) | access;
EDIS;
}
//*****************************************************************************
//
//! Commits the lock configuration.
//!
//! \param configBase is the configuration address of the EMIF instance used.
//!
//! This function commits the access protection for an EMIF instance from
//! CPU & DMA.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_commitAccessConfig(uint32_t configBase)
{
//
// Check the arguments.
//
ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase) ||
EMIF_isEMIF2ConfigBaseValid(configBase));
//
// Sets the bits that commits access protection config.
//
EALLOW;
HWREGH(configBase + MEMCFG_O_EMIF1COMMIT) |=
MEMCFG_EMIF1COMMIT_COMMIT_EMIF1;
EDIS;
}
//*****************************************************************************
//
//! Locks the write to access configuration fields.
//!
//! \param configBase is the configuration address of the EMIF instance used.
//!
//! This function locks the write to access configuration fields i.e
//! ACCPROT0 & Mselect fields, for an EMIF instance.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_lockAccessConfig(uint32_t configBase)
{
//
// Check the arguments.
//
ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase) ||
EMIF_isEMIF2ConfigBaseValid(configBase));
//
// Sets the bits that locks access protection config.
//
EALLOW;
HWREGH(configBase + MEMCFG_O_EMIF1LOCK) |= MEMCFG_EMIF1LOCK_LOCK_EMIF1;
EDIS;
}
//*****************************************************************************
//
//! Unlocks the write to access configuration fields.
//!
//! \param configBase is the configuration address of the EMIF instance used.
//!
//! This function unlocks the write to access configuration fields such as
//! ACCPROT0 & Mselect fields, for an EMIF instance.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_unlockAccessConfig(uint32_t configBase)
{
//
// Check the arguments.
//
ASSERT(EMIF_isEMIF1ConfigBaseValid(configBase) ||
EMIF_isEMIF2ConfigBaseValid(configBase));
//
// Sets the bits that unlocks access protection config.
//
EALLOW;
HWREGH(configBase + MEMCFG_O_EMIF1LOCK) &=
~((uint16_t)MEMCFG_EMIF1LOCK_LOCK_EMIF1);
EDIS;
}
//*****************************************************************************
//
// Prototypes for Asynchronous Memory Interface
//
//*****************************************************************************
//*****************************************************************************
//
//! Selects the asynchronous mode of operation.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! \param offset is the offset of asynchronous chip select of EMIF instance.
//!
//! \param mode is the desired mode of operation for external memory.
//!
//!
//! This function sets the mode of operation for asynchronous memory
//! between Normal or Strobe mode. Valid values for param \e offset can be
//! \e EMIF_ASYNC_CS2_OFFSET, \e EMIF_ASYNC_CS3_OFFSET &
//! \e EMIF_ASYNC_C43_OFFSET for EMIF1 and \e EMIF_ASYNC_CS2_OFFSET for EMIF2.
//! Valid values for param \e mode can be \e EMIF_ASYNC_STROBE_MODE or
//! \e EMIF_ASYNC_NORMAL_MODE.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_setAsyncMode(uint32_t base, EMIF_AsyncCSOffset offset,
EMIF_AsyncMode mode)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
if(base == EMIF2_BASE)
{
ASSERT(offset == EMIF_ASYNC_CS2_OFFSET);
}
//
// Sets the async mode of operation.
//
HWREG(base + (uint32_t)offset) = (HWREG(base + (uint32_t)offset)
& ~((uint32_t)EMIF_ASYNC_CS2_CR_SS))
| (uint32_t)mode;
}
//*****************************************************************************
//
//! Enables the Extended Wait Mode.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! \param offset is the offset of asynchronous chip select of the
//! EMIF instance
//!
//! This function enables the extended wait mode for an asynchronous
//! external memory.Valid values for param \e offset can be
//! \e EMIF_ASYNC_CS2_OFFSET, \e EMIF_ASYNC_CS3_OFFSET &
//! \e EMIF_ASYNC_C43_OFFSET for EMIF1 and \e EMIF_ASYNC_CS2_OFFSET for EMIF2.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_enableAsyncExtendedWait(uint32_t base, EMIF_AsyncCSOffset offset)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
if(base == EMIF2_BASE)
{
ASSERT(offset == EMIF_ASYNC_CS2_OFFSET);
}
//
// Sets the bit that enables extended wait mode.
//
HWREG(base + (uint32_t)offset) = HWREG(base + (uint32_t)offset) |
EMIF_ASYNC_CS2_CR_EW;
}
//*****************************************************************************
//
//! Disables the Extended Wait Mode.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! \param offset is the offset of asynchronous chip select of EMIF instance.
//!
//! This function disables the extended wait mode for an asynchronous external
//! memory.Valid values for param \e offset can be \e EMIF_ASYNC_CS2_OFFSET,
//! \e EMIF_ASYNC_CS3_OFFSET & \e EMIF_ASYNC_C43_OFFSET for EMIF1 and
//! \e EMIF_ASYNC_CS2_OFFSET for EMIF2.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_disableAsyncExtendedWait(uint32_t base, EMIF_AsyncCSOffset offset)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
if(base == EMIF2_BASE)
{
ASSERT(offset == EMIF_ASYNC_CS2_OFFSET);
}
//
// Sets the bit that disables extended wait mode.
//
HWREG(base + (uint32_t)offset) = HWREG(base + (uint32_t)offset) &
~((uint32_t)EMIF_ASYNC_CS2_CR_EW);
}
//*****************************************************************************
//
//! Sets the wait polarity.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! \param polarity is desired wait polarity.
//!
//! This function sets the wait polarity for an asynchronous external memory.
//! Valid values for param \e polarity can be \e EMIF_ASYNC_WAIT_POLARITY_LOW
//! or \e EMIF_ASYNC_WAIT_POLARITY_HIGH.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_setAsyncWaitPolarity(uint32_t base, EMIF_AsyncWaitPolarity polarity)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
//
// Sets the polarity for async extended wait mode.
//
HWREG(base + EMIF_O_ASYNC_WCCR) = (HWREG(base + EMIF_O_ASYNC_WCCR)
& ~((uint32_t)EMIF_ASYNC_WCCR_WP0))
| (uint32_t)polarity;
}
//*****************************************************************************
//
//! Sets the Maximum Wait Cycles.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! \param value is the desired maximum wait cycles.
//!
//! This function sets the maximum wait cycles for extended asynchronous cycle.
//! Valid values for parameter \e value lies b/w 0x0U-0xFFU or 0-255.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_setAsyncMaximumWaitCycles(uint32_t base, uint16_t value)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
ASSERT(value <= (EMIF_ASYNC_WCCR_MAX_EXT_WAIT_M));
//
// Sets the bit that enables extended wait mode.
//
HWREGH(base + EMIF_O_ASYNC_WCCR) = (HWREGH(base + EMIF_O_ASYNC_WCCR)
& ~((uint16_t)EMIF_ASYNC_WCCR_MAX_EXT_WAIT_M))
| value;
}
//*****************************************************************************
//
//! Sets the Asynchronous Memory Timing Characteristics.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! \param offset is the offset of asynchronous chip select of EMIF instance.
//!
//! \param tParam is the desired timing parameters.
//!
//! This function sets timing characteristics for an external asynchronous
//! memory to be interfaced. Valid values for param \e offset can be
//! \e EMIF_ASYNC_CS2_OFFSET, \e EMIF_ASYNC_CS3_OFFSET and
//! \e EMIF_ASYNC_C43_OFFSET for EMIF1 & EMIF_ASYNC_CS2_OFFSET for EMIF2.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_setAsyncTimingParams(uint32_t base, EMIF_AsyncCSOffset offset,
const EMIF_AsyncTimingParams *tParam)
{
uint32_t temp;
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
if(base == EMIF2_BASE)
{
ASSERT(offset == EMIF_ASYNC_CS2_OFFSET);
}
//
// Sets the async memory timing parameters.
//
temp = (tParam->turnArnd << EMIF_ASYNC_CS2_CR_TA_S) |
(tParam->rHold << EMIF_ASYNC_CS2_CR_R_HOLD_S) |
(tParam->rStrobe << EMIF_ASYNC_CS2_CR_R_STROBE_S) |
(tParam->rSetup << EMIF_ASYNC_CS2_CR_R_SETUP_S) |
(tParam->wHold << EMIF_ASYNC_CS2_CR_W_HOLD_S) |
(tParam->wStrobe << EMIF_ASYNC_CS2_CR_W_STROBE_S) |
(tParam->wSetup << EMIF_ASYNC_CS2_CR_W_SETUP_S);
HWREG(base + (uint32_t)offset) = (HWREG(base + (uint32_t)offset) &
~EMIF_ASYNC_CS_CR_MASK) | temp;
}
//*****************************************************************************
//
//! Sets the Asynchronous Data Bus Width.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! \param offset is the offset of asynchronous chip select of EMIF instance.
//!
//! \param width is the data bus width of the memory.
//!
//! This function sets the data bus size for an external asynchronous memory
//! to be interfaced. Valid values for param \e offset can be
//! \e EMIF_ASYNC_CS2_OFFSET, \e EMIF_ASYNC_CS3_OFFSET &
//! \e EMIF_ASYNC_C43_OFFSET for EMIF1 and \e EMIF_ASYNC_CS2_OFFSET for EMIF2.
//! Valid values of param \e width can be \e EMIF_ASYNC_DATA_WIDTH_8,
//! \e EMIF_ASYNC_DATA_WIDTH_16 or \e EMIF_ASYNC_DATA_WIDTH_32.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_setAsyncDataBusWidth(uint32_t base, EMIF_AsyncCSOffset offset,
EMIF_AsyncDataWidth width)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
if(base == EMIF2_BASE)
{
ASSERT(offset == EMIF_ASYNC_CS2_OFFSET);
}
//
// Sets the async memory data bus width.
//
HWREGH(base + (uint32_t)offset) = (HWREGH(base + (uint32_t)offset)
& ~((uint16_t)EMIF_ASYNC_CS2_CR_ASIZE_M))
| (uint32_t)width;
}
//*****************************************************************************
//
// Prototypes for Interrupt Handling
//
//*****************************************************************************
//*****************************************************************************
//
//! Enables the Asynchronous Memory Interrupts.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! \param intFlags is the mask for desired interrupts.
//!
//! This function enables the desired interrupts for an external asynchronous
//! memory interface. Valid values for param \e intFlags can be
//! \b EMIF_ASYNC_INT_AT, \b EMIF_ASYNC_INT_LT, \b EMIF_ASYNC_INT_WR or their
//! combination.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_enableAsyncInterrupt(uint32_t base, uint16_t intFlags)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
ASSERT(intFlags <= EMIF_ASYNC_INT_MASK);
//
// Sets the bits that enables async memory interrupts.
//
HWREGH(base + EMIF_O_INT_MSK_SET) = intFlags;
}
//*****************************************************************************
//
//! Disables the Asynchronous Memory Interrupts.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! \param intFlags is the mask for interrupts to be disabled.
//!
//! This function disables the desired interrupts for an external asynchronous
//! memory interface. Valid values for param \e intFlags can be
//! \b EMIF_ASYNC_INT_AT, \b EMIF_ASYNC_INT_LT, \b EMIF_ASYNC_INT_WR or
//! their combination.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_disableAsyncInterrupt(uint32_t base, uint16_t intFlags)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
ASSERT(intFlags <= EMIF_ASYNC_INT_MASK);
//
// Sets the bits that disables async memory interrupts.
//
HWREGH(base + EMIF_O_INT_MSK_CLR) = intFlags;
}
//*****************************************************************************
//
//! Gets the interrupt status.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! This function gets the interrupt status for an EMIF instance.
//!
//! \return Returns the current interrupt status.
//
//*****************************************************************************
static inline uint16_t
EMIF_getAsyncInterruptStatus(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
//
// Gets the async memory interrupt status.
//
return(HWREGH(base + EMIF_O_INT_MSK) & EMIF_ASYNC_INT_MASK);
}
//*****************************************************************************
//
//! Clears the interrupt status for an EMIF instance.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! \param intFlags is the mask for the interrupt status to be cleared.
//!
//! This function clears the interrupt status for an EMIF instance.
//! The \e intFlags parameter can be any of \b EMIF_INT_MSK_SET_AT_MASK_SET,
//! \b EMIF_INT_MSK_SET_LT_MASK_SET, or \b EMIF_INT_MSK_SET_WR_MASK_SET_M
//! values or their combination.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_clearAsyncInterruptStatus(uint32_t base, uint16_t intFlags)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
ASSERT(intFlags <= EMIF_ASYNC_INT_MASK);
//
// Sets the bit that clears desired async memory interrupts.
//
HWREGH(base + EMIF_O_INT_MSK) = intFlags;
}
//*****************************************************************************
//
// Prototypes for Synchronous Memory Interface
//
//*****************************************************************************
//*****************************************************************************
//
//! Sets the Synchronous Memory Timing Parameters.
//!
//! \param base is the base address of an EMIF instance.
//!
//! \param tParam is parameters from memory datasheet in \e ns.
//!
//! This function sets the timing characteristics for an external
//! synchronous memory to be interfaced.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_setSyncTimingParams(uint32_t base, const EMIF_SyncTimingParams *tParam)
{
uint32_t temp;
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
//
// Sets sync memory timing parameters.
//
temp = ((tParam->tRrd << EMIF_SDRAM_TR_T_RRD_S)
& EMIF_SDRAM_TR_T_RRD_M)
| ((tParam->tRc << EMIF_SDRAM_TR_T_RC_S)
& EMIF_SDRAM_TR_T_RC_M)
| ((tParam->tRas << EMIF_SDRAM_TR_T_RAS_S)
& EMIF_SDRAM_TR_T_RAS_M)
| ((tParam->tWr << EMIF_SDRAM_TR_T_WR_S)
& EMIF_SDRAM_TR_T_WR_M)
| ((tParam->tRcd << EMIF_SDRAM_TR_T_RCD_S)
& EMIF_SDRAM_TR_T_RCD_M)
| ((tParam->tRp << EMIF_SDRAM_TR_T_RP_S)
& EMIF_SDRAM_TR_T_RP_M)
| ((tParam->tRfc << EMIF_SDRAM_TR_T_RFC_S)
& EMIF_SDRAM_TR_T_RFC_M);
HWREG(base + EMIF_O_SDRAM_TR) = (HWREG(base + EMIF_O_SDRAM_TR) &
~EMIF_SYNC_SDRAM_TR_MASK) | temp;
}
//*****************************************************************************
//
//! Sets the SDRAM Self Refresh Exit Timing.
//!
//! \param base is the base address of an EMIF instance.
//!
//! \param tXs is the desired timing value.
//!
//! This function sets the self refresh exit timing for an external
//! synchronous memory to be interfaced. tXs values must lie between
//! 0x0U-0x1FU or 0-31.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_setSyncSelfRefreshExitTmng(uint32_t base, uint16_t tXs)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
ASSERT(tXs <= EMIF_SDR_EXT_TMNG_T_XS_M);
//
// Sets the self refresh exit timing for sync memory.
//
HWREGH(base + EMIF_O_SDR_EXT_TMNG) = (HWREGH(base + EMIF_O_SDR_EXT_TMNG)
& ~((uint16_t)EMIF_SDR_EXT_TMNG_T_XS_M))
| tXs;
}
//*****************************************************************************
//
//! Sets the SDR Refresh Rate.
//!
//! \param base is the base address of an EMIF instance.
//!
//! \param refRate is the refresh rate.
//!
//! This function sets the refresh rate for an external synchronous memory
//! to be interfaced. Valid values for refRate lies b/w 0x0U-0x1FFFU or
//! 0-8191.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_setSyncRefreshRate(uint32_t base, uint16_t refRate)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
ASSERT(refRate <= EMIF_SDRAM_RCR_REFRESH_RATE_M);
//
// Sets the sync memory refresh rate.
//
HWREGH(base + EMIF_O_SDRAM_RCR) = (HWREGH(base + EMIF_O_SDRAM_RCR)
& (~(uint16_t)EMIF_SDRAM_RCR_REFRESH_RATE_M))
| refRate;
}
//*****************************************************************************
//
//! Sets the Synchronous Memory configuration parameters.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! \param config is the desired configuration parameters.
//!
//! This function sets configuration parameters like CL, NM, IBANK
//! and PAGESIZE for an external synchronous memory to be interfaced.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_setSyncMemoryConfig(uint32_t base, const EMIF_SyncConfig *config)
{
uint32_t temp;
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
//
// Sets the sync memory configuration bits.
//
temp = ((uint32_t)config->casLatency | (uint32_t)config->iBank |
(uint32_t)config->narrowMode | (uint32_t)config->pageSize);
HWREG(base + EMIF_O_SDRAM_CR) = (HWREG(base + EMIF_O_SDRAM_CR) &
~EMIF_SYNC_SDRAM_CR_MASK) | temp;
}
//*****************************************************************************
//
// Prototypes for EMIF Low Power Modes
//
//*****************************************************************************
//*****************************************************************************
//
//! Enables Self Refresh.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! This function enables Self Refresh Mode for EMIF.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_enableSyncSelfRefresh(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
//
// Sets the bits that enables sync memory self refresh mode.
//
HWREG(base + EMIF_O_SDRAM_CR) |= EMIF_SDRAM_CR_SR;
}
//*****************************************************************************
//
//! Disables Self Refresh.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! This function disables Self Refresh Mode for EMIF.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_disableSyncSelfRefresh(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
//
// Sets the bits that disables sync memory self refresh mode.
//
HWREG(base + EMIF_O_SDRAM_CR) &= ~((uint32_t)EMIF_SDRAM_CR_SR);
}
//*****************************************************************************
//
//! Enables Power Down.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! This function Enables Power Down Mode for synchronous memory
//! to be interfaced.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_enableSyncPowerDown(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
//
// Sets the bits that enables sync memory power down mode.
//
HWREG(base + EMIF_O_SDRAM_CR) |= EMIF_SDRAM_CR_PD;
}
//*****************************************************************************
//
//! Disables Power Down.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! This function disables Power Down Mode for synchronous memory
//! to be interfaced.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_disableSyncPowerDown(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
//
// Sets the bits that disables sync memory power down mode.
//
HWREG(base + EMIF_O_SDRAM_CR) &= ~((uint32_t)EMIF_SDRAM_CR_PD);
}
//*****************************************************************************
//
//! Enables Refresh in Power Down.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! This function enables Refresh in Power Down Mode for synchronous memory
//! to be interfaced.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_enableSyncRefreshInPowerDown(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
//
// Sets the bits that enables refresh in power down mode.
//
HWREG(base + EMIF_O_SDRAM_CR) |= EMIF_SDRAM_CR_PDWR;
}
//*****************************************************************************
//
//! Disables Refresh in Power Down.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! This function disables Refresh in Power Down Mode for synchronous memory
//! to be interfaced.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EMIF_disableSyncRefreshInPowerDown(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
//
// Sets the bits that disables refresh in power down mode.
//
HWREG(base + EMIF_O_SDRAM_CR) &= ~((uint32_t)EMIF_SDRAM_CR_PDWR);
}
//*****************************************************************************
//
//! Gets total number of SDRAM accesses.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! This function returns total number of SDRAM accesses
//! from a controller(CPUx/CPUx.DMA).
//!
//! \return \e Returns total number of accesses to SDRAM.
//
//*****************************************************************************
static inline uint32_t
EMIF_getSyncTotalAccesses(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
//
// Gets total accesses to sync memory.
//
return(HWREG(base + EMIF_O_TOTAL_SDRAM_AR));
}
//*****************************************************************************
//
//! Gets total number of SDRAM accesses which require activate command.
//!
//! \param base is the base address of the EMIF instance used.
//!
//! This function returns total number of accesses to SDRAM which
//! require activate command.
//!
//!\return \e Returns total number of accesses to SDRAM which require activate.
//
//*****************************************************************************
static inline uint32_t
EMIF_getSyncTotalActivateAccesses(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(EMIF_isBaseValid(base));
//
// Gets total accesses to sync memory which requires activate command.
//
return(HWREG(base + EMIF_O_TOTAL_SDRAM_ACTR));
}
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif
#endif // EMIF_H