123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677 |
- /*!
- \file gd32f30x_exmc.c
- \brief EXMC driver
- \version 2017-02-10, V1.0.0, firmware for GD32F30x
- \version 2018-10-10, V1.1.0, firmware for GD32F30x
- \version 2018-12-25, V2.0.0, firmware for GD32F30x
- \version 2020-09-30, V2.1.0, firmware for GD32F30x
- */
- /*
- Copyright (c) 2020, GigaDevice Semiconductor Inc.
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
- 1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- 3. Neither the name of the copyright holder 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.
- */
- #include "gd32f30x_exmc.h"
- /* EXMC bank0 register reset value */
- #define BANK0_SNCTL_REGION0_RESET ((uint32_t)0x000030DBU)
- #define BANK0_SNCTL_REGION1_2_3_RESET ((uint32_t)0x000030D2U)
- #define BANK0_SNTCFG_RESET ((uint32_t)0x0FFFFFFFU)
- #define BANK0_SNWTCFG_RESET ((uint32_t)0x0FFFFFFFU)
- /* EXMC bank1/2 register reset mask */
- #define BANK1_2_NPCTL_RESET ((uint32_t)0x00000018U)
- #define BANK1_2_NPINTEN_RESET ((uint32_t)0x00000042U)
- #define BANK1_2_NPCTCFG_RESET ((uint32_t)0xFCFCFCFCU)
- #define BANK1_2_NPATCFG_RESET ((uint32_t)0xFCFCFCFCU)
- /* EXMC bank3 register reset mask */
- #define BANK3_NPCTL_RESET ((uint32_t)0x00000018U)
- #define BANK3_NPINTEN_RESET ((uint32_t)0x00000043U)
- #define BANK3_NPCTCFG_RESET ((uint32_t)0xFCFCFCFCU)
- #define BANK3_NPATCFG_RESET ((uint32_t)0xFCFCFCFCU)
- #define BANK3_PIOTCFG3_RESET ((uint32_t)0xFCFCFCFCU)
- /* EXMC register bit offset */
- #define SNCTL_NRMUX_OFFSET ((uint32_t)1U)
- #define SNCTL_SBRSTEN_OFFSET ((uint32_t)8U)
- #define SNCTL_WRAPEN_OFFSET ((uint32_t)10U)
- #define SNCTL_WREN_OFFSET ((uint32_t)12U)
- #define SNCTL_NRWTEN_OFFSET ((uint32_t)13U)
- #define SNCTL_EXMODEN_OFFSET ((uint32_t)14U)
- #define SNCTL_ASYNCWAIT_OFFSET ((uint32_t)15U)
- #define SNTCFG_AHLD_OFFSET ((uint32_t)4U)
- #define SNTCFG_DSET_OFFSET ((uint32_t)8U)
- #define SNTCFG_BUSLAT_OFFSET ((uint32_t)16U)
- #define SNWTCFG_WAHLD_OFFSET ((uint32_t)4U)
- #define SNWTCFG_WDSET_OFFSET ((uint32_t)8U)
- #define SNWTCFG_WBUSLAT_OFFSET ((uint32_t)16U)
- #define NPCTL_NDWTEN_OFFSET ((uint32_t)1U)
- #define NPCTL_ECCEN_OFFSET ((uint32_t)6U)
- #define NPCTCFG_COMWAIT_OFFSET ((uint32_t)8U)
- #define NPCTCFG_COMHLD_OFFSET ((uint32_t)16U)
- #define NPCTCFG_COMHIZ_OFFSET ((uint32_t)24U)
- #define NPATCFG_ATTWAIT_OFFSET ((uint32_t)8U)
- #define NPATCFG_ATTHLD_OFFSET ((uint32_t)16U)
- #define NPATCFG_ATTHIZ_OFFSET ((uint32_t)24U)
- #define PIOTCFG_IOWAIT_OFFSET ((uint32_t)8U)
- #define PIOTCFG_IOHLD_OFFSET ((uint32_t)16U)
- #define PIOTCFG_IOHIZ_OFFSET ((uint32_t)24U)
- #define INTEN_INTS_OFFSET ((uint32_t)3U)
- /*!
- \brief deinitialize EXMC NOR/SRAM region
- \param[in] exmc_norsram_region: select the region of bank0
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3)
- \param[out] none
- \retval none
- */
- void exmc_norsram_deinit(uint32_t exmc_norsram_region)
- {
- /* reset the registers */
- if(EXMC_BANK0_NORSRAM_REGION0 == exmc_norsram_region){
- EXMC_SNCTL(exmc_norsram_region) = BANK0_SNCTL_REGION0_RESET;
- }else{
- EXMC_SNCTL(exmc_norsram_region) = BANK0_SNCTL_REGION1_2_3_RESET;
- }
- EXMC_SNTCFG(exmc_norsram_region) = BANK0_SNTCFG_RESET;
- EXMC_SNWTCFG(exmc_norsram_region) = BANK0_SNWTCFG_RESET;
- }
- /*!
- \brief initialize exmc_norsram_parameter_struct with the default values
- \param[in] none
- \param[out] exmc_norsram_init_struct: the initialized struct exmc_norsram_parameter_struct pointer
- \retval none
- */
- void exmc_norsram_struct_para_init(exmc_norsram_parameter_struct* exmc_norsram_init_struct)
- {
- /* configure the structure with default values */
- exmc_norsram_init_struct->norsram_region = EXMC_BANK0_NORSRAM_REGION0;
- exmc_norsram_init_struct->address_data_mux = ENABLE;
- exmc_norsram_init_struct->memory_type = EXMC_MEMORY_TYPE_SRAM;
- exmc_norsram_init_struct->databus_width = EXMC_NOR_DATABUS_WIDTH_8B;
- exmc_norsram_init_struct->burst_mode = DISABLE;
- exmc_norsram_init_struct->nwait_polarity = EXMC_NWAIT_POLARITY_LOW;
- exmc_norsram_init_struct->wrap_burst_mode = DISABLE;
- exmc_norsram_init_struct->nwait_config = EXMC_NWAIT_CONFIG_BEFORE;
- exmc_norsram_init_struct->memory_write = ENABLE;
- exmc_norsram_init_struct->nwait_signal = ENABLE;
- exmc_norsram_init_struct->extended_mode = DISABLE;
- exmc_norsram_init_struct->asyn_wait = DISABLE;
- exmc_norsram_init_struct->write_mode = EXMC_ASYN_WRITE;
- /* read/write timing configure */
- exmc_norsram_init_struct->read_write_timing->asyn_address_setuptime = 0xFU;
- exmc_norsram_init_struct->read_write_timing->asyn_address_holdtime = 0xFU;
- exmc_norsram_init_struct->read_write_timing->asyn_data_setuptime = 0xFFU;
- exmc_norsram_init_struct->read_write_timing->bus_latency = 0xFU;
- exmc_norsram_init_struct->read_write_timing->syn_clk_division = EXMC_SYN_CLOCK_RATIO_16_CLK;
- exmc_norsram_init_struct->read_write_timing->syn_data_latency = EXMC_DATALAT_17_CLK;
- exmc_norsram_init_struct->read_write_timing->asyn_access_mode = EXMC_ACCESS_MODE_A;
- /* write timing configure, when extended mode is used */
- exmc_norsram_init_struct->write_timing->asyn_address_setuptime = 0xFU;
- exmc_norsram_init_struct->write_timing->asyn_address_holdtime = 0xFU;
- exmc_norsram_init_struct->write_timing->asyn_data_setuptime = 0xFFU;
- exmc_norsram_init_struct->write_timing->bus_latency = 0xFU;
- exmc_norsram_init_struct->write_timing->asyn_access_mode = EXMC_ACCESS_MODE_A;
- }
- /*!
- \brief initialize EXMC NOR/SRAM region
- \param[in] exmc_norsram_parameter_struct: configure the EXMC NOR/SRAM parameter
- norsram_region: EXMC_BANK0_NORSRAM_REGIONx,x=0..3
- write_mode: EXMC_ASYN_WRITE,EXMC_SYN_WRITE
- extended_mode: ENABLE or DISABLE
- asyn_wait: ENABLE or DISABLE
- nwait_signal: ENABLE or DISABLE
- memory_write: ENABLE or DISABLE
- nwait_config: EXMC_NWAIT_CONFIG_BEFORE,EXMC_NWAIT_CONFIG_DURING
- wrap_burst_mode: ENABLE or DISABLE
- nwait_polarity: EXMC_NWAIT_POLARITY_LOW,EXMC_NWAIT_POLARITY_HIGH
- burst_mode: ENABLE or DISABLE
- databus_width: EXMC_NOR_DATABUS_WIDTH_8B,EXMC_NOR_DATABUS_WIDTH_16B
- memory_type: EXMC_MEMORY_TYPE_SRAM,EXMC_MEMORY_TYPE_PSRAM,EXMC_MEMORY_TYPE_NOR
- address_data_mux: ENABLE or DISABLE
- read_write_timing: struct exmc_norsram_timing_parameter_struct set the time
- write_timing: struct exmc_norsram_timing_parameter_struct set the time
- \param[out] none
- \retval none
- */
- void exmc_norsram_init(exmc_norsram_parameter_struct* exmc_norsram_init_struct)
- {
- uint32_t snctl = 0x00000000U,sntcfg = 0x00000000U,snwtcfg = 0x00000000U;
- /* get the register value */
- snctl = EXMC_SNCTL(exmc_norsram_init_struct->norsram_region);
- /* clear relative bits */
- snctl &= ((uint32_t)~(EXMC_SNCTL_NRMUX | EXMC_SNCTL_NRTP | EXMC_SNCTL_NRW | EXMC_SNCTL_SBRSTEN |
- EXMC_SNCTL_NREN | EXMC_SNCTL_NRWTPOL | EXMC_SNCTL_WRAPEN | EXMC_SNCTL_NRWTCFG |
- EXMC_SNCTL_WREN | EXMC_SNCTL_NRWTEN | EXMC_SNCTL_EXMODEN | EXMC_SNCTL_ASYNCWAIT |
- EXMC_SNCTL_SYNCWR ));
- snctl |= (uint32_t)(exmc_norsram_init_struct->address_data_mux << SNCTL_NRMUX_OFFSET) |
- exmc_norsram_init_struct->memory_type |
- exmc_norsram_init_struct->databus_width |
- (exmc_norsram_init_struct->burst_mode << SNCTL_SBRSTEN_OFFSET) |
- exmc_norsram_init_struct->nwait_polarity |
- (exmc_norsram_init_struct->wrap_burst_mode << SNCTL_WRAPEN_OFFSET) |
- exmc_norsram_init_struct->nwait_config |
- (exmc_norsram_init_struct->memory_write << SNCTL_WREN_OFFSET) |
- (exmc_norsram_init_struct->nwait_signal << SNCTL_NRWTEN_OFFSET) |
- (exmc_norsram_init_struct->extended_mode << SNCTL_EXMODEN_OFFSET) |
- (exmc_norsram_init_struct->asyn_wait << SNCTL_ASYNCWAIT_OFFSET) |
- exmc_norsram_init_struct->write_mode;
- sntcfg = (uint32_t)((exmc_norsram_init_struct->read_write_timing->asyn_address_setuptime - 1U ) & EXMC_SNTCFG_ASET )|
- (((exmc_norsram_init_struct->read_write_timing->asyn_address_holdtime - 1U ) << SNTCFG_AHLD_OFFSET ) & EXMC_SNTCFG_AHLD ) |
- (((exmc_norsram_init_struct->read_write_timing->asyn_data_setuptime - 1U ) << SNTCFG_DSET_OFFSET ) & EXMC_SNTCFG_DSET ) |
- (((exmc_norsram_init_struct->read_write_timing->bus_latency - 1U ) << SNTCFG_BUSLAT_OFFSET ) & EXMC_SNTCFG_BUSLAT )|
- exmc_norsram_init_struct->read_write_timing->syn_clk_division |
- exmc_norsram_init_struct->read_write_timing->syn_data_latency |
- exmc_norsram_init_struct->read_write_timing->asyn_access_mode;
- /* nor flash access enable */
- if(EXMC_MEMORY_TYPE_NOR == exmc_norsram_init_struct->memory_type){
- snctl |= (uint32_t)EXMC_SNCTL_NREN;
- }
- /* extended mode configure */
- if(ENABLE == exmc_norsram_init_struct->extended_mode){
- snwtcfg = (uint32_t)((exmc_norsram_init_struct->write_timing->asyn_address_setuptime - 1U) & EXMC_SNWTCFG_WASET ) |
- (((exmc_norsram_init_struct->write_timing->asyn_address_holdtime -1U ) << SNWTCFG_WAHLD_OFFSET ) & EXMC_SNWTCFG_WAHLD )|
- (((exmc_norsram_init_struct->write_timing->asyn_data_setuptime -1U ) << SNWTCFG_WDSET_OFFSET ) & EXMC_SNWTCFG_WDSET )|
- (((exmc_norsram_init_struct->write_timing->bus_latency - 1U ) << SNWTCFG_WBUSLAT_OFFSET ) & EXMC_SNWTCFG_WBUSLAT ) |
- exmc_norsram_init_struct->write_timing->asyn_access_mode;
- }else{
- snwtcfg = BANK0_SNWTCFG_RESET;
- }
- /* configure the registers */
- EXMC_SNCTL(exmc_norsram_init_struct->norsram_region) = snctl;
- EXMC_SNTCFG(exmc_norsram_init_struct->norsram_region) = sntcfg;
- EXMC_SNWTCFG(exmc_norsram_init_struct->norsram_region) = snwtcfg;
- }
- /*!
- \brief enable EXMC NOR/PSRAM bank region
- \param[in] exmc_norsram_region: specifie the region of NOR/PSRAM bank
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3)
- \param[out] none
- \retval none
- */
- void exmc_norsram_enable(uint32_t exmc_norsram_region)
- {
- EXMC_SNCTL(exmc_norsram_region) |= (uint32_t)EXMC_SNCTL_NRBKEN;
- }
- /*!
- \brief disable EXMC NOR/PSRAM bank region
- \param[in] exmc_norsram_region: specifie the region of NOR/PSRAM Bank
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3)
- \param[out] none
- \retval none
- */
- void exmc_norsram_disable(uint32_t exmc_norsram_region)
- {
- EXMC_SNCTL(exmc_norsram_region) &= ~(uint32_t)EXMC_SNCTL_NRBKEN;
- }
- /*!
- \brief deinitialize EXMC NAND bank
- \param[in] exmc_nand_bank: select the bank of NAND
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANKx_NAND(x=1..2)
- \param[out] none
- \retval none
- */
- void exmc_nand_deinit(uint32_t exmc_nand_bank)
- {
- /* EXMC_BANK1_NAND or EXMC_BANK2_NAND */
- EXMC_NPCTL(exmc_nand_bank) = BANK1_2_NPCTL_RESET;
- EXMC_NPINTEN(exmc_nand_bank) = BANK1_2_NPINTEN_RESET;
- EXMC_NPCTCFG(exmc_nand_bank) = BANK1_2_NPCTCFG_RESET;
- EXMC_NPATCFG(exmc_nand_bank) = BANK1_2_NPATCFG_RESET;
- }
- /*!
- \brief initialize exmc_norsram_parameter_struct with the default values
- \param[in] none
- \param[out] the initialized struct exmc_norsram_parameter_struct pointer
- \retval none
- */
- void exmc_nand_struct_para_init(exmc_nand_parameter_struct* exmc_nand_init_struct)
- {
- /* configure the structure with default values */
- exmc_nand_init_struct->nand_bank = EXMC_BANK1_NAND;
- exmc_nand_init_struct->wait_feature = DISABLE;
- exmc_nand_init_struct->databus_width = EXMC_NAND_DATABUS_WIDTH_8B;
- exmc_nand_init_struct->ecc_logic = DISABLE;
- exmc_nand_init_struct->ecc_size = EXMC_ECC_SIZE_256BYTES;
- exmc_nand_init_struct->ctr_latency = 0x0U;
- exmc_nand_init_struct->atr_latency = 0x0U;
- exmc_nand_init_struct->common_space_timing->setuptime = 0xFCU;
- exmc_nand_init_struct->common_space_timing->waittime = 0xFCU;
- exmc_nand_init_struct->common_space_timing->holdtime = 0xFCU;
- exmc_nand_init_struct->common_space_timing->databus_hiztime = 0xFCU;
- exmc_nand_init_struct->attribute_space_timing->setuptime = 0xFCU;
- exmc_nand_init_struct->attribute_space_timing->waittime = 0xFCU;
- exmc_nand_init_struct->attribute_space_timing->holdtime = 0xFCU;
- exmc_nand_init_struct->attribute_space_timing->databus_hiztime = 0xFCU;
- }
- /*!
- \brief initialize EXMC NAND bank
- \param[in] exmc_nand_parameter_struct: configure the EXMC NAND parameter
- nand_bank: EXMC_BANK1_NAND,EXMC_BANK2_NAND
- ecc_size: EXMC_ECC_SIZE_xBYTES,x=256,512,1024,2048,4096
- atr_latency: EXMC_ALE_RE_DELAY_x_HCLK,x=1..16
- ctr_latency: EXMC_CLE_RE_DELAY_x_HCLK,x=1..16
- ecc_logic: ENABLE or DISABLE
- databus_width: EXMC_NAND_DATABUS_WIDTH_8B,EXMC_NAND_DATABUS_WIDTH_16B
- wait_feature: ENABLE or DISABLE
- common_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time
- attribute_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time
- \param[out] none
- \retval none
- */
- void exmc_nand_init(exmc_nand_parameter_struct* exmc_nand_init_struct)
- {
- uint32_t npctl = 0x00000000U, npctcfg = 0x00000000U, npatcfg = 0x00000000U;
-
- npctl = (uint32_t)(exmc_nand_init_struct->wait_feature << NPCTL_NDWTEN_OFFSET)|
- EXMC_NPCTL_NDTP |
- exmc_nand_init_struct->databus_width |
- (exmc_nand_init_struct->ecc_logic << NPCTL_ECCEN_OFFSET)|
- exmc_nand_init_struct->ecc_size |
- exmc_nand_init_struct->ctr_latency |
- exmc_nand_init_struct->atr_latency;
- npctcfg = (uint32_t)((exmc_nand_init_struct->common_space_timing->setuptime - 1U) & EXMC_NPCTCFG_COMSET ) |
- (((exmc_nand_init_struct->common_space_timing->waittime - 1U) << NPCTCFG_COMWAIT_OFFSET) & EXMC_NPCTCFG_COMWAIT ) |
- ((exmc_nand_init_struct->common_space_timing->holdtime << NPCTCFG_COMHLD_OFFSET) & EXMC_NPCTCFG_COMHLD ) |
- (((exmc_nand_init_struct->common_space_timing->databus_hiztime - 1U) << NPCTCFG_COMHIZ_OFFSET) & EXMC_NPCTCFG_COMHIZ );
- npatcfg = (uint32_t)((exmc_nand_init_struct->attribute_space_timing->setuptime - 1U) & EXMC_NPATCFG_ATTSET ) |
- (((exmc_nand_init_struct->attribute_space_timing->waittime - 1U) << NPATCFG_ATTWAIT_OFFSET) & EXMC_NPATCFG_ATTWAIT ) |
- ((exmc_nand_init_struct->attribute_space_timing->holdtime << NPATCFG_ATTHLD_OFFSET) & EXMC_NPATCFG_ATTHLD ) |
- (((exmc_nand_init_struct->attribute_space_timing->databus_hiztime -1U) << NPATCFG_ATTHIZ_OFFSET) & EXMC_NPATCFG_ATTHIZ );
- /* EXMC_BANK1_NAND or EXMC_BANK2_NAND initialize */
- EXMC_NPCTL(exmc_nand_init_struct->nand_bank) = npctl;
- EXMC_NPCTCFG(exmc_nand_init_struct->nand_bank) = npctcfg;
- EXMC_NPATCFG(exmc_nand_init_struct->nand_bank) = npatcfg;
- }
- /*!
- \brief enable NAND bank
- \param[in] exmc_nand_bank: specifie the NAND bank
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANKx_NAND(x=1,2)
- \param[out] none
- \retval none
- */
- void exmc_nand_enable(uint32_t exmc_nand_bank)
- {
- EXMC_NPCTL(exmc_nand_bank) |= EXMC_NPCTL_NDBKEN;
- }
- /*!
- \brief disable NAND bank
- \param[in] exmc_nand_bank: specifie the NAND bank
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANKx_NAND(x=1,2)
- \param[out] none
- \retval none
- */
- void exmc_nand_disable(uint32_t exmc_nand_bank)
- {
- EXMC_NPCTL(exmc_nand_bank) &= (~EXMC_NPCTL_NDBKEN);
- }
- /*!
- \brief deinitialize EXMC PC card bank
- \param[in] none
- \param[out] none
- \retval none
- */
- void exmc_pccard_deinit(void)
- {
- /* EXMC_BANK3_PCCARD */
- EXMC_NPCTL3 = BANK3_NPCTL_RESET;
- EXMC_NPINTEN3 = BANK3_NPINTEN_RESET;
- EXMC_NPCTCFG3 = BANK3_NPCTCFG_RESET;
- EXMC_NPATCFG3 = BANK3_NPATCFG_RESET;
- EXMC_PIOTCFG3 = BANK3_PIOTCFG3_RESET;
- }
- /*!
- \brief initialize exmc_pccard_parameter_struct parameter with the default values
- \param[in] none
- \param[out] the initialized struct exmc_pccard_parameter_struct pointer
- \retval none
- */
- void exmc_pccard_struct_para_init(exmc_pccard_parameter_struct* exmc_pccard_init_struct)
- {
- /* configure the structure with default values */
- exmc_pccard_init_struct->wait_feature = DISABLE;
- exmc_pccard_init_struct->ctr_latency = 0x0U;
- exmc_pccard_init_struct->atr_latency = 0x0U;
- exmc_pccard_init_struct->common_space_timing->setuptime = 0xFCU;
- exmc_pccard_init_struct->common_space_timing->waittime = 0xFCU;
- exmc_pccard_init_struct->common_space_timing->holdtime = 0xFCU;
- exmc_pccard_init_struct->common_space_timing->databus_hiztime = 0xFCU;
- exmc_pccard_init_struct->attribute_space_timing->setuptime = 0xFCU;
- exmc_pccard_init_struct->attribute_space_timing->waittime = 0xFCU;
- exmc_pccard_init_struct->attribute_space_timing->holdtime = 0xFCU;
- exmc_pccard_init_struct->attribute_space_timing->databus_hiztime = 0xFCU;
- exmc_pccard_init_struct->io_space_timing->setuptime = 0xFCU;
- exmc_pccard_init_struct->io_space_timing->waittime = 0xFCU;
- exmc_pccard_init_struct->io_space_timing->holdtime = 0xFCU;
- exmc_pccard_init_struct->io_space_timing->databus_hiztime = 0xFCU;
- }
- /*!
- \brief initialize EXMC PC card bank
- \param[in] exmc_pccard_parameter_struct: configure the EXMC NAND parameter
- atr_latency: EXMC_ALE_RE_DELAY_x_HCLK,x=1..16
- ctr_latency: EXMC_CLE_RE_DELAY_x_HCLK,x=1..16
- wait_feature: ENABLE or DISABLE
- common_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time
- attribute_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time
- io_space_timing: exmc_nand_pccard_timing_parameter_struct set the time
- \param[out] none
- \retval none
- */
- void exmc_pccard_init(exmc_pccard_parameter_struct* exmc_pccard_init_struct)
- {
- /* configure the EXMC bank3 PC card control register */
- EXMC_NPCTL3 = (uint32_t)(exmc_pccard_init_struct->wait_feature << NPCTL_NDWTEN_OFFSET) |
- EXMC_NAND_DATABUS_WIDTH_16B |
- exmc_pccard_init_struct->ctr_latency |
- exmc_pccard_init_struct->atr_latency ;
- /* configure the EXMC bank3 PC card common space timing configuration register */
- EXMC_NPCTCFG3 = (uint32_t)((exmc_pccard_init_struct->common_space_timing->setuptime - 1U)& EXMC_NPCTCFG_COMSET ) |
- (((exmc_pccard_init_struct->common_space_timing->waittime - 1U) << NPCTCFG_COMWAIT_OFFSET) & EXMC_NPCTCFG_COMWAIT ) |
- ((exmc_pccard_init_struct->common_space_timing->holdtime << NPCTCFG_COMHLD_OFFSET) & EXMC_NPCTCFG_COMHLD ) |
- (((exmc_pccard_init_struct->common_space_timing->databus_hiztime - 1U) << NPCTCFG_COMHIZ_OFFSET) & EXMC_NPCTCFG_COMHIZ );
- /* configure the EXMC bank3 PC card attribute space timing configuration register */
- EXMC_NPATCFG3 = (uint32_t)((exmc_pccard_init_struct->attribute_space_timing->setuptime - 1U) & EXMC_NPATCFG_ATTSET ) |
- (((exmc_pccard_init_struct->attribute_space_timing->waittime - 1U) << NPATCFG_ATTWAIT_OFFSET) & EXMC_NPATCFG_ATTWAIT ) |
- ((exmc_pccard_init_struct->attribute_space_timing->holdtime << NPATCFG_ATTHLD_OFFSET) & EXMC_NPATCFG_ATTHLD )|
- (((exmc_pccard_init_struct->attribute_space_timing->databus_hiztime -1U) << NPATCFG_ATTHIZ_OFFSET) & EXMC_NPATCFG_ATTHIZ );
- /* configure the EXMC bank3 PC card io space timing configuration register */
- EXMC_PIOTCFG3 = (uint32_t)((exmc_pccard_init_struct->io_space_timing->setuptime - 1U) & EXMC_PIOTCFG3_IOSET ) |
- (((exmc_pccard_init_struct->io_space_timing->waittime - 1U) << PIOTCFG_IOWAIT_OFFSET) & EXMC_PIOTCFG3_IOWAIT ) |
- ((exmc_pccard_init_struct->io_space_timing->holdtime << PIOTCFG_IOHLD_OFFSET) & EXMC_PIOTCFG3_IOHLD )|
- ((exmc_pccard_init_struct->io_space_timing->databus_hiztime << PIOTCFG_IOHIZ_OFFSET) & EXMC_PIOTCFG3_IOHIZ );
- }
- /*!
- \brief enable PC Card Bank
- \param[in] none
- \param[out] none
- \retval none
- */
- void exmc_pccard_enable(void)
- {
- EXMC_NPCTL3 |= EXMC_NPCTL_NDBKEN;
- }
- /*!
- \brief disable PC Card Bank
- \param[in] none
- \param[out] none
- \retval none
- */
- void exmc_pccard_disable(void)
- {
- EXMC_NPCTL3 &= (~EXMC_NPCTL_NDBKEN);
- }
- /*!
- \brief configure CRAM page size
- \param[in] exmc_norsram_region: specifie the region of NOR/PSRAM bank
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3)
- \param[in] page_size: CRAM page size
- only one parameter can be selected which is shown as below:
- \arg EXMC_CRAM_AUTO_SPLIT: the clock is generated only during synchronous access
- \arg EXMC_CRAM_PAGE_SIZE_128_BYTES: page size is 128 bytes
- \arg EXMC_CRAM_PAGE_SIZE_256_BYTES: page size is 256 bytes
- \arg EXMC_CRAM_PAGE_SIZE_512_BYTES: page size is 512 bytes
- \arg EXMC_CRAM_PAGE_SIZE_1024_BYTES: page size is 1024 bytes
- \param[out] none
- \retval none
- */
- void exmc_norsram_page_size_config(uint32_t exmc_norsram_region, uint32_t page_size)
- {
- /* reset the bits */
- EXMC_SNCTL(exmc_norsram_region) &= ~EXMC_SNCTL_CPS;
- /* set the CPS bits */
- EXMC_SNCTL(exmc_norsram_region) |= page_size;
- }
- /*!
- \brief enable or disable the EXMC NAND ECC function
- \param[in] exmc_nand_bank: specifie the NAND bank
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANKx_NAND(x=1,2)
- \param[in] newvalue: ENABLE or DISABLE
- \param[out] none
- \retval none
- */
- void exmc_nand_ecc_config(uint32_t exmc_nand_bank, ControlStatus newvalue)
- {
- if (ENABLE == newvalue){
- /* enable the selected NAND bank ECC function */
- EXMC_NPCTL(exmc_nand_bank) |= EXMC_NPCTL_ECCEN;
- }else{
- /* disable the selected NAND bank ECC function */
- EXMC_NPCTL(exmc_nand_bank) &= (~EXMC_NPCTL_ECCEN);
- }
- }
- /*!
- \brief get the EXMC ECC value
- \param[in] exmc_nand_bank: specifie the NAND bank
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANKx_NAND(x=1,2)
- \param[out] none
- \retval the error correction code(ECC) value
- */
- uint32_t exmc_ecc_get(uint32_t exmc_nand_bank)
- {
- return (EXMC_NECC(exmc_nand_bank));
- }
- /*!
- \brief enable EXMC interrupt
- \param[in] exmc_bank: specifies the NAND bank,PC card bank
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANK1_NAND: the NAND bank1
- \arg EXMC_BANK2_NAND: the NAND bank2
- \arg EXMC_BANK3_PCCARD: the PC card bank
- \param[in] interrupt: EXMC interrupt flag
- only one parameter can be selected which are shown as below:
- \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag
- \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag
- \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag
- \param[out] none
- \retval none
- */
- void exmc_interrupt_enable(uint32_t exmc_bank,uint32_t interrupt)
- {
- /* NAND bank1,bank2 or PC card bank3 */
- EXMC_NPINTEN(exmc_bank) |= interrupt;
- }
- /*!
- \brief disable EXMC interrupt
- \param[in] exmc_bank: specifies the NAND bank , PC card bank
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANK1_NAND: the NAND bank1
- \arg EXMC_BANK2_NAND: the NAND bank2
- \arg EXMC_BANK3_PCCARD: the PC card bank
- \param[in] interrupt: EXMC interrupt flag
- only one parameter can be selected which are shown as below:
- \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag
- \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag
- \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag
- \param[out] none
- \retval none
- */
- void exmc_interrupt_disable(uint32_t exmc_bank,uint32_t interrupt)
- {
- /* NAND bank1,bank2 or PC card bank3 */
- EXMC_NPINTEN(exmc_bank) &= (~interrupt);
- }
- /*!
- \brief get EXMC flag status
- \param[in] exmc_bank: specifies the NAND bank , PC card bank
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANK1_NAND: the NAND bank1
- \arg EXMC_BANK2_NAND: the NAND bank2
- \arg EXMC_BANK3_PCCARD: the PC Card bank
- \param[in] flag: EXMC status and flag
- only one parameter can be selected which are shown as below:
- \arg EXMC_NAND_PCCARD_FLAG_RISE: interrupt rising edge status
- \arg EXMC_NAND_PCCARD_FLAG_LEVEL: interrupt high-level status
- \arg EXMC_NAND_PCCARD_FLAG_FALL: interrupt falling edge status
- \arg EXMC_NAND_PCCARD_FLAG_FIFOE: FIFO empty flag
- \param[out] none
- \retval FlagStatus: SET or RESET
- */
- FlagStatus exmc_flag_get(uint32_t exmc_bank,uint32_t flag)
- {
- uint32_t status = 0x00000000U;
- /* NAND bank1,bank2 or PC card bank3 */
- status = EXMC_NPINTEN(exmc_bank);
-
- if ((status & flag) != (uint32_t)flag ){
- /* flag is reset */
- return RESET;
- }else{
- /* flag is set */
- return SET;
- }
- }
- /*!
- \brief clear EXMC flag status
- \param[in] exmc_bank: specifie the NAND bank , PCCARD bank
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANK1_NAND: the NAND bank1
- \arg EXMC_BANK2_NAND: the NAND bank2
- \arg EXMC_BANK3_PCCARD: the PC card bank
- \param[in] flag: EXMC status and flag
- only one parameter can be selected which are shown as below:
- \arg EXMC_NAND_PCCARD_FLAG_RISE: interrupt rising edge status
- \arg EXMC_NAND_PCCARD_FLAG_LEVEL: interrupt high-level status
- \arg EXMC_NAND_PCCARD_FLAG_FALL: interrupt falling edge status
- \arg EXMC_NAND_PCCARD_FLAG_FIFOE: FIFO empty flag
- \param[out] none
- \retval none
- */
- void exmc_flag_clear(uint32_t exmc_bank,uint32_t flag)
- {
- /* NAND bank1,bank2 or PC card bank3 */
- EXMC_NPINTEN(exmc_bank) &= (~flag);
- }
- /*!
- \brief get EXMC interrupt flag
- \param[in] exmc_bank: specifies the NAND bank , PC card bank
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANK1_NAND: the NAND bank1
- \arg EXMC_BANK2_NAND: the NAND bank2
- \arg EXMC_BANK3_PCCARD: the PC card bank
- \param[in] interrupt: EXMC interrupt flag
- only one parameter can be selected which are shown as below:
- \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag
- \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag
- \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag
- \param[out] none
- \retval FlagStatus: SET or RESET
- */
- FlagStatus exmc_interrupt_flag_get(uint32_t exmc_bank,uint32_t interrupt)
- {
- uint32_t status = 0x00000000U,interrupt_enable = 0x00000000U,interrupt_state = 0x00000000U;
- /* NAND bank1,bank2 or PC card bank3 */
- status = EXMC_NPINTEN(exmc_bank);
- interrupt_state = (status & (interrupt >> INTEN_INTS_OFFSET));
- interrupt_enable = (status & interrupt);
- if ((interrupt_enable) && (interrupt_state)){
- /* interrupt flag is set */
- return SET;
- }else{
- /* interrupt flag is reset */
- return RESET;
- }
- }
- /*!
- \brief clear EXMC interrupt flag
- \param[in] exmc_bank: specifies the NAND bank , PC card bank
- only one parameter can be selected which is shown as below:
- \arg EXMC_BANK1_NAND: the NAND bank1
- \arg EXMC_BANK2_NAND: the NAND bank2
- \arg EXMC_BANK3_PCCARD: the PC card bank
- \param[in] interrupt: EXMC interrupt flag
- only one parameter can be selected which are shown as below:
- \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag
- \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag
- \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag
- \param[out] none
- \retval none
- */
- void exmc_interrupt_flag_clear(uint32_t exmc_bank,uint32_t interrupt)
- {
- /* NAND bank1,bank2 or PC card bank3 */
- EXMC_NPINTEN(exmc_bank) &= ~(interrupt >> INTEN_INTS_OFFSET);
- }
|