From 013e3c14cc3f2fe92dba7e92d436bdcb3e2c165f Mon Sep 17 00:00:00 2001 From: Zhao_Jiasheng <18535861947@163.com> Date: Fri, 28 May 2021 14:31:48 +0800 Subject: [PATCH 1/7] Add arm fsmc driver --- arch/arm/cortex-m4/system_init.c | 4 - board/aiit-arm32-board/board.c | 6 + .../third_party_driver/extmem/Makefile | 2 +- .../third_party_driver/extmem/connect_fsmc.c | 133 ++ .../third_party_driver/extmem/extmem.c | 336 ----- .../third_party_driver/extmem/hardware_fsmc.c | 1101 +++++++++++++++++ .../include/hardware_fsmc.h | 1 + board/stm32f407zgt6/board.c | 6 + .../stm32f407zgt6/third_party_driver/Kconfig | 6 + .../stm32f407zgt6/third_party_driver/Makefile | 3 + .../third_party_driver/extmem/Kconfig | 53 + .../third_party_driver/extmem/Makefile | 3 + .../third_party_driver/extmem/connect_fsmc.c | 192 +++ .../third_party_driver/extmem/hardware_fsmc.c | 1101 +++++++++++++++++ .../third_party_driver/include/connect_fsmc.h | 36 + .../include/hardware_fsmc.h | 689 +++++++++++ kernel/kernel_test/Makefile | 3 +- kernel/kernel_test/extsram_test.c | 79 ++ 18 files changed, 3412 insertions(+), 342 deletions(-) create mode 100644 board/aiit-arm32-board/third_party_driver/extmem/connect_fsmc.c delete mode 100644 board/aiit-arm32-board/third_party_driver/extmem/extmem.c create mode 100644 board/aiit-arm32-board/third_party_driver/extmem/hardware_fsmc.c create mode 100644 board/stm32f407zgt6/third_party_driver/extmem/Kconfig create mode 100644 board/stm32f407zgt6/third_party_driver/extmem/Makefile create mode 100644 board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c create mode 100644 board/stm32f407zgt6/third_party_driver/extmem/hardware_fsmc.c create mode 100644 board/stm32f407zgt6/third_party_driver/include/connect_fsmc.h create mode 100644 board/stm32f407zgt6/third_party_driver/include/hardware_fsmc.h create mode 100644 kernel/kernel_test/extsram_test.c diff --git a/arch/arm/cortex-m4/system_init.c b/arch/arm/cortex-m4/system_init.c index bde593cf3..be01987c0 100644 --- a/arch/arm/cortex-m4/system_init.c +++ b/arch/arm/cortex-m4/system_init.c @@ -91,10 +91,6 @@ void SystemInit(void) RCC->CR &= (uint32_t)0xFFFBFFFF; RCC->CIR = 0x00000000; -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - SystemInitExtMemCtl(); -#endif - #ifdef VECT_TAB_SRAM SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; #else diff --git a/board/aiit-arm32-board/board.c b/board/aiit-arm32-board/board.c index f70c1f3fd..f3c221b75 100644 --- a/board/aiit-arm32-board/board.c +++ b/board/aiit-arm32-board/board.c @@ -164,6 +164,12 @@ void InitBoardHardware() KPrintf("board initialization......\n"); #endif + +#ifdef BSP_USING_EXTMEM + extern int HwSramInit(void); + HwSramInit(); +#endif + InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); #ifdef SEPARATE_COMPILE diff --git a/board/aiit-arm32-board/third_party_driver/extmem/Makefile b/board/aiit-arm32-board/third_party_driver/extmem/Makefile index 6224e3f93..81594a1bf 100644 --- a/board/aiit-arm32-board/third_party_driver/extmem/Makefile +++ b/board/aiit-arm32-board/third_party_driver/extmem/Makefile @@ -1,3 +1,3 @@ -SRC_FILES := extmem.c +SRC_FILES := hardware_fsmc.c connect_fsmc.c include $(KERNEL_ROOT)/compiler.mk diff --git a/board/aiit-arm32-board/third_party_driver/extmem/connect_fsmc.c b/board/aiit-arm32-board/third_party_driver/extmem/connect_fsmc.c new file mode 100644 index 000000000..f7f1d2d40 --- /dev/null +++ b/board/aiit-arm32-board/third_party_driver/extmem/connect_fsmc.c @@ -0,0 +1,133 @@ +#include "hardware_fsmc.h" +#include "hardware_gpio.h" +#include "hardware_rcc.h" + +#define SRAM_DATA_WIDTH 16 + +static FSMC_NORSRAMInitTypeDef hsram; +static FSMC_NORSRAMTimingInitTypeDef hsram_read; +static FSMC_NORSRAMTimingInitTypeDef hsram_write; + +int HwSramInit(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE); + RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOE, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOF, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_10 | GPIO_Pin_12; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOG, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC); + + GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC); + + GPIO_PinAFConfig(GPIOF,GPIO_PinSource0,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource1,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource2,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource3,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource4,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource5,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource13,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource14,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource15,GPIO_AF_FSMC); + + GPIO_PinAFConfig(GPIOG,GPIO_PinSource0,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource1,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource3,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource10,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC); + + hsram.FSMC_ReadWriteTimingStruct = &hsram_read; + hsram.FSMC_WriteTimingStruct = &hsram_write; + + /* hsram.Init */ + hsram.FSMC_Bank = FSMC_Bank1_NORSRAM1; + hsram.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + hsram.FSMC_MemoryType = FSMC_MemoryType_SRAM; +#if SRAM_DATA_WIDTH == 8 + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; +#elif SRAM_DATA_WIDTH == 16 + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; +#else + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_32b; +#endif + hsram.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + hsram.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + hsram.FSMC_WrapMode = FSMC_WrapMode_Disable; + hsram.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + hsram.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + hsram.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + hsram.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + hsram.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + + hsram_read.FSMC_AddressSetupTime = 1; + hsram_read.FSMC_AddressHoldTime = 0; + hsram_read.FSMC_DataSetupTime = 2; + hsram_read.FSMC_BusTurnAroundDuration = 0; + hsram_read.FSMC_CLKDivision = 0; + hsram_read.FSMC_DataLatency = 0; + hsram_read.FSMC_AccessMode = FSMC_AccessMode_A; + + hsram_write.FSMC_AddressSetupTime = 1; + hsram_write.FSMC_AddressHoldTime = 0; + hsram_write.FSMC_DataSetupTime = 2; + hsram_write.FSMC_BusTurnAroundDuration = 0; + hsram_write.FSMC_CLKDivision = 0; + hsram_write.FSMC_DataLatency = 0; + hsram_write.FSMC_AccessMode = FSMC_AccessMode_A; + + FSMC_NORSRAMInit(&hsram); + + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); + + return 0; +} \ No newline at end of file diff --git a/board/aiit-arm32-board/third_party_driver/extmem/extmem.c b/board/aiit-arm32-board/third_party_driver/extmem/extmem.c deleted file mode 100644 index bb3c793aa..000000000 --- a/board/aiit-arm32-board/third_party_driver/extmem/extmem.c +++ /dev/null @@ -1,336 +0,0 @@ -/* -* Copyright (c) 2020 AIIT XUOS Lab -* XiUOS is licensed under Mulan PSL v2. -* You can use this software according to the terms and conditions of the Mulan PSL v2. -* You may obtain a copy of Mulan PSL v2 at: -* http://license.coscl.org.cn/MulanPSL2 -* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -* See the Mulan PSL v2 for more details. -*/ - -/** -* @file extmem.c -* @brief support extmem function -* @version 1.0 -* @author AIIT XUOS Lab -* @date 2021-04-25 -*/ - -#include -#include - -#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) -void SystemInitExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; - - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - - RCC->AHB1ENR |= 0x000001F8; - - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - GPIOD->MODER = 0xAAAA0A8A; - GPIOD->OSPEEDR = 0xFFFF0FCF; - GPIOD->OTYPER = 0x00000000; - GPIOD->PUPDR = 0x00000000; - - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - GPIOE->MODER = 0xAAAA828A; - GPIOE->OSPEEDR = 0xFFFFC3CF; - GPIOE->OTYPER = 0x00000000; - GPIOE->PUPDR = 0x00000000; - - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - GPIOF->MODER = 0xAA800AAA; - GPIOF->OSPEEDR = 0xAA800AAA; - GPIOF->OTYPER = 0x00000000; - GPIOF->PUPDR = 0x00000000; - - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - GPIOG->MODER = 0xAAAAAAAA; - GPIOG->OSPEEDR = 0xAAAAAAAA; - GPIOG->OTYPER = 0x00000000; - GPIOG->PUPDR = 0x00000000; - - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - GPIOH->MODER = 0xAAAA08A0; - GPIOH->OSPEEDR = 0xAAAA08A0; - GPIOH->OTYPER = 0x00000000; - GPIOH->PUPDR = 0x00000000; - - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - GPIOI->MODER = 0x0028AAAA; - GPIOI->OSPEEDR = 0x0028AAAA; - GPIOI->OTYPER = 0x00000000; - GPIOI->PUPDR = 0x00000000; - - RCC->AHB3ENR |= 0x00000001; - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - - FMC_Bank5_6->SDCR[0] = 0x000019E4; - FMC_Bank5_6->SDTR[0] = 0x01115351; - - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - for (index = 0; index<1000; index++); - - FMC_Bank5_6->SDCMR = 0x00000012; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - FMC_Bank5_6->SDCMR = 0x00000073; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - FMC_Bank5_6->SDCMR = 0x00046014; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - tmpreg = FMC_Bank5_6->SDRTR; - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); - - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif -#if defined(STM32F469xx) || defined(STM32F479xx) - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif - - (void)(tmp); -} -#endif -#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) -void SystemInitExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#if defined (DATA_IN_ExtSDRAM) - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - -#if defined(STM32F446xx) - RCC->AHB1ENR |= 0x0000007D; -#else - RCC->AHB1ENR |= 0x000001F8; -#endif - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - -#if defined(STM32F446xx) - GPIOA->AFR[0] |= 0xC0000000; - GPIOA->AFR[1] |= 0x00000000; - GPIOA->MODER |= 0x00008000; - GPIOA->OSPEEDR |= 0x00008000; - GPIOA->OTYPER |= 0x00000000; - GPIOA->PUPDR |= 0x00000000; - - GPIOC->AFR[0] |= 0x00CC0000; - GPIOC->AFR[1] |= 0x00000000; - GPIOC->MODER |= 0x00000A00; - GPIOC->OSPEEDR |= 0x00000A00; - GPIOC->OTYPER |= 0x00000000; - GPIOC->PUPDR |= 0x00000000; -#endif - - GPIOD->AFR[0] = 0x000000CC; - GPIOD->AFR[1] = 0xCC000CCC; - GPIOD->MODER = 0xA02A000A; - GPIOD->OSPEEDR = 0xA02A000A; - GPIOD->OTYPER = 0x00000000; - GPIOD->PUPDR = 0x00000000; - - GPIOE->AFR[0] = 0xC00000CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - GPIOE->MODER = 0xAAAA800A; - GPIOE->OSPEEDR = 0xAAAA800A; - GPIOE->OTYPER = 0x00000000; - GPIOE->PUPDR = 0x00000000; - - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - GPIOF->MODER = 0xAA800AAA; - GPIOF->OSPEEDR = 0xAA800AAA; - GPIOF->OTYPER = 0x00000000; - GPIOF->PUPDR = 0x00000000; - - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - GPIOG->MODER = 0xAAAAAAAA; - GPIOG->OSPEEDR = 0xAAAAAAAA; - GPIOG->OTYPER = 0x00000000; - GPIOG->PUPDR = 0x00000000; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - GPIOH->MODER = 0xAAAA08A0; - GPIOH->OSPEEDR = 0xAAAA08A0; - GPIOH->OTYPER = 0x00000000; - GPIOH->PUPDR = 0x00000000; - - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - GPIOI->MODER = 0x0028AAAA; - GPIOI->OSPEEDR = 0x0028AAAA; - GPIOI->OTYPER = 0x00000000; - GPIOI->PUPDR = 0x00000000; -#endif - - RCC->AHB3ENR |= 0x00000001; - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - -#if defined(STM32F446xx) - FMC_Bank5_6->SDCR[0] = 0x00001954; -#else - FMC_Bank5_6->SDCR[0] = 0x000019E4; -#endif - FMC_Bank5_6->SDTR[0] = 0x01115351; - - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - for (index = 0; index<1000; index++); - - FMC_Bank5_6->SDCMR = 0x00000012; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x000000F3; -#else - FMC_Bank5_6->SDCMR = 0x00000073; -#endif - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x00044014; -#else - FMC_Bank5_6->SDCMR = 0x00046014; -#endif - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - tmpreg = FMC_Bank5_6->SDRTR; -#if defined(STM32F446xx) - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); -#else - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); -#endif - - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); -#endif -#endif - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) - -#if defined(DATA_IN_ExtSRAM) - RCC->AHB1ENR |= 0x00000078; - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); - - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - GPIOD->MODER = 0xAAAA0A8A; - GPIOD->OSPEEDR = 0xFFFF0FCF; - GPIOD->OTYPER = 0x00000000; - GPIOD->PUPDR = 0x00000000; - - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - GPIOE->MODER = 0xAAAA828A; - GPIOE->OSPEEDR = 0xFFFFC3CF; - GPIOE->OTYPER = 0x00000000; - GPIOE->PUPDR = 0x00000000; - - GPIOF->AFR[0] = 0x00CCCCCC; - GPIOF->AFR[1] = 0xCCCC0000; - GPIOF->MODER = 0xAA000AAA; - GPIOF->OSPEEDR = 0xFF000FFF; - GPIOF->OTYPER = 0x00000000; - GPIOF->PUPDR = 0x00000000; - - GPIOG->AFR[0] = 0x00CCCCCC; - GPIOG->AFR[1] = 0x000000C0; - GPIOG->MODER = 0x00085AAA; - GPIOG->OSPEEDR = 0x000CAFFF; - GPIOG->OTYPER = 0x00000000; - GPIOG->PUPDR = 0x00000000; - - RCC->AHB3ENR |= 0x00000001; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif -#if defined(STM32F469xx) || defined(STM32F479xx) - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ - || defined(STM32F412Zx) || defined(STM32F412Vx) - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); - FSMC_Bank1->BTCR[2] = 0x00001011; - FSMC_Bank1->BTCR[3] = 0x00000201; - FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; -#endif - -#endif -#endif - (void)(tmp); -} -#endif \ No newline at end of file diff --git a/board/aiit-arm32-board/third_party_driver/extmem/hardware_fsmc.c b/board/aiit-arm32-board/third_party_driver/extmem/hardware_fsmc.c new file mode 100644 index 000000000..5c46e4d7d --- /dev/null +++ b/board/aiit-arm32-board/third_party_driver/extmem/hardware_fsmc.c @@ -0,0 +1,1101 @@ +/** + ****************************************************************************** + * @file stm32f4xx_fsmc.c + * @author MCD Application Team + * @version V1.8.0 + * @date 04-November-2016 + * @brief This file provides firmware functions to manage the following + * functionalities of the FSMC peripheral: + * + Interface with SRAM, PSRAM, NOR and OneNAND memories + * + Interface with NAND memories + * + Interface with 16-bit PC Card compatible memories + * + Interrupts and flags management + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2016 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "hardware_fsmc.h" +#include "hardware_rcc.h" +#include + +/** @addtogroup STM32F4xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup FSMC + * @brief FSMC driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +const FSMC_NORSRAMTimingInitTypeDef FSMC_DefaultTimingStruct = {0x0F, /* FSMC_AddressSetupTime */ + 0x0F, /* FSMC_AddressHoldTime */ + 0xFF, /* FSMC_DataSetupTime */ + 0x0F, /* FSMC_BusTurnAroundDuration */ + 0x0F, /* FSMC_CLKDivision */ + 0x0F, /* FSMC_DataLatency */ + FSMC_AccessMode_A /* FSMC_AccessMode */ + }; +/* Private define ------------------------------------------------------------*/ + +/* --------------------- FSMC registers bit mask ---------------------------- */ +/* FSMC BCRx Mask */ +#define BCR_MBKEN_SET ((uint32_t)0x00000001) +#define BCR_MBKEN_RESET ((uint32_t)0x000FFFFE) +#define BCR_FACCEN_SET ((uint32_t)0x00000040) + +/* FSMC PCRx Mask */ +#define PCR_PBKEN_SET ((uint32_t)0x00000004) +#define PCR_PBKEN_RESET ((uint32_t)0x000FFFFB) +#define PCR_ECCEN_SET ((uint32_t)0x00000040) +#define PCR_ECCEN_RESET ((uint32_t)0x000FFFBF) +#define PCR_MEMORYTYPE_NAND ((uint32_t)0x00000008) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup FSMC_Private_Functions + * @{ + */ + +/** @defgroup FSMC_Group1 NOR/SRAM Controller functions + * @brief NOR/SRAM Controller functions + * +@verbatim + =============================================================================== + ##### NOR and SRAM Controller functions ##### + =============================================================================== + + [..] The following sequence should be followed to configure the FSMC to interface + with SRAM, PSRAM, NOR or OneNAND memory connected to the NOR/SRAM Bank: + + (#) Enable the clock for the FSMC and associated GPIOs using the following functions: + RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); + + (#) FSMC pins configuration + (++) Connect the involved FSMC pins to AF12 using the following function + GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_FSMC); + (++) Configure these FSMC pins in alternate function mode by calling the function + GPIO_Init(); + + (#) Declare a FSMC_NORSRAMInitTypeDef structure, for example: + FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; + and fill the FSMC_NORSRAMInitStructure variable with the allowed values of + the structure member. + + (#) Initialize the NOR/SRAM Controller by calling the function + FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); + + (#) Then enable the NOR/SRAM Bank, for example: + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE); + + (#) At this stage you can read/write from/to the memory connected to the NOR/SRAM Bank. + +@endverbatim + * @{ + */ + +/** + * @brief De-initializes the FSMC NOR/SRAM Banks registers to their default + * reset values. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 + * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 + * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 + * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 + * @retval None + */ +void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank) +{ + /* Check the parameter */ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); + + /* FSMC_Bank1_NORSRAM1 */ + if(FSMC_Bank == FSMC_Bank1_NORSRAM1) + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030DB; + } + /* FSMC_Bank1_NORSRAM2, FSMC_Bank1_NORSRAM3 or FSMC_Bank1_NORSRAM4 */ + else + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030D2; + } + FSMC_Bank1->BTCR[FSMC_Bank + 1] = 0x0FFFFFFF; + FSMC_Bank1E->BWTR[FSMC_Bank] = 0x0FFFFFFF; +} + +/** + * @brief Initializes the FSMC NOR/SRAM Banks according to the specified + * parameters in the FSMC_NORSRAMInitStruct. + * @param FSMC_NORSRAMInitStruct : pointer to a FSMC_NORSRAMInitTypeDef structure + * that contains the configuration information for the FSMC NOR/SRAM + * specified Banks. + * @retval None + */ +void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) +{ + uint32_t tmpbcr = 0, tmpbtr = 0, tmpbwr = 0; + + /* Check the parameters */ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_NORSRAMInitStruct->FSMC_Bank)); + assert_param(IS_FSMC_MUX(FSMC_NORSRAMInitStruct->FSMC_DataAddressMux)); + assert_param(IS_FSMC_MEMORY(FSMC_NORSRAMInitStruct->FSMC_MemoryType)); + assert_param(IS_FSMC_MEMORY_WIDTH(FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth)); + assert_param(IS_FSMC_BURSTMODE(FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode)); + assert_param(IS_FSMC_ASYNWAIT(FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait)); + assert_param(IS_FSMC_WAIT_POLARITY(FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity)); + assert_param(IS_FSMC_WRAP_MODE(FSMC_NORSRAMInitStruct->FSMC_WrapMode)); + assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive)); + assert_param(IS_FSMC_WRITE_OPERATION(FSMC_NORSRAMInitStruct->FSMC_WriteOperation)); + assert_param(IS_FSMC_WAITE_SIGNAL(FSMC_NORSRAMInitStruct->FSMC_WaitSignal)); + assert_param(IS_FSMC_EXTENDED_MODE(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode)); + assert_param(IS_FSMC_WRITE_BURST(FSMC_NORSRAMInitStruct->FSMC_WriteBurst)); + assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime)); + assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime)); + assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime)); + assert_param(IS_FSMC_TURNAROUND_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration)); + assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision)); + assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency)); + assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode)); + + /* Get the BTCR register value */ + tmpbcr = FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank]; + + /* Clear MBKEN, MUXEN, MTYP, MWID, FACCEN, BURSTEN, WAITPOL, WRAPMOD, WAITCFG, WREN, + WAITEN, EXTMOD, ASYNCWAIT, CBURSTRW and CCLKEN bits */ + tmpbcr &= ((uint32_t)~(FSMC_BCR1_MBKEN | FSMC_BCR1_MUXEN | FSMC_BCR1_MTYP | \ + FSMC_BCR1_MWID | FSMC_BCR1_FACCEN | FSMC_BCR1_BURSTEN | \ + FSMC_BCR1_WAITPOL | FSMC_BCR1_WRAPMOD | FSMC_BCR1_WAITCFG | \ + FSMC_BCR1_WREN | FSMC_BCR1_WAITEN | FSMC_BCR1_EXTMOD | \ + FSMC_BCR1_ASYNCWAIT | FSMC_BCR1_CBURSTRW)); + + /* Bank1 NOR/SRAM control register configuration */ + tmpbcr |= (uint32_t)FSMC_NORSRAMInitStruct->FSMC_DataAddressMux | + FSMC_NORSRAMInitStruct->FSMC_MemoryType | + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth | + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode | + FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity | + FSMC_NORSRAMInitStruct->FSMC_WrapMode | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive | + FSMC_NORSRAMInitStruct->FSMC_WriteOperation | + FSMC_NORSRAMInitStruct->FSMC_WaitSignal | + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode | + FSMC_NORSRAMInitStruct->FSMC_WriteBurst; + + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] = tmpbcr; + + if(FSMC_NORSRAMInitStruct->FSMC_MemoryType == FSMC_MemoryType_NOR) + { + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] |= (uint32_t)BCR_FACCEN_SET; + } + + /* Get the BTCR register value */ + tmpbtr = FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1]; + + /* Clear ADDSET, ADDHLD, DATAST, BUSTURN, CLKDIV, DATLAT and ACCMOD bits */ + tmpbtr &= ((uint32_t)~(FSMC_BTR1_ADDSET | FSMC_BTR1_ADDHLD | FSMC_BTR1_DATAST | \ + FSMC_BTR1_BUSTURN | FSMC_BTR1_CLKDIV | FSMC_BTR1_DATLAT | \ + FSMC_BTR1_ACCMOD)); + + /* Bank1 NOR/SRAM timing register configuration */ + tmpbtr |= (uint32_t)FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime << 4) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime << 8) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration << 16) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision << 20) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency << 24) | + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode; + + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1] = tmpbtr; + + /* Bank1 NOR/SRAM timing register for write configuration, if extended mode is used */ + if(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode == FSMC_ExtendedMode_Enable) + { + assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime)); + assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime)); + assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime)); + assert_param(IS_FSMC_TURNAROUND_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_BusTurnAroundDuration)); + assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode)); + + /* Get the BWTR register value */ + tmpbwr = FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank]; + + /* Clear ADDSET, ADDHLD, DATAST, BUSTURN, and ACCMOD bits */ + tmpbwr &= ((uint32_t)~(FSMC_BWTR1_ADDSET | FSMC_BWTR1_ADDHLD | FSMC_BWTR1_DATAST | \ + FSMC_BWTR1_DATLAT | FSMC_BWTR1_ACCMOD)); + + tmpbwr |= (uint32_t)FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime << 4 )| + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime << 8) | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_BusTurnAroundDuration << 16) | + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode; + + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = tmpbwr; + } + else + { + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = 0x0FFFFFFF; + } +} + +/** + * @brief Fills each FSMC_NORSRAMInitStruct member with its default value. + * @param FSMC_NORSRAMInitStruct: pointer to a FSMC_NORSRAMInitTypeDef structure + * which will be initialized. + * @retval None + */ +void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) +{ + /* Reset NOR/SRAM Init structure parameters values */ + FSMC_NORSRAMInitStruct->FSMC_Bank = FSMC_Bank1_NORSRAM1; + FSMC_NORSRAMInitStruct->FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; + FSMC_NORSRAMInitStruct->FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStruct->FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStruct->FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignal = FSMC_WaitSignal_Enable; + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct = (FSMC_NORSRAMTimingInitTypeDef*)((uint32_t)&FSMC_DefaultTimingStruct); + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct = (FSMC_NORSRAMTimingInitTypeDef*)((uint32_t)&FSMC_DefaultTimingStruct); +} + +/** + * @brief Enables or disables the specified NOR/SRAM Memory Bank. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 + * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 + * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 + * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 + * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NOR/SRAM Bank by setting the PBKEN bit in the BCRx register */ + FSMC_Bank1->BTCR[FSMC_Bank] |= BCR_MBKEN_SET; + } + else + { + /* Disable the selected NOR/SRAM Bank by clearing the PBKEN bit in the BCRx register */ + FSMC_Bank1->BTCR[FSMC_Bank] &= BCR_MBKEN_RESET; + } +} +/** + * @} + */ + +/** @defgroup FSMC_Group2 NAND Controller functions + * @brief NAND Controller functions + * +@verbatim + =============================================================================== + ##### NAND Controller functions ##### + =============================================================================== + + [..] The following sequence should be followed to configure the FSMC to interface + with 8-bit or 16-bit NAND memory connected to the NAND Bank: + + (#) Enable the clock for the FSMC and associated GPIOs using the following functions: + (++) RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); + (++) RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); + + (#) FSMC pins configuration + (++) Connect the involved FSMC pins to AF12 using the following function + GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_FSMC); + (++) Configure these FSMC pins in alternate function mode by calling the function + GPIO_Init(); + + (#) Declare a FSMC_NANDInitTypeDef structure, for example: + FSMC_NANDInitTypeDef FSMC_NANDInitStructure; + and fill the FSMC_NANDInitStructure variable with the allowed values of + the structure member. + + (#) Initialize the NAND Controller by calling the function + FSMC_NANDInit(&FSMC_NANDInitStructure); + + (#) Then enable the NAND Bank, for example: + FSMC_NANDCmd(FSMC_Bank3_NAND, ENABLE); + + (#) At this stage you can read/write from/to the memory connected to the NAND Bank. + + [..] + (@) To enable the Error Correction Code (ECC), you have to use the function + FSMC_NANDECCCmd(FSMC_Bank3_NAND, ENABLE); + [..] + (@) and to get the current ECC value you have to use the function + ECCval = FSMC_GetECC(FSMC_Bank3_NAND); + +@endverbatim + * @{ + */ + +/** + * @brief De-initializes the FSMC NAND Banks registers to their default reset values. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @retval None + */ +void FSMC_NANDDeInit(uint32_t FSMC_Bank) +{ + /* Check the parameter */ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + /* Set the FSMC_Bank2 registers to their reset values */ + FSMC_Bank2->PCR2 = 0x00000018; + FSMC_Bank2->SR2 = 0x00000040; + FSMC_Bank2->PMEM2 = 0xFCFCFCFC; + FSMC_Bank2->PATT2 = 0xFCFCFCFC; + } + /* FSMC_Bank3_NAND */ + else + { + /* Set the FSMC_Bank3 registers to their reset values */ + FSMC_Bank3->PCR3 = 0x00000018; + FSMC_Bank3->SR3 = 0x00000040; + FSMC_Bank3->PMEM3 = 0xFCFCFCFC; + FSMC_Bank3->PATT3 = 0xFCFCFCFC; + } +} + +/** + * @brief Initializes the FSMC NAND Banks according to the specified parameters + * in the FSMC_NANDInitStruct. + * @param FSMC_NANDInitStruct : pointer to a FSMC_NANDInitTypeDef structure that + * contains the configuration information for the FSMC NAND specified Banks. + * @retval None + */ +void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) +{ + uint32_t tmppcr = 0x00000000, tmppmem = 0x00000000, tmppatt = 0x00000000; + + /* Check the parameters */ + assert_param( IS_FSMC_NAND_BANK(FSMC_NANDInitStruct->FSMC_Bank)); + assert_param( IS_FSMC_WAIT_FEATURE(FSMC_NANDInitStruct->FSMC_Waitfeature)); + assert_param( IS_FSMC_MEMORY_WIDTH(FSMC_NANDInitStruct->FSMC_MemoryDataWidth)); + assert_param( IS_FSMC_ECC_STATE(FSMC_NANDInitStruct->FSMC_ECC)); + assert_param( IS_FSMC_ECCPAGE_SIZE(FSMC_NANDInitStruct->FSMC_ECCPageSize)); + assert_param( IS_FSMC_TCLR_TIME(FSMC_NANDInitStruct->FSMC_TCLRSetupTime)); + assert_param( IS_FSMC_TAR_TIME(FSMC_NANDInitStruct->FSMC_TARSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); + + if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) + { + /* Get the NAND bank 2 register value */ + tmppcr = FSMC_Bank2->PCR2; + } + else + { + /* Get the NAND bank 3 register value */ + tmppcr = FSMC_Bank3->PCR3; + } + + /* Clear PWAITEN, PBKEN, PTYP, PWID, ECCEN, TCLR, TAR and ECCPS bits */ + tmppcr &= ((uint32_t)~(FSMC_PCR2_PWAITEN | FSMC_PCR2_PBKEN | FSMC_PCR2_PTYP | \ + FSMC_PCR2_PWID | FSMC_PCR2_ECCEN | FSMC_PCR2_TCLR | \ + FSMC_PCR2_TAR | FSMC_PCR2_ECCPS)); + + /* Set the tmppcr value according to FSMC_NANDInitStruct parameters */ + tmppcr |= (uint32_t)FSMC_NANDInitStruct->FSMC_Waitfeature | + PCR_MEMORYTYPE_NAND | + FSMC_NANDInitStruct->FSMC_MemoryDataWidth | + FSMC_NANDInitStruct->FSMC_ECC | + FSMC_NANDInitStruct->FSMC_ECCPageSize | + (FSMC_NANDInitStruct->FSMC_TCLRSetupTime << 9 )| + (FSMC_NANDInitStruct->FSMC_TARSetupTime << 13); + + if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) + { + /* Get the NAND bank 2 register value */ + tmppmem = FSMC_Bank2->PMEM2; + } + else + { + /* Get the NAND bank 3 register value */ + tmppmem = FSMC_Bank3->PMEM3; + } + + /* Clear MEMSETx, MEMWAITx, MEMHOLDx and MEMHIZx bits */ + tmppmem &= ((uint32_t)~(FSMC_PMEM2_MEMSET2 | FSMC_PMEM2_MEMWAIT2 | FSMC_PMEM2_MEMHOLD2 | \ + FSMC_PMEM2_MEMHIZ2)); + + /* Set tmppmem value according to FSMC_CommonSpaceTimingStructure parameters */ + tmppmem |= (uint32_t)FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) + { + /* Get the NAND bank 2 register value */ + tmppatt = FSMC_Bank2->PATT2; + } + else + { + /* Get the NAND bank 3 register value */ + tmppatt = FSMC_Bank2->PATT2; + } + + /* Clear ATTSETx, ATTWAITx, ATTHOLDx and ATTHIZx bits */ + tmppatt &= ((uint32_t)~(FSMC_PATT2_ATTSET2 | FSMC_PATT2_ATTWAIT2 | FSMC_PATT2_ATTHOLD2 | \ + FSMC_PATT2_ATTHIZ2)); + + /* Set tmppatt value according to FSMC_AttributeSpaceTimingStructure parameters */ + tmppatt |= (uint32_t)FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) + { + /* FSMC_Bank2_NAND registers configuration */ + FSMC_Bank2->PCR2 = tmppcr; + FSMC_Bank2->PMEM2 = tmppmem; + FSMC_Bank2->PATT2 = tmppatt; + } + else + { + /* FSMC_Bank3_NAND registers configuration */ + FSMC_Bank3->PCR3 = tmppcr; + FSMC_Bank3->PMEM3 = tmppmem; + FSMC_Bank3->PATT3 = tmppatt; + } +} + + +/** + * @brief Fills each FSMC_NANDInitStruct member with its default value. + * @param FSMC_NANDInitStruct: pointer to a FSMC_NANDInitTypeDef structure which + * will be initialized. + * @retval None + */ +void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) +{ + /* Reset NAND Init structure parameters values */ + FSMC_NANDInitStruct->FSMC_Bank = FSMC_Bank2_NAND; + FSMC_NANDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; + FSMC_NANDInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NANDInitStruct->FSMC_ECC = FSMC_ECC_Disable; + FSMC_NANDInitStruct->FSMC_ECCPageSize = FSMC_ECCPageSize_256Bytes; + FSMC_NANDInitStruct->FSMC_TCLRSetupTime = 0x0; + FSMC_NANDInitStruct->FSMC_TARSetupTime = 0x0; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; +} + +/** + * @brief Enables or disables the specified NAND Memory Bank. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NAND Bank by setting the PBKEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 |= PCR_PBKEN_SET; + } + else + { + FSMC_Bank3->PCR3 |= PCR_PBKEN_SET; + } + } + else + { + /* Disable the selected NAND Bank by clearing the PBKEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 &= PCR_PBKEN_RESET; + } + else + { + FSMC_Bank3->PCR3 &= PCR_PBKEN_RESET; + } + } +} +/** + * @brief Enables or disables the FSMC NAND ECC feature. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @param NewState: new state of the FSMC NAND ECC feature. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NAND Bank ECC function by setting the ECCEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 |= PCR_ECCEN_SET; + } + else + { + FSMC_Bank3->PCR3 |= PCR_ECCEN_SET; + } + } + else + { + /* Disable the selected NAND Bank ECC function by clearing the ECCEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 &= PCR_ECCEN_RESET; + } + else + { + FSMC_Bank3->PCR3 &= PCR_ECCEN_RESET; + } + } +} + +/** + * @brief Returns the error correction code register value. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @retval The Error Correction Code (ECC) value. + */ +uint32_t FSMC_GetECC(uint32_t FSMC_Bank) +{ + uint32_t eccval = 0x00000000; + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + /* Get the ECCR2 register value */ + eccval = FSMC_Bank2->ECCR2; + } + else + { + /* Get the ECCR3 register value */ + eccval = FSMC_Bank3->ECCR3; + } + /* Return the error correction code value */ + return(eccval); +} +/** + * @} + */ + +/** @defgroup FSMC_Group3 PCCARD Controller functions + * @brief PCCARD Controller functions + * +@verbatim + =============================================================================== + ##### PCCARD Controller functions ##### + =============================================================================== + + [..] he following sequence should be followed to configure the FSMC to interface + with 16-bit PC Card compatible memory connected to the PCCARD Bank: + + (#) Enable the clock for the FSMC and associated GPIOs using the following functions: + (++) RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); + (++) RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); + + (#) FSMC pins configuration + (++) Connect the involved FSMC pins to AF12 using the following function + GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_FSMC); + (++) Configure these FSMC pins in alternate function mode by calling the function + GPIO_Init(); + + (#) Declare a FSMC_PCCARDInitTypeDef structure, for example: + FSMC_PCCARDInitTypeDef FSMC_PCCARDInitStructure; + and fill the FSMC_PCCARDInitStructure variable with the allowed values of + the structure member. + + (#) Initialize the PCCARD Controller by calling the function + FSMC_PCCARDInit(&FSMC_PCCARDInitStructure); + + (#) Then enable the PCCARD Bank: + FSMC_PCCARDCmd(ENABLE); + + (#) At this stage you can read/write from/to the memory connected to the PCCARD Bank. + +@endverbatim + * @{ + */ + +/** + * @brief De-initializes the FSMC PCCARD Bank registers to their default reset values. + * @param None + * @retval None + */ +void FSMC_PCCARDDeInit(void) +{ + /* Set the FSMC_Bank4 registers to their reset values */ + FSMC_Bank4->PCR4 = 0x00000018; + FSMC_Bank4->SR4 = 0x00000000; + FSMC_Bank4->PMEM4 = 0xFCFCFCFC; + FSMC_Bank4->PATT4 = 0xFCFCFCFC; + FSMC_Bank4->PIO4 = 0xFCFCFCFC; +} + +/** + * @brief Initializes the FSMC PCCARD Bank according to the specified parameters + * in the FSMC_PCCARDInitStruct. + * @param FSMC_PCCARDInitStruct : pointer to a FSMC_PCCARDInitTypeDef structure + * that contains the configuration information for the FSMC PCCARD Bank. + * @retval None + */ +void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) +{ + uint32_t tmppcr4 = 0, tmppmem4 = 0, tmppatt4 = 0, tmppio4 = 0; + + /* Check the parameters */ + assert_param(IS_FSMC_WAIT_FEATURE(FSMC_PCCARDInitStruct->FSMC_Waitfeature)); + assert_param(IS_FSMC_TCLR_TIME(FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime)); + assert_param(IS_FSMC_TAR_TIME(FSMC_PCCARDInitStruct->FSMC_TARSetupTime)); + + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); + + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime)); + + /* Get PCCARD control register value */ + tmppcr4 = FSMC_Bank4->PCR4; + + /* Clear TAR, TCLR, PWAITEN and PWID bits */ + tmppcr4 &= ((uint32_t)~(FSMC_PCR4_TAR | FSMC_PCR4_TCLR | FSMC_PCR4_PWAITEN | \ + FSMC_PCR4_PWID)); + + /* Set the PCR4 register value according to FSMC_PCCARDInitStruct parameters */ + tmppcr4 |= (uint32_t)FSMC_PCCARDInitStruct->FSMC_Waitfeature | + FSMC_MemoryDataWidth_16b | + (FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime << 9) | + (FSMC_PCCARDInitStruct->FSMC_TARSetupTime << 13); + + FSMC_Bank4->PCR4 = tmppcr4; + + /* Get PCCARD common space timing register value */ + tmppmem4 = FSMC_Bank4->PMEM4; + + /* Clear MEMSETx, MEMWAITx, MEMHOLDx and MEMHIZx bits */ + tmppmem4 &= ((uint32_t)~(FSMC_PMEM4_MEMSET4 | FSMC_PMEM4_MEMWAIT4 | FSMC_PMEM4_MEMHOLD4 | \ + FSMC_PMEM4_MEMHIZ4)); + + /* Set PMEM4 register value according to FSMC_CommonSpaceTimingStructure parameters */ + tmppmem4 |= (uint32_t)FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + FSMC_Bank4->PMEM4 = tmppmem4; + + /* Get PCCARD timing parameters */ + tmppatt4 = FSMC_Bank4->PATT4; + + /* Clear ATTSETx, ATTWAITx, ATTHOLDx and ATTHIZx bits */ + tmppatt4 &= ((uint32_t)~(FSMC_PATT4_ATTSET4 | FSMC_PATT4_ATTWAIT4 | FSMC_PATT4_ATTHOLD4 | \ + FSMC_PATT4_ATTHIZ4)); + + /* Set PATT4 register value according to FSMC_AttributeSpaceTimingStructure parameters */ + tmppatt4 |= (uint32_t)FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + FSMC_Bank4->PATT4 = tmppatt4; + + /* Get FSMC_PCCARD device timing parameters */ + tmppio4 = FSMC_Bank4->PIO4; + + /* Clear IOSET4, IOWAIT4, IOHOLD4 and IOHIZ4 bits */ + tmppio4 &= ((uint32_t)~(FSMC_PIO4_IOSET4 | FSMC_PIO4_IOWAIT4 | FSMC_PIO4_IOHOLD4 | \ + FSMC_PIO4_IOHIZ4)); + + /* Set PIO4 register value according to FSMC_IOSpaceTimingStructure parameters */ + tmppio4 |= (uint32_t)FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + FSMC_Bank4->PIO4 = tmppio4; +} + +/** + * @brief Fills each FSMC_PCCARDInitStruct member with its default value. + * @param FSMC_PCCARDInitStruct: pointer to a FSMC_PCCARDInitTypeDef structure + * which will be initialized. + * @retval None + */ +void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) +{ + /* Reset PCCARD Init structure parameters values */ + FSMC_PCCARDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; + FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime = 0x0; + FSMC_PCCARDInitStruct->FSMC_TARSetupTime = 0x0; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; +} + +/** + * @brief Enables or disables the PCCARD Memory Bank. + * @param NewState: new state of the PCCARD Memory Bank. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_PCCARDCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the PCCARD Bank by setting the PBKEN bit in the PCR4 register */ + FSMC_Bank4->PCR4 |= PCR_PBKEN_SET; + } + else + { + /* Disable the PCCARD Bank by clearing the PBKEN bit in the PCR4 register */ + FSMC_Bank4->PCR4 &= PCR_PBKEN_RESET; + } +} +/** + * @} + */ + +/** @defgroup FSMC_Group4 Interrupts and flags management functions + * @brief Interrupts and flags management functions + * +@verbatim + =============================================================================== + ##### Interrupts and flags management functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified FSMC interrupts. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the FSMC interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @param NewState: new state of the specified FSMC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState) +{ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_IT(FSMC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected FSMC_Bank2 interrupts */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 |= FSMC_IT; + } + /* Enable the selected FSMC_Bank3 interrupts */ + else if (FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 |= FSMC_IT; + } + /* Enable the selected FSMC_Bank4 interrupts */ + else + { + FSMC_Bank4->SR4 |= FSMC_IT; + } + } + else + { + /* Disable the selected FSMC_Bank2 interrupts */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + + FSMC_Bank2->SR2 &= (uint32_t)~FSMC_IT; + } + /* Disable the selected FSMC_Bank3 interrupts */ + else if (FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= (uint32_t)~FSMC_IT; + } + /* Disable the selected FSMC_Bank4 interrupts */ + else + { + FSMC_Bank4->SR4 &= (uint32_t)~FSMC_IT; + } + } +} + +/** + * @brief Checks whether the specified FSMC flag is set or not. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg FSMC_FLAG_RisingEdge: Rising edge detection Flag. + * @arg FSMC_FLAG_Level: Level detection Flag. + * @arg FSMC_FLAG_FallingEdge: Falling edge detection Flag. + * @arg FSMC_FLAG_FEMPT: Fifo empty Flag. + * @retval The new state of FSMC_FLAG (SET or RESET). + */ +FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpsr = 0x00000000; + + /* Check the parameters */ + assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); + assert_param(IS_FSMC_GET_FLAG(FSMC_FLAG)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + tmpsr = FSMC_Bank2->SR2; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + tmpsr = FSMC_Bank3->SR3; + } + /* FSMC_Bank4_PCCARD*/ + else + { + tmpsr = FSMC_Bank4->SR4; + } + + /* Get the flag status */ + if ((tmpsr & FSMC_FLAG) != (uint16_t)RESET ) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** + * @brief Clears the FSMC's pending flags. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg FSMC_FLAG_RisingEdge: Rising edge detection Flag. + * @arg FSMC_FLAG_Level: Level detection Flag. + * @arg FSMC_FLAG_FallingEdge: Falling edge detection Flag. + * @retval None + */ +void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); + assert_param(IS_FSMC_CLEAR_FLAG(FSMC_FLAG)) ; + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 &= ~FSMC_FLAG; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= ~FSMC_FLAG; + } + /* FSMC_Bank4_PCCARD*/ + else + { + FSMC_Bank4->SR4 &= ~FSMC_FLAG; + } +} + +/** + * @brief Checks whether the specified FSMC interrupt has occurred or not. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the FSMC interrupt source to check. + * This parameter can be one of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @retval The new state of FSMC_IT (SET or RESET). + */ +ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t tmpsr = 0x0, itstatus = 0x0, itenable = 0x0; + + /* Check the parameters */ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_GET_IT(FSMC_IT)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + tmpsr = FSMC_Bank2->SR2; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + tmpsr = FSMC_Bank3->SR3; + } + /* FSMC_Bank4_PCCARD*/ + else + { + tmpsr = FSMC_Bank4->SR4; + } + + itstatus = tmpsr & FSMC_IT; + + itenable = tmpsr & (FSMC_IT >> 3); + if ((itstatus != (uint32_t)RESET) && (itenable != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the FSMC's interrupt pending bits. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @retval None + */ +void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT) +{ + /* Check the parameters */ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_IT(FSMC_IT)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 &= ~(FSMC_IT >> 3); + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= ~(FSMC_IT >> 3); + } + /* FSMC_Bank4_PCCARD*/ + else + { + FSMC_Bank4->SR4 &= ~(FSMC_IT >> 3); + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/aiit-arm32-board/third_party_driver/include/hardware_fsmc.h b/board/aiit-arm32-board/third_party_driver/include/hardware_fsmc.h index f81f630a1..7669636f2 100644 --- a/board/aiit-arm32-board/third_party_driver/include/hardware_fsmc.h +++ b/board/aiit-arm32-board/third_party_driver/include/hardware_fsmc.h @@ -334,6 +334,7 @@ typedef struct #define FSMC_MemoryDataWidth_8b ((uint32_t)0x00000000) #define FSMC_MemoryDataWidth_16b ((uint32_t)0x00000010) +#define FSMC_MemoryDataWidth_32b ((uint32_t)0x00000020) #define IS_FSMC_MEMORY_WIDTH(WIDTH) (((WIDTH) == FSMC_MemoryDataWidth_8b) || \ ((WIDTH) == FSMC_MemoryDataWidth_16b)) /** diff --git a/board/stm32f407zgt6/board.c b/board/stm32f407zgt6/board.c index 6eb4b7155..2f431e621 100644 --- a/board/stm32f407zgt6/board.c +++ b/board/stm32f407zgt6/board.c @@ -125,6 +125,12 @@ void InitBoardHardware() KPrintf("\nconsole init completed.\n"); KPrintf("board initialization......\n"); #endif + +#ifdef BSP_USING_EXTMEM + extern int HwSramInit(void); + HwSramInit(); +#endif + InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); #ifdef SEPARATE_COMPILE diff --git a/board/stm32f407zgt6/third_party_driver/Kconfig b/board/stm32f407zgt6/third_party_driver/Kconfig index 922bb52ea..68c67ca19 100755 --- a/board/stm32f407zgt6/third_party_driver/Kconfig +++ b/board/stm32f407zgt6/third_party_driver/Kconfig @@ -15,3 +15,9 @@ if BSP_USING_UART source "$BSP_DIR/third_party_driver/uart/Kconfig" endif +menuconfig BSP_USING_EXTMEM +bool "Using extern memory" +default n +if BSP_USING_EXTMEM +source "$BSP_DIR/third_party_driver/extmem/Kconfig" +endif diff --git a/board/stm32f407zgt6/third_party_driver/Makefile b/board/stm32f407zgt6/third_party_driver/Makefile index 5a0a3ce79..36c861758 100644 --- a/board/stm32f407zgt6/third_party_driver/Makefile +++ b/board/stm32f407zgt6/third_party_driver/Makefile @@ -9,5 +9,8 @@ ifeq ($(CONFIG_BSP_USING_UART),y) SRC_DIR += uart endif +ifeq ($(CONFIG_BSP_USING_EXTMEM),y) + SRC_DIR += extmem +endif include $(KERNEL_ROOT)/compiler.mk diff --git a/board/stm32f407zgt6/third_party_driver/extmem/Kconfig b/board/stm32f407zgt6/third_party_driver/extmem/Kconfig new file mode 100644 index 000000000..4b663fc9f --- /dev/null +++ b/board/stm32f407zgt6/third_party_driver/extmem/Kconfig @@ -0,0 +1,53 @@ +if BSP_USING_EXTMEM + config EXTSRAM_MAX_NUM + int + default 4 + + config BSP_USING_FSMC_BANK1_NORSRAM1 + bool "config fsmc bank1 sram1" + default n + if BSP_USING_FSMC_BANK1_NORSRAM1 + config BANK1_NORSRAM1_SIZE + hex "config sram1 chip size" + default 0x100000 + config BANK1_NORSRAM1_DATA_WIDTH + int "config sram1 chip data width" + default 16 + endif + + config BSP_USING_FSMC_BANK1_NORSRAM2 + bool "config fsmc bank1 sram2" + default n + if BSP_USING_FSMC_BANK1_NORSRAM2 + config BANK1_NORSRAM2_SIZE + hex "config sram2 chip size" + default 0x100000 + config BANK1_NORSRAM2_DATA_WIDTH + int "config sram2 chip data width" + default 16 + endif + + config BSP_USING_FSMC_BANK1_NORSRAM3 + bool "config fsmc bank1 sram3" + default n + if BSP_USING_FSMC_BANK1_NORSRAM3 + config BANK1_NORSRAM3_SIZE + hex "config sram3 chip size" + default 0x100000 + config BANK1_NORSRAM3_DATA_WIDTH + int "config sram3 chip data width" + default 16 + endif + + config BSP_USING_FSMC_BANK1_NORSRAM4 + bool "config fsmc bank1 sram4" + default n + if BSP_USING_FSMC_BANK1_NORSRAM4 + config BANK1_NORSRAM4_SIZE + hex "config sram4 chip size" + default 0x100000 + config BANK1_NORSRAM4_DATA_WIDTH + int "config sram4 chip data width" + default 16 + endif +endif diff --git a/board/stm32f407zgt6/third_party_driver/extmem/Makefile b/board/stm32f407zgt6/third_party_driver/extmem/Makefile new file mode 100644 index 000000000..81594a1bf --- /dev/null +++ b/board/stm32f407zgt6/third_party_driver/extmem/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := hardware_fsmc.c connect_fsmc.c + +include $(KERNEL_ROOT)/compiler.mk diff --git a/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c b/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c new file mode 100644 index 000000000..3e6993ca6 --- /dev/null +++ b/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c @@ -0,0 +1,192 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** +* @file connect_fsmc.c +* @brief support extern memory by fsmc +* @version 1.0 +* @author AIIT XUOS Lab +* @date 2021-05-28 +*/ + +#include "connect_fsmc.h" +#include "hardware_fsmc.h" +#include "hardware_gpio.h" +#include "hardware_rcc.h" + +static FSMC_NORSRAMInitTypeDef hsram; +static FSMC_NORSRAMTimingInitTypeDef hsram_read; +static FSMC_NORSRAMTimingInitTypeDef hsram_write; + +int HwSramInit(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE); + RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOE, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOF, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_10 | GPIO_Pin_12; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOG, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC); + + GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC); + + GPIO_PinAFConfig(GPIOF,GPIO_PinSource0,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource1,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource2,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource3,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource4,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource5,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource13,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource14,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource15,GPIO_AF_FSMC); + + GPIO_PinAFConfig(GPIOG,GPIO_PinSource0,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource1,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource3,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource10,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC); + + hsram.FSMC_ReadWriteTimingStruct = &hsram_read; + hsram.FSMC_WriteTimingStruct = &hsram_write; + + /* hsram.Init */ + hsram.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + hsram.FSMC_MemoryType = FSMC_MemoryType_SRAM; + hsram.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + hsram.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + hsram.FSMC_WrapMode = FSMC_WrapMode_Disable; + hsram.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + hsram.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + hsram.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + hsram.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + hsram.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + + hsram_read.FSMC_AddressSetupTime = 1; + hsram_read.FSMC_AddressHoldTime = 0; + hsram_read.FSMC_DataSetupTime = 2; + hsram_read.FSMC_BusTurnAroundDuration = 0; + hsram_read.FSMC_CLKDivision = 0; + hsram_read.FSMC_DataLatency = 0; + hsram_read.FSMC_AccessMode = FSMC_AccessMode_A; + + hsram_write.FSMC_AddressSetupTime = 1; + hsram_write.FSMC_AddressHoldTime = 0; + hsram_write.FSMC_DataSetupTime = 2; + hsram_write.FSMC_BusTurnAroundDuration = 0; + hsram_write.FSMC_CLKDivision = 0; + hsram_write.FSMC_DataLatency = 0; + hsram_write.FSMC_AccessMode = FSMC_AccessMode_A; + +#ifdef BSP_USING_FSMC_BANK1_NORSRAM1 + hsram.FSMC_Bank = FSMC_Bank1_NORSRAM1; +#if BANK1_NORSRAM1_DATA_WIDTH == 8 + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; +#elif BANK1_NORSRAM1_DATA_WIDTH == 16 + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; +#else + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_32b; +#endif + FSMC_NORSRAMInit(&hsram); + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); +#endif + +#ifdef BSP_USING_FSMC_BANK1_NORSRAM2 + hsram.FSMC_Bank = FSMC_Bank1_NORSRAM2; +#if BANK1_NORSRAM2_DATA_WIDTH == 8 + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; +#elif BANK1_NORSRAM2_DATA_WIDTH == 16 + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; +#else + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_32b; +#endif + FSMC_NORSRAMInit(&hsram); + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE); +#endif + +#ifdef BSP_USING_FSMC_BANK1_NORSRAM3 + hsram.FSMC_Bank = FSMC_Bank1_NORSRAM3; +#if BANK1_NORSRAM3_DATA_WIDTH == 8 + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; +#elif BANK1_NORSRAM3_DATA_WIDTH == 16 + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; +#else + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_32b; +#endif + FSMC_NORSRAMInit(&hsram); + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); +#endif + +#ifdef BSP_USING_FSMC_BANK1_NORSRAM4 + hsram.FSMC_Bank = FSMC_Bank1_NORSRAM4; +#if BANK1_NORSRAM4_DATA_WIDTH == 8 + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; +#elif BANK1_NORSRAM4_DATA_WIDTH == 16 + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; +#else + hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_32b; +#endif + FSMC_NORSRAMInit(&hsram); + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); +#endif + + return 0; +} \ No newline at end of file diff --git a/board/stm32f407zgt6/third_party_driver/extmem/hardware_fsmc.c b/board/stm32f407zgt6/third_party_driver/extmem/hardware_fsmc.c new file mode 100644 index 000000000..5c46e4d7d --- /dev/null +++ b/board/stm32f407zgt6/third_party_driver/extmem/hardware_fsmc.c @@ -0,0 +1,1101 @@ +/** + ****************************************************************************** + * @file stm32f4xx_fsmc.c + * @author MCD Application Team + * @version V1.8.0 + * @date 04-November-2016 + * @brief This file provides firmware functions to manage the following + * functionalities of the FSMC peripheral: + * + Interface with SRAM, PSRAM, NOR and OneNAND memories + * + Interface with NAND memories + * + Interface with 16-bit PC Card compatible memories + * + Interrupts and flags management + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2016 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "hardware_fsmc.h" +#include "hardware_rcc.h" +#include + +/** @addtogroup STM32F4xx_StdPeriph_Driver + * @{ + */ + +/** @defgroup FSMC + * @brief FSMC driver modules + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +const FSMC_NORSRAMTimingInitTypeDef FSMC_DefaultTimingStruct = {0x0F, /* FSMC_AddressSetupTime */ + 0x0F, /* FSMC_AddressHoldTime */ + 0xFF, /* FSMC_DataSetupTime */ + 0x0F, /* FSMC_BusTurnAroundDuration */ + 0x0F, /* FSMC_CLKDivision */ + 0x0F, /* FSMC_DataLatency */ + FSMC_AccessMode_A /* FSMC_AccessMode */ + }; +/* Private define ------------------------------------------------------------*/ + +/* --------------------- FSMC registers bit mask ---------------------------- */ +/* FSMC BCRx Mask */ +#define BCR_MBKEN_SET ((uint32_t)0x00000001) +#define BCR_MBKEN_RESET ((uint32_t)0x000FFFFE) +#define BCR_FACCEN_SET ((uint32_t)0x00000040) + +/* FSMC PCRx Mask */ +#define PCR_PBKEN_SET ((uint32_t)0x00000004) +#define PCR_PBKEN_RESET ((uint32_t)0x000FFFFB) +#define PCR_ECCEN_SET ((uint32_t)0x00000040) +#define PCR_ECCEN_RESET ((uint32_t)0x000FFFBF) +#define PCR_MEMORYTYPE_NAND ((uint32_t)0x00000008) + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup FSMC_Private_Functions + * @{ + */ + +/** @defgroup FSMC_Group1 NOR/SRAM Controller functions + * @brief NOR/SRAM Controller functions + * +@verbatim + =============================================================================== + ##### NOR and SRAM Controller functions ##### + =============================================================================== + + [..] The following sequence should be followed to configure the FSMC to interface + with SRAM, PSRAM, NOR or OneNAND memory connected to the NOR/SRAM Bank: + + (#) Enable the clock for the FSMC and associated GPIOs using the following functions: + RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); + + (#) FSMC pins configuration + (++) Connect the involved FSMC pins to AF12 using the following function + GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_FSMC); + (++) Configure these FSMC pins in alternate function mode by calling the function + GPIO_Init(); + + (#) Declare a FSMC_NORSRAMInitTypeDef structure, for example: + FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; + and fill the FSMC_NORSRAMInitStructure variable with the allowed values of + the structure member. + + (#) Initialize the NOR/SRAM Controller by calling the function + FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); + + (#) Then enable the NOR/SRAM Bank, for example: + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE); + + (#) At this stage you can read/write from/to the memory connected to the NOR/SRAM Bank. + +@endverbatim + * @{ + */ + +/** + * @brief De-initializes the FSMC NOR/SRAM Banks registers to their default + * reset values. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 + * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 + * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 + * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 + * @retval None + */ +void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank) +{ + /* Check the parameter */ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); + + /* FSMC_Bank1_NORSRAM1 */ + if(FSMC_Bank == FSMC_Bank1_NORSRAM1) + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030DB; + } + /* FSMC_Bank1_NORSRAM2, FSMC_Bank1_NORSRAM3 or FSMC_Bank1_NORSRAM4 */ + else + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030D2; + } + FSMC_Bank1->BTCR[FSMC_Bank + 1] = 0x0FFFFFFF; + FSMC_Bank1E->BWTR[FSMC_Bank] = 0x0FFFFFFF; +} + +/** + * @brief Initializes the FSMC NOR/SRAM Banks according to the specified + * parameters in the FSMC_NORSRAMInitStruct. + * @param FSMC_NORSRAMInitStruct : pointer to a FSMC_NORSRAMInitTypeDef structure + * that contains the configuration information for the FSMC NOR/SRAM + * specified Banks. + * @retval None + */ +void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) +{ + uint32_t tmpbcr = 0, tmpbtr = 0, tmpbwr = 0; + + /* Check the parameters */ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_NORSRAMInitStruct->FSMC_Bank)); + assert_param(IS_FSMC_MUX(FSMC_NORSRAMInitStruct->FSMC_DataAddressMux)); + assert_param(IS_FSMC_MEMORY(FSMC_NORSRAMInitStruct->FSMC_MemoryType)); + assert_param(IS_FSMC_MEMORY_WIDTH(FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth)); + assert_param(IS_FSMC_BURSTMODE(FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode)); + assert_param(IS_FSMC_ASYNWAIT(FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait)); + assert_param(IS_FSMC_WAIT_POLARITY(FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity)); + assert_param(IS_FSMC_WRAP_MODE(FSMC_NORSRAMInitStruct->FSMC_WrapMode)); + assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive)); + assert_param(IS_FSMC_WRITE_OPERATION(FSMC_NORSRAMInitStruct->FSMC_WriteOperation)); + assert_param(IS_FSMC_WAITE_SIGNAL(FSMC_NORSRAMInitStruct->FSMC_WaitSignal)); + assert_param(IS_FSMC_EXTENDED_MODE(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode)); + assert_param(IS_FSMC_WRITE_BURST(FSMC_NORSRAMInitStruct->FSMC_WriteBurst)); + assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime)); + assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime)); + assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime)); + assert_param(IS_FSMC_TURNAROUND_TIME(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration)); + assert_param(IS_FSMC_CLK_DIV(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision)); + assert_param(IS_FSMC_DATA_LATENCY(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency)); + assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode)); + + /* Get the BTCR register value */ + tmpbcr = FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank]; + + /* Clear MBKEN, MUXEN, MTYP, MWID, FACCEN, BURSTEN, WAITPOL, WRAPMOD, WAITCFG, WREN, + WAITEN, EXTMOD, ASYNCWAIT, CBURSTRW and CCLKEN bits */ + tmpbcr &= ((uint32_t)~(FSMC_BCR1_MBKEN | FSMC_BCR1_MUXEN | FSMC_BCR1_MTYP | \ + FSMC_BCR1_MWID | FSMC_BCR1_FACCEN | FSMC_BCR1_BURSTEN | \ + FSMC_BCR1_WAITPOL | FSMC_BCR1_WRAPMOD | FSMC_BCR1_WAITCFG | \ + FSMC_BCR1_WREN | FSMC_BCR1_WAITEN | FSMC_BCR1_EXTMOD | \ + FSMC_BCR1_ASYNCWAIT | FSMC_BCR1_CBURSTRW)); + + /* Bank1 NOR/SRAM control register configuration */ + tmpbcr |= (uint32_t)FSMC_NORSRAMInitStruct->FSMC_DataAddressMux | + FSMC_NORSRAMInitStruct->FSMC_MemoryType | + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth | + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode | + FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity | + FSMC_NORSRAMInitStruct->FSMC_WrapMode | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive | + FSMC_NORSRAMInitStruct->FSMC_WriteOperation | + FSMC_NORSRAMInitStruct->FSMC_WaitSignal | + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode | + FSMC_NORSRAMInitStruct->FSMC_WriteBurst; + + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] = tmpbcr; + + if(FSMC_NORSRAMInitStruct->FSMC_MemoryType == FSMC_MemoryType_NOR) + { + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] |= (uint32_t)BCR_FACCEN_SET; + } + + /* Get the BTCR register value */ + tmpbtr = FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1]; + + /* Clear ADDSET, ADDHLD, DATAST, BUSTURN, CLKDIV, DATLAT and ACCMOD bits */ + tmpbtr &= ((uint32_t)~(FSMC_BTR1_ADDSET | FSMC_BTR1_ADDHLD | FSMC_BTR1_DATAST | \ + FSMC_BTR1_BUSTURN | FSMC_BTR1_CLKDIV | FSMC_BTR1_DATLAT | \ + FSMC_BTR1_ACCMOD)); + + /* Bank1 NOR/SRAM timing register configuration */ + tmpbtr |= (uint32_t)FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime << 4) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime << 8) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration << 16) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision << 20) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency << 24) | + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode; + + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank+1] = tmpbtr; + + /* Bank1 NOR/SRAM timing register for write configuration, if extended mode is used */ + if(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode == FSMC_ExtendedMode_Enable) + { + assert_param(IS_FSMC_ADDRESS_SETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime)); + assert_param(IS_FSMC_ADDRESS_HOLD_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime)); + assert_param(IS_FSMC_DATASETUP_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime)); + assert_param(IS_FSMC_TURNAROUND_TIME(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_BusTurnAroundDuration)); + assert_param(IS_FSMC_ACCESS_MODE(FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode)); + + /* Get the BWTR register value */ + tmpbwr = FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank]; + + /* Clear ADDSET, ADDHLD, DATAST, BUSTURN, and ACCMOD bits */ + tmpbwr &= ((uint32_t)~(FSMC_BWTR1_ADDSET | FSMC_BWTR1_ADDHLD | FSMC_BWTR1_DATAST | \ + FSMC_BWTR1_DATLAT | FSMC_BWTR1_ACCMOD)); + + tmpbwr |= (uint32_t)FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime << 4 )| + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime << 8) | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_BusTurnAroundDuration << 16) | + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode; + + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = tmpbwr; + } + else + { + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = 0x0FFFFFFF; + } +} + +/** + * @brief Fills each FSMC_NORSRAMInitStruct member with its default value. + * @param FSMC_NORSRAMInitStruct: pointer to a FSMC_NORSRAMInitTypeDef structure + * which will be initialized. + * @retval None + */ +void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct) +{ + /* Reset NOR/SRAM Init structure parameters values */ + FSMC_NORSRAMInitStruct->FSMC_Bank = FSMC_Bank1_NORSRAM1; + FSMC_NORSRAMInitStruct->FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; + FSMC_NORSRAMInitStruct->FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStruct->FSMC_WrapMode = FSMC_WrapMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStruct->FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignal = FSMC_WaitSignal_Enable; + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct = (FSMC_NORSRAMTimingInitTypeDef*)((uint32_t)&FSMC_DefaultTimingStruct); + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct = (FSMC_NORSRAMTimingInitTypeDef*)((uint32_t)&FSMC_DefaultTimingStruct); +} + +/** + * @brief Enables or disables the specified NOR/SRAM Memory Bank. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank1_NORSRAM1: FSMC Bank1 NOR/SRAM1 + * @arg FSMC_Bank1_NORSRAM2: FSMC Bank1 NOR/SRAM2 + * @arg FSMC_Bank1_NORSRAM3: FSMC Bank1 NOR/SRAM3 + * @arg FSMC_Bank1_NORSRAM4: FSMC Bank1 NOR/SRAM4 + * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NORSRAM_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NOR/SRAM Bank by setting the PBKEN bit in the BCRx register */ + FSMC_Bank1->BTCR[FSMC_Bank] |= BCR_MBKEN_SET; + } + else + { + /* Disable the selected NOR/SRAM Bank by clearing the PBKEN bit in the BCRx register */ + FSMC_Bank1->BTCR[FSMC_Bank] &= BCR_MBKEN_RESET; + } +} +/** + * @} + */ + +/** @defgroup FSMC_Group2 NAND Controller functions + * @brief NAND Controller functions + * +@verbatim + =============================================================================== + ##### NAND Controller functions ##### + =============================================================================== + + [..] The following sequence should be followed to configure the FSMC to interface + with 8-bit or 16-bit NAND memory connected to the NAND Bank: + + (#) Enable the clock for the FSMC and associated GPIOs using the following functions: + (++) RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); + (++) RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); + + (#) FSMC pins configuration + (++) Connect the involved FSMC pins to AF12 using the following function + GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_FSMC); + (++) Configure these FSMC pins in alternate function mode by calling the function + GPIO_Init(); + + (#) Declare a FSMC_NANDInitTypeDef structure, for example: + FSMC_NANDInitTypeDef FSMC_NANDInitStructure; + and fill the FSMC_NANDInitStructure variable with the allowed values of + the structure member. + + (#) Initialize the NAND Controller by calling the function + FSMC_NANDInit(&FSMC_NANDInitStructure); + + (#) Then enable the NAND Bank, for example: + FSMC_NANDCmd(FSMC_Bank3_NAND, ENABLE); + + (#) At this stage you can read/write from/to the memory connected to the NAND Bank. + + [..] + (@) To enable the Error Correction Code (ECC), you have to use the function + FSMC_NANDECCCmd(FSMC_Bank3_NAND, ENABLE); + [..] + (@) and to get the current ECC value you have to use the function + ECCval = FSMC_GetECC(FSMC_Bank3_NAND); + +@endverbatim + * @{ + */ + +/** + * @brief De-initializes the FSMC NAND Banks registers to their default reset values. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @retval None + */ +void FSMC_NANDDeInit(uint32_t FSMC_Bank) +{ + /* Check the parameter */ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + /* Set the FSMC_Bank2 registers to their reset values */ + FSMC_Bank2->PCR2 = 0x00000018; + FSMC_Bank2->SR2 = 0x00000040; + FSMC_Bank2->PMEM2 = 0xFCFCFCFC; + FSMC_Bank2->PATT2 = 0xFCFCFCFC; + } + /* FSMC_Bank3_NAND */ + else + { + /* Set the FSMC_Bank3 registers to their reset values */ + FSMC_Bank3->PCR3 = 0x00000018; + FSMC_Bank3->SR3 = 0x00000040; + FSMC_Bank3->PMEM3 = 0xFCFCFCFC; + FSMC_Bank3->PATT3 = 0xFCFCFCFC; + } +} + +/** + * @brief Initializes the FSMC NAND Banks according to the specified parameters + * in the FSMC_NANDInitStruct. + * @param FSMC_NANDInitStruct : pointer to a FSMC_NANDInitTypeDef structure that + * contains the configuration information for the FSMC NAND specified Banks. + * @retval None + */ +void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) +{ + uint32_t tmppcr = 0x00000000, tmppmem = 0x00000000, tmppatt = 0x00000000; + + /* Check the parameters */ + assert_param( IS_FSMC_NAND_BANK(FSMC_NANDInitStruct->FSMC_Bank)); + assert_param( IS_FSMC_WAIT_FEATURE(FSMC_NANDInitStruct->FSMC_Waitfeature)); + assert_param( IS_FSMC_MEMORY_WIDTH(FSMC_NANDInitStruct->FSMC_MemoryDataWidth)); + assert_param( IS_FSMC_ECC_STATE(FSMC_NANDInitStruct->FSMC_ECC)); + assert_param( IS_FSMC_ECCPAGE_SIZE(FSMC_NANDInitStruct->FSMC_ECCPageSize)); + assert_param( IS_FSMC_TCLR_TIME(FSMC_NANDInitStruct->FSMC_TCLRSetupTime)); + assert_param( IS_FSMC_TAR_TIME(FSMC_NANDInitStruct->FSMC_TARSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); + + if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) + { + /* Get the NAND bank 2 register value */ + tmppcr = FSMC_Bank2->PCR2; + } + else + { + /* Get the NAND bank 3 register value */ + tmppcr = FSMC_Bank3->PCR3; + } + + /* Clear PWAITEN, PBKEN, PTYP, PWID, ECCEN, TCLR, TAR and ECCPS bits */ + tmppcr &= ((uint32_t)~(FSMC_PCR2_PWAITEN | FSMC_PCR2_PBKEN | FSMC_PCR2_PTYP | \ + FSMC_PCR2_PWID | FSMC_PCR2_ECCEN | FSMC_PCR2_TCLR | \ + FSMC_PCR2_TAR | FSMC_PCR2_ECCPS)); + + /* Set the tmppcr value according to FSMC_NANDInitStruct parameters */ + tmppcr |= (uint32_t)FSMC_NANDInitStruct->FSMC_Waitfeature | + PCR_MEMORYTYPE_NAND | + FSMC_NANDInitStruct->FSMC_MemoryDataWidth | + FSMC_NANDInitStruct->FSMC_ECC | + FSMC_NANDInitStruct->FSMC_ECCPageSize | + (FSMC_NANDInitStruct->FSMC_TCLRSetupTime << 9 )| + (FSMC_NANDInitStruct->FSMC_TARSetupTime << 13); + + if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) + { + /* Get the NAND bank 2 register value */ + tmppmem = FSMC_Bank2->PMEM2; + } + else + { + /* Get the NAND bank 3 register value */ + tmppmem = FSMC_Bank3->PMEM3; + } + + /* Clear MEMSETx, MEMWAITx, MEMHOLDx and MEMHIZx bits */ + tmppmem &= ((uint32_t)~(FSMC_PMEM2_MEMSET2 | FSMC_PMEM2_MEMWAIT2 | FSMC_PMEM2_MEMHOLD2 | \ + FSMC_PMEM2_MEMHIZ2)); + + /* Set tmppmem value according to FSMC_CommonSpaceTimingStructure parameters */ + tmppmem |= (uint32_t)FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) + { + /* Get the NAND bank 2 register value */ + tmppatt = FSMC_Bank2->PATT2; + } + else + { + /* Get the NAND bank 3 register value */ + tmppatt = FSMC_Bank2->PATT2; + } + + /* Clear ATTSETx, ATTWAITx, ATTHOLDx and ATTHIZx bits */ + tmppatt &= ((uint32_t)~(FSMC_PATT2_ATTSET2 | FSMC_PATT2_ATTWAIT2 | FSMC_PATT2_ATTHOLD2 | \ + FSMC_PATT2_ATTHIZ2)); + + /* Set tmppatt value according to FSMC_AttributeSpaceTimingStructure parameters */ + tmppatt |= (uint32_t)FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) + { + /* FSMC_Bank2_NAND registers configuration */ + FSMC_Bank2->PCR2 = tmppcr; + FSMC_Bank2->PMEM2 = tmppmem; + FSMC_Bank2->PATT2 = tmppatt; + } + else + { + /* FSMC_Bank3_NAND registers configuration */ + FSMC_Bank3->PCR3 = tmppcr; + FSMC_Bank3->PMEM3 = tmppmem; + FSMC_Bank3->PATT3 = tmppatt; + } +} + + +/** + * @brief Fills each FSMC_NANDInitStruct member with its default value. + * @param FSMC_NANDInitStruct: pointer to a FSMC_NANDInitTypeDef structure which + * will be initialized. + * @retval None + */ +void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct) +{ + /* Reset NAND Init structure parameters values */ + FSMC_NANDInitStruct->FSMC_Bank = FSMC_Bank2_NAND; + FSMC_NANDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; + FSMC_NANDInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NANDInitStruct->FSMC_ECC = FSMC_ECC_Disable; + FSMC_NANDInitStruct->FSMC_ECCPageSize = FSMC_ECCPageSize_256Bytes; + FSMC_NANDInitStruct->FSMC_TCLRSetupTime = 0x0; + FSMC_NANDInitStruct->FSMC_TARSetupTime = 0x0; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; +} + +/** + * @brief Enables or disables the specified NAND Memory Bank. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @param NewState: new state of the FSMC_Bank. This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NAND Bank by setting the PBKEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 |= PCR_PBKEN_SET; + } + else + { + FSMC_Bank3->PCR3 |= PCR_PBKEN_SET; + } + } + else + { + /* Disable the selected NAND Bank by clearing the PBKEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 &= PCR_PBKEN_RESET; + } + else + { + FSMC_Bank3->PCR3 &= PCR_PBKEN_RESET; + } + } +} +/** + * @brief Enables or disables the FSMC NAND ECC feature. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @param NewState: new state of the FSMC NAND ECC feature. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + assert_param(IS_FSMC_NAND_BANK(FSMC_Bank)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected NAND Bank ECC function by setting the ECCEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 |= PCR_ECCEN_SET; + } + else + { + FSMC_Bank3->PCR3 |= PCR_ECCEN_SET; + } + } + else + { + /* Disable the selected NAND Bank ECC function by clearing the ECCEN bit in the PCRx register */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 &= PCR_ECCEN_RESET; + } + else + { + FSMC_Bank3->PCR3 &= PCR_ECCEN_RESET; + } + } +} + +/** + * @brief Returns the error correction code register value. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @retval The Error Correction Code (ECC) value. + */ +uint32_t FSMC_GetECC(uint32_t FSMC_Bank) +{ + uint32_t eccval = 0x00000000; + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + /* Get the ECCR2 register value */ + eccval = FSMC_Bank2->ECCR2; + } + else + { + /* Get the ECCR3 register value */ + eccval = FSMC_Bank3->ECCR3; + } + /* Return the error correction code value */ + return(eccval); +} +/** + * @} + */ + +/** @defgroup FSMC_Group3 PCCARD Controller functions + * @brief PCCARD Controller functions + * +@verbatim + =============================================================================== + ##### PCCARD Controller functions ##### + =============================================================================== + + [..] he following sequence should be followed to configure the FSMC to interface + with 16-bit PC Card compatible memory connected to the PCCARD Bank: + + (#) Enable the clock for the FSMC and associated GPIOs using the following functions: + (++) RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); + (++) RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); + + (#) FSMC pins configuration + (++) Connect the involved FSMC pins to AF12 using the following function + GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_FSMC); + (++) Configure these FSMC pins in alternate function mode by calling the function + GPIO_Init(); + + (#) Declare a FSMC_PCCARDInitTypeDef structure, for example: + FSMC_PCCARDInitTypeDef FSMC_PCCARDInitStructure; + and fill the FSMC_PCCARDInitStructure variable with the allowed values of + the structure member. + + (#) Initialize the PCCARD Controller by calling the function + FSMC_PCCARDInit(&FSMC_PCCARDInitStructure); + + (#) Then enable the PCCARD Bank: + FSMC_PCCARDCmd(ENABLE); + + (#) At this stage you can read/write from/to the memory connected to the PCCARD Bank. + +@endverbatim + * @{ + */ + +/** + * @brief De-initializes the FSMC PCCARD Bank registers to their default reset values. + * @param None + * @retval None + */ +void FSMC_PCCARDDeInit(void) +{ + /* Set the FSMC_Bank4 registers to their reset values */ + FSMC_Bank4->PCR4 = 0x00000018; + FSMC_Bank4->SR4 = 0x00000000; + FSMC_Bank4->PMEM4 = 0xFCFCFCFC; + FSMC_Bank4->PATT4 = 0xFCFCFCFC; + FSMC_Bank4->PIO4 = 0xFCFCFCFC; +} + +/** + * @brief Initializes the FSMC PCCARD Bank according to the specified parameters + * in the FSMC_PCCARDInitStruct. + * @param FSMC_PCCARDInitStruct : pointer to a FSMC_PCCARDInitTypeDef structure + * that contains the configuration information for the FSMC PCCARD Bank. + * @retval None + */ +void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) +{ + uint32_t tmppcr4 = 0, tmppmem4 = 0, tmppatt4 = 0, tmppio4 = 0; + + /* Check the parameters */ + assert_param(IS_FSMC_WAIT_FEATURE(FSMC_PCCARDInitStruct->FSMC_Waitfeature)); + assert_param(IS_FSMC_TCLR_TIME(FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime)); + assert_param(IS_FSMC_TAR_TIME(FSMC_PCCARDInitStruct->FSMC_TARSetupTime)); + + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime)); + + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime)); + assert_param(IS_FSMC_SETUP_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime)); + assert_param(IS_FSMC_WAIT_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime)); + assert_param(IS_FSMC_HOLD_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime)); + assert_param(IS_FSMC_HIZ_TIME(FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime)); + + /* Get PCCARD control register value */ + tmppcr4 = FSMC_Bank4->PCR4; + + /* Clear TAR, TCLR, PWAITEN and PWID bits */ + tmppcr4 &= ((uint32_t)~(FSMC_PCR4_TAR | FSMC_PCR4_TCLR | FSMC_PCR4_PWAITEN | \ + FSMC_PCR4_PWID)); + + /* Set the PCR4 register value according to FSMC_PCCARDInitStruct parameters */ + tmppcr4 |= (uint32_t)FSMC_PCCARDInitStruct->FSMC_Waitfeature | + FSMC_MemoryDataWidth_16b | + (FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime << 9) | + (FSMC_PCCARDInitStruct->FSMC_TARSetupTime << 13); + + FSMC_Bank4->PCR4 = tmppcr4; + + /* Get PCCARD common space timing register value */ + tmppmem4 = FSMC_Bank4->PMEM4; + + /* Clear MEMSETx, MEMWAITx, MEMHOLDx and MEMHIZx bits */ + tmppmem4 &= ((uint32_t)~(FSMC_PMEM4_MEMSET4 | FSMC_PMEM4_MEMWAIT4 | FSMC_PMEM4_MEMHOLD4 | \ + FSMC_PMEM4_MEMHIZ4)); + + /* Set PMEM4 register value according to FSMC_CommonSpaceTimingStructure parameters */ + tmppmem4 |= (uint32_t)FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + FSMC_Bank4->PMEM4 = tmppmem4; + + /* Get PCCARD timing parameters */ + tmppatt4 = FSMC_Bank4->PATT4; + + /* Clear ATTSETx, ATTWAITx, ATTHOLDx and ATTHIZx bits */ + tmppatt4 &= ((uint32_t)~(FSMC_PATT4_ATTSET4 | FSMC_PATT4_ATTWAIT4 | FSMC_PATT4_ATTHOLD4 | \ + FSMC_PATT4_ATTHIZ4)); + + /* Set PATT4 register value according to FSMC_AttributeSpaceTimingStructure parameters */ + tmppatt4 |= (uint32_t)FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + FSMC_Bank4->PATT4 = tmppatt4; + + /* Get FSMC_PCCARD device timing parameters */ + tmppio4 = FSMC_Bank4->PIO4; + + /* Clear IOSET4, IOWAIT4, IOHOLD4 and IOHIZ4 bits */ + tmppio4 &= ((uint32_t)~(FSMC_PIO4_IOSET4 | FSMC_PIO4_IOWAIT4 | FSMC_PIO4_IOHOLD4 | \ + FSMC_PIO4_IOHIZ4)); + + /* Set PIO4 register value according to FSMC_IOSpaceTimingStructure parameters */ + tmppio4 |= (uint32_t)FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime | + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime << 16)| + (FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + FSMC_Bank4->PIO4 = tmppio4; +} + +/** + * @brief Fills each FSMC_PCCARDInitStruct member with its default value. + * @param FSMC_PCCARDInitStruct: pointer to a FSMC_PCCARDInitTypeDef structure + * which will be initialized. + * @retval None + */ +void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct) +{ + /* Reset PCCARD Init structure parameters values */ + FSMC_PCCARDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; + FSMC_PCCARDInitStruct->FSMC_TCLRSetupTime = 0x0; + FSMC_PCCARDInitStruct->FSMC_TARSetupTime = 0x0; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_PCCARDInitStruct->FSMC_IOSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; +} + +/** + * @brief Enables or disables the PCCARD Memory Bank. + * @param NewState: new state of the PCCARD Memory Bank. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_PCCARDCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the PCCARD Bank by setting the PBKEN bit in the PCR4 register */ + FSMC_Bank4->PCR4 |= PCR_PBKEN_SET; + } + else + { + /* Disable the PCCARD Bank by clearing the PBKEN bit in the PCR4 register */ + FSMC_Bank4->PCR4 &= PCR_PBKEN_RESET; + } +} +/** + * @} + */ + +/** @defgroup FSMC_Group4 Interrupts and flags management functions + * @brief Interrupts and flags management functions + * +@verbatim + =============================================================================== + ##### Interrupts and flags management functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Enables or disables the specified FSMC interrupts. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the FSMC interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @param NewState: new state of the specified FSMC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState) +{ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_IT(FSMC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected FSMC_Bank2 interrupts */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 |= FSMC_IT; + } + /* Enable the selected FSMC_Bank3 interrupts */ + else if (FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 |= FSMC_IT; + } + /* Enable the selected FSMC_Bank4 interrupts */ + else + { + FSMC_Bank4->SR4 |= FSMC_IT; + } + } + else + { + /* Disable the selected FSMC_Bank2 interrupts */ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + + FSMC_Bank2->SR2 &= (uint32_t)~FSMC_IT; + } + /* Disable the selected FSMC_Bank3 interrupts */ + else if (FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= (uint32_t)~FSMC_IT; + } + /* Disable the selected FSMC_Bank4 interrupts */ + else + { + FSMC_Bank4->SR4 &= (uint32_t)~FSMC_IT; + } + } +} + +/** + * @brief Checks whether the specified FSMC flag is set or not. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg FSMC_FLAG_RisingEdge: Rising edge detection Flag. + * @arg FSMC_FLAG_Level: Level detection Flag. + * @arg FSMC_FLAG_FallingEdge: Falling edge detection Flag. + * @arg FSMC_FLAG_FEMPT: Fifo empty Flag. + * @retval The new state of FSMC_FLAG (SET or RESET). + */ +FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpsr = 0x00000000; + + /* Check the parameters */ + assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); + assert_param(IS_FSMC_GET_FLAG(FSMC_FLAG)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + tmpsr = FSMC_Bank2->SR2; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + tmpsr = FSMC_Bank3->SR3; + } + /* FSMC_Bank4_PCCARD*/ + else + { + tmpsr = FSMC_Bank4->SR4; + } + + /* Get the flag status */ + if ((tmpsr & FSMC_FLAG) != (uint16_t)RESET ) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** + * @brief Clears the FSMC's pending flags. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg FSMC_FLAG_RisingEdge: Rising edge detection Flag. + * @arg FSMC_FLAG_Level: Level detection Flag. + * @arg FSMC_FLAG_FallingEdge: Falling edge detection Flag. + * @retval None + */ +void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) +{ + /* Check the parameters */ + assert_param(IS_FSMC_GETFLAG_BANK(FSMC_Bank)); + assert_param(IS_FSMC_CLEAR_FLAG(FSMC_FLAG)) ; + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 &= ~FSMC_FLAG; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= ~FSMC_FLAG; + } + /* FSMC_Bank4_PCCARD*/ + else + { + FSMC_Bank4->SR4 &= ~FSMC_FLAG; + } +} + +/** + * @brief Checks whether the specified FSMC interrupt has occurred or not. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the FSMC interrupt source to check. + * This parameter can be one of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @retval The new state of FSMC_IT (SET or RESET). + */ +ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t tmpsr = 0x0, itstatus = 0x0, itenable = 0x0; + + /* Check the parameters */ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_GET_IT(FSMC_IT)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + tmpsr = FSMC_Bank2->SR2; + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + tmpsr = FSMC_Bank3->SR3; + } + /* FSMC_Bank4_PCCARD*/ + else + { + tmpsr = FSMC_Bank4->SR4; + } + + itstatus = tmpsr & FSMC_IT; + + itenable = tmpsr & (FSMC_IT >> 3); + if ((itstatus != (uint32_t)RESET) && (itenable != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the FSMC's interrupt pending bits. + * @param FSMC_Bank: specifies the FSMC Bank to be used + * This parameter can be one of the following values: + * @arg FSMC_Bank2_NAND: FSMC Bank2 NAND + * @arg FSMC_Bank3_NAND: FSMC Bank3 NAND + * @arg FSMC_Bank4_PCCARD: FSMC Bank4 PCCARD + * @param FSMC_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg FSMC_IT_RisingEdge: Rising edge detection interrupt. + * @arg FSMC_IT_Level: Level edge detection interrupt. + * @arg FSMC_IT_FallingEdge: Falling edge detection interrupt. + * @retval None + */ +void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT) +{ + /* Check the parameters */ + assert_param(IS_FSMC_IT_BANK(FSMC_Bank)); + assert_param(IS_FSMC_IT(FSMC_IT)); + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->SR2 &= ~(FSMC_IT >> 3); + } + else if(FSMC_Bank == FSMC_Bank3_NAND) + { + FSMC_Bank3->SR3 &= ~(FSMC_IT >> 3); + } + /* FSMC_Bank4_PCCARD*/ + else + { + FSMC_Bank4->SR4 &= ~(FSMC_IT >> 3); + } +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/stm32f407zgt6/third_party_driver/include/connect_fsmc.h b/board/stm32f407zgt6/third_party_driver/include/connect_fsmc.h new file mode 100644 index 000000000..04c41c191 --- /dev/null +++ b/board/stm32f407zgt6/third_party_driver/include/connect_fsmc.h @@ -0,0 +1,36 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** +* @file connect_fsmc.h +* @brief declare stm32f407zgt6-board fsmc function +* @version 1.0 +* @author AIIT XUOS Lab +* @date 2021-05-28 +*/ + +#ifndef CONNECT_FSMC_H +#define CONNECT_FSMC_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +int HwSramInit(void); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/board/stm32f407zgt6/third_party_driver/include/hardware_fsmc.h b/board/stm32f407zgt6/third_party_driver/include/hardware_fsmc.h new file mode 100644 index 000000000..7669636f2 --- /dev/null +++ b/board/stm32f407zgt6/third_party_driver/include/hardware_fsmc.h @@ -0,0 +1,689 @@ +/** + ****************************************************************************** + * @file stm32f4xx_fsmc.h + * @author MCD Application Team + * @version V1.0.0 + * @date 30-September-2011 + * @brief This file contains all the functions prototypes for the FSMC firmware + * library. + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2011 STMicroelectronics

+ ****************************************************************************** + */ + +/** +* @file: hardware_fsmc.h +* @brief: define hardware fsmc function +* @version: 1.0 +* @author: AIIT XUOS Lab +* @date: 2021/4/25 +*/ + +/************************************************* +File name: hardware_fsmc.h +Description: define hardware fsmc function +Others: +History: +1. Date: 2021-04-25 +Author: AIIT XUOS Lab +Modification: +1. rename stm32f4xx_fsmc.h for XiUOS +*************************************************/ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __HARDWARE_FSMC_H__ +#define __HARDWARE_FSMC_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include + +/** @addtogroup STM32F4xx_StdPeriph_Driver + * @{ + */ + +/** @addtogroup FSMC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief Timing parameters For NOR/SRAM Banks + */ +typedef struct +{ + uint32_t FSMC_AddressSetupTime; /*!< Defines the number of HCLK cycles to configure + the duration of the address setup time. + This parameter can be a value between 0 and 0xF. + @note This parameter is not used with synchronous NOR Flash memories. */ + + uint32_t FSMC_AddressHoldTime; /*!< Defines the number of HCLK cycles to configure + the duration of the address hold time. + This parameter can be a value between 0 and 0xF. + @note This parameter is not used with synchronous NOR Flash memories.*/ + + uint32_t FSMC_DataSetupTime; /*!< Defines the number of HCLK cycles to configure + the duration of the data setup time. + This parameter can be a value between 0 and 0xFF. + @note This parameter is used for SRAMs, ROMs and asynchronous multiplexed NOR Flash memories. */ + + uint32_t FSMC_BusTurnAroundDuration; /*!< Defines the number of HCLK cycles to configure + the duration of the bus turnaround. + This parameter can be a value between 0 and 0xF. + @note This parameter is only used for multiplexed NOR Flash memories. */ + + uint32_t FSMC_CLKDivision; /*!< Defines the period of CLK clock output signal, expressed in number of HCLK cycles. + This parameter can be a value between 1 and 0xF. + @note This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses. */ + + uint32_t FSMC_DataLatency; /*!< Defines the number of memory clock cycles to issue + to the memory before getting the first data. + The parameter value depends on the memory type as shown below: + - It must be set to 0 in case of a CRAM + - It is don't care in asynchronous NOR, SRAM or ROM accesses + - It may assume a value between 0 and 0xF in NOR Flash memories + with synchronous burst mode enable */ + + uint32_t FSMC_AccessMode; /*!< Specifies the asynchronous access mode. + This parameter can be a value of @ref FSMC_Access_Mode */ +}FSMC_NORSRAMTimingInitTypeDef; + +/** + * @brief FSMC NOR/SRAM Init structure definition + */ +typedef struct +{ + uint32_t FSMC_Bank; /*!< Specifies the NOR/SRAM memory bank that will be used. + This parameter can be a value of @ref FSMC_NORSRAM_Bank */ + + uint32_t FSMC_DataAddressMux; /*!< Specifies whether the address and data values are + multiplexed on the databus or not. + This parameter can be a value of @ref FSMC_Data_Address_Bus_Multiplexing */ + + uint32_t FSMC_MemoryType; /*!< Specifies the type of external memory attached to + the corresponding memory bank. + This parameter can be a value of @ref FSMC_Memory_Type */ + + uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width. + This parameter can be a value of @ref FSMC_Data_Width */ + + uint32_t FSMC_BurstAccessMode; /*!< Enables or disables the burst access mode for Flash memory, + valid only with synchronous burst Flash memories. + This parameter can be a value of @ref FSMC_Burst_Access_Mode */ + + uint32_t FSMC_AsynchronousWait; /*!< Enables or disables wait signal during asynchronous transfers, + valid only with asynchronous Flash memories. + This parameter can be a value of @ref FSMC_AsynchronousWait */ + + uint32_t FSMC_WaitSignalPolarity; /*!< Specifies the wait signal polarity, valid only when accessing + the Flash memory in burst mode. + This parameter can be a value of @ref FSMC_Wait_Signal_Polarity */ + + uint32_t FSMC_WrapMode; /*!< Enables or disables the Wrapped burst access mode for Flash + memory, valid only when accessing Flash memories in burst mode. + This parameter can be a value of @ref FSMC_Wrap_Mode */ + + uint32_t FSMC_WaitSignalActive; /*!< Specifies if the wait signal is asserted by the memory one + clock cycle before the wait state or during the wait state, + valid only when accessing memories in burst mode. + This parameter can be a value of @ref FSMC_Wait_Timing */ + + uint32_t FSMC_WriteOperation; /*!< Enables or disables the write operation in the selected bank by the FSMC. + This parameter can be a value of @ref FSMC_Write_Operation */ + + uint32_t FSMC_WaitSignal; /*!< Enables or disables the wait-state insertion via wait + signal, valid for Flash memory access in burst mode. + This parameter can be a value of @ref FSMC_Wait_Signal */ + + uint32_t FSMC_ExtendedMode; /*!< Enables or disables the extended mode. + This parameter can be a value of @ref FSMC_Extended_Mode */ + + uint32_t FSMC_WriteBurst; /*!< Enables or disables the write burst operation. + This parameter can be a value of @ref FSMC_Write_Burst */ + + FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct; /*!< Timing Parameters for write and read access if the ExtendedMode is not used*/ + + FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct; /*!< Timing Parameters for write access if the ExtendedMode is used*/ +}FSMC_NORSRAMInitTypeDef; + +/** + * @brief Timing parameters For FSMC NAND and PCCARD Banks + */ +typedef struct +{ + uint32_t FSMC_SetupTime; /*!< Defines the number of HCLK cycles to setup address before + the command assertion for NAND-Flash read or write access + to common/Attribute or I/O memory space (depending on + the memory space timing to be configured). + This parameter can be a value between 0 and 0xFF.*/ + + uint32_t FSMC_WaitSetupTime; /*!< Defines the minimum number of HCLK cycles to CHECK the + command for NAND-Flash read or write access to + common/Attribute or I/O memory space (depending on the + memory space timing to be configured). + This parameter can be a number between 0x00 and 0xFF */ + + uint32_t FSMC_HoldSetupTime; /*!< Defines the number of HCLK clock cycles to hold address + (and data for write access) after the command deassertion + for NAND-Flash read or write access to common/Attribute + or I/O memory space (depending on the memory space timing + to be configured). + This parameter can be a number between 0x00 and 0xFF */ + + uint32_t FSMC_HiZSetupTime; /*!< Defines the number of HCLK clock cycles during which the + databus is kept in HiZ after the start of a NAND-Flash + write access to common/Attribute or I/O memory space (depending + on the memory space timing to be configured). + This parameter can be a number between 0x00 and 0xFF */ +}FSMC_NAND_PCCARDTimingInitTypeDef; + +/** + * @brief FSMC NAND Init structure definition + */ +typedef struct +{ + uint32_t FSMC_Bank; /*!< Specifies the NAND memory bank that will be used. + This parameter can be a value of @ref FSMC_NAND_Bank */ + + uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the NAND Memory Bank. + This parameter can be any value of @ref FSMC_Wait_feature */ + + uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width. + This parameter can be any value of @ref FSMC_Data_Width */ + + uint32_t FSMC_ECC; /*!< Enables or disables the ECC computation. + This parameter can be any value of @ref FSMC_ECC */ + + uint32_t FSMC_ECCPageSize; /*!< Defines the page size for the extended ECC. + This parameter can be any value of @ref FSMC_ECC_Page_Size */ + + uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between CLE low and RE low. + This parameter can be a value between 0 and 0xFF. */ + + uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between ALE low and RE low. + This parameter can be a number between 0x0 and 0xFF */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */ +}FSMC_NANDInitTypeDef; + +/** + * @brief FSMC PCCARD Init structure definition + */ + +typedef struct +{ + uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the Memory Bank. + This parameter can be any value of @ref FSMC_Wait_feature */ + + uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between CLE low and RE low. + This parameter can be a value between 0 and 0xFF. */ + + uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the + delay between ALE low and RE low. + This parameter can be a number between 0x0 and 0xFF */ + + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_IOSpaceTimingStruct; /*!< FSMC IO Space Timing */ +}FSMC_PCCARDInitTypeDef; + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup FSMC_Exported_Constants + * @{ + */ + +/** @defgroup FSMC_NORSRAM_Bank + * @{ + */ +#define FSMC_Bank1_NORSRAM1 ((uint32_t)0x00000000) +#define FSMC_Bank1_NORSRAM2 ((uint32_t)0x00000002) +#define FSMC_Bank1_NORSRAM3 ((uint32_t)0x00000004) +#define FSMC_Bank1_NORSRAM4 ((uint32_t)0x00000006) +/** + * @} + */ + +/** @defgroup FSMC_NAND_Bank + * @{ + */ +#define FSMC_Bank2_NAND ((uint32_t)0x00000010) +#define FSMC_Bank3_NAND ((uint32_t)0x00000100) +/** + * @} + */ + +/** @defgroup FSMC_PCCARD_Bank + * @{ + */ +#define FSMC_Bank4_PCCARD ((uint32_t)0x00001000) +/** + * @} + */ + +#define IS_FSMC_NORSRAM_BANK(BANK) (((BANK) == FSMC_Bank1_NORSRAM1) || \ + ((BANK) == FSMC_Bank1_NORSRAM2) || \ + ((BANK) == FSMC_Bank1_NORSRAM3) || \ + ((BANK) == FSMC_Bank1_NORSRAM4)) + +#define IS_FSMC_NAND_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ + ((BANK) == FSMC_Bank3_NAND)) + +#define IS_FSMC_GETFLAG_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ + ((BANK) == FSMC_Bank3_NAND) || \ + ((BANK) == FSMC_Bank4_PCCARD)) + +#define IS_FSMC_IT_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \ + ((BANK) == FSMC_Bank3_NAND) || \ + ((BANK) == FSMC_Bank4_PCCARD)) + +/** @defgroup FSMC_NOR_SRAM_Controller + * @{ + */ + +/** @defgroup FSMC_Data_Address_Bus_Multiplexing + * @{ + */ + +#define FSMC_DataAddressMux_Disable ((uint32_t)0x00000000) +#define FSMC_DataAddressMux_Enable ((uint32_t)0x00000002) +#define IS_FSMC_MUX(MUX) (((MUX) == FSMC_DataAddressMux_Disable) || \ + ((MUX) == FSMC_DataAddressMux_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Memory_Type + * @{ + */ + +#define FSMC_MemoryType_SRAM ((uint32_t)0x00000000) +#define FSMC_MemoryType_PSRAM ((uint32_t)0x00000004) +#define FSMC_MemoryType_NOR ((uint32_t)0x00000008) +#define IS_FSMC_MEMORY(MEMORY) (((MEMORY) == FSMC_MemoryType_SRAM) || \ + ((MEMORY) == FSMC_MemoryType_PSRAM)|| \ + ((MEMORY) == FSMC_MemoryType_NOR)) +/** + * @} + */ + +/** @defgroup FSMC_Data_Width + * @{ + */ + +#define FSMC_MemoryDataWidth_8b ((uint32_t)0x00000000) +#define FSMC_MemoryDataWidth_16b ((uint32_t)0x00000010) +#define FSMC_MemoryDataWidth_32b ((uint32_t)0x00000020) +#define IS_FSMC_MEMORY_WIDTH(WIDTH) (((WIDTH) == FSMC_MemoryDataWidth_8b) || \ + ((WIDTH) == FSMC_MemoryDataWidth_16b)) +/** + * @} + */ + +/** @defgroup FSMC_Burst_Access_Mode + * @{ + */ + +#define FSMC_BurstAccessMode_Disable ((uint32_t)0x00000000) +#define FSMC_BurstAccessMode_Enable ((uint32_t)0x00000100) +#define IS_FSMC_BURSTMODE(STATE) (((STATE) == FSMC_BurstAccessMode_Disable) || \ + ((STATE) == FSMC_BurstAccessMode_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_AsynchronousWait + * @{ + */ +#define FSMC_AsynchronousWait_Disable ((uint32_t)0x00000000) +#define FSMC_AsynchronousWait_Enable ((uint32_t)0x00008000) +#define IS_FSMC_ASYNWAIT(STATE) (((STATE) == FSMC_AsynchronousWait_Disable) || \ + ((STATE) == FSMC_AsynchronousWait_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Wait_Signal_Polarity + * @{ + */ +#define FSMC_WaitSignalPolarity_Low ((uint32_t)0x00000000) +#define FSMC_WaitSignalPolarity_High ((uint32_t)0x00000200) +#define IS_FSMC_WAIT_POLARITY(POLARITY) (((POLARITY) == FSMC_WaitSignalPolarity_Low) || \ + ((POLARITY) == FSMC_WaitSignalPolarity_High)) +/** + * @} + */ + +/** @defgroup FSMC_Wrap_Mode + * @{ + */ +#define FSMC_WrapMode_Disable ((uint32_t)0x00000000) +#define FSMC_WrapMode_Enable ((uint32_t)0x00000400) +#define IS_FSMC_WRAP_MODE(MODE) (((MODE) == FSMC_WrapMode_Disable) || \ + ((MODE) == FSMC_WrapMode_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Wait_Timing + * @{ + */ +#define FSMC_WaitSignalActive_BeforeWaitState ((uint32_t)0x00000000) +#define FSMC_WaitSignalActive_DuringWaitState ((uint32_t)0x00000800) +#define IS_FSMC_WAIT_SIGNAL_ACTIVE(ACTIVE) (((ACTIVE) == FSMC_WaitSignalActive_BeforeWaitState) || \ + ((ACTIVE) == FSMC_WaitSignalActive_DuringWaitState)) +/** + * @} + */ + +/** @defgroup FSMC_Write_Operation + * @{ + */ +#define FSMC_WriteOperation_Disable ((uint32_t)0x00000000) +#define FSMC_WriteOperation_Enable ((uint32_t)0x00001000) +#define IS_FSMC_WRITE_OPERATION(OPERATION) (((OPERATION) == FSMC_WriteOperation_Disable) || \ + ((OPERATION) == FSMC_WriteOperation_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Wait_Signal + * @{ + */ +#define FSMC_WaitSignal_Disable ((uint32_t)0x00000000) +#define FSMC_WaitSignal_Enable ((uint32_t)0x00002000) +#define IS_FSMC_WAITE_SIGNAL(SIGNAL) (((SIGNAL) == FSMC_WaitSignal_Disable) || \ + ((SIGNAL) == FSMC_WaitSignal_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Extended_Mode + * @{ + */ +#define FSMC_ExtendedMode_Disable ((uint32_t)0x00000000) +#define FSMC_ExtendedMode_Enable ((uint32_t)0x00004000) + +#define IS_FSMC_EXTENDED_MODE(MODE) (((MODE) == FSMC_ExtendedMode_Disable) || \ + ((MODE) == FSMC_ExtendedMode_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Write_Burst + * @{ + */ + +#define FSMC_WriteBurst_Disable ((uint32_t)0x00000000) +#define FSMC_WriteBurst_Enable ((uint32_t)0x00080000) +#define IS_FSMC_WRITE_BURST(BURST) (((BURST) == FSMC_WriteBurst_Disable) || \ + ((BURST) == FSMC_WriteBurst_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_Address_Setup_Time + * @{ + */ +#define IS_FSMC_ADDRESS_SETUP_TIME(TIME) ((TIME) <= 0xF) +/** + * @} + */ + +/** @defgroup FSMC_Address_Hold_Time + * @{ + */ +#define IS_FSMC_ADDRESS_HOLD_TIME(TIME) ((TIME) <= 0xF) +/** + * @} + */ + +/** @defgroup FSMC_Data_Setup_Time + * @{ + */ +#define IS_FSMC_DATASETUP_TIME(TIME) (((TIME) > 0) && ((TIME) <= 0xFF)) +/** + * @} + */ + +/** @defgroup FSMC_Bus_Turn_around_Duration + * @{ + */ +#define IS_FSMC_TURNAROUND_TIME(TIME) ((TIME) <= 0xF) +/** + * @} + */ + +/** @defgroup FSMC_CLK_Division + * @{ + */ +#define IS_FSMC_CLK_DIV(DIV) ((DIV) <= 0xF) +/** + * @} + */ + +/** @defgroup FSMC_Data_Latency + * @{ + */ +#define IS_FSMC_DATA_LATENCY(LATENCY) ((LATENCY) <= 0xF) +/** + * @} + */ + +/** @defgroup FSMC_Access_Mode + * @{ + */ +#define FSMC_AccessMode_A ((uint32_t)0x00000000) +#define FSMC_AccessMode_B ((uint32_t)0x10000000) +#define FSMC_AccessMode_C ((uint32_t)0x20000000) +#define FSMC_AccessMode_D ((uint32_t)0x30000000) +#define IS_FSMC_ACCESS_MODE(MODE) (((MODE) == FSMC_AccessMode_A) || \ + ((MODE) == FSMC_AccessMode_B) || \ + ((MODE) == FSMC_AccessMode_C) || \ + ((MODE) == FSMC_AccessMode_D)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup FSMC_NAND_PCCARD_Controller + * @{ + */ + +/** @defgroup FSMC_Wait_feature + * @{ + */ +#define FSMC_Waitfeature_Disable ((uint32_t)0x00000000) +#define FSMC_Waitfeature_Enable ((uint32_t)0x00000002) +#define IS_FSMC_WAIT_FEATURE(FEATURE) (((FEATURE) == FSMC_Waitfeature_Disable) || \ + ((FEATURE) == FSMC_Waitfeature_Enable)) +/** + * @} + */ + + +/** @defgroup FSMC_ECC + * @{ + */ +#define FSMC_ECC_Disable ((uint32_t)0x00000000) +#define FSMC_ECC_Enable ((uint32_t)0x00000040) +#define IS_FSMC_ECC_STATE(STATE) (((STATE) == FSMC_ECC_Disable) || \ + ((STATE) == FSMC_ECC_Enable)) +/** + * @} + */ + +/** @defgroup FSMC_ECC_Page_Size + * @{ + */ +#define FSMC_ECCPageSize_256Bytes ((uint32_t)0x00000000) +#define FSMC_ECCPageSize_512Bytes ((uint32_t)0x00020000) +#define FSMC_ECCPageSize_1024Bytes ((uint32_t)0x00040000) +#define FSMC_ECCPageSize_2048Bytes ((uint32_t)0x00060000) +#define FSMC_ECCPageSize_4096Bytes ((uint32_t)0x00080000) +#define FSMC_ECCPageSize_8192Bytes ((uint32_t)0x000A0000) +#define IS_FSMC_ECCPAGE_SIZE(SIZE) (((SIZE) == FSMC_ECCPageSize_256Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_512Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_1024Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_2048Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_4096Bytes) || \ + ((SIZE) == FSMC_ECCPageSize_8192Bytes)) +/** + * @} + */ + +/** @defgroup FSMC_TCLR_Setup_Time + * @{ + */ +#define IS_FSMC_TCLR_TIME(TIME) ((TIME) <= 0xFF) +/** + * @} + */ + +/** @defgroup FSMC_TAR_Setup_Time + * @{ + */ +#define IS_FSMC_TAR_TIME(TIME) ((TIME) <= 0xFF) +/** + * @} + */ + +/** @defgroup FSMC_Setup_Time + * @{ + */ +#define IS_FSMC_SETUP_TIME(TIME) ((TIME) <= 0xFF) +/** + * @} + */ + +/** @defgroup FSMC_Wait_Setup_Time + * @{ + */ +#define IS_FSMC_WAIT_TIME(TIME) ((TIME) <= 0xFF) +/** + * @} + */ + +/** @defgroup FSMC_Hold_Setup_Time + * @{ + */ +#define IS_FSMC_HOLD_TIME(TIME) ((TIME) <= 0xFF) +/** + * @} + */ + +/** @defgroup FSMC_HiZ_Setup_Time + * @{ + */ +#define IS_FSMC_HIZ_TIME(TIME) ((TIME) <= 0xFF) +/** + * @} + */ + +/** @defgroup FSMC_Interrupt_sources + * @{ + */ +#define FSMC_IT_RisingEdge ((uint32_t)0x00000008) +#define FSMC_IT_Level ((uint32_t)0x00000010) +#define FSMC_IT_FallingEdge ((uint32_t)0x00000020) +#define IS_FSMC_IT(IT) ((((IT) & (uint32_t)0xFFFFFFC7) == 0x00000000) && ((IT) != 0x00000000)) +#define IS_FSMC_GET_IT(IT) (((IT) == FSMC_IT_RisingEdge) || \ + ((IT) == FSMC_IT_Level) || \ + ((IT) == FSMC_IT_FallingEdge)) +/** + * @} + */ + +/** @defgroup FSMC_Flags + * @{ + */ +#define FSMC_FLAG_RisingEdge ((uint32_t)0x00000001) +#define FSMC_FLAG_Level ((uint32_t)0x00000002) +#define FSMC_FLAG_FallingEdge ((uint32_t)0x00000004) +#define FSMC_FLAG_FEMPT ((uint32_t)0x00000040) +#define IS_FSMC_GET_FLAG(FLAG) (((FLAG) == FSMC_FLAG_RisingEdge) || \ + ((FLAG) == FSMC_FLAG_Level) || \ + ((FLAG) == FSMC_FLAG_FallingEdge) || \ + ((FLAG) == FSMC_FLAG_FEMPT)) + +#define IS_FSMC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFF8) == 0x00000000) && ((FLAG) != 0x00000000)) +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/* NOR/SRAM Controller functions **********************************************/ +void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank); +void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); +void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); +void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState); + +/* NAND Controller functions **************************************************/ +void FSMC_NANDDeInit(uint32_t FSMC_Bank); +void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); +void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); +void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState); +void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState); +uint32_t FSMC_GetECC(uint32_t FSMC_Bank); + +/* PCCARD Controller functions ************************************************/ +void FSMC_PCCARDDeInit(void); +void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct); +void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct); +void FSMC_PCCARDCmd(FunctionalState NewState); + +/* Interrupts and flags management functions **********************************/ +void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState); +FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG); +void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG); +ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT); +void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT); + +#ifdef __cplusplus +} +#endif + +#endif /*__HARDWARE_FSMC_H__ */ +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/kernel/kernel_test/Makefile b/kernel/kernel_test/Makefile index d8de8e370..820f29e97 100644 --- a/kernel/kernel_test/Makefile +++ b/kernel/kernel_test/Makefile @@ -1,4 +1,5 @@ -SRC_FILES := test_main.c +SRC_FILES := test_main.c +SRC_FILES += extsram_test.c ifeq ($(CONFIG_KERNEL_TEST_SEM),y) SRC_FILES += test_sem.c diff --git a/kernel/kernel_test/extsram_test.c b/kernel/kernel_test/extsram_test.c new file mode 100644 index 000000000..58e60820a --- /dev/null +++ b/kernel/kernel_test/extsram_test.c @@ -0,0 +1,79 @@ +#include +#include + +/* parameters for sram peripheral */ +/* stm32f4 Bank3:0X68000000 */ +#define SRAM_BANK_ADDR ((uint32_t)0X60000000) +/* data width: 8, 16, 32 */ +#define SRAM_DATA_WIDTH 16 +/* sram size */ +#define SRAM_SIZE ((uint32_t)0x00100000) + +int sram_test(void) +{ + int i = 0; + uint32_t start_time = 0, time_cast = 0; +#if SRAM_DATA_WIDTH == 8 + char data_width = 1; + uint8_t data = 0; +#elif SRAM_DATA_WIDTH == 16 + char data_width = 2; + uint16_t data = 0; +#else + char data_width = 4; + uint32_t data = 0; +#endif + + /* write data */ + KPrintf("Writing the %ld bytes data, waiting....", SRAM_SIZE); + start_time = CurrentTicksGain(); + for (i = 0; i < SRAM_SIZE / data_width; i++) + { +#if SRAM_DATA_WIDTH == 8 + *(volatile uint8_t *)(SRAM_BANK_ADDR + i * data_width) = (uint8_t)0x55; +#elif SRAM_DATA_WIDTH == 16 + *(volatile uint16_t *)(SRAM_BANK_ADDR + i * data_width) = (uint16_t)0x5555; +#else + *(volatile uint32_t *)(SRAM_BANK_ADDR + i * data_width) = (uint32_t)0x55555555; +#endif + } + time_cast = CurrentTicksGain() - start_time; + KPrintf("Write data success, total time: %d.%03dS.\n", time_cast / TICK_PER_SECOND, + time_cast % TICK_PER_SECOND / ((TICK_PER_SECOND * 1 + 999) / 1000)); + + /* read data */ + KPrintf("start Reading and verifying data, waiting....\n"); + for (i = 0; i < SRAM_SIZE / data_width; i++) + { +#if SRAM_DATA_WIDTH == 8 + data = *(volatile uint8_t *)(SRAM_BANK_ADDR + i * data_width); + if (data != 0x55) + { + KPrintf("SRAM test failed!"); + break; + } +#elif SRAM_DATA_WIDTH == 16 + data = *(volatile uint16_t *)(SRAM_BANK_ADDR + i * data_width); + if (data != 0x5555) + { + KPrintf("SRAM test failed! data = 0x%x\n",data); + break; + } +#else + data = *(volatile uint32_t *)(SRAM_BANK_ADDR + i * data_width); + if (data != 0x55555555) + { + KPrintf("SRAM test failed!"); + break; + } +#endif + } + + if (i >= SRAM_SIZE / data_width) + { + KPrintf("SRAM test success!\n"); + } + + return 0; +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0),sram_test, sram_test, sram_test ); From 0f7d7f446f90fca4f8892ff05a4a5c1d917fc754 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Fri, 28 May 2021 21:19:07 +0800 Subject: [PATCH 2/7] only for debug --- board/aiit-arm32-board/board.c | 9 + .../third_party_driver/extmem/Kconfig | 22 ++ board/stm32f407zgt6/board.c | 3 +- .../third_party_driver/extmem/connect_fsmc.c | 6 + kernel/include/xs_memory.h | 3 + kernel/kernel_test/extsram_test.c | 2 +- kernel/kernel_test/test_mem.c | 2 +- kernel/memory/byte_manage.c | 225 +++++++++++++++--- 8 files changed, 232 insertions(+), 40 deletions(-) diff --git a/board/aiit-arm32-board/board.c b/board/aiit-arm32-board/board.c index f3c221b75..5aa161265 100644 --- a/board/aiit-arm32-board/board.c +++ b/board/aiit-arm32-board/board.c @@ -47,6 +47,7 @@ extern int Stm32HwRtcInit(); extern int Stm32HwTouchBusInit(void); extern int Stm32HwCanBusInit(void); extern int HwSdioInit(); +extern int HwSramInit(void); static void ClockConfiguration() { @@ -143,6 +144,11 @@ struct InitSequenceDesc _board_init[] = #ifdef BSP_USING_SDIO {"hw sdcard init",HwSdioInit}, #endif +// #ifdef BSP_USING_EXTMEM +// #ifdef DATA_IN_ExtSRAM +// {"hw ext sram",HwSramInit}, +// #endif +// #endif { " NONE ",NONE }, }; @@ -155,9 +161,12 @@ void InitBoardHardware() NVIC_Configuration(); SysTickConfiguration(); + InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); + #ifdef BSP_USING_UART Stm32HwUsartInit(); #endif + #ifdef KERNEL_CONSOLE InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME); KPrintf("\nconsole init completed.\n"); diff --git a/board/aiit-arm32-board/third_party_driver/extmem/Kconfig b/board/aiit-arm32-board/third_party_driver/extmem/Kconfig index e69de29bb..4010be56d 100644 --- a/board/aiit-arm32-board/third_party_driver/extmem/Kconfig +++ b/board/aiit-arm32-board/third_party_driver/extmem/Kconfig @@ -0,0 +1,22 @@ +menu "Extern Sram Config" + config DATA_IN_ExtSRAM + bool "support extern sram" + default n + if DATA_IN_ExtSRAM + config EXTSRAM_MAX_NUM + int + default 4 + + config BSP_USING_FSMC_BANK1_NORSRAM3 + bool "config fsmc bank1 sram3" + default n + if BSP_USING_FSMC_BANK1_NORSRAM3 + config BANK1_NORSRAM3_SIZE + hex "config sram chip size" + default 0x100000 + config BANK1_NORSRAM3_DATA_WIDTH + int "sram chip data width" + default 16 + endif + endif +endmenu diff --git a/board/stm32f407zgt6/board.c b/board/stm32f407zgt6/board.c index 2f431e621..c672d8243 100644 --- a/board/stm32f407zgt6/board.c +++ b/board/stm32f407zgt6/board.c @@ -117,6 +117,7 @@ void InitBoardHardware() NVIC_Configuration(); SysTickConfiguration(); + InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); #ifdef BSP_USING_UART Stm32HwUsartInit(); #endif @@ -131,7 +132,7 @@ void InitBoardHardware() HwSramInit(); #endif - InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); + // InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); #ifdef SEPARATE_COMPILE diff --git a/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c b/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c index 3e6993ca6..232154a1f 100644 --- a/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c +++ b/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c @@ -18,6 +18,7 @@ * @date 2021-05-28 */ +#include #include "connect_fsmc.h" #include "hardware_fsmc.h" #include "hardware_gpio.h" @@ -173,6 +174,11 @@ int HwSramInit(void) #endif FSMC_NORSRAMInit(&hsram); FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); + + extern void ExtSramInitBoardMemory(void *start_phy_address, void *end_phy_address, uint8 extsram_idx); + #define START_ADDRESS 0x68000000 + ExtSramInitBoardMemory((void*)(START_ADDRESS), (void*)((START_ADDRESS + BANK1_NORSRAM3_SIZE)), 2); + #endif #ifdef BSP_USING_FSMC_BANK1_NORSRAM4 diff --git a/kernel/include/xs_memory.h b/kernel/include/xs_memory.h index c54b4fc2a..ad404cdb5 100644 --- a/kernel/include/xs_memory.h +++ b/kernel/include/xs_memory.h @@ -85,6 +85,9 @@ void FreeBlockMemGather(void *data_block); #endif void InitBoardMemory(void *begin_addr, void *end_addr); +#ifdef DATA_IN_ExtSRAM +void ExtSramInitBoardMemory(void *start_phy_address, void *end_phy_address, uint8 extsram_idx); +#endif void *x_malloc(x_size_t nbytes); void x_free(void *ptr); void *x_realloc(void *ptr, x_size_t nbytes); diff --git a/kernel/kernel_test/extsram_test.c b/kernel/kernel_test/extsram_test.c index 58e60820a..1e0741430 100644 --- a/kernel/kernel_test/extsram_test.c +++ b/kernel/kernel_test/extsram_test.c @@ -3,7 +3,7 @@ /* parameters for sram peripheral */ /* stm32f4 Bank3:0X68000000 */ -#define SRAM_BANK_ADDR ((uint32_t)0X60000000) +#define SRAM_BANK_ADDR ((uint32_t)0X68000000) /* data width: 8, 16, 32 */ #define SRAM_DATA_WIDTH 16 /* sram size */ diff --git a/kernel/kernel_test/test_mem.c b/kernel/kernel_test/test_mem.c index 286f673cf..8b1ca2aee 100644 --- a/kernel/kernel_test/test_mem.c +++ b/kernel/kernel_test/test_mem.c @@ -140,10 +140,10 @@ int FendGrin() int tempvalue = 1; while( i< MEM_GRIN_COUNT) { - KPrintf("\033[32;1malloc memory [%d]\033[0m\n",tempvalue); ptr[i] = x_malloc(tempvalue); if (ptr[i]) { + KPrintf("\033[32;1malloc memory [%d] ptr[%d] = 0x%x\033[0m\n",tempvalue,i,ptr[i]); arr_grin[i] = tempvalue; i++; tempvalue++; diff --git a/kernel/memory/byte_manage.c b/kernel/memory/byte_manage.c index fdebc105f..72a745e8b 100644 --- a/kernel/memory/byte_manage.c +++ b/kernel/memory/byte_manage.c @@ -22,6 +22,8 @@ #include #include +#define DATA_IN_ExtSRAM + #define MEM_STATS /* Covert pointer to other structure */ @@ -43,6 +45,13 @@ /* These masks are used to get the flags and data field of memory blocks */ #define STATIC_BLOCK_MASK 0x80000000 #define DYNAMIC_BLOCK_MASK 0x40000000 +#define DYNAMIC_BLOCK_NO_EXTMEM_MASK DYNAMIC_BLOCK_MASK +// #define DYNAMIC_BLOCK_EXTMEM1_MASK 0x40010000 ///< dynamic memory block external SRAM 1 +// #define DYNAMIC_BLOCK_EXTMEM2_MASK 0x40020000 ///< dynamic memory block external SRAM 2 +// #define DYNAMIC_BLOCK_EXTMEM3_MASK 0x40030000 ///< dynamic memory block external SRAM 3 +// #define DYNAMIC_BLOCK_EXTMEM4_MASK 0x40040000 ///< dynamic memory block external SRAM 4 +#define DYNAMIC_BLOCK_EXTMEMn_MASK(n) (DYNAMIC_BLOCK_MASK | (0xFF & n) << 16) + #define ALLOC_BLOCK_MASK 0xc0000000 #define DYNAMIC_REMAINING_MASK 0x3fffffff @@ -59,6 +68,7 @@ struct DynamicAllocNode { x_size_t size; /* the size of dynamicAllocNode */ uint32 prev_adj_size; /* the size of the previous adjacent node, (dynamic alloc node or dynamic free node */ + uint32 flag; /* |static_dynamic[32-24]|ext_sram[23-16]|res[15-8]|res[7-0]| */ }; /** @@ -68,7 +78,8 @@ struct DynamicFreeNode { x_size_t size; /* the size of dynamicAllocNode */ uint32 prev_adj_size; /* the size of the previous adjacent node, (dynamic alloc node or dynamic free node */ - + uint32 flag; /* |static_dynamic_region_flag[32-24]|ext_sram_idx[23-16]|res[15-8]|res[7-0]| */ + struct DynamicFreeNode *next; struct DynamicFreeNode *prev; }; @@ -144,7 +155,7 @@ struct StaticMemoryDone struct DynamicBuddyMemoryDone { void (*init)(struct DynamicBuddyMemory *dynamic_buddy, x_ubase dynamic_buddy_start,x_ubase dynamic_buddy_size); - void* (*malloc)(struct DynamicBuddyMemory *dynamic_buddy, x_size_t size); + void* (*malloc)(struct DynamicBuddyMemory *dynamic_buddy, x_size_t size, uint32 extsram_mask); void (*release)(struct ByteMemory *byte_memory, void *pointer); int (*JudgeLegal)(struct DynamicBuddyMemory *dynamic_buddy, void *pointer); }; @@ -155,6 +166,10 @@ static struct ByteMemory ByteManager; #ifdef SEPARATE_COMPILE static struct ByteMemory UserByteManager; #endif + +#ifdef DATA_IN_ExtSRAM +static struct ByteMemory ExtByteManager[EXTSRAM_MAX_NUM] = {0}; +#endif /** * This function determines whether the address is valid. * @@ -187,7 +202,8 @@ static int SmallMemTypeAlloc(struct DynamicAllocNode *address) { NULL_PARAM_CHECK(address); - if(address->prev_adj_size & STATIC_BLOCK_MASK) { + // if(address->prev_adj_size & STATIC_BLOCK_MASK) { + if(address->flag & STATIC_BLOCK_MASK) { return RET_TRUE; } @@ -205,7 +221,8 @@ static int MmAllocNode(struct DynamicAllocNode *memory_ptr) { NULL_PARAM_CHECK(memory_ptr); - if(memory_ptr->prev_adj_size & ALLOC_BLOCK_MASK) { + // if(memory_ptr->prev_adj_size & ALLOC_BLOCK_MASK) { + if(memory_ptr->flag & ALLOC_BLOCK_MASK) { return RET_TRUE; } return 0; @@ -233,7 +250,7 @@ static int CaculateBuddyIndex(x_size_t size) } else { ndx = MEM_LINKNRS - 1; } - + KPrintf("hehehe ndx = %d, size = %d\n",ndx, size); return ndx; } @@ -289,21 +306,28 @@ static void InitBuddy(struct DynamicBuddyMemory *dynamic_buddy, x_ubase dynamic_ /* record the start boundary of dynamic buddy memory */ dynamic_buddy->mm_dynamic_start[0] = PTR2ALLOCNODE(dynamic_buddy_start); dynamic_buddy->mm_dynamic_start[0]->size = SIZEOF_DYNAMICALLOCNODE_MEM; - dynamic_buddy->mm_dynamic_start[0]->prev_adj_size = DYNAMIC_BLOCK_MASK; + dynamic_buddy->mm_dynamic_start[0]->prev_adj_size = 0; + dynamic_buddy->mm_dynamic_start[0]->flag = DYNAMIC_BLOCK_MASK; /* the initialized free node */ node =(struct DynamicFreeNode *) ((x_ubase)dynamic_buddy_start + SIZEOF_DYNAMICALLOCNODE_MEM); - node->size=(uint32)(dynamic_buddy_size - 2* SIZEOF_DYNAMICALLOCNODE_MEM); + KPrintf("kaishi : 0x%x, node : 0x%x, size : 0x%x\n", (x_ubase)dynamic_buddy_start, node, dynamic_buddy_size); + node->size=(dynamic_buddy_size - 2* SIZEOF_DYNAMICALLOCNODE_MEM); + KPrintf("hahaha size = %d\n", node->size); node->prev_adj_size= SIZEOF_DYNAMICALLOCNODE_MEM; + node->flag= DYNAMIC_BLOCK_MASK; /* record the end boundary of dynamic buddy memory */ dynamic_buddy->mm_dynamic_end[0] = PTR2ALLOCNODE((x_ubase)dynamic_buddy_start + (x_ubase)dynamic_buddy_size - SIZEOF_DYNAMICALLOCNODE_MEM); dynamic_buddy->mm_dynamic_end[0]->size = SIZEOF_DYNAMICALLOCNODE_MEM; dynamic_buddy->mm_dynamic_end[0]->prev_adj_size = node->size; - dynamic_buddy->mm_dynamic_end[0]->prev_adj_size |= DYNAMIC_BLOCK_MASK; + // dynamic_buddy->mm_dynamic_end[0]->prev_adj_size |= DYNAMIC_BLOCK_MASK; + dynamic_buddy->mm_dynamic_end[0]->flag = DYNAMIC_BLOCK_MASK; /* insert node into dynamic buddy memory */ AddNewNodeIntoBuddy(dynamic_buddy,node); + KPrintf("14 : %d\n", dynamic_buddy->mm_freenode_list[14].size); + KPrintf("dynamic_buddy_start = 0x%x,dynamic_buddy_size = 0x%x\n",dynamic_buddy_start,dynamic_buddy_size); } /** @@ -311,13 +335,15 @@ static void InitBuddy(struct DynamicBuddyMemory *dynamic_buddy, x_ubase dynamic_ * * @param dynamic_buddy the heart dynamic buddy structure * @param size the memory size to be allocated + * @param extsram_mask mask the memory region comes from ext sram * * @return pointer address on success; NULL on failure */ -static void* BigMemMalloc(struct DynamicBuddyMemory *dynamic_buddy, x_size_t size) +static void* BigMemMalloc(struct DynamicBuddyMemory *dynamic_buddy, x_size_t size, uint32 extsram_mask) { int ndx = 0; - x_size_t allocsize = 0; + // x_size_t allocsize = 0; + uint32 allocsize = 0; void *result = NONE; struct DynamicFreeNode *node = NONE; @@ -325,7 +351,7 @@ static void* BigMemMalloc(struct DynamicBuddyMemory *dynamic_buddy, x_size_t siz /* calculate the real size */ allocsize = size + SIZEOF_DYNAMICALLOCNODE_MEM; - +KPrintf("allocsize = %d\n", allocsize); /* if the size exceeds the upper limit, return MEM_LINKNRS - 1 */ if (allocsize >= MEM_HIGH_RANGE) { ndx = MEM_LINKNRS - 1; @@ -339,12 +365,13 @@ static void* BigMemMalloc(struct DynamicBuddyMemory *dynamic_buddy, x_size_t siz node && (node->size < allocsize); node = node->next) { }; - + KPrintf("node 0x%x mm_freenode_list[%d] = 0x%x dynamic_buddy_start = 0x%x allocsize = %d\n",node,ndx,&dynamic_buddy->mm_freenode_list[ndx],dynamic_buddy->dynamic_buddy_start,allocsize); /* get the best-fit freeNode */ if (node && (node->size > allocsize)) { struct DynamicFreeNode *remainder; struct DynamicFreeNode *next; - x_size_t remaining; + // x_size_t remaining; + uint32 remaining; node->prev->next = node->next; if (node->next) { @@ -352,31 +379,42 @@ static void* BigMemMalloc(struct DynamicBuddyMemory *dynamic_buddy, x_size_t siz } remaining = node->size - allocsize; + KPrintf("node = 0x%x node size = %d alloc size = %d remaining size = %d \n",node,node->size,allocsize,remaining); if (remaining >= MEM_LOW_RANGE){ next = PTR2FREENODE(((char *)node) + node->size); /* create the remainder node */ remainder = PTR2FREENODE(((char *)node) + allocsize); remainder->size = remaining; + // KPrintf("remainder 0x%x node 0x%x next 0x%x,a s %d r %d remainder s %d fg 0x%x\n",remainder,node,next,allocsize,remaining,remainder->size,remainder->flag); + remainder->prev_adj_size = allocsize; + // KPrintf("0 remainder 0x%x node 0x%x next 0x%x,a s %d r %d remainder s %d, p s = %d fg 0x%x\n",remainder,node,next,allocsize,remaining,remainder->size,remainder->prev_adj_size,remainder->flag); /* adjust the size of the node */ node->size = allocsize; - next->prev_adj_size = (remaining|(next->prev_adj_size & ALLOC_BLOCK_MASK)); + // next->prev_adj_size = (remaining|(next->prev_adj_size & ALLOC_BLOCK_MASK)); + next->prev_adj_size = remaining; /* insert the remainder freeNode back into the dynamic buddy memory */ + KPrintf("1 remainder 0x%x node 0x%x next 0x%x,a s %d r %d remainder s %d, p s = %d fg 0x%x\n",remainder,node,next,node->size,remaining,remainder->size,remainder->prev_adj_size,remainder->flag); AddNewNodeIntoBuddy(dynamic_buddy, remainder); } /* handle the case of an exact size match */ - node->prev_adj_size &= DYNAMIC_REMAINING_MASK; - node->prev_adj_size |= DYNAMIC_BLOCK_MASK; + // node->prev_adj_size &= DYNAMIC_REMAINING_MASK; + // node->prev_adj_size |= DYNAMIC_BLOCK_MASK; + + node->flag = extsram_mask; + // KPrintf("node flag = 0x%x prev_adj_size = 0x%x\n",node->flag,node->prev_adj_size); result = (void *)((char *)node + SIZEOF_DYNAMICALLOCNODE_MEM); } /* failure allocation */ if(result == NONE) { +#ifndef DATA_IN_ExtSRAM KPrintf("%s: allocation failed, size %d.\n", __func__,allocsize); +#endif return result; } @@ -413,7 +451,8 @@ static void BigMemFree( struct ByteMemory *byte_memory, void *pointer) /* get the next sibling freeNode */ next = PTR2FREENODE((char*)node+node->size); - if(((next->prev_adj_size & DYNAMIC_BLOCK_MASK) == 0)) { + // if(((next->prev_adj_size & DYNAMIC_BLOCK_MASK) == 0)) { + if(((next->flag & DYNAMIC_BLOCK_MASK) == 0)) { struct DynamicAllocNode *andbeyond; andbeyond = PTR2ALLOCNODE((char*)next + next->size); @@ -423,21 +462,25 @@ static void BigMemFree( struct ByteMemory *byte_memory, void *pointer) } node->size += next->size; - andbeyond->prev_adj_size = (node->size | (andbeyond->prev_adj_size & ALLOC_BLOCK_MASK)); + // andbeyond->prev_adj_size = (node->size | (andbeyond->prev_adj_size & ALLOC_BLOCK_MASK)); + andbeyond->prev_adj_size = node->size; next = (struct DynamicFreeNode*)andbeyond; } /* get the prev sibling freeNode */ - prev = (struct DynamicFreeNode*)((char*)node - (node->prev_adj_size & DYNAMIC_REMAINING_MASK)); - if((prev->prev_adj_size & DYNAMIC_BLOCK_MASK)==0) { + // prev = (struct DynamicFreeNode*)((char*)node - (node->prev_adj_size & DYNAMIC_REMAINING_MASK)); + prev = (struct DynamicFreeNode*)((char*)node - node->prev_adj_size ); + // if((prev->prev_adj_size & DYNAMIC_BLOCK_MASK)==0) { + if((prev->flag & DYNAMIC_BLOCK_MASK)==0) { prev->prev->next=prev->next; if(prev->next){ prev->next->prev = prev->prev; } prev->size += node->size; - next->prev_adj_size = (prev->size | (next->prev_adj_size & ALLOC_BLOCK_MASK)); + // next->prev_adj_size = (prev->size | (next->prev_adj_size & ALLOC_BLOCK_MASK)); + next->prev_adj_size = prev->size; node = prev; } - node->prev_adj_size &= DYNAMIC_REMAINING_MASK; + // node->prev_adj_size &= DYNAMIC_REMAINING_MASK; /* insert freeNode into dynamic buddy memory */ AddNewNodeIntoBuddy(&byte_memory->dynamic_buddy_manager,node); @@ -466,7 +509,7 @@ static void SmallMemInit(struct ByteMemory *byte_memory) item = &byte_memory->static_manager[MM_SEGMENT_32B]; /* allocate memory zone for [32b] */ - item->freelist = byte_memory->dynamic_buddy_manager.done->malloc(&byte_memory->dynamic_buddy_manager, SMALL_SIZE_32B(SIZEOF_32B)); + item->freelist = byte_memory->dynamic_buddy_manager.done->malloc(&byte_memory->dynamic_buddy_manager, SMALL_SIZE_32B(SIZEOF_32B), DYNAMIC_BLOCK_NO_EXTMEM_MASK); if(!item->freelist) { KPrintf("%s: no memory for small memory[32B].\n",__func__); item->block_free_count = 0; @@ -481,14 +524,14 @@ static void SmallMemInit(struct ByteMemory *byte_memory) for(offset = 0; offset < item->block_total_count; offset++) { node = PTR2ALLOCNODE((char*)item->freelist + offset * (SIZEOF_32B + SIZEOF_DYNAMICALLOCNODE_MEM)); node->size =(x_size_t) ((char*)item->freelist + (offset + 1) * (SIZEOF_32B + SIZEOF_DYNAMICALLOCNODE_MEM)); - node->prev_adj_size = STATIC_BLOCK_MASK; + node->flag = STATIC_BLOCK_MASK; } node->size = NONE; item = &byte_memory->static_manager[MM_SEGMENT_64B]; /* allocate memory zone for [64B] */ - item->freelist = byte_memory->dynamic_buddy_manager.done->malloc(&byte_memory->dynamic_buddy_manager, SMALL_SIZE_64B(SIZEOF_64B)); + item->freelist = byte_memory->dynamic_buddy_manager.done->malloc(&byte_memory->dynamic_buddy_manager, SMALL_SIZE_64B(SIZEOF_64B),DYNAMIC_BLOCK_NO_EXTMEM_MASK); if(!item->freelist) { KPrintf("%s: no memory for small memory[64B].\n",__func__); return; @@ -502,7 +545,7 @@ static void SmallMemInit(struct ByteMemory *byte_memory) for(offset = 0; offset < item->block_total_count; offset++) { node = PTR2ALLOCNODE((char*)item->freelist + offset * (SIZEOF_64B + SIZEOF_DYNAMICALLOCNODE_MEM)); node->size =(x_size_t) ((char*)item->freelist + (offset + 1) * (SIZEOF_64B + SIZEOF_DYNAMICALLOCNODE_MEM)); - node->prev_adj_size = STATIC_BLOCK_MASK; + node->flag = STATIC_BLOCK_MASK; } node->size = NONE; @@ -548,6 +591,7 @@ static void SmallMemFree(void *pointer) */ static void *SmallMemMalloc(struct ByteMemory *byte_memory, x_size_t size) { + uint8 i = 0; void *result = NONE; struct DynamicAllocNode *node = NONE; struct segment *static_segment = NONE; @@ -564,7 +608,7 @@ static void *SmallMemMalloc(struct ByteMemory *byte_memory, x_size_t size) /* get the head static memory block */ result = static_segment->freelist; node = PTR2ALLOCNODE(static_segment->freelist); - node->prev_adj_size = STATIC_BLOCK_MASK; + node->flag = STATIC_BLOCK_MASK; /* update the statistic information of static segment */ static_segment->freelist = (uint8 *)(long)(node->size); @@ -578,7 +622,20 @@ static void *SmallMemMalloc(struct ByteMemory *byte_memory, x_size_t size) } /* the static memory block is exhausted, now turn to dynamic buddy memory for allocation. */ - result = byte_memory->dynamic_buddy_manager.done->malloc(&byte_memory->dynamic_buddy_manager, size); + result = byte_memory->dynamic_buddy_manager.done->malloc(&byte_memory->dynamic_buddy_manager, size, DYNAMIC_BLOCK_NO_EXTMEM_MASK); +#ifdef DATA_IN_ExtSRAM + if(NONE == result) { + for(i = 0; i < EXTSRAM_MAX_NUM; i++) { + if(NONE != ExtByteManager[i].done) { + result = ExtByteManager[i].dynamic_buddy_manager.done->malloc(&ExtByteManager[i].dynamic_buddy_manager, size, DYNAMIC_BLOCK_EXTMEMn_MASK(i + 1)); + if (result){ + CHECK(ExtByteManager[i].dynamic_buddy_manager.done->JudgeLegal(&ExtByteManager[i].dynamic_buddy_manager, ret - SIZEOF_DYNAMICALLOCNODE_MEM)); + break; + } + } + } + } +#endif return result; } @@ -597,18 +654,31 @@ static struct StaticMemoryDone StaticDone = { */ void *x_malloc(x_size_t size) { + uint8 i = 0; void *ret = NONE; register x_base lock = 0; - /* parameter detection */ + // /* parameter detection */ + // if((size == 0) || (size > ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start - ByteManager.dynamic_buddy_manager.active_memory)) + // return NONE; +#ifdef DATA_IN_ExtSRAM + /* parameter detection */ + if(size == 0 ){ + return NONE; + } + // if((size > ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start - ByteManager.dynamic_buddy_manager.active_memory)){ + // goto try_extmem; + // } + +#else + /* parameter detection */ if((size == 0) || (size > ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start - ByteManager.dynamic_buddy_manager.active_memory)) return NONE; - +#endif /* hold lock before allocation */ lock = CriticalAreaLock(); /* alignment */ size = ALIGN_MEN_UP(size, MEM_ALIGN_SIZE); - /* determine allocation operation from static segments or dynamic buddy memory */ #ifdef KERNEL_SMALL_MEM_ALLOC if(size <= SIZEOF_32B) { @@ -618,10 +688,28 @@ void *x_malloc(x_size_t size) } else #endif { - ret = ByteManager.dynamic_buddy_manager.done->malloc(&ByteManager.dynamic_buddy_manager,size); + ret = ByteManager.dynamic_buddy_manager.done->malloc(&ByteManager.dynamic_buddy_manager, size, DYNAMIC_BLOCK_NO_EXTMEM_MASK); + if(ret != NONE) + CHECK(ByteManager.dynamic_buddy_manager.done->JudgeLegal(&ByteManager.dynamic_buddy_manager, ret - SIZEOF_DYNAMICALLOCNODE_MEM)); +// try_extmem: +#ifdef DATA_IN_ExtSRAM + if(NONE == ret) { + KPrintf("wwg debug ...\n"); + for(i = 0; i < EXTSRAM_MAX_NUM; i++) { + if(NONE != ExtByteManager[i].done) { + KPrintf(" ExtByteManager[%d].done = 0x%x \n",i,ExtByteManager[i].done); + ret = ExtByteManager[i].dynamic_buddy_manager.done->malloc(&ExtByteManager[i].dynamic_buddy_manager, size, DYNAMIC_BLOCK_EXTMEMn_MASK(i + 1)); + if (ret){ + CHECK(ExtByteManager[i].dynamic_buddy_manager.done->JudgeLegal(&ExtByteManager[i].dynamic_buddy_manager, ret - SIZEOF_DYNAMICALLOCNODE_MEM)); + break; + } + KPrintf("ret = 0x%x \n",ret); + } + } + } +#endif } - if(ret != NONE) - CHECK(ByteManager.dynamic_buddy_manager.done->JudgeLegal(&ByteManager.dynamic_buddy_manager, ret - SIZEOF_DYNAMICALLOCNODE_MEM)); + KPrintf("malloc i = %d size %d ret = 0x%x\n",i,size,ret); /* release lock */ CriticalAreaUnLock(lock); return ret; @@ -726,20 +814,83 @@ void x_free(void *pointer) lock = CriticalAreaLock(); node = PTR2ALLOCNODE((char*)pointer-SIZEOF_DYNAMICALLOCNODE_MEM); CHECK(ByteManager.done->JudgeAllocated(node)); - + /* judge release the memory block ro static_segment or dynamic buddy memory */ #ifdef KERNEL_SMALL_MEM_ALLOC - if(node->prev_adj_size & STATIC_BLOCK_MASK) { + if(node->flag & STATIC_BLOCK_MASK) { ByteManager.static_manager->done->release(pointer); } else #endif { +#ifdef DATA_IN_ExtSRAM + /* judge the pointer is not malloced from extern memory*/ + if(0 == (node->flag & 0xFF0000)) { ByteManager.dynamic_buddy_manager.done->release(&ByteManager,pointer); } + + /* judge the pointer is malloced from extern memory*/ + if(0 != (node->flag & 0xFF0000)) { + KPrintf("wwg debug node->flag = 0x%x\n",node->flag); + ExtByteManager[((node->flag & 0xFF0000) >> 16) - 1].dynamic_buddy_manager.done->release(&ExtByteManager[((node->flag & 0xFF0000) >> 16) - 1],pointer); + } +#else + ByteManager.dynamic_buddy_manager.done->release(&ByteManager,pointer); +#endif + } /* release the lock */ CriticalAreaUnLock(lock); } +#ifdef DATA_IN_ExtSRAM +/** + * This function initializes the dynamic buddy memory of extern sram. + * + * @param start_phy_address the start physical address for static and dynamic memory + * @param end_phy_address the end physical address for static and dynamic memory + * @param extsram_idx the idx of extsram chip + */ +void ExtSramInitBoardMemory(void *start_phy_address, void *end_phy_address, uint8 extsram_idx) +{ + register x_size_t offset = 0; + + NULL_PARAM_CHECK(start_phy_address); + NULL_PARAM_CHECK(end_phy_address); + + KDEBUG_NOT_IN_INTERRUPT; + struct DynamicBuddyMemory *uheap = &ExtByteManager[extsram_idx].dynamic_buddy_manager; + + /* align begin and end addr to page */ + ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_start = ALIGN_MEN_UP((x_ubase)start_phy_address, MM_PAGE_SIZE); + ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_end = ALIGN_MEN_DOWN((x_ubase)end_phy_address, MM_PAGE_SIZE); + KPrintf("%s: 0x%x-0x%x extsram_idx = %d\n",__func__,ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_start,ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_end, extsram_idx); + + /* parameter detection */ + if (ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_start >= ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_end) { + KPrintf("ExtSramInitBoardMemory, wrong address[0x%x - 0x%x]\n", + (x_ubase)start_phy_address, (x_ubase)end_phy_address); + return; + } + + uheap->mm_total_size = 0; + memset(uheap->mm_freenode_list, 0, SIZEOF_XSFREENODE_MEM * MEM_LINKNRS); + + /* initialize the freeNodeList */ + for (offset = 1; offset < MEM_LINKNRS; offset++) { + uheap->mm_freenode_list[offset - 1].next = &uheap->mm_freenode_list[offset]; + uheap->mm_freenode_list[offset].prev = &uheap->mm_freenode_list[offset - 1]; + } + + ExtByteManager[extsram_idx].dynamic_buddy_manager.done = &DynamicDone; + ExtByteManager[extsram_idx].done = &NodeDone; + + + /* dynamic buddy memory initialization */ + ExtByteManager[extsram_idx].dynamic_buddy_manager.done->init(&ExtByteManager[extsram_idx].dynamic_buddy_manager, ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_start, ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_end - ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_start); + KPrintf("[0x%x - 0x%x]ExtByteManager[%d].dynamic_buddy_manager.done = 0x%x\n",start_phy_address,end_phy_address,extsram_idx,ExtByteManager[extsram_idx].dynamic_buddy_manager.done); + +} +#endif + /** * This function initializes the static segments and dynamic buddy memory structures. * @@ -1025,7 +1176,7 @@ void ShowBuddy(void) KPrintf("\n\033[41;1mlist memory information\033[0m\n", __func__); for (debug = ByteManager.dynamic_buddy_manager.mm_freenode_list[0].next; debug;debug = debug->next){ - KPrintf("%s,current is %x,next is %x, size %u, flag %x\n",__func__, debug, debug->next,debug->size,debug->prev_adj_size & ALLOC_BLOCK_MASK); + KPrintf("%s,current is %x,next is %x, size %u, flag %x\n",__func__, debug, debug->next,debug->size,debug->flag & ALLOC_BLOCK_MASK); }; KPrintf("\nlist memory information\n\n"); CriticalAreaUnLock(lock); From 8b2d6082d1b5162ad57097b866bdeb8cbb390815 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Sat, 29 May 2021 11:58:58 +0800 Subject: [PATCH 3/7] extsram test is ok --- .../third_party_driver/extmem/connect_fsmc.c | 18 ++++-- kernel/memory/byte_manage.c | 55 +++++-------------- 2 files changed, 28 insertions(+), 45 deletions(-) diff --git a/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c b/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c index 232154a1f..cbfce3c0c 100644 --- a/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c +++ b/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c @@ -23,6 +23,8 @@ #include "hardware_fsmc.h" #include "hardware_gpio.h" #include "hardware_rcc.h" +#include "cmsis_gcc.h" +#include static FSMC_NORSRAMInitTypeDef hsram; static FSMC_NORSRAMTimingInitTypeDef hsram_read; @@ -121,17 +123,17 @@ int HwSramInit(void) hsram.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; hsram.FSMC_WriteBurst = FSMC_WriteBurst_Disable; - hsram_read.FSMC_AddressSetupTime = 1; + hsram_read.FSMC_AddressSetupTime = 0; hsram_read.FSMC_AddressHoldTime = 0; - hsram_read.FSMC_DataSetupTime = 2; + hsram_read.FSMC_DataSetupTime = 8; hsram_read.FSMC_BusTurnAroundDuration = 0; hsram_read.FSMC_CLKDivision = 0; hsram_read.FSMC_DataLatency = 0; hsram_read.FSMC_AccessMode = FSMC_AccessMode_A; - hsram_write.FSMC_AddressSetupTime = 1; + hsram_write.FSMC_AddressSetupTime = 0; hsram_write.FSMC_AddressHoldTime = 0; - hsram_write.FSMC_DataSetupTime = 2; + hsram_write.FSMC_DataSetupTime = 8; hsram_write.FSMC_BusTurnAroundDuration = 0; hsram_write.FSMC_CLKDivision = 0; hsram_write.FSMC_DataLatency = 0; @@ -175,8 +177,16 @@ int HwSramInit(void) FSMC_NORSRAMInit(&hsram); FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); + + extern void ExtSramInitBoardMemory(void *start_phy_address, void *end_phy_address, uint8 extsram_idx); #define START_ADDRESS 0x68000000 + + memset((void*)START_ADDRESS,0,BANK1_NORSRAM3_SIZE); + __DSB(); +//     __ISB(); + __DMB(); + ExtSramInitBoardMemory((void*)(START_ADDRESS), (void*)((START_ADDRESS + BANK1_NORSRAM3_SIZE)), 2); #endif diff --git a/kernel/memory/byte_manage.c b/kernel/memory/byte_manage.c index 72a745e8b..ce1e21aad 100644 --- a/kernel/memory/byte_manage.c +++ b/kernel/memory/byte_manage.c @@ -202,7 +202,6 @@ static int SmallMemTypeAlloc(struct DynamicAllocNode *address) { NULL_PARAM_CHECK(address); - // if(address->prev_adj_size & STATIC_BLOCK_MASK) { if(address->flag & STATIC_BLOCK_MASK) { return RET_TRUE; } @@ -221,7 +220,6 @@ static int MmAllocNode(struct DynamicAllocNode *memory_ptr) { NULL_PARAM_CHECK(memory_ptr); - // if(memory_ptr->prev_adj_size & ALLOC_BLOCK_MASK) { if(memory_ptr->flag & ALLOC_BLOCK_MASK) { return RET_TRUE; } @@ -250,7 +248,6 @@ static int CaculateBuddyIndex(x_size_t size) } else { ndx = MEM_LINKNRS - 1; } - KPrintf("hehehe ndx = %d, size = %d\n",ndx, size); return ndx; } @@ -311,23 +308,18 @@ static void InitBuddy(struct DynamicBuddyMemory *dynamic_buddy, x_ubase dynamic_ /* the initialized free node */ node =(struct DynamicFreeNode *) ((x_ubase)dynamic_buddy_start + SIZEOF_DYNAMICALLOCNODE_MEM); - KPrintf("kaishi : 0x%x, node : 0x%x, size : 0x%x\n", (x_ubase)dynamic_buddy_start, node, dynamic_buddy_size); node->size=(dynamic_buddy_size - 2* SIZEOF_DYNAMICALLOCNODE_MEM); - KPrintf("hahaha size = %d\n", node->size); node->prev_adj_size= SIZEOF_DYNAMICALLOCNODE_MEM; - node->flag= DYNAMIC_BLOCK_MASK; + node->flag= 0; /* record the end boundary of dynamic buddy memory */ dynamic_buddy->mm_dynamic_end[0] = PTR2ALLOCNODE((x_ubase)dynamic_buddy_start + (x_ubase)dynamic_buddy_size - SIZEOF_DYNAMICALLOCNODE_MEM); dynamic_buddy->mm_dynamic_end[0]->size = SIZEOF_DYNAMICALLOCNODE_MEM; dynamic_buddy->mm_dynamic_end[0]->prev_adj_size = node->size; - // dynamic_buddy->mm_dynamic_end[0]->prev_adj_size |= DYNAMIC_BLOCK_MASK; dynamic_buddy->mm_dynamic_end[0]->flag = DYNAMIC_BLOCK_MASK; /* insert node into dynamic buddy memory */ AddNewNodeIntoBuddy(dynamic_buddy,node); - KPrintf("14 : %d\n", dynamic_buddy->mm_freenode_list[14].size); - KPrintf("dynamic_buddy_start = 0x%x,dynamic_buddy_size = 0x%x\n",dynamic_buddy_start,dynamic_buddy_size); } /** @@ -342,7 +334,6 @@ static void InitBuddy(struct DynamicBuddyMemory *dynamic_buddy, x_ubase dynamic_ static void* BigMemMalloc(struct DynamicBuddyMemory *dynamic_buddy, x_size_t size, uint32 extsram_mask) { int ndx = 0; - // x_size_t allocsize = 0; uint32 allocsize = 0; void *result = NONE; struct DynamicFreeNode *node = NONE; @@ -351,7 +342,6 @@ static void* BigMemMalloc(struct DynamicBuddyMemory *dynamic_buddy, x_size_t siz /* calculate the real size */ allocsize = size + SIZEOF_DYNAMICALLOCNODE_MEM; -KPrintf("allocsize = %d\n", allocsize); /* if the size exceeds the upper limit, return MEM_LINKNRS - 1 */ if (allocsize >= MEM_HIGH_RANGE) { ndx = MEM_LINKNRS - 1; @@ -365,12 +355,10 @@ KPrintf("allocsize = %d\n", allocsize); node && (node->size < allocsize); node = node->next) { }; - KPrintf("node 0x%x mm_freenode_list[%d] = 0x%x dynamic_buddy_start = 0x%x allocsize = %d\n",node,ndx,&dynamic_buddy->mm_freenode_list[ndx],dynamic_buddy->dynamic_buddy_start,allocsize); /* get the best-fit freeNode */ if (node && (node->size > allocsize)) { struct DynamicFreeNode *remainder; struct DynamicFreeNode *next; - // x_size_t remaining; uint32 remaining; node->prev->next = node->next; @@ -379,34 +367,27 @@ KPrintf("allocsize = %d\n", allocsize); } remaining = node->size - allocsize; - KPrintf("node = 0x%x node size = %d alloc size = %d remaining size = %d \n",node,node->size,allocsize,remaining); if (remaining >= MEM_LOW_RANGE){ next = PTR2FREENODE(((char *)node) + node->size); /* create the remainder node */ remainder = PTR2FREENODE(((char *)node) + allocsize); remainder->size = remaining; - // KPrintf("remainder 0x%x node 0x%x next 0x%x,a s %d r %d remainder s %d fg 0x%x\n",remainder,node,next,allocsize,remaining,remainder->size,remainder->flag); remainder->prev_adj_size = allocsize; - // KPrintf("0 remainder 0x%x node 0x%x next 0x%x,a s %d r %d remainder s %d, p s = %d fg 0x%x\n",remainder,node,next,allocsize,remaining,remainder->size,remainder->prev_adj_size,remainder->flag); + remainder->flag = 0; /* adjust the size of the node */ node->size = allocsize; - // next->prev_adj_size = (remaining|(next->prev_adj_size & ALLOC_BLOCK_MASK)); next->prev_adj_size = remaining; /* insert the remainder freeNode back into the dynamic buddy memory */ - KPrintf("1 remainder 0x%x node 0x%x next 0x%x,a s %d r %d remainder s %d, p s = %d fg 0x%x\n",remainder,node,next,node->size,remaining,remainder->size,remainder->prev_adj_size,remainder->flag); AddNewNodeIntoBuddy(dynamic_buddy, remainder); } /* handle the case of an exact size match */ - // node->prev_adj_size &= DYNAMIC_REMAINING_MASK; - // node->prev_adj_size |= DYNAMIC_BLOCK_MASK; node->flag = extsram_mask; - // KPrintf("node flag = 0x%x prev_adj_size = 0x%x\n",node->flag,node->prev_adj_size); result = (void *)((char *)node + SIZEOF_DYNAMICALLOCNODE_MEM); } @@ -451,7 +432,6 @@ static void BigMemFree( struct ByteMemory *byte_memory, void *pointer) /* get the next sibling freeNode */ next = PTR2FREENODE((char*)node+node->size); - // if(((next->prev_adj_size & DYNAMIC_BLOCK_MASK) == 0)) { if(((next->flag & DYNAMIC_BLOCK_MASK) == 0)) { struct DynamicAllocNode *andbeyond; @@ -462,25 +442,22 @@ static void BigMemFree( struct ByteMemory *byte_memory, void *pointer) } node->size += next->size; - // andbeyond->prev_adj_size = (node->size | (andbeyond->prev_adj_size & ALLOC_BLOCK_MASK)); andbeyond->prev_adj_size = node->size; next = (struct DynamicFreeNode*)andbeyond; } /* get the prev sibling freeNode */ - // prev = (struct DynamicFreeNode*)((char*)node - (node->prev_adj_size & DYNAMIC_REMAINING_MASK)); prev = (struct DynamicFreeNode*)((char*)node - node->prev_adj_size ); - // if((prev->prev_adj_size & DYNAMIC_BLOCK_MASK)==0) { if((prev->flag & DYNAMIC_BLOCK_MASK)==0) { + prev->prev->next=prev->next; if(prev->next){ prev->next->prev = prev->prev; } prev->size += node->size; - // next->prev_adj_size = (prev->size | (next->prev_adj_size & ALLOC_BLOCK_MASK)); next->prev_adj_size = prev->size; node = prev; } - // node->prev_adj_size &= DYNAMIC_REMAINING_MASK; + node->flag = 0; /* insert freeNode into dynamic buddy memory */ AddNewNodeIntoBuddy(&byte_memory->dynamic_buddy_manager,node); @@ -658,17 +635,19 @@ void *x_malloc(x_size_t size) void *ret = NONE; register x_base lock = 0; - // /* parameter detection */ - // if((size == 0) || (size > ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start - ByteManager.dynamic_buddy_manager.active_memory)) - // return NONE; + /* parameter detection */ + #ifdef DATA_IN_ExtSRAM /* parameter detection */ if(size == 0 ){ return NONE; } - // if((size > ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start - ByteManager.dynamic_buddy_manager.active_memory)){ - // goto try_extmem; - // } + if((size > ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start - ByteManager.dynamic_buddy_manager.active_memory)){ + lock = CriticalAreaLock(); + /* alignment */ + size = ALIGN_MEN_UP(size, MEM_ALIGN_SIZE); + goto try_extmem; + } #else /* parameter detection */ @@ -691,25 +670,22 @@ void *x_malloc(x_size_t size) ret = ByteManager.dynamic_buddy_manager.done->malloc(&ByteManager.dynamic_buddy_manager, size, DYNAMIC_BLOCK_NO_EXTMEM_MASK); if(ret != NONE) CHECK(ByteManager.dynamic_buddy_manager.done->JudgeLegal(&ByteManager.dynamic_buddy_manager, ret - SIZEOF_DYNAMICALLOCNODE_MEM)); -// try_extmem: +try_extmem: #ifdef DATA_IN_ExtSRAM if(NONE == ret) { - KPrintf("wwg debug ...\n"); for(i = 0; i < EXTSRAM_MAX_NUM; i++) { if(NONE != ExtByteManager[i].done) { - KPrintf(" ExtByteManager[%d].done = 0x%x \n",i,ExtByteManager[i].done); ret = ExtByteManager[i].dynamic_buddy_manager.done->malloc(&ExtByteManager[i].dynamic_buddy_manager, size, DYNAMIC_BLOCK_EXTMEMn_MASK(i + 1)); if (ret){ CHECK(ExtByteManager[i].dynamic_buddy_manager.done->JudgeLegal(&ExtByteManager[i].dynamic_buddy_manager, ret - SIZEOF_DYNAMICALLOCNODE_MEM)); break; } - KPrintf("ret = 0x%x \n",ret); + } } } #endif } - KPrintf("malloc i = %d size %d ret = 0x%x\n",i,size,ret); /* release lock */ CriticalAreaUnLock(lock); return ret; @@ -830,7 +806,6 @@ void x_free(void *pointer) /* judge the pointer is malloced from extern memory*/ if(0 != (node->flag & 0xFF0000)) { - KPrintf("wwg debug node->flag = 0x%x\n",node->flag); ExtByteManager[((node->flag & 0xFF0000) >> 16) - 1].dynamic_buddy_manager.done->release(&ExtByteManager[((node->flag & 0xFF0000) >> 16) - 1],pointer); } #else @@ -886,8 +861,6 @@ void ExtSramInitBoardMemory(void *start_phy_address, void *end_phy_address, uint /* dynamic buddy memory initialization */ ExtByteManager[extsram_idx].dynamic_buddy_manager.done->init(&ExtByteManager[extsram_idx].dynamic_buddy_manager, ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_start, ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_end - ExtByteManager[extsram_idx].dynamic_buddy_manager.dynamic_buddy_start); - KPrintf("[0x%x - 0x%x]ExtByteManager[%d].dynamic_buddy_manager.done = 0x%x\n",start_phy_address,end_phy_address,extsram_idx,ExtByteManager[extsram_idx].dynamic_buddy_manager.done); - } #endif From 221bd363c97d2e97993fc33849335bab4fc5dd7a Mon Sep 17 00:00:00 2001 From: Zhao_Jiasheng <18535861947@163.com> Date: Sat, 29 May 2021 13:24:05 +0800 Subject: [PATCH 4/7] Finishing fsmc driver --- board/aiit-arm32-board/board.c | 17 +- .../third_party_driver/Kconfig | 1 + .../third_party_driver/extmem/Kconfig | 37 +- .../third_party_driver/extmem/connect_fsmc.c | 255 +++++++------ .../include/{extmem.h => connect_fsmc.h} | 24 +- .../third_party_driver/Kconfig | 7 - .../third_party_driver/Makefile | 5 - .../third_party_driver/extmem/Kconfig | 0 .../third_party_driver/extmem/Makefile | 3 - .../third_party_driver/extmem/extmem.c | 336 ------------------ .../third_party_driver/include/extmem.h | 28 -- board/stm32f407zgt6/board.c | 11 +- .../stm32f407zgt6/third_party_driver/Kconfig | 1 + .../third_party_driver/extmem/Kconfig | 36 -- .../third_party_driver/extmem/connect_fsmc.c | 128 +++---- kernel/Kconfig | 4 + kernel/include/xs_memory.h | 2 +- kernel/memory/byte_manage.c | 16 +- 18 files changed, 237 insertions(+), 674 deletions(-) rename board/aiit-arm32-board/third_party_driver/include/{extmem.h => connect_fsmc.h} (69%) delete mode 100644 board/stm32f407-st-discovery/third_party_driver/extmem/Kconfig delete mode 100644 board/stm32f407-st-discovery/third_party_driver/extmem/Makefile delete mode 100644 board/stm32f407-st-discovery/third_party_driver/extmem/extmem.c delete mode 100644 board/stm32f407-st-discovery/third_party_driver/include/extmem.h diff --git a/board/aiit-arm32-board/board.c b/board/aiit-arm32-board/board.c index 5aa161265..b25c2266a 100644 --- a/board/aiit-arm32-board/board.c +++ b/board/aiit-arm32-board/board.c @@ -144,11 +144,9 @@ struct InitSequenceDesc _board_init[] = #ifdef BSP_USING_SDIO {"hw sdcard init",HwSdioInit}, #endif -// #ifdef BSP_USING_EXTMEM -// #ifdef DATA_IN_ExtSRAM -// {"hw ext sram",HwSramInit}, -// #endif -// #endif +#ifdef BSP_USING_EXTMEM + { "hw extern sram", HwSramInit }, +#endif { " NONE ",NONE }, }; @@ -161,7 +159,7 @@ void InitBoardHardware() NVIC_Configuration(); SysTickConfiguration(); - InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); + InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); #ifdef BSP_USING_UART Stm32HwUsartInit(); @@ -174,13 +172,6 @@ void InitBoardHardware() KPrintf("board initialization......\n"); #endif -#ifdef BSP_USING_EXTMEM - extern int HwSramInit(void); - HwSramInit(); -#endif - - InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); - #ifdef SEPARATE_COMPILE // init mpu diff --git a/board/aiit-arm32-board/third_party_driver/Kconfig b/board/aiit-arm32-board/third_party_driver/Kconfig index b7a22104f..b48232b0d 100755 --- a/board/aiit-arm32-board/third_party_driver/Kconfig +++ b/board/aiit-arm32-board/third_party_driver/Kconfig @@ -15,6 +15,7 @@ endif menuconfig BSP_USING_EXTMEM bool "Using EXTMEM device" default n +select MEM_EXTERN_SRAM if BSP_USING_EXTMEM source "$BSP_DIR/third_party_driver/extmem/Kconfig" endif diff --git a/board/aiit-arm32-board/third_party_driver/extmem/Kconfig b/board/aiit-arm32-board/third_party_driver/extmem/Kconfig index 4010be56d..27186cb7c 100644 --- a/board/aiit-arm32-board/third_party_driver/extmem/Kconfig +++ b/board/aiit-arm32-board/third_party_driver/extmem/Kconfig @@ -1,22 +1,17 @@ -menu "Extern Sram Config" - config DATA_IN_ExtSRAM - bool "support extern sram" +if BSP_USING_EXTMEM + config EXTSRAM_MAX_NUM + int + default 4 + + config BSP_USING_FSMC_BANK1_NORSRAM3 + bool "config fsmc bank1 sram3" default n - if DATA_IN_ExtSRAM - config EXTSRAM_MAX_NUM - int - default 4 - - config BSP_USING_FSMC_BANK1_NORSRAM3 - bool "config fsmc bank1 sram3" - default n - if BSP_USING_FSMC_BANK1_NORSRAM3 - config BANK1_NORSRAM3_SIZE - hex "config sram chip size" - default 0x100000 - config BANK1_NORSRAM3_DATA_WIDTH - int "sram chip data width" - default 16 - endif - endif -endmenu + if BSP_USING_FSMC_BANK1_NORSRAM3 + config BANK1_NORSRAM3_SIZE + hex "config sram3 chip size" + default 0x100000 + config BANK1_NORSRAM3_DATA_WIDTH + int "config sram3 chip data width" + default 16 + endif +endif diff --git a/board/aiit-arm32-board/third_party_driver/extmem/connect_fsmc.c b/board/aiit-arm32-board/third_party_driver/extmem/connect_fsmc.c index f7f1d2d40..74313937c 100644 --- a/board/aiit-arm32-board/third_party_driver/extmem/connect_fsmc.c +++ b/board/aiit-arm32-board/third_party_driver/extmem/connect_fsmc.c @@ -1,133 +1,162 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** +* @file connect_fsmc.c +* @brief support extern memory by fsmc +* @version 1.0 +* @author AIIT XUOS Lab +* @date 2021-05-28 +*/ + +#include "connect_fsmc.h" #include "hardware_fsmc.h" #include "hardware_gpio.h" #include "hardware_rcc.h" +#include +#include -#define SRAM_DATA_WIDTH 16 +#define FSMC_BANK1_NORSRAM3_START_ADDRESS 0x68000000 -static FSMC_NORSRAMInitTypeDef hsram; -static FSMC_NORSRAMTimingInitTypeDef hsram_read; -static FSMC_NORSRAMTimingInitTypeDef hsram_write; +static FSMC_NORSRAMInitTypeDef hsram3; +static FSMC_NORSRAMTimingInitTypeDef hsram_read3; +static FSMC_NORSRAMTimingInitTypeDef hsram_write3; + +extern void ExtSramInitBoardMemory(void *start_phy_address, void *end_phy_address, uint8 extsram_idx); int HwSramInit(void) { GPIO_InitTypeDef GPIO_InitStructure; - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE); - RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE); + RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE); - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOD, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOE, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOF, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOD, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOE, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOF, &GPIO_InitStructure); - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_10 | GPIO_Pin_12; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOG, &GPIO_InitStructure); - - GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC); - - GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC); - - GPIO_PinAFConfig(GPIOF,GPIO_PinSource0,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOF,GPIO_PinSource1,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOF,GPIO_PinSource2,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOF,GPIO_PinSource3,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOF,GPIO_PinSource4,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOF,GPIO_PinSource5,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOF,GPIO_PinSource13,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOF,GPIO_PinSource14,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOF,GPIO_PinSource15,GPIO_AF_FSMC); - - GPIO_PinAFConfig(GPIOG,GPIO_PinSource0,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOG,GPIO_PinSource1,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOG,GPIO_PinSource3,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOG,GPIO_PinSource10,GPIO_AF_FSMC); - GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_10 | GPIO_Pin_12; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(GPIOG, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC); + + GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC); + + GPIO_PinAFConfig(GPIOF,GPIO_PinSource0,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource1,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource2,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource3,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource4,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource5,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource13,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource14,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOF,GPIO_PinSource15,GPIO_AF_FSMC); + + GPIO_PinAFConfig(GPIOG,GPIO_PinSource0,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource1,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource3,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource10,GPIO_AF_FSMC); + GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC); - hsram.FSMC_ReadWriteTimingStruct = &hsram_read; - hsram.FSMC_WriteTimingStruct = &hsram_write; + hsram3.FSMC_ReadWriteTimingStruct = &hsram_read3; + hsram3.FSMC_WriteTimingStruct = &hsram_write3; - /* hsram.Init */ - hsram.FSMC_Bank = FSMC_Bank1_NORSRAM1; - hsram.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; - hsram.FSMC_MemoryType = FSMC_MemoryType_SRAM; -#if SRAM_DATA_WIDTH == 8 - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; -#elif SRAM_DATA_WIDTH == 16 - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; + /* hsram3.Init */ + hsram3.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + hsram3.FSMC_MemoryType = FSMC_MemoryType_SRAM; + hsram3.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + hsram3.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + hsram3.FSMC_WrapMode = FSMC_WrapMode_Disable; + hsram3.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + hsram3.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + hsram3.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + hsram3.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + hsram3.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + + hsram_read3.FSMC_AddressSetupTime = 0; + hsram_read3.FSMC_AddressHoldTime = 0; + hsram_read3.FSMC_DataSetupTime = 8; + hsram_read3.FSMC_BusTurnAroundDuration = 0; + hsram_read3.FSMC_CLKDivision = 0; + hsram_read3.FSMC_DataLatency = 0; + hsram_read3.FSMC_AccessMode = FSMC_AccessMode_A; + + hsram_write3.FSMC_AddressSetupTime = 0; + hsram_write3.FSMC_AddressHoldTime = 0; + hsram_write3.FSMC_DataSetupTime = 8; + hsram_write3.FSMC_BusTurnAroundDuration = 0; + hsram_write3.FSMC_CLKDivision = 0; + hsram_write3.FSMC_DataLatency = 0; + hsram_write3.FSMC_AccessMode = FSMC_AccessMode_A; + +#ifdef BSP_USING_FSMC_BANK1_NORSRAM3 + hsram3.FSMC_Bank = FSMC_Bank1_NORSRAM3; +#if BANK1_NORSRAM3_DATA_WIDTH == 8 + hsram3.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; +#elif BANK1_NORSRAM3_DATA_WIDTH == 16 + hsram3.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; #else - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_32b; + hsram3.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_32b; #endif - hsram.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; - hsram.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; - hsram.FSMC_WrapMode = FSMC_WrapMode_Disable; - hsram.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; - hsram.FSMC_WriteOperation = FSMC_WriteOperation_Enable; - hsram.FSMC_WaitSignal = FSMC_WaitSignal_Disable; - hsram.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; - hsram.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInit(&hsram3); + FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); + + ExtSramInitBoardMemory((void*)(FSMC_BANK1_NORSRAM3_START_ADDRESS), (void*)((FSMC_BANK1_NORSRAM3_START_ADDRESS + BANK1_NORSRAM3_SIZE)), 2); - hsram_read.FSMC_AddressSetupTime = 1; - hsram_read.FSMC_AddressHoldTime = 0; - hsram_read.FSMC_DataSetupTime = 2; - hsram_read.FSMC_BusTurnAroundDuration = 0; - hsram_read.FSMC_CLKDivision = 0; - hsram_read.FSMC_DataLatency = 0; - hsram_read.FSMC_AccessMode = FSMC_AccessMode_A; - - hsram_write.FSMC_AddressSetupTime = 1; - hsram_write.FSMC_AddressHoldTime = 0; - hsram_write.FSMC_DataSetupTime = 2; - hsram_write.FSMC_BusTurnAroundDuration = 0; - hsram_write.FSMC_CLKDivision = 0; - hsram_write.FSMC_DataLatency = 0; - hsram_write.FSMC_AccessMode = FSMC_AccessMode_A; - - FSMC_NORSRAMInit(&hsram); - - FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); +#endif return 0; } \ No newline at end of file diff --git a/board/aiit-arm32-board/third_party_driver/include/extmem.h b/board/aiit-arm32-board/third_party_driver/include/connect_fsmc.h similarity index 69% rename from board/aiit-arm32-board/third_party_driver/include/extmem.h rename to board/aiit-arm32-board/third_party_driver/include/connect_fsmc.h index fe9be543c..04c41c191 100644 --- a/board/aiit-arm32-board/third_party_driver/include/extmem.h +++ b/board/aiit-arm32-board/third_party_driver/include/connect_fsmc.h @@ -9,20 +9,28 @@ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ - + /** -* @file extmem.h -* @brief support extmem function +* @file connect_fsmc.h +* @brief declare stm32f407zgt6-board fsmc function * @version 1.0 * @author AIIT XUOS Lab -* @date 2021-04-25 +* @date 2021-05-28 */ -#ifndef EXTMEM_H -#define EXTMEM_H +#ifndef CONNECT_FSMC_H +#define CONNECT_FSMC_H -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - void SystemInitExtMemCtl(void); +#include + +#ifdef __cplusplus +extern "C" { +#endif + +int HwSramInit(void); + +#ifdef __cplusplus +} #endif #endif \ No newline at end of file diff --git a/board/stm32f407-st-discovery/third_party_driver/Kconfig b/board/stm32f407-st-discovery/third_party_driver/Kconfig index 43448e65a..0e31c526e 100755 --- a/board/stm32f407-st-discovery/third_party_driver/Kconfig +++ b/board/stm32f407-st-discovery/third_party_driver/Kconfig @@ -13,13 +13,6 @@ if BSP_USING_DMA source "$BSP_DIR/third_party_driver/common/Kconfig" endif -menuconfig BSP_USING_EXTMEM -bool "Using EXTMEM device" -default n -if BSP_USING_EXTMEM -source "$BSP_DIR/third_party_driver/extmem/Kconfig" -endif - menuconfig BSP_USING_GPIO bool "Using GPIO device " default y diff --git a/board/stm32f407-st-discovery/third_party_driver/Makefile b/board/stm32f407-st-discovery/third_party_driver/Makefile index 3057ed771..09c9310dd 100644 --- a/board/stm32f407-st-discovery/third_party_driver/Makefile +++ b/board/stm32f407-st-discovery/third_party_driver/Makefile @@ -5,11 +5,6 @@ ifeq ($(CONFIG_BSP_USING_CAN),y) SRC_DIR += can endif - -ifeq ($(CONFIG_BSP_USING_EXTMEM),y) - SRC_DIR += extmem -endif - ifeq ($(CONFIG_BSP_USING_GPIO),y) SRC_DIR += gpio endif diff --git a/board/stm32f407-st-discovery/third_party_driver/extmem/Kconfig b/board/stm32f407-st-discovery/third_party_driver/extmem/Kconfig deleted file mode 100644 index e69de29bb..000000000 diff --git a/board/stm32f407-st-discovery/third_party_driver/extmem/Makefile b/board/stm32f407-st-discovery/third_party_driver/extmem/Makefile deleted file mode 100644 index 6224e3f93..000000000 --- a/board/stm32f407-st-discovery/third_party_driver/extmem/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -SRC_FILES := extmem.c - -include $(KERNEL_ROOT)/compiler.mk diff --git a/board/stm32f407-st-discovery/third_party_driver/extmem/extmem.c b/board/stm32f407-st-discovery/third_party_driver/extmem/extmem.c deleted file mode 100644 index 9f7bc63f8..000000000 --- a/board/stm32f407-st-discovery/third_party_driver/extmem/extmem.c +++ /dev/null @@ -1,336 +0,0 @@ -/* -* Copyright (c) 2020 AIIT XUOS Lab -* XiUOS is licensed under Mulan PSL v2. -* You can use this software according to the terms and conditions of the Mulan PSL v2. -* You may obtain a copy of Mulan PSL v2 at: -* http://license.coscl.org.cn/MulanPSL2 -* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -* See the Mulan PSL v2 for more details. -*/ - -/** -* @file extmem.c -* @brief support extmem function -* @version 1.0 -* @author AIIT XUOS Lab -* @date 2021-04-25 -*/ - -#include "stm32f4xx.h" -#include "extmem.h" - -#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) -void SystemInitExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; - - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - - RCC->AHB1ENR |= 0x000001F8; - - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - GPIOD->MODER = 0xAAAA0A8A; - GPIOD->OSPEEDR = 0xFFFF0FCF; - GPIOD->OTYPER = 0x00000000; - GPIOD->PUPDR = 0x00000000; - - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - GPIOE->MODER = 0xAAAA828A; - GPIOE->OSPEEDR = 0xFFFFC3CF; - GPIOE->OTYPER = 0x00000000; - GPIOE->PUPDR = 0x00000000; - - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - GPIOF->MODER = 0xAA800AAA; - GPIOF->OSPEEDR = 0xAA800AAA; - GPIOF->OTYPER = 0x00000000; - GPIOF->PUPDR = 0x00000000; - - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - GPIOG->MODER = 0xAAAAAAAA; - GPIOG->OSPEEDR = 0xAAAAAAAA; - GPIOG->OTYPER = 0x00000000; - GPIOG->PUPDR = 0x00000000; - - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - GPIOH->MODER = 0xAAAA08A0; - GPIOH->OSPEEDR = 0xAAAA08A0; - GPIOH->OTYPER = 0x00000000; - GPIOH->PUPDR = 0x00000000; - - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - GPIOI->MODER = 0x0028AAAA; - GPIOI->OSPEEDR = 0x0028AAAA; - GPIOI->OTYPER = 0x00000000; - GPIOI->PUPDR = 0x00000000; - - RCC->AHB3ENR |= 0x00000001; - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - - FMC_Bank5_6->SDCR[0] = 0x000019E4; - FMC_Bank5_6->SDTR[0] = 0x01115351; - - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - for (index = 0; index<1000; index++); - - FMC_Bank5_6->SDCMR = 0x00000012; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - FMC_Bank5_6->SDCMR = 0x00000073; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - FMC_Bank5_6->SDCMR = 0x00046014; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - tmpreg = FMC_Bank5_6->SDRTR; - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); - - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif -#if defined(STM32F469xx) || defined(STM32F479xx) - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif - - (void)(tmp); -} -#endif -#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) -void SystemInitExtMemCtl(void) -{ - __IO uint32_t tmp = 0x00; -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) -#if defined (DATA_IN_ExtSDRAM) - register uint32_t tmpreg = 0, timeout = 0xFFFF; - register __IO uint32_t index; - -#if defined(STM32F446xx) - RCC->AHB1ENR |= 0x0000007D; -#else - RCC->AHB1ENR |= 0x000001F8; -#endif - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); - -#if defined(STM32F446xx) - GPIOA->AFR[0] |= 0xC0000000; - GPIOA->AFR[1] |= 0x00000000; - GPIOA->MODER |= 0x00008000; - GPIOA->OSPEEDR |= 0x00008000; - GPIOA->OTYPER |= 0x00000000; - GPIOA->PUPDR |= 0x00000000; - - GPIOC->AFR[0] |= 0x00CC0000; - GPIOC->AFR[1] |= 0x00000000; - GPIOC->MODER |= 0x00000A00; - GPIOC->OSPEEDR |= 0x00000A00; - GPIOC->OTYPER |= 0x00000000; - GPIOC->PUPDR |= 0x00000000; -#endif - - GPIOD->AFR[0] = 0x000000CC; - GPIOD->AFR[1] = 0xCC000CCC; - GPIOD->MODER = 0xA02A000A; - GPIOD->OSPEEDR = 0xA02A000A; - GPIOD->OTYPER = 0x00000000; - GPIOD->PUPDR = 0x00000000; - - GPIOE->AFR[0] = 0xC00000CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - GPIOE->MODER = 0xAAAA800A; - GPIOE->OSPEEDR = 0xAAAA800A; - GPIOE->OTYPER = 0x00000000; - GPIOE->PUPDR = 0x00000000; - - GPIOF->AFR[0] = 0xCCCCCCCC; - GPIOF->AFR[1] = 0xCCCCCCCC; - GPIOF->MODER = 0xAA800AAA; - GPIOF->OSPEEDR = 0xAA800AAA; - GPIOF->OTYPER = 0x00000000; - GPIOF->PUPDR = 0x00000000; - - GPIOG->AFR[0] = 0xCCCCCCCC; - GPIOG->AFR[1] = 0xCCCCCCCC; - GPIOG->MODER = 0xAAAAAAAA; - GPIOG->OSPEEDR = 0xAAAAAAAA; - GPIOG->OTYPER = 0x00000000; - GPIOG->PUPDR = 0x00000000; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) - GPIOH->AFR[0] = 0x00C0CC00; - GPIOH->AFR[1] = 0xCCCCCCCC; - GPIOH->MODER = 0xAAAA08A0; - GPIOH->OSPEEDR = 0xAAAA08A0; - GPIOH->OTYPER = 0x00000000; - GPIOH->PUPDR = 0x00000000; - - GPIOI->AFR[0] = 0xCCCCCCCC; - GPIOI->AFR[1] = 0x00000CC0; - GPIOI->MODER = 0x0028AAAA; - GPIOI->OSPEEDR = 0x0028AAAA; - GPIOI->OTYPER = 0x00000000; - GPIOI->PUPDR = 0x00000000; -#endif - - RCC->AHB3ENR |= 0x00000001; - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - -#if defined(STM32F446xx) - FMC_Bank5_6->SDCR[0] = 0x00001954; -#else - FMC_Bank5_6->SDCR[0] = 0x000019E4; -#endif - FMC_Bank5_6->SDTR[0] = 0x01115351; - - FMC_Bank5_6->SDCMR = 0x00000011; - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - for (index = 0; index<1000; index++); - - FMC_Bank5_6->SDCMR = 0x00000012; - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x000000F3; -#else - FMC_Bank5_6->SDCMR = 0x00000073; -#endif - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - -#if defined(STM32F446xx) - FMC_Bank5_6->SDCMR = 0x00044014; -#else - FMC_Bank5_6->SDCMR = 0x00046014; -#endif - timeout = 0xFFFF; - while((tmpreg != 0) && (timeout-- > 0)) - { - tmpreg = FMC_Bank5_6->SDSR & 0x00000020; - } - - tmpreg = FMC_Bank5_6->SDRTR; -#if defined(STM32F446xx) - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); -#else - FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); -#endif - - tmpreg = FMC_Bank5_6->SDCR[0]; - FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); -#endif -#endif - -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ - || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ - || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) - -#if defined(DATA_IN_ExtSRAM) - RCC->AHB1ENR |= 0x00000078; - tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); - - GPIOD->AFR[0] = 0x00CCC0CC; - GPIOD->AFR[1] = 0xCCCCCCCC; - GPIOD->MODER = 0xAAAA0A8A; - GPIOD->OSPEEDR = 0xFFFF0FCF; - GPIOD->OTYPER = 0x00000000; - GPIOD->PUPDR = 0x00000000; - - GPIOE->AFR[0] = 0xC00CC0CC; - GPIOE->AFR[1] = 0xCCCCCCCC; - GPIOE->MODER = 0xAAAA828A; - GPIOE->OSPEEDR = 0xFFFFC3CF; - GPIOE->OTYPER = 0x00000000; - GPIOE->PUPDR = 0x00000000; - - GPIOF->AFR[0] = 0x00CCCCCC; - GPIOF->AFR[1] = 0xCCCC0000; - GPIOF->MODER = 0xAA000AAA; - GPIOF->OSPEEDR = 0xFF000FFF; - GPIOF->OTYPER = 0x00000000; - GPIOF->PUPDR = 0x00000000; - - GPIOG->AFR[0] = 0x00CCCCCC; - GPIOG->AFR[1] = 0x000000C0; - GPIOG->MODER = 0x00085AAA; - GPIOG->OSPEEDR = 0x000CAFFF; - GPIOG->OTYPER = 0x00000000; - GPIOG->PUPDR = 0x00000000; - - RCC->AHB3ENR |= 0x00000001; - -#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - FMC_Bank1->BTCR[2] = 0x00001011; - FMC_Bank1->BTCR[3] = 0x00000201; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif -#if defined(STM32F469xx) || defined(STM32F479xx) - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); - FMC_Bank1->BTCR[2] = 0x00001091; - FMC_Bank1->BTCR[3] = 0x00110212; - FMC_Bank1E->BWTR[2] = 0x0fffffff; -#endif -#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ - || defined(STM32F412Zx) || defined(STM32F412Vx) - tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); - FSMC_Bank1->BTCR[2] = 0x00001011; - FSMC_Bank1->BTCR[3] = 0x00000201; - FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; -#endif - -#endif -#endif - (void)(tmp); -} -#endif \ No newline at end of file diff --git a/board/stm32f407-st-discovery/third_party_driver/include/extmem.h b/board/stm32f407-st-discovery/third_party_driver/include/extmem.h deleted file mode 100644 index 00a20ce38..000000000 --- a/board/stm32f407-st-discovery/third_party_driver/include/extmem.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -* Copyright (c) 2020 AIIT XUOS Lab -* xiuOS is licensed under Mulan PSL v2. -* You can use this software according to the terms and conditions of the Mulan PSL v2. -* You may obtain a copy of Mulan PSL v2 at: -* http://license.coscl.org.cn/MulanPSL2 -* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -* See the Mulan PSL v2 for more details. -*/ - -/** -* @file extmem.h -* @brief support extmem function -* @version 1.0 -* @author AIIT XUOS Lab -* @date 2021-04-25 -*/ - -#ifndef EXTMEM_H -#define EXTMEM_H - -#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) - void SystemInitExtMemCtl(void); -#endif - -#endif \ No newline at end of file diff --git a/board/stm32f407zgt6/board.c b/board/stm32f407zgt6/board.c index c672d8243..095ac58fa 100644 --- a/board/stm32f407zgt6/board.c +++ b/board/stm32f407zgt6/board.c @@ -35,6 +35,7 @@ Modification: #include "board.h" #include "connect_usart.h" #include "connect_gpio.h" +#include "connect_fsmc.h" #include "misc.h" extern void entry(void); @@ -104,6 +105,9 @@ struct InitSequenceDesc _board_init[] = { #ifdef BSP_USING_GPIO { "hw pin", Stm32HwGpioInit }, +#endif +#ifdef BSP_USING_EXTMEM + { "hw extern sram", HwSramInit }, #endif { " NONE ",NONE }, }; @@ -126,13 +130,6 @@ void InitBoardHardware() KPrintf("\nconsole init completed.\n"); KPrintf("board initialization......\n"); #endif - -#ifdef BSP_USING_EXTMEM - extern int HwSramInit(void); - HwSramInit(); -#endif - - // InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); #ifdef SEPARATE_COMPILE diff --git a/board/stm32f407zgt6/third_party_driver/Kconfig b/board/stm32f407zgt6/third_party_driver/Kconfig index 68c67ca19..b83f2ddee 100755 --- a/board/stm32f407zgt6/third_party_driver/Kconfig +++ b/board/stm32f407zgt6/third_party_driver/Kconfig @@ -18,6 +18,7 @@ endif menuconfig BSP_USING_EXTMEM bool "Using extern memory" default n +select MEM_EXTERN_SRAM if BSP_USING_EXTMEM source "$BSP_DIR/third_party_driver/extmem/Kconfig" endif diff --git a/board/stm32f407zgt6/third_party_driver/extmem/Kconfig b/board/stm32f407zgt6/third_party_driver/extmem/Kconfig index 4b663fc9f..27186cb7c 100644 --- a/board/stm32f407zgt6/third_party_driver/extmem/Kconfig +++ b/board/stm32f407zgt6/third_party_driver/extmem/Kconfig @@ -2,30 +2,6 @@ if BSP_USING_EXTMEM config EXTSRAM_MAX_NUM int default 4 - - config BSP_USING_FSMC_BANK1_NORSRAM1 - bool "config fsmc bank1 sram1" - default n - if BSP_USING_FSMC_BANK1_NORSRAM1 - config BANK1_NORSRAM1_SIZE - hex "config sram1 chip size" - default 0x100000 - config BANK1_NORSRAM1_DATA_WIDTH - int "config sram1 chip data width" - default 16 - endif - - config BSP_USING_FSMC_BANK1_NORSRAM2 - bool "config fsmc bank1 sram2" - default n - if BSP_USING_FSMC_BANK1_NORSRAM2 - config BANK1_NORSRAM2_SIZE - hex "config sram2 chip size" - default 0x100000 - config BANK1_NORSRAM2_DATA_WIDTH - int "config sram2 chip data width" - default 16 - endif config BSP_USING_FSMC_BANK1_NORSRAM3 bool "config fsmc bank1 sram3" @@ -38,16 +14,4 @@ if BSP_USING_EXTMEM int "config sram3 chip data width" default 16 endif - - config BSP_USING_FSMC_BANK1_NORSRAM4 - bool "config fsmc bank1 sram4" - default n - if BSP_USING_FSMC_BANK1_NORSRAM4 - config BANK1_NORSRAM4_SIZE - hex "config sram4 chip size" - default 0x100000 - config BANK1_NORSRAM4_DATA_WIDTH - int "config sram4 chip data width" - default 16 - endif endif diff --git a/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c b/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c index cbfce3c0c..74313937c 100644 --- a/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c +++ b/board/stm32f407zgt6/third_party_driver/extmem/connect_fsmc.c @@ -18,17 +18,20 @@ * @date 2021-05-28 */ -#include #include "connect_fsmc.h" #include "hardware_fsmc.h" #include "hardware_gpio.h" #include "hardware_rcc.h" -#include "cmsis_gcc.h" #include +#include -static FSMC_NORSRAMInitTypeDef hsram; -static FSMC_NORSRAMTimingInitTypeDef hsram_read; -static FSMC_NORSRAMTimingInitTypeDef hsram_write; +#define FSMC_BANK1_NORSRAM3_START_ADDRESS 0x68000000 + +static FSMC_NORSRAMInitTypeDef hsram3; +static FSMC_NORSRAMTimingInitTypeDef hsram_read3; +static FSMC_NORSRAMTimingInitTypeDef hsram_write3; + +extern void ExtSramInitBoardMemory(void *start_phy_address, void *end_phy_address, uint8 extsram_idx); int HwSramInit(void) { @@ -108,100 +111,51 @@ int HwSramInit(void) GPIO_PinAFConfig(GPIOG,GPIO_PinSource10,GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC); - hsram.FSMC_ReadWriteTimingStruct = &hsram_read; - hsram.FSMC_WriteTimingStruct = &hsram_write; + hsram3.FSMC_ReadWriteTimingStruct = &hsram_read3; + hsram3.FSMC_WriteTimingStruct = &hsram_write3; - /* hsram.Init */ - hsram.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; - hsram.FSMC_MemoryType = FSMC_MemoryType_SRAM; - hsram.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; - hsram.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; - hsram.FSMC_WrapMode = FSMC_WrapMode_Disable; - hsram.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; - hsram.FSMC_WriteOperation = FSMC_WriteOperation_Enable; - hsram.FSMC_WaitSignal = FSMC_WaitSignal_Disable; - hsram.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; - hsram.FSMC_WriteBurst = FSMC_WriteBurst_Disable; + /* hsram3.Init */ + hsram3.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; + hsram3.FSMC_MemoryType = FSMC_MemoryType_SRAM; + hsram3.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + hsram3.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + hsram3.FSMC_WrapMode = FSMC_WrapMode_Disable; + hsram3.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + hsram3.FSMC_WriteOperation = FSMC_WriteOperation_Enable; + hsram3.FSMC_WaitSignal = FSMC_WaitSignal_Disable; + hsram3.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + hsram3.FSMC_WriteBurst = FSMC_WriteBurst_Disable; - hsram_read.FSMC_AddressSetupTime = 0; - hsram_read.FSMC_AddressHoldTime = 0; - hsram_read.FSMC_DataSetupTime = 8; - hsram_read.FSMC_BusTurnAroundDuration = 0; - hsram_read.FSMC_CLKDivision = 0; - hsram_read.FSMC_DataLatency = 0; - hsram_read.FSMC_AccessMode = FSMC_AccessMode_A; + hsram_read3.FSMC_AddressSetupTime = 0; + hsram_read3.FSMC_AddressHoldTime = 0; + hsram_read3.FSMC_DataSetupTime = 8; + hsram_read3.FSMC_BusTurnAroundDuration = 0; + hsram_read3.FSMC_CLKDivision = 0; + hsram_read3.FSMC_DataLatency = 0; + hsram_read3.FSMC_AccessMode = FSMC_AccessMode_A; - hsram_write.FSMC_AddressSetupTime = 0; - hsram_write.FSMC_AddressHoldTime = 0; - hsram_write.FSMC_DataSetupTime = 8; - hsram_write.FSMC_BusTurnAroundDuration = 0; - hsram_write.FSMC_CLKDivision = 0; - hsram_write.FSMC_DataLatency = 0; - hsram_write.FSMC_AccessMode = FSMC_AccessMode_A; - -#ifdef BSP_USING_FSMC_BANK1_NORSRAM1 - hsram.FSMC_Bank = FSMC_Bank1_NORSRAM1; -#if BANK1_NORSRAM1_DATA_WIDTH == 8 - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; -#elif BANK1_NORSRAM1_DATA_WIDTH == 16 - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; -#else - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_32b; -#endif - FSMC_NORSRAMInit(&hsram); - FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); -#endif - -#ifdef BSP_USING_FSMC_BANK1_NORSRAM2 - hsram.FSMC_Bank = FSMC_Bank1_NORSRAM2; -#if BANK1_NORSRAM2_DATA_WIDTH == 8 - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; -#elif BANK1_NORSRAM2_DATA_WIDTH == 16 - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; -#else - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_32b; -#endif - FSMC_NORSRAMInit(&hsram); - FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE); -#endif + hsram_write3.FSMC_AddressSetupTime = 0; + hsram_write3.FSMC_AddressHoldTime = 0; + hsram_write3.FSMC_DataSetupTime = 8; + hsram_write3.FSMC_BusTurnAroundDuration = 0; + hsram_write3.FSMC_CLKDivision = 0; + hsram_write3.FSMC_DataLatency = 0; + hsram_write3.FSMC_AccessMode = FSMC_AccessMode_A; #ifdef BSP_USING_FSMC_BANK1_NORSRAM3 - hsram.FSMC_Bank = FSMC_Bank1_NORSRAM3; + hsram3.FSMC_Bank = FSMC_Bank1_NORSRAM3; #if BANK1_NORSRAM3_DATA_WIDTH == 8 - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + hsram3.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; #elif BANK1_NORSRAM3_DATA_WIDTH == 16 - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; + hsram3.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; #else - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_32b; + hsram3.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_32b; #endif - FSMC_NORSRAMInit(&hsram); + FSMC_NORSRAMInit(&hsram3); FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); - + ExtSramInitBoardMemory((void*)(FSMC_BANK1_NORSRAM3_START_ADDRESS), (void*)((FSMC_BANK1_NORSRAM3_START_ADDRESS + BANK1_NORSRAM3_SIZE)), 2); - extern void ExtSramInitBoardMemory(void *start_phy_address, void *end_phy_address, uint8 extsram_idx); - #define START_ADDRESS 0x68000000 - - memset((void*)START_ADDRESS,0,BANK1_NORSRAM3_SIZE); - __DSB(); -//     __ISB(); - __DMB(); - - ExtSramInitBoardMemory((void*)(START_ADDRESS), (void*)((START_ADDRESS + BANK1_NORSRAM3_SIZE)), 2); - -#endif - -#ifdef BSP_USING_FSMC_BANK1_NORSRAM4 - hsram.FSMC_Bank = FSMC_Bank1_NORSRAM4; -#if BANK1_NORSRAM4_DATA_WIDTH == 8 - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; -#elif BANK1_NORSRAM4_DATA_WIDTH == 16 - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; -#else - hsram.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_32b; -#endif - FSMC_NORSRAMInit(&hsram); - FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); #endif return 0; diff --git a/kernel/Kconfig b/kernel/Kconfig index 4ffbacbe2..6ad0f72d0 100644 --- a/kernel/Kconfig +++ b/kernel/Kconfig @@ -37,6 +37,10 @@ menu "Kernel feature" help Alignment size for CPU architecture data access + config MEM_EXTERN_SRAM + bool "Using extern memory" + default n + config MM_PAGE_SIZE int "Config memory page size" default 4096 diff --git a/kernel/include/xs_memory.h b/kernel/include/xs_memory.h index ad404cdb5..0d9c9f958 100644 --- a/kernel/include/xs_memory.h +++ b/kernel/include/xs_memory.h @@ -85,7 +85,7 @@ void FreeBlockMemGather(void *data_block); #endif void InitBoardMemory(void *begin_addr, void *end_addr); -#ifdef DATA_IN_ExtSRAM +#ifdef MEM_EXTERN_SRAM void ExtSramInitBoardMemory(void *start_phy_address, void *end_phy_address, uint8 extsram_idx); #endif void *x_malloc(x_size_t nbytes); diff --git a/kernel/memory/byte_manage.c b/kernel/memory/byte_manage.c index ce1e21aad..82e3ba9bb 100644 --- a/kernel/memory/byte_manage.c +++ b/kernel/memory/byte_manage.c @@ -22,8 +22,6 @@ #include #include -#define DATA_IN_ExtSRAM - #define MEM_STATS /* Covert pointer to other structure */ @@ -167,7 +165,7 @@ static struct ByteMemory ByteManager; static struct ByteMemory UserByteManager; #endif -#ifdef DATA_IN_ExtSRAM +#ifdef MEM_EXTERN_SRAM static struct ByteMemory ExtByteManager[EXTSRAM_MAX_NUM] = {0}; #endif /** @@ -393,7 +391,7 @@ static void* BigMemMalloc(struct DynamicBuddyMemory *dynamic_buddy, x_size_t siz /* failure allocation */ if(result == NONE) { -#ifndef DATA_IN_ExtSRAM +#ifndef MEM_EXTERN_SRAM KPrintf("%s: allocation failed, size %d.\n", __func__,allocsize); #endif return result; @@ -600,7 +598,7 @@ static void *SmallMemMalloc(struct ByteMemory *byte_memory, x_size_t size) /* the static memory block is exhausted, now turn to dynamic buddy memory for allocation. */ result = byte_memory->dynamic_buddy_manager.done->malloc(&byte_memory->dynamic_buddy_manager, size, DYNAMIC_BLOCK_NO_EXTMEM_MASK); -#ifdef DATA_IN_ExtSRAM +#ifdef MEM_EXTERN_SRAM if(NONE == result) { for(i = 0; i < EXTSRAM_MAX_NUM; i++) { if(NONE != ExtByteManager[i].done) { @@ -637,7 +635,7 @@ void *x_malloc(x_size_t size) /* parameter detection */ -#ifdef DATA_IN_ExtSRAM +#ifdef MEM_EXTERN_SRAM /* parameter detection */ if(size == 0 ){ return NONE; @@ -671,7 +669,7 @@ void *x_malloc(x_size_t size) if(ret != NONE) CHECK(ByteManager.dynamic_buddy_manager.done->JudgeLegal(&ByteManager.dynamic_buddy_manager, ret - SIZEOF_DYNAMICALLOCNODE_MEM)); try_extmem: -#ifdef DATA_IN_ExtSRAM +#ifdef MEM_EXTERN_SRAM if(NONE == ret) { for(i = 0; i < EXTSRAM_MAX_NUM; i++) { if(NONE != ExtByteManager[i].done) { @@ -798,7 +796,7 @@ void x_free(void *pointer) } else #endif { -#ifdef DATA_IN_ExtSRAM +#ifdef MEM_EXTERN_SRAM /* judge the pointer is not malloced from extern memory*/ if(0 == (node->flag & 0xFF0000)) { ByteManager.dynamic_buddy_manager.done->release(&ByteManager,pointer); @@ -816,7 +814,7 @@ void x_free(void *pointer) CriticalAreaUnLock(lock); } -#ifdef DATA_IN_ExtSRAM +#ifdef MEM_EXTERN_SRAM /** * This function initializes the dynamic buddy memory of extern sram. * From 54e8b8569b5f464f9616f0ddb480bf21d4d8e72c Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Sat, 29 May 2021 13:43:39 +0800 Subject: [PATCH 5/7] add debug information for extern sram memory --- kernel/memory/byte_manage.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/kernel/memory/byte_manage.c b/kernel/memory/byte_manage.c index 82e3ba9bb..1c77facf0 100644 --- a/kernel/memory/byte_manage.c +++ b/kernel/memory/byte_manage.c @@ -1127,11 +1127,22 @@ void ShowMemory(void); */ void ShowMemory(void) { + int i = 0; KPrintf("total memory: %d\n", ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start); KPrintf("used memory : %d\n", ByteManager.dynamic_buddy_manager.active_memory); KPrintf("maximum allocated memory: %d\n", ByteManager.dynamic_buddy_manager.max_ever_usedmem); KPrintf("total cache szie: %d, %d/%d[32B],%d/%d[64B]\n", ByteManager.dynamic_buddy_manager.static_memory,ByteManager.static_manager[0].block_free_count,SMALL_NUMBER_32B,ByteManager.static_manager[1].block_free_count,SMALL_NUMBER_64B); - ShowBuddy(); +#ifdef MEM_EXTERN_SRAM + for(i = 0; i < EXTSRAM_MAX_NUM; i++) { + if(NONE != ExtByteManager[i].done){ + KPrintf("\nlist extern sram[%d] memory information\n\n",i); + KPrintf("extern sram total memory: %d\n", ExtByteManager[i].dynamic_buddy_manager.dynamic_buddy_end - ExtByteManager[i].dynamic_buddy_manager.dynamic_buddy_start); + KPrintf("extern sram used memory : %d\n", ExtByteManager[i].dynamic_buddy_manager.active_memory); + KPrintf("extern sram maximum allocated memory: %d\n", ExtByteManager[i].dynamic_buddy_manager.max_ever_usedmem); + } + } +#endif + ShowBuddy(); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0), ShowMemory,ShowMemory,list memory usage information); @@ -1140,6 +1151,7 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHE */ void ShowBuddy(void) { + int i = 0; int lock = 0; struct DynamicFreeNode *debug = NONE; @@ -1147,9 +1159,21 @@ void ShowBuddy(void) KPrintf("\n\033[41;1mlist memory information\033[0m\n", __func__); for (debug = ByteManager.dynamic_buddy_manager.mm_freenode_list[0].next; debug;debug = debug->next){ - KPrintf("%s,current is %x,next is %x, size %u, flag %x\n",__func__, debug, debug->next,debug->size,debug->flag & ALLOC_BLOCK_MASK); + KPrintf("%s,current is %x,next is %x, size %u, flag %x\n",__func__, debug, debug->next,debug->size,debug->flag); }; KPrintf("\nlist memory information\n\n"); +#ifdef MEM_EXTERN_SRAM + for(i = 0; i < EXTSRAM_MAX_NUM; i++) { + if(NONE != ExtByteManager[i].done){ + KPrintf("\nlist extern sram[%d] memory information\n\n",i); + for (debug = ExtByteManager[i].dynamic_buddy_manager.mm_freenode_list[0].next; + debug;debug = debug->next){ + KPrintf("%s,current is %x,next is %x, size %u, flag %x\n",__func__, debug, debug->next,debug->size,debug->flag); + }; + } + } + +#endif CriticalAreaUnLock(lock); } SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0), From 9f56e71545301307f0fd6e7bb317a1bfef67fd83 Mon Sep 17 00:00:00 2001 From: Zhao_Jiasheng <18535861947@163.com> Date: Sat, 29 May 2021 13:49:11 +0800 Subject: [PATCH 6/7] Modify User malloc and free --- kernel/memory/byte_manage.c | 46 ++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/kernel/memory/byte_manage.c b/kernel/memory/byte_manage.c index 1c77facf0..bff3b6104 100644 --- a/kernel/memory/byte_manage.c +++ b/kernel/memory/byte_manage.c @@ -925,12 +925,28 @@ void InitBoardMemory(void *start_phy_address, void *end_phy_address) */ void *x_umalloc(x_size_t size) { + uint8 i = 0; void *ret = NONE; register x_base lock = 0; + +#ifdef MEM_EXTERN_SRAM + /* parameter detection */ + if(size == 0 ){ + return NONE; + } + if((size > ByteManager.dynamic_buddy_manager.dynamic_buddy_end - ByteManager.dynamic_buddy_manager.dynamic_buddy_start - ByteManager.dynamic_buddy_manager.active_memory)){ + lock = CriticalAreaLock(); + /* alignment */ + size = ALIGN_MEN_UP(size, MEM_ALIGN_SIZE); + goto try_extmem; + } + +#else /* parameter detection */ if((size == 0) || (size > UserByteManager.dynamic_buddy_manager.dynamic_buddy_end - UserByteManager.dynamic_buddy_manager.dynamic_buddy_start - UserByteManager.dynamic_buddy_manager.active_memory)) return NONE; +#endif /* hold lock before allocation */ lock = CriticalAreaLock(); @@ -939,6 +955,21 @@ void *x_umalloc(x_size_t size) ret = UserByteManager.dynamic_buddy_manager.done->malloc(&UserByteManager.dynamic_buddy_manager,size); if(ret != NONE) CHECK(UserByteManager.dynamic_buddy_manager.done->JudgeLegal(&UserByteManager.dynamic_buddy_manager, ret - SIZEOF_DYNAMICALLOCNODE_MEM)); + +try_extmem: +#ifdef MEM_EXTERN_SRAM + if(NONE == ret) { + for(i = 0; i < EXTSRAM_MAX_NUM; i++) { + if(NONE != ExtByteManager[i].done) { + ret = ExtByteManager[i].dynamic_buddy_manager.done->malloc(&ExtByteManager[i].dynamic_buddy_manager, size, DYNAMIC_BLOCK_EXTMEMn_MASK(i + 1)); + if (ret) { + CHECK(ExtByteManager[i].dynamic_buddy_manager.done->JudgeLegal(&ExtByteManager[i].dynamic_buddy_manager, ret - SIZEOF_DYNAMICALLOCNODE_MEM)); + break; + } + } + } + } +#endif /* release lock */ CriticalAreaUnLock(lock); return ret; @@ -1042,8 +1073,21 @@ void x_ufree(void *pointer) lock = CriticalAreaLock(); node = PTR2ALLOCNODE((char*)pointer-SIZEOF_DYNAMICALLOCNODE_MEM); CHECK(UserByteManager.done->JudgeAllocated(node)); - UserByteManager.dynamic_buddy_manager.done->release(&UserByteManager,pointer); +#ifdef MEM_EXTERN_SRAM + /* judge the pointer is not malloced from extern memory*/ + if(0 == (node->flag & 0xFF0000)) { + UserByteManager.dynamic_buddy_manager.done->release(&ByteManager,pointer); + } + + /* judge the pointer is malloced from extern memory*/ + if(0 != (node->flag & 0xFF0000)) { + ExtByteManager[((node->flag & 0xFF0000) >> 16) - 1].dynamic_buddy_manager.done->release(&ExtByteManager[((node->flag & 0xFF0000) >> 16) - 1],pointer); + } + +#else + UserByteManager.dynamic_buddy_manager.done->release(&UserByteManager,pointer); +#endif /* release the lock */ CriticalAreaUnLock(lock); } From 3e65883a7f6e8e14869c56268c42a76d4aa49efe Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Sat, 29 May 2021 14:07:00 +0800 Subject: [PATCH 7/7] fix a bug --- kernel/kernel_test/Makefile | 4 +++- kernel/memory/byte_manage.c | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/kernel/kernel_test/Makefile b/kernel/kernel_test/Makefile index 820f29e97..e1daf45c1 100644 --- a/kernel/kernel_test/Makefile +++ b/kernel/kernel_test/Makefile @@ -1,5 +1,4 @@ SRC_FILES := test_main.c -SRC_FILES += extsram_test.c ifeq ($(CONFIG_KERNEL_TEST_SEM),y) SRC_FILES += test_sem.c @@ -32,6 +31,9 @@ endif ifeq ($(CONFIG_KERNEL_TEST_MEM),y) SRC_FILES += test_mem.c SRC_FILES += test_gatherblock.c +ifeq ($(CONFIG_MEM_EXTERN_SRAM),y) + SRC_FILES += extsram_test.c +endif endif ifeq ($(CONFIG_KERNEL_TEST_TIMER),y) diff --git a/kernel/memory/byte_manage.c b/kernel/memory/byte_manage.c index bff3b6104..78913de06 100644 --- a/kernel/memory/byte_manage.c +++ b/kernel/memory/byte_manage.c @@ -668,8 +668,9 @@ void *x_malloc(x_size_t size) ret = ByteManager.dynamic_buddy_manager.done->malloc(&ByteManager.dynamic_buddy_manager, size, DYNAMIC_BLOCK_NO_EXTMEM_MASK); if(ret != NONE) CHECK(ByteManager.dynamic_buddy_manager.done->JudgeLegal(&ByteManager.dynamic_buddy_manager, ret - SIZEOF_DYNAMICALLOCNODE_MEM)); -try_extmem: + #ifdef MEM_EXTERN_SRAM +try_extmem: if(NONE == ret) { for(i = 0; i < EXTSRAM_MAX_NUM; i++) { if(NONE != ExtByteManager[i].done) { @@ -956,8 +957,9 @@ void *x_umalloc(x_size_t size) if(ret != NONE) CHECK(UserByteManager.dynamic_buddy_manager.done->JudgeLegal(&UserByteManager.dynamic_buddy_manager, ret - SIZEOF_DYNAMICALLOCNODE_MEM)); -try_extmem: + #ifdef MEM_EXTERN_SRAM +try_extmem: if(NONE == ret) { for(i = 0; i < EXTSRAM_MAX_NUM; i++) { if(NONE != ExtByteManager[i].done) {