123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398 |
- /**********************************************************************
- * $Id$ lpc_emc.c 2011-06-02
- *//**
- * @file lpc_emc.c
- * @brief Contains all functions support for EMC firmware library
- * on LPC
- * @version 1.0
- * @date 02. June. 2011
- * @author NXP MCU SW Application Team
- *
- * Copyright(C) 2011, NXP Semiconductor
- * All rights reserved.
- *
- ***********************************************************************
- * Software that is described herein is for illustrative purposes only
- * which provides customers with programming information regarding the
- * products. This software is supplied "AS IS" without any warranties.
- * NXP Semiconductors assumes no responsibility or liability for the
- * use of the software, conveys no license or title under any patent,
- * copyright, or mask work right to the product. NXP Semiconductors
- * reserves the right to make changes in the software without
- * notification. NXP Semiconductors also make no representation or
- * warranty that such application will be suitable for the specified
- * use without further testing or modification.
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, under NXP Semiconductors'
- * relevant copyright in the software, without fee, provided that it
- * is used in conjunction with NXP Semiconductors microcontrollers. This
- * copyright, permission, and disclaimer notice must appear in all copies of
- * this code.
- **********************************************************************/
- #ifdef __BUILD_WITH_EXAMPLE__
- #include "lpc_libcfg.h"
- #else
- #include "lpc_libcfg_default.h"
- #endif /* __BUILD_WITH_EXAMPLE__ */
- #ifdef _EMC
- #include "lpc_emc.h"
- #include "lpc_clkpwr.h"
- #include "lpc_pinsel.h"
- /* Peripheral group ----------------------------------------------------------- */
- /** @addtogroup EMC
- * @{
- */
-
- /** @defgroup EMC_Public_Functions
- * @{
- */
- /*********************************************************************
- * @brief Calculate refresh timer (the multiple of 16 CCLKs)
- * @param[in] freq - frequency of EMC Clk
- * @param[in] time - micro second
- * @return None
- **********************************************************************/
- uint32_t EMC_SDRAM_REFRESH(uint32_t time)
- {
- uint32_t emc_freq = CLKPWR_GetCLK(CLKPWR_CLKTYPE_EMC);
- return (((uint64_t)((uint64_t)time * emc_freq)/16000000ull)+1);
- }
- /*********************************************************************
- * @brief Calculate EMC Clock from nano second
- * @param[in] time - nano second
- * @return None
- **********************************************************************/
- uint32_t EMC_NS2CLK(uint32_t time){
- uint32_t emc_freq = CLKPWR_GetCLK(CLKPWR_CLKTYPE_EMC);
- return (((uint64_t)time*emc_freq/1000000000ull));
- }
- /*********************************************************************
- * @brief Power on EMC Block
- * @param[in] None
- * @return None
- **********************************************************************/
- EMC_FUNC_CODE EMC_PwrOn(void)
- {
- // If CPU clock is > 80 MHz, then divide it by two to create the EMC clock
- if(CLKPWR_GetCLK(CLKPWR_CLKTYPE_CPU) > 80000000) {
- CLKPWR_SetCLKDiv(CLKPWR_CLKTYPE_EMC, 1); // CPU clock / 2
- } else {
- CLKPWR_SetCLKDiv(CLKPWR_CLKTYPE_EMC, 0); // Same clock as CPU
- }
- // Power on
- CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCEMC, ENABLE);
- // Enable
- LPC_EMC->Control = EMC_Control_E;
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Initialize external dynamic memory
- * @param[in] pConfig Configuration
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM/EMC_FUNC_ERR
- **********************************************************************/
- EMC_FUNC_CODE DynMem_Init(EMC_DYN_MEM_Config_Type* pConfig)
- {
- uint32_t i = 0;
- EMC_FUNC_CODE ret = EMC_FUNC_OK;
- /* Pin configuration:
- * P2.16 - /EMC_CAS
- * P2.17 - /EMC_RAS
- * P2.18 - EMC_CLK[0]
- * P2.19 - EMC_CLK[1]
- *
- * P2.20 - EMC_DYCS0
- * P2.21 - EMC_DYCS1
- * P2.22 - EMC_DYCS2
- * P2.23 - EMC_DYCS3
- *
- * P2.24 - EMC_CKE0
- * P2.25 - EMC_CKE1
- * P2.26 - EMC_CKE2
- * P2.27 - EMC_CKE3
- *
- * P2.28 - EMC_DQM0
- * P2.29 - EMC_DQM1
- * P2.30 - EMC_DQM2
- * P2.31 - EMC_DQM3
- *
- * P3.0-P3.31 - EMC_D[0-31]
- * P4.0-P4.23 - EMC_A[0-23]
- * P5.0-P5.1 - EMC_A[24-25]
- *
- * P4.25 - EMC_WE
- */
- PINSEL_ConfigPin(2,16,1);
- PINSEL_ConfigPin(2,17,1);
- PINSEL_ConfigPin(2,18,1);
- PINSEL_ConfigPin(2,19,1);
- PINSEL_ConfigPin(2,20,1);
- PINSEL_ConfigPin(2,21,1);
- PINSEL_ConfigPin(2,22,1);
- PINSEL_ConfigPin(2,23,1);
- PINSEL_ConfigPin(2,24,1);
- PINSEL_ConfigPin(2,25,1);
- PINSEL_ConfigPin(2,26,1);
- PINSEL_ConfigPin(2,27,1);
- PINSEL_ConfigPin(2,28,1);
- PINSEL_ConfigPin(2,29,1);
- PINSEL_ConfigPin(2,30,1);
- PINSEL_ConfigPin(2,31,1);
- for(i = 0; i < 32; i++)
- {
- PINSEL_ConfigPin(3,i,1);
- PINSEL_ConfigPin(4,i,1);
- }
- PINSEL_ConfigPin(5,0,1);
- PINSEL_ConfigPin(5,1,1);
- // Power On
- ret |= EMC_PwrOn();
- /*Init SDRAM controller*/
- LPC_SC->EMCDLYCTL |= (8<<0);
- /*Set data read delay*/
- LPC_SC->EMCDLYCTL |=(8<<8);
- LPC_SC->EMCDLYCTL |= (0x08 <<16);
- ret |= EMC_ConfigEndianMode(EMC_Config_Little_Endian_Mode);
-
- /* Dynamic memory setting */
- ret |= EMC_DynCtrlSelfRefresh(EMC_DYNAMIC_CTRL_SR_NORMALMODE);
- ret |= EMC_DynCtrlPowerDownMode(EMC_DYNAMIC_CTRL_DP_NORMAL);
- ret |= EMC_DynCtrlClockEnable(EMC_DYNAMIC_CTRL_CE_ALLCLK_HI);
- ret |= EMC_DynCtrlMMC(EMC_DYNAMIC_CTRL_MMC_CLKOUT_ENABLED);
- ret |= EMC_DynCtrlClockControl(EMC_DYNAMIC_CTRL_CE_CLKOUT_CONT);
- /* Timing */
- ret |= EMC_SetDynMemoryParameter(EMC_DYN_MEM_REFRESH_TIMER, pConfig->RefreshTime);
- ret |= EMC_SetDynMemoryParameter(EMC_DYN_MEM_READ_CONFIG, pConfig->ReadConfig);
- ret |= EMC_SetDynMemoryParameter(EMC_DYN_MEM_TRP, pConfig->PrechargeCmdPeriod);
- ret |= EMC_SetDynMemoryParameter(EMC_DYN_MEM_TRAS, pConfig->Active2PreChargeTime);
- ret |= EMC_SetDynMemoryParameter(EMC_DYN_MEM_TSREX, pConfig->SeftRefreshExitTime);
- ret |= EMC_SetDynMemoryParameter(EMC_DYN_MEM_TAPR, pConfig->DataOut2ActiveTime);
- ret |= EMC_SetDynMemoryParameter(EMC_DYN_MEM_TDAL, pConfig->DataIn2ActiveTime);
- ret |= EMC_SetDynMemoryParameter(EMC_DYN_MEM_TWR, pConfig->WriteRecoveryTime);
- ret |= EMC_SetDynMemoryParameter(EMC_DYN_MEM_TRC, pConfig->Active2ActivePeriod);
- ret |= EMC_SetDynMemoryParameter(EMC_DYN_MEM_TRFC, pConfig->AutoRefrehPeriod);
- ret |= EMC_SetDynMemoryParameter(EMC_DYN_MEM_TXSR, pConfig->ExitSelfRefreshTime);
- ret |= EMC_SetDynMemoryParameter(EMC_DYN_MEM_TRRD, pConfig->ActiveBankLatency);
- ret |= EMC_SetDynMemoryParameter(EMC_DYN_MEM_TMRD, pConfig->LoadModeReg2Active);
- ret |= EMC_DynMemRAS(pConfig->CSn,pConfig->RASLatency);
- ret |= EMC_DynMemCAS(pConfig->CSn,pConfig->CASLatency);
- ret |= EMC_DynMemConfigMD(pConfig->CSn,EMC_DYNAMIC_CFG_MEMDEV_SDRAM);
- ret |= EMC_DynMemConfigAM(pConfig->CSn, pConfig->AddrBusWidth, pConfig->AddrMap, pConfig->DataWidth, pConfig->ChipSize);
- return ret;
- }
- /*********************************************************************//**
- * @brief Initialize external static memory
- * @param[in] pConfig Configuration
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM/EMC_FUNC_ERR
- **********************************************************************/
- EMC_FUNC_CODE StaticMem_Init(EMC_STATIC_MEM_Config_Type* pConfig)
- {
- uint32_t i;
- EMC_FUNC_CODE ret = EMC_FUNC_OK;
- /* Pin configuration:
- * P4.30 - /EMC_CS0
- * P4.31 - /EMC_CS1
- * P2.14 - /EMC_CS2
- * P2.15 - /EMC_CS3
- *
- *
- * P3.0-P3.31 - EMC_D[0-31]
- * P4.0-P4.23 - EMC_A[0-23]
- * P5.0-P5.1 - EMC_A[24-25]
- *
- * P4.24 - /EMC_OE
- * P4.25 - /EMC_WE
- *
- */
- PINSEL_ConfigPin(2,14,1);
- PINSEL_ConfigPin(2,15,1);
- for(i = 0; i < 32; i++)
- {
- PINSEL_ConfigPin(3,i,1);
- PINSEL_ConfigPin(4,i,1);
- }
- PINSEL_ConfigPin(5,0,1);
- PINSEL_ConfigPin(5,1,1);
- // Power On
- ret |= EMC_PwrOn();
- // Configuration
- if(pConfig->AddressMirror)
- {
- LPC_EMC->Control |= EMC_Control_M;
- }
- ret |= EMC_StaMemConfigMW(pConfig->CSn,pConfig->DataWidth);
-
- if(pConfig->PageMode)
- ret |= EMC_StaMemConfigPM(pConfig->CSn,EMC_CFG_PM_ASYNC_ENABLE);
- else
- ret |= EMC_StaMemConfigPM(pConfig->CSn,EMC_CFG_PM_DISABLE);
- if(pConfig->ByteLane)
- ret |= EMC_StaMemConfigPB(pConfig->CSn, EMC_CFG_BYTELAND_READ_BITSLOW);
- else
- ret |= EMC_StaMemConfigPB(pConfig->CSn, EMC_CFG_BYTELAND_READ_BITSHIGH);
- if(pConfig->ExtendedWait)
- ret |= EMC_StaMemConfigEW(pConfig->CSn,EMC_CFG_EW_ENABLED);
- else
- ret |= EMC_StaMemConfigEW(pConfig->CSn,EMC_CFG_EW_DISABLED);
- // Timing
- ret |= EMC_SetStaMemoryParameter(pConfig->CSn,EMC_STA_MEM_WAITWEN, pConfig->WaitWEn);
- ret |= EMC_SetStaMemoryParameter(pConfig->CSn,EMC_STA_MEM_WAITOEN, pConfig->WaitOEn);
- ret |= EMC_SetStaMemoryParameter(pConfig->CSn,EMC_STA_MEM_WAITRD, pConfig->WaitRd);
- ret |= EMC_SetStaMemoryParameter(pConfig->CSn,EMC_STA_MEM_WAITPAGE, pConfig->WaitPage);
- ret |= EMC_SetStaMemoryParameter(pConfig->CSn,EMC_STA_MEM_WAITWR, pConfig->WaitWr);
- ret |= EMC_SetStaMemoryParameter(pConfig->CSn,EMC_STA_MEM_WAITTURN, pConfig->WaitTurn);
- return ret;
- }
- /*********************************************************************//**
- * @brief EMC initialize (power on block, config EMC pins).
- * @param[in] None
- * @return None
- **********************************************************************/
- EMC_FUNC_CODE EMC_Init(void)
- {
- uint8_t i;
- // If CPU clock is > 80 MHz, then divide it by two to create the EMC clock
- if(CLKPWR_GetCLK(CLKPWR_CLKTYPE_CPU) > 80000000) {
- CLKPWR_SetCLKDiv(CLKPWR_CLKTYPE_EMC, 1); // CPU clock / 2
- } else {
- CLKPWR_SetCLKDiv(CLKPWR_CLKTYPE_EMC, 0); // Same clock as CPU
- }
- LPC_SC->PCONP |= 0x00000800;
- LPC_SC->EMCDLYCTL = 0x00001010;
- LPC_EMC->Control = 0x00000001;
- LPC_EMC->Config = 0x00000000;
- /* Pin configuration:
- * P2.14 - /EMC_CS2
- * P2.15 - /EMC_CS3
- *
- * P2.16 - /EMC_CAS
- * P2.17 - /EMC_RAS
- * P2.18 - EMC_CLK[0]
- * P2.19 - EMC_CLK[1]
- *
- * P2.20 - EMC_DYCS0
- * P2.21 - EMC_DYCS1
- * P2.22 - EMC_DYCS2
- * P2.23 - EMC_DYCS3
- *
- * P2.24 - EMC_CKE0
- * P2.25 - EMC_CKE1
- * P2.26 - EMC_CKE2
- * P2.27 - EMC_CKE3
- *
- * P2.28 - EMC_DQM0
- * P2.29 - EMC_DQM1
- * P2.30 - EMC_DQM2
- * P2.31 - EMC_DQM3
- *
- * P3.0-P3.31 - EMC_D[0-31]
- * P4.0-P4.23 - EMC_A[0-23]
- * P5.0-P5.1 - EMC_A[24-25]
- *
- * P4.24 - /EMC_OE
- * P4.25 - /EMC_WE
- *
- * P4.30 - /EMC_CS0
- * P4.31 - /EMC_CS1
- */
- PINSEL_ConfigPin(2,14,1);
- PINSEL_ConfigPin(2,15,1);
- PINSEL_ConfigPin(2,16,1);
- PINSEL_ConfigPin(2,17,1);
- PINSEL_ConfigPin(2,18,1);
- PINSEL_ConfigPin(2,19,1);
- PINSEL_ConfigPin(2,20,1);
- PINSEL_ConfigPin(2,21,1);
- PINSEL_ConfigPin(2,22,1);
- PINSEL_ConfigPin(2,23,1);
- PINSEL_ConfigPin(2,24,1);
- PINSEL_ConfigPin(2,25,1);
- PINSEL_ConfigPin(2,26,1);
- PINSEL_ConfigPin(2,27,1);
- PINSEL_ConfigPin(2,28,1);
- PINSEL_ConfigPin(2,29,1);
- PINSEL_ConfigPin(2,30,1);
- PINSEL_ConfigPin(2,31,1);
- for(i = 0; i < 32; i++)
- {
- PINSEL_ConfigPin(3,i,1);
- PINSEL_ConfigPin(4,i,1);
- }
- PINSEL_ConfigPin(5,0,1);
- PINSEL_ConfigPin(5,1,1);
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Configure Little Endian/Big Endian mode for EMC
- *
- * @param[in] endia_mode Endian mode, should be:
- *
- * - EMC_Config_Little_Endian_Mode: Little-endian mode
- *
- * - EMC_Config_Big_Endian_Mode : Big-endian mode
- *
- * @return EMC_FUNC_OK
- **********************************************************************/
- EMC_FUNC_CODE EMC_ConfigEndianMode(uint32_t endian_mode)
- {
- LPC_EMC->Config &= ~(EMC_Config_Endian_Mask);
- LPC_EMC->Config |= (endian_mode&EMC_Config_Endian_Mask);
- return EMC_FUNC_OK;
- }
- /****************** Group of Dynamic control functions************************/
- /*********************************************************************//**
- * @brief Set the dsvalue for dynamic clock enable bit
- *
- * @param[in] clock_enable clock enable mode, should be:
- *
- * - EMC_DYNAMIC_CTRL_CE_SAVEPWR: Clock enable of idle devices
- * are deasserted to save power
- *
- * - EMC_DYNAMIC_CTRL_CE_ALLCLK_HI: All clock enables are driven
- * HIGH continuously
- *
- * @return EMC_FUNC_CODE
- **********************************************************************/
- EMC_FUNC_CODE EMC_DynCtrlClockEnable(uint32_t clock_enable)
- {
- LPC_EMC->DynamicControl &= ~(EMC_DYNAMIC_CTRL_MEMCLK_EN_BMASK);
- LPC_EMC->DynamicControl |= clock_enable & EMC_DYNAMIC_CTRL_MEMCLK_EN_BMASK;
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Set the value for dynamic memory clock control: stops or
- * runs continuously
- *
- * @param[in] clock_control clock control mode, should be:
- *
- * - EMC_DYNAMIC_CTRL_CS_CLKOUT_STOP: CLKOUT stops when all
- * SDRAMs are idle and during self-refresh mode
- *
- * - EMC_DYNAMIC_CTRL_CS_CLKOUT_CONT: CLKOUT runs continuously
- *
- * @return EMC_FUNC_OK
- **********************************************************************/
- EMC_FUNC_CODE EMC_DynCtrlClockControl(int32_t clock_control)
- {
- LPC_EMC->DynamicControl &= ~EMC_DYNAMIC_CTRL_CLKCTRL_BMASK;
- LPC_EMC->DynamicControl |= clock_control & EMC_DYNAMIC_CTRL_CLKCTRL_BMASK;
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Switch the Self-refresh mode between normal and self-refresh mode
- *
- * @param[in] self_refresh_mode self refresh mode, should be:
- *
- * - EMC_DYNAMIC_CTRL_SR_NORMALMODE: Normal mode
- *
- * - EMC_DYNAMIC_CTRL_SR_SELFREFRESH: Enter self-refresh mode
- *
- * @return EMC_FUNC_OK
- **********************************************************************/
- EMC_FUNC_CODE EMC_DynCtrlSelfRefresh(uint32_t self_refresh_mode)
- {
- LPC_EMC->DynamicControl &= ~EMC_DYNAMIC_CTRL_SELFREFRESH_REQ_BMASK;
- LPC_EMC->DynamicControl =self_refresh_mode & EMC_DYNAMIC_CTRL_SELFREFRESH_REQ_BMASK;
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Enable/disable CLKOUT
- *
- * @param[in] MMC_val Memory clock control mode, should be:
- *
- * - EMC_DYNAMIC_CTRL_MMC_CLKOUT_ENABLED: CLKOUT enabled
- *
- * - EMC_DYNAMIC_CTRL_MMC_CLKOUT_DISABLED: CLKOUT disabled
- *
- * @return EMC_FUNC_OK
- **********************************************************************/
- EMC_FUNC_CODE EMC_DynCtrlMMC(uint32_t MMC_val)
- {
- LPC_EMC->DynamicControl &= ~EMC_DYNAMIC_CTRL_MMC_CLKOUTCTRL_BMASK;
- LPC_EMC->DynamicControl |=MMC_val & EMC_DYNAMIC_CTRL_MMC_CLKOUTCTRL_BMASK;
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Issue SDRAM command
- *
- * @param[in] SDRAM_command Command mode, should be:
- *
- * - EMC_DYNAMIC_CTRL_SDRAM_NORMAL: Issue SDRAM NORMAL operation command
- *
- * - EMC_DYNAMIC_CTRL_SDRAM_MODE: Issue SDRAM MODE command
- *
- * - EMC_DYNAMIC_CTRL_SDRAM_PALL: Issue SDRAM PALL (precharge all) command
- *
- * - EMC_DYNAMIC_CTRL_SDRAM_NOP: Issue SRAM NOP (no operation) command
- *
- * @return EMC_FUNC_OK
- **********************************************************************/
- EMC_FUNC_CODE EMC_DynCtrlSDRAMInit(uint32_t SDRAM_command)
- {
- LPC_EMC->DynamicControl &= ~EMC_DYNAMIC_CTRL_SDRAM_INIT_BMASK;
- LPC_EMC->DynamicControl |= SDRAM_command & EMC_DYNAMIC_CTRL_SDRAM_INIT_BMASK;
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Switch between Normal operation and deep sleep power mode
- *
- * @param[in] Power_command Low-power SDRAM deep-sleep mode, should be:
- *
- * - EMC_DYNAMIC_CTRL_DP_NORMAL: Normal operation
- *
- * - EMC_DYNAMIC_CTRL_DP_DEEPSLEEP: Enter deep-sleep mode
- *
- * @return EMC_FUNC_OK
- **********************************************************************/
- EMC_FUNC_CODE EMC_DynCtrlPowerDownMode(uint32_t Power_command)
- {
- LPC_EMC->DynamicControl &= ~EMC_DYNAMIC_CTRL_SDRAM_PWRMODE_BMASK;
- LPC_EMC->DynamicControl |= Power_command & EMC_DYNAMIC_CTRL_SDRAM_PWRMODE_BMASK;
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Set the value of EMC dynamic memory registers
- *
- * @param[in] par EMC register that will set value, should be:
- * - EMC_DYN_MEM_REFRESH_TIMER: Dynamic Refresh register
- * - EMC_DYN_MEM_READ_CONFIG: Dynamic Read Config register
- * - EMC_DYN_MEM_TRP: Dynamic RP register
- * - EMC_DYN_MEM_TRAS: Dynamic RAS register
- * - EMC_DYN_MEM_TSREX: Dynamic SREX register
- * - EMC_DYN_MEM_TAPR: Dynamic APR register
- * - EMC_DYN_MEM_TDAL: Dynamic DAL register
- * - EMC_DYN_MEM_TWR: Dynamic WR register
- * - EMC_DYN_MEM_TRC: Dynamic RC register
- * - EMC_DYN_MEM_TRFC: Dynamic RFC register
- * - EMC_DYN_MEM_TXSR: Dynamic XSR register
- * - EMC_DYN_MEM_TRRD: Dynamic RRD register
- * - EMC_DYN_MEM_TMRD: Dynamic MRD register
- *
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM
- **********************************************************************/
- EMC_FUNC_CODE EMC_SetDynMemoryParameter(EMC_DYN_MEM_PAR par, uint32_t val)
- {
- switch ( par)
- {
- case EMC_DYN_MEM_REFRESH_TIMER:
- LPC_EMC->DynamicRefresh = EMC_DynamicRefresh_REFRESH(val);
- break;
-
- case EMC_DYN_MEM_READ_CONFIG:
- LPC_EMC->DynamicReadConfig = EMC_DynamicReadConfig_RD(val);
- break;
-
- case EMC_DYN_MEM_TRP:
- LPC_EMC->DynamicRP = EMC_DynamictRP_tRP(val);
- break;
-
- case EMC_DYN_MEM_TRAS:
- LPC_EMC->DynamicRAS = EMC_DynamictRP_tRAS(val);
- break;
-
- case EMC_DYN_MEM_TSREX:
- LPC_EMC->DynamicSREX = EMC_DynamictRP_tSREX(val);
- break;
-
- case EMC_DYN_MEM_TAPR:
- LPC_EMC->DynamicAPR = EMC_DynamictAPR_tAPR(val);
- break;
-
- case EMC_DYN_MEM_TDAL:
- LPC_EMC->DynamicDAL =EMC_DynamictDAL_tDAL(val);
- break;
-
- case EMC_DYN_MEM_TWR:
- LPC_EMC->DynamicWR = EMC_DynamictWR_tWR(val);
- break;
-
- case EMC_DYN_MEM_TRC:
- LPC_EMC->DynamicRC = EMC_DynamictRC_tRC(val);
- break;
-
- case EMC_DYN_MEM_TRFC:
- LPC_EMC->DynamicRFC = EMC_DynamictRFC_tRFC(val);
- break;
-
- case EMC_DYN_MEM_TXSR:
- LPC_EMC->DynamicXSR = EMC_DynamictXSR_tXSR(val);
- break;
-
- case EMC_DYN_MEM_TRRD:
- LPC_EMC->DynamicRRD = EMC_DynamictRRD_tRRD(val);
- break;
-
- case EMC_DYN_MEM_TMRD:
- LPC_EMC->DynamicMRD = EMC_DynamictMRD_tMRD(val);
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Configure the memory device
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] mem_dev Memory device, should be:
- *
- * - EMC_DYNAMIC_CFG_MEMDEV_SDRAM: SDRAM
- *
- * - EMC_DYNAMIC_CFG_MEMDEV_LOWPWR_SDRAM: Low-power SDRAM
- *
- *
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM
- **********************************************************************/
- EMC_FUNC_CODE EMC_DynMemConfigMD(uint32_t index , uint32_t mem_dev)
- {
- switch (index)
- {
- case 0:
- LPC_EMC->DynamicConfig0 &= ~EMC_DYNAMIC_CFG_MEMDEV_BMASK;
- LPC_EMC->DynamicConfig0 |= mem_dev & EMC_DYNAMIC_CFG_MEMDEV_BMASK;
- break;
-
- case 1:
- LPC_EMC->DynamicConfig1 &= ~EMC_DYNAMIC_CFG_MEMDEV_BMASK;
- LPC_EMC->DynamicConfig1 |= mem_dev & EMC_DYNAMIC_CFG_MEMDEV_BMASK;
- break;
-
- case 2:
- LPC_EMC->DynamicConfig2 &= ~EMC_DYNAMIC_CFG_MEMDEV_BMASK;
- LPC_EMC->DynamicConfig2 |= mem_dev & EMC_DYNAMIC_CFG_MEMDEV_BMASK;
- break;
-
- case 3:
- LPC_EMC->DynamicConfig3 &= ~EMC_DYNAMIC_CFG_MEMDEV_BMASK;
- LPC_EMC->DynamicConfig3 |= mem_dev & EMC_DYNAMIC_CFG_MEMDEV_BMASK;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Map the address for the memory device
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] add_mapped address where the memory will be mapped
- *
- * @return EMC_FUNC_OK
- **********************************************************************/
- EMC_FUNC_CODE EMC_DynMemConfigAM(uint32_t index ,
- uint8_t addr_bus_width, uint8_t addr_map,
- uint8_t data_bus_width,
- uint16_t chip_size)
- {
- const int chip_max_size = 512; // 512Mb
- uint8_t data_bus_max_size = 0;
- uint32_t add_mapped_p1 = 0x00, add_mapped_p2 = 0x00, add_mapped_p3 = 0x00;
- uint32_t tmp = 16, i = 0, j = 0;
- /* Get part 3 of address map */
- switch(addr_bus_width)
- {
- case 16:
- add_mapped_p3 = 0;
- data_bus_max_size = 16;
- break;
- case 32:
- add_mapped_p3 = 1;
- data_bus_max_size = 32;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- /* Get part 2 of address map */
- add_mapped_p2 = EMC_DYNAMIC_CFG_ADD_MAP_P2(addr_map);
- /* Get part 1 of address map */
- if(chip_size == 16)
- {
- if(data_bus_width == 8)
- add_mapped_p1 = 0;
- else if(data_bus_width == 16)
- add_mapped_p1 = 1;
- else
- return EMC_FUNC_INVALID_PARAM;
- }
- else
- {
- while(1)
- {
- i++;
- tmp = 16*(0x01 << (i+1));
- if(tmp == chip_size)
- {
- for(j = 0; (8<<j)<=data_bus_max_size;j++)
- {
- if((8<<j) == data_bus_width)
- break;
- }
- if( (8<<j) > data_bus_max_size)
- return EMC_FUNC_INVALID_PARAM;
-
- add_mapped_p1 = (i<<2) + j;
- break;
- }
- if(tmp >= chip_max_size)
- {
- return EMC_FUNC_INVALID_PARAM;
- }
- }
- }
-
- switch ( index)
- {
- case 0:
- LPC_EMC->DynamicConfig0 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P1_MASK;
- LPC_EMC->DynamicConfig0 |= EMC_DYNAMIC_CFG_ADD_MAP_P1(add_mapped_p1);
- LPC_EMC->DynamicConfig0 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P2_MASK;
- LPC_EMC->DynamicConfig0 |= EMC_DYNAMIC_CFG_ADD_MAP_P2(add_mapped_p2);
- LPC_EMC->DynamicConfig0 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P3_MASK;
- LPC_EMC->DynamicConfig0 |= EMC_DYNAMIC_CFG_ADD_MAP_P3(add_mapped_p3);
- break;
-
- case 1:
- LPC_EMC->DynamicConfig1 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P1_MASK;
- LPC_EMC->DynamicConfig1 |= EMC_DYNAMIC_CFG_ADD_MAP_P1(add_mapped_p1);
- LPC_EMC->DynamicConfig1 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P2_MASK;
- LPC_EMC->DynamicConfig1 |= EMC_DYNAMIC_CFG_ADD_MAP_P2(add_mapped_p2);
- LPC_EMC->DynamicConfig1 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P3_MASK;
- LPC_EMC->DynamicConfig1 |= EMC_DYNAMIC_CFG_ADD_MAP_P3(add_mapped_p3);
- break;
-
- case 2:
- LPC_EMC->DynamicConfig2 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P1_MASK;
- LPC_EMC->DynamicConfig2 |= EMC_DYNAMIC_CFG_ADD_MAP_P1(add_mapped_p1);
- LPC_EMC->DynamicConfig2 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P2_MASK;
- LPC_EMC->DynamicConfig2 |= EMC_DYNAMIC_CFG_ADD_MAP_P2( add_mapped_p2);
- LPC_EMC->DynamicConfig2 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P3_MASK;
- LPC_EMC->DynamicConfig2 |= EMC_DYNAMIC_CFG_ADD_MAP_P3(add_mapped_p3);
- break;
-
- case 3:
- LPC_EMC->DynamicConfig3 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P1_MASK;
- LPC_EMC->DynamicConfig3 |= EMC_DYNAMIC_CFG_ADD_MAP_P1(add_mapped_p1);
- LPC_EMC->DynamicConfig3 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P2_MASK;
- LPC_EMC->DynamicConfig3 |= EMC_DYNAMIC_CFG_ADD_MAP_P2(add_mapped_p2);
- LPC_EMC->DynamicConfig3 &= ~EMC_DYNAMIC_CFG_ADD_MAP_P3_MASK;
- LPC_EMC->DynamicConfig3 |= EMC_DYNAMIC_CFG_ADD_MAP_P3(add_mapped_p3);
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Enable/disable the buffer
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] buff_control buffer control mode, should be:
- *
- * - EMC_DYNAMIC_CFG_BUFF_DISABLED: buffer is disabled
- *
- * - EMC_DYNAMIC_CFG_BUFF_ENABLED: buffer is enable
- *
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM
- **********************************************************************/
- EMC_FUNC_CODE EMC_DynMemConfigB(uint32_t index , uint32_t buff_control)
- {
- switch ( index)
- {
- case 0:
- LPC_EMC->DynamicConfig0 &= ~EMC_DYNAMIC_CFG_BUFFENABLE_BMASK;
- LPC_EMC->DynamicConfig0 |= buff_control & EMC_DYNAMIC_CFG_BUFFENABLE_BMASK;
- break;
-
- case 1:
- LPC_EMC->DynamicConfig1 &= ~EMC_DYNAMIC_CFG_BUFFENABLE_BMASK;
- LPC_EMC->DynamicConfig1 |= buff_control& EMC_DYNAMIC_CFG_BUFFENABLE_BMASK;
- break;
- case 2:
- LPC_EMC->DynamicConfig2 &= ~EMC_DYNAMIC_CFG_BUFFENABLE_BMASK;
- LPC_EMC->DynamicConfig2 |= buff_control& EMC_DYNAMIC_CFG_BUFFENABLE_BMASK;
- break;
- case 3:
- LPC_EMC->DynamicConfig3 &= ~EMC_DYNAMIC_CFG_BUFFENABLE_BMASK;
- LPC_EMC->DynamicConfig3|= buff_control& EMC_DYNAMIC_CFG_BUFFENABLE_BMASK;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Configure write permission: protect or not
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] permission permission mode, should be:
- *
- * - EMC_DYNAMIC_CFG_WR_UNPROTECTED: will not protect
- *
- * - EMC_DYNAMIC_CFG_WR_PROTECTED: will protect
- *
- * @return EMC_FUNC_OK
- **********************************************************************/
- EMC_FUNC_CODE EMC_DynMemConfigP(uint32_t index , uint32_t permission)
- {
- switch ( index)
- {
- case 0:
- LPC_EMC->DynamicConfig0 &= ~ EMC_DYNAMIC_CFG_WRPROTECT_BMASK;
- LPC_EMC->DynamicConfig0 |= permission&EMC_DYNAMIC_CFG_WRPROTECT_BMASK;
- break;
-
- case 1:
- LPC_EMC->DynamicConfig1 &= ~ EMC_DYNAMIC_CFG_WRPROTECT_BMASK;
- LPC_EMC->DynamicConfig1 |= permission&EMC_DYNAMIC_CFG_WRPROTECT_BMASK;
- break;
-
- case 2:
- LPC_EMC->DynamicConfig2 &= ~ EMC_DYNAMIC_CFG_WRPROTECT_BMASK;
- LPC_EMC->DynamicConfig2 |= permission&EMC_DYNAMIC_CFG_WRPROTECT_BMASK;
- break;
-
- case 3:
- LPC_EMC->DynamicConfig3 &= ~ EMC_DYNAMIC_CFG_WRPROTECT_BMASK;
- LPC_EMC->DynamicConfig3 |= permission&EMC_DYNAMIC_CFG_WRPROTECT_BMASK;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Set value for RAS latency
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] ras_val RAS value should be in range: 0..3
- *
- * @return EMC_FUNC_OK
- **********************************************************************/
- EMC_FUNC_CODE EMC_DynMemRAS(uint32_t index , uint32_t ras_val)
- {
- switch ( index)
- {
- case 0:
- LPC_EMC->DynamicRasCas0 &= ~EMC_DYNAMIC_RASCAS_RASCFG_BMASK;
- LPC_EMC->DynamicRasCas0 |=( ras_val << EMC_DYNAMIC_RASCAS_RASCFG_POS)
- &EMC_DYNAMIC_RASCAS_RASCFG_BMASK;
- break;
-
- case 1:
- LPC_EMC->DynamicRasCas1 &= ~EMC_DYNAMIC_RASCAS_RASCFG_BMASK;
- LPC_EMC->DynamicRasCas1 |= ( ras_val << EMC_DYNAMIC_RASCAS_RASCFG_POS)
- &EMC_DYNAMIC_RASCAS_RASCFG_BMASK;
- break;
-
- case 2:
- LPC_EMC->DynamicRasCas2 &= ~EMC_DYNAMIC_RASCAS_RASCFG_BMASK;
- LPC_EMC->DynamicRasCas2 |= ( ras_val << EMC_DYNAMIC_RASCAS_RASCFG_POS)
- &EMC_DYNAMIC_RASCAS_RASCFG_BMASK;
- break;
-
- case 3:
- LPC_EMC->DynamicRasCas3 &= ~EMC_DYNAMIC_RASCAS_RASCFG_BMASK;
- LPC_EMC->DynamicRasCas3 |= ( ras_val << EMC_DYNAMIC_RASCAS_RASCFG_POS)
- &EMC_DYNAMIC_RASCAS_RASCFG_BMASK;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Set value for CAS latency
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] ras_val CAS value should be in range: 0..3
- *
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM
- **********************************************************************/
- EMC_FUNC_CODE EMC_DynMemCAS(uint32_t index , uint32_t cas_val)
- {
- switch ( index)
- {
- case 0:
- LPC_EMC->DynamicRasCas0 &= ~EMC_DYNAMIC_RASCAS_CASCFG_BMASK;
- LPC_EMC->DynamicRasCas0 |= (cas_val<<EMC_DYNAMIC_RASCAS_CASCFG_POS)
- &EMC_DYNAMIC_RASCAS_CASCFG_BMASK;
- break;
-
- case 1:
- LPC_EMC->DynamicRasCas1 &= ~EMC_DYNAMIC_RASCAS_CASCFG_BMASK;
- LPC_EMC->DynamicRasCas1 |= (cas_val<<EMC_DYNAMIC_RASCAS_CASCFG_POS)
- &EMC_DYNAMIC_RASCAS_CASCFG_BMASK;
- break;
-
- case 2:
- LPC_EMC->DynamicRasCas2 &= ~EMC_DYNAMIC_RASCAS_CASCFG_BMASK;
- LPC_EMC->DynamicRasCas2 |= (cas_val<<EMC_DYNAMIC_RASCAS_CASCFG_POS)
- &EMC_DYNAMIC_RASCAS_CASCFG_BMASK;
- break;
-
- case 3:
- LPC_EMC->DynamicRasCas3 &= ~EMC_DYNAMIC_RASCAS_CASCFG_BMASK;
- LPC_EMC->DynamicRasCas3 |= (cas_val<<EMC_DYNAMIC_RASCAS_CASCFG_POS)
- &EMC_DYNAMIC_RASCAS_CASCFG_BMASK;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Set extended wait time out for accessing static memory
- *
- * @param[in] Extended_wait_time_out timeout value that will be set
- *
- * @return EMC_FUNC_OK
- **********************************************************************/
- EMC_FUNC_CODE EMC_StaticExtendedWait(uint32_t Extended_wait_time_out)
- {
- LPC_EMC->StaticExtendedWait = EMC_StaticExtendedWait_EXTENDEDWAIT(Extended_wait_time_out);
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Configure the memory width
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] mem_width memory width, should be:
- *
- * - EMC_STATIC_CFG_MW_8BITS: 8-bits
- *
- * - EMC_STATIC_CFG_MW_16BITS: 16-bits
- *
- * - EMC_STATIC_CFG_MW_32BITS02: 32-bits
- *
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM
- **********************************************************************/
- EMC_FUNC_CODE EMC_StaMemConfigMW(uint32_t index , uint32_t mem_width)
- {
- uint32_t mem_width_flg = 0;
- switch(mem_width)
- {
- case 8:
- mem_width_flg = EMC_STATIC_CFG_MW_8BITS;
- break;
- case 16:
- mem_width_flg = EMC_STATIC_CFG_MW_16BITS;
- break;
- case 32:
- mem_width_flg = EMC_STATIC_CFG_MW_32BITS;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- switch ( index)
- {
- case 0:
- LPC_EMC->StaticConfig0 &= ~ EMC_STATIC_CFG_MEMWIDTH_BMASK;
- LPC_EMC->StaticConfig0 |= mem_width_flg;
- break;
-
- case 1:
- LPC_EMC->StaticConfig1 &= ~ EMC_STATIC_CFG_MEMWIDTH_BMASK;
- LPC_EMC->StaticConfig1 |= mem_width_flg;
- break;
-
- case 2:
- LPC_EMC->StaticConfig2 &= ~ EMC_STATIC_CFG_MEMWIDTH_BMASK;
- LPC_EMC->StaticConfig2 |= mem_width_flg;
- break;
-
- case 3:
- LPC_EMC->StaticConfig3 &= ~ EMC_STATIC_CFG_MEMWIDTH_BMASK;
- LPC_EMC->StaticConfig3 |= mem_width_flg;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Configure the page mode
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] page_mode page mode, should be:
- *
- * - EMC_CFG_PM_DISABLE: disable
- *
- * - EMC_CFG_PM_ASYNC_ENABLE: asynchronous page mode enable
- *
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM
- **********************************************************************/
- EMC_FUNC_CODE EMC_StaMemConfigPM(uint32_t index , uint32_t page_mode)
- {
- switch ( index)
- {
- case 0:
- LPC_EMC->StaticConfig0 &= ~EMC_STATIC_CFG_PAGEMODE_MASK;
- LPC_EMC->StaticConfig0 |= page_mode&EMC_STATIC_CFG_PAGEMODE_MASK;
- break;
-
- case 1:
- LPC_EMC->StaticConfig1 &= ~EMC_STATIC_CFG_PAGEMODE_MASK;
- LPC_EMC->StaticConfig1 |= page_mode&EMC_STATIC_CFG_PAGEMODE_MASK;
- break;
-
- case 2:
- LPC_EMC->StaticConfig2 &= ~EMC_STATIC_CFG_PAGEMODE_MASK;
- LPC_EMC->StaticConfig2 |= page_mode&EMC_STATIC_CFG_PAGEMODE_MASK;
- break;
-
- case 3:
- LPC_EMC->StaticConfig3 &= ~EMC_STATIC_CFG_PAGEMODE_MASK;
- LPC_EMC->StaticConfig3 |= page_mode&EMC_STATIC_CFG_PAGEMODE_MASK;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Configure the chip select polarity
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] pagepol_val_mode page mode, should be:
- *
- * - EMC_CFG_BYTELAND_PC_ACTIVE_LO: Active LOW ship select
- *
- * - EMC_CFG_BYTELAND_PC_ACTIVE_HI: Active HIGH chip select
- *
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM
- **********************************************************************/
- EMC_FUNC_CODE EMC_StaMemConfigPC(uint32_t index , uint32_t pol_val)
- {
- switch ( index)
- {
- case 0:
- LPC_EMC->StaticConfig0 &= ~EMC_STATIC_CFG_CHIPPOLARITY_MASK;
- LPC_EMC->StaticConfig0 |= pol_val&EMC_STATIC_CFG_CHIPPOLARITY_MASK;
- break;
-
- case 1:
- LPC_EMC->StaticConfig1 &= ~EMC_STATIC_CFG_CHIPPOLARITY_MASK;
- LPC_EMC->StaticConfig1 |= pol_val&EMC_STATIC_CFG_CHIPPOLARITY_MASK;
- break;
-
- case 2:
- LPC_EMC->StaticConfig2 &= ~EMC_STATIC_CFG_CHIPPOLARITY_MASK;
- LPC_EMC->StaticConfig2 |= pol_val&EMC_STATIC_CFG_CHIPPOLARITY_MASK;
- break;
-
- case 3:
- LPC_EMC->StaticConfig3 &= ~EMC_STATIC_CFG_CHIPPOLARITY_MASK;
- LPC_EMC->StaticConfig3 |= pol_val&EMC_STATIC_CFG_CHIPPOLARITY_MASK;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Configure the byte lane state
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] pb_val Byte lane state, should be:
- *
- * - EMC_CFG_BYTELAND_READ_BITSHIGH: For reads all bits
- * in BLSn[3:0] are HIGH.
- *
- * - EMC_CFG_BYTELAND_READ_BITSLOW: For reads all bits
- * in BLSn[3:0] are LOW.
- *
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM
- **********************************************************************/
- EMC_FUNC_CODE EMC_StaMemConfigPB(uint32_t index , uint32_t pb_val)
- {
- switch ( index)
- {
- case 0:
- LPC_EMC->StaticConfig0 &= ~EMC_STATIC_CFG_BYTELAND_MASK;
- LPC_EMC->StaticConfig0 |= pb_val&EMC_STATIC_CFG_BYTELAND_MASK;
- break;
- case 1:
- LPC_EMC->StaticConfig1 &= ~EMC_STATIC_CFG_BYTELAND_MASK;
- LPC_EMC->StaticConfig1 |= pb_val&EMC_STATIC_CFG_BYTELAND_MASK;
- break;
- case 2:
- LPC_EMC->StaticConfig2 &= ~EMC_STATIC_CFG_BYTELAND_MASK;
- LPC_EMC->StaticConfig2 |= pb_val&EMC_STATIC_CFG_BYTELAND_MASK;
- break;
- case 3:
- LPC_EMC->StaticConfig3 &= ~EMC_STATIC_CFG_BYTELAND_MASK;
- LPC_EMC->StaticConfig3 |= pb_val&EMC_STATIC_CFG_BYTELAND_MASK;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Configure the extended wait value
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] ex_wait Extended wait mode, should be:
- *
- * - EMC_CFG_EW_DISABLED: Extended wait disabled.
- *
- * - EMC_CFG_EW_ENABLED: Extended wait enabled.
- *
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM
- **********************************************************************/
- EMC_FUNC_CODE EMC_StaMemConfigEW(uint32_t index , uint32_t ex_wait)
- {
- switch ( index)
- {
- case 0:
- LPC_EMC->StaticConfig0 &= ~EMC_STATIC_CFG_EXTWAIT_MASK;
- LPC_EMC->StaticConfig0 |= ex_wait&EMC_STATIC_CFG_EXTWAIT_MASK;
- break;
-
- case 1:
- LPC_EMC->StaticConfig1 &= ~EMC_STATIC_CFG_EXTWAIT_MASK;
- LPC_EMC->StaticConfig1 |= ex_wait&EMC_STATIC_CFG_EXTWAIT_MASK;
- break;
-
- case 2:
- LPC_EMC->StaticConfig2 &= ~EMC_STATIC_CFG_EXTWAIT_MASK;
- LPC_EMC->StaticConfig2 |= ex_wait&EMC_STATIC_CFG_EXTWAIT_MASK;
- break;
-
- case 3:
- LPC_EMC->StaticConfig3 &= ~EMC_STATIC_CFG_EXTWAIT_MASK;
- LPC_EMC->StaticConfig3 |= ex_wait&EMC_STATIC_CFG_EXTWAIT_MASK;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Configure the buffer enable value
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] buf_val Buffer mode, should be:
- *
- * - EMC_CFG_BUF_DISABLED: Buffer disabled.
- *
- * - EMC_CFG_BUF_ENABLED: Buffer enabled.
- *
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM
- **********************************************************************/
- EMC_FUNC_CODE EMC_StaMemConfigB(uint32_t index , uint32_t buf_val)
- {
- switch ( index)
- {
- case 0:
- LPC_EMC->StaticConfig0 &= ~EMC_STATIC_CFG_BUFENABLE_MASK;
- LPC_EMC->StaticConfig0 |= buf_val&EMC_STATIC_CFG_BUFENABLE_MASK;
- break;
-
- case 1:
- LPC_EMC->StaticConfig1 &= ~EMC_STATIC_CFG_BUFENABLE_MASK;
- LPC_EMC->StaticConfig1 |= buf_val&EMC_STATIC_CFG_BUFENABLE_MASK;
- break;
-
- case 2:
- LPC_EMC->StaticConfig2 &= ~EMC_STATIC_CFG_BUFENABLE_MASK;
- LPC_EMC->StaticConfig2 |= buf_val&EMC_STATIC_CFG_BUFENABLE_MASK;
- break;
-
- case 3:
- LPC_EMC->StaticConfig3 &= ~EMC_STATIC_CFG_BUFENABLE_MASK;
- LPC_EMC->StaticConfig3 |= buf_val&EMC_STATIC_CFG_BUFENABLE_MASK;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Configure the write permission
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] per_val Permission mode, should be:
- *
- * - EMC_CFG_WRITEPROTECT_DISABLED: Write not protected.
- *
- * - EMC_CFG_WRITEPROTECT_ENABLED: Write protected.
- *
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM
- **********************************************************************/
- EMC_FUNC_CODE EMC_StaMemConfigpP(uint32_t index , uint32_t per_val)
- {
- switch ( index)
- {
- case 0:
- LPC_EMC->StaticConfig0 &= ~EMC_STATIC_CFG_WRIEPROTECT_MASK;
- LPC_EMC->StaticConfig0 |= per_val&EMC_STATIC_CFG_WRIEPROTECT_MASK;
- break;
-
- case 1:
- LPC_EMC->StaticConfig1 &= ~EMC_STATIC_CFG_WRIEPROTECT_MASK;
- LPC_EMC->StaticConfig1 |= per_val&EMC_STATIC_CFG_WRIEPROTECT_MASK;
- break;
-
- case 2:
- LPC_EMC->StaticConfig2 &= ~EMC_STATIC_CFG_WRIEPROTECT_MASK;
- LPC_EMC->StaticConfig2 |= per_val&EMC_STATIC_CFG_WRIEPROTECT_MASK;
- break;
-
- case 3:
- LPC_EMC->StaticConfig3 &= ~EMC_STATIC_CFG_WRIEPROTECT_MASK;
- LPC_EMC->StaticConfig3 |= per_val&EMC_STATIC_CFG_WRIEPROTECT_MASK;
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- return EMC_FUNC_OK;
- }
- /*********************************************************************//**
- * @brief Set the value of LPC_EMC static memory registers
- *
- * @param[in] index index number, should be from 0 to 3
- *
- * @param[in] EMC_STA_MEM_PAR Static register, should be:
- *
- * - EMC_STA_MEM_WAITWEN: StaticWaitWen0 register
- * - EMC_STA_MEM_WAITOEN: StaticWaitOen0 register
- * - EMC_STA_MEM_WAITRD: StaticWaitRd0 register
- * - EMC_STA_MEM_WAITPAGE: StaticWaitPage0 register
- * - EMC_STA_MEM_WAITWR: StaticWaitWr0 register
- * - EMC_STA_MEM_WAITTURN: StaticWaitTurn0 register
- *
- * @return EMC_FUNC_OK/EMC_FUNC_INVALID_PARAM
- **********************************************************************/
- EMC_FUNC_CODE EMC_SetStaMemoryParameter(uint32_t index ,EMC_STA_MEM_PAR par, uint32_t val)
- {
- switch (index)
- {
- case 0:
- switch ( par)
- {
- case EMC_STA_MEM_WAITWEN:
- LPC_EMC->StaticWaitWen0 = EMC_StaticWaitWen_WAITWEN(val);
- break;
-
- case EMC_STA_MEM_WAITOEN:
- LPC_EMC->StaticWaitOen0 = EMC_StaticWaitOen_WAITOEN(val);
- break;
-
- case EMC_STA_MEM_WAITRD:
- LPC_EMC->StaticWaitRd0 = EMC_StaticWaitRd_WAITRD(val);
- break;
-
- case EMC_STA_MEM_WAITPAGE:
- LPC_EMC->StaticWaitPage0 = EMC_StaticwaitPage_WAITPAGE(val);
- break;
-
- case EMC_STA_MEM_WAITWR:
- LPC_EMC->StaticWaitWr0 = EMC_StaticWaitwr_WAITWR(val);
- break;
-
- case EMC_STA_MEM_WAITTURN:
- LPC_EMC->StaticWaitTurn0 =EMC_StaticWaitTurn_WAITTURN(val);
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- break;
-
- case 1:
- switch ( par)
- {
- case EMC_STA_MEM_WAITWEN:
- LPC_EMC->StaticWaitWen1 = EMC_StaticWaitWen_WAITWEN(val);
- break;
-
- case EMC_STA_MEM_WAITOEN:
- LPC_EMC->StaticWaitOen1 = EMC_StaticWaitOen_WAITOEN(val);
- break;
-
- case EMC_STA_MEM_WAITRD:
- LPC_EMC->StaticWaitRd1 = EMC_StaticWaitRd_WAITRD(val);
- break;
-
- case EMC_STA_MEM_WAITPAGE:
- LPC_EMC->StaticWaitPage1 = EMC_StaticwaitPage_WAITPAGE(val);
- break;
-
- case EMC_STA_MEM_WAITWR:
- LPC_EMC->StaticWaitWr1 = EMC_StaticWaitwr_WAITWR(val);
- break;
-
- case EMC_STA_MEM_WAITTURN:
- LPC_EMC->StaticWaitTurn1 =EMC_StaticWaitTurn_WAITTURN(val);
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- break;
-
- case 2:
- switch ( par)
- {
- case EMC_STA_MEM_WAITWEN:
- LPC_EMC->StaticWaitWen2 = EMC_StaticWaitWen_WAITWEN(val);
- break;
-
- case EMC_STA_MEM_WAITOEN:
- LPC_EMC->StaticWaitOen2 = EMC_StaticWaitOen_WAITOEN(val);
- break;
-
- case EMC_STA_MEM_WAITRD:
- LPC_EMC->StaticWaitRd2 = EMC_StaticWaitRd_WAITRD(val);
- break;
-
- case EMC_STA_MEM_WAITPAGE:
- LPC_EMC->StaticWaitPage2 = EMC_StaticwaitPage_WAITPAGE(val);
- break;
-
- case EMC_STA_MEM_WAITWR:
- LPC_EMC->StaticWaitWr2 = EMC_StaticWaitwr_WAITWR(val);
- break;
-
- case EMC_STA_MEM_WAITTURN:
- LPC_EMC->StaticWaitTurn2 =EMC_StaticWaitTurn_WAITTURN(val);
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- break;
-
- case 3:
- switch ( par)
- {
- case EMC_STA_MEM_WAITWEN:
- LPC_EMC->StaticWaitWen3 = EMC_StaticWaitWen_WAITWEN(val);
- break;
-
- case EMC_STA_MEM_WAITOEN:
- LPC_EMC->StaticWaitOen3 = EMC_StaticWaitOen_WAITOEN(val);
- break;
-
- case EMC_STA_MEM_WAITRD:
- LPC_EMC->StaticWaitRd3 = EMC_StaticWaitRd_WAITRD(val);
- break;
-
- case EMC_STA_MEM_WAITPAGE:
- LPC_EMC->StaticWaitPage3 = EMC_StaticwaitPage_WAITPAGE(val);
- break;
-
- case EMC_STA_MEM_WAITWR:
- LPC_EMC->StaticWaitWr3 = EMC_StaticWaitwr_WAITWR(val);
- break;
-
- case EMC_STA_MEM_WAITTURN:
- LPC_EMC->StaticWaitTurn3 =EMC_StaticWaitTurn_WAITTURN(val);
- break;
- default:
- return EMC_FUNC_INVALID_PARAM;
- }
- break;
- }
- return EMC_FUNC_OK;
- }
- /**
- * @}
- */
-
- /**
- * @}
- */
- #endif /*_EMC*/
|