From 09394a1b1a7281b9624838b27e8166adffb794a5 Mon Sep 17 00:00:00 2001 From: Alex Lewontin Date: Sun, 24 Jan 2021 17:17:29 -0500 Subject: [PATCH 1/5] NUC123: Added CONFIG0/1 settings, and updated linker script --- .../ARMCMx/compilers/GCC/ld/NUC123xD4xx0.ld | 28 ++++++-- os/hal/ports/NUMICRO/NUC123/hal_lld.c | 3 + os/hal/ports/NUMICRO/NUC123/hal_lld.h | 64 ++++++++++++++++++- .../NUTINY-SDK-NUC123-V2.0/Blinky/Makefile | 2 +- .../NUTINY-SDK-NUC123-V2.0/PWM/Makefile | 2 +- .../NUTINY-SDK-NUC123-V2.0/SERIAL/Makefile | 2 +- .../NUTINY-SDK-NUC123-V2.0/USB_HID/Makefile | 2 +- 7 files changed, 92 insertions(+), 11 deletions(-) diff --git a/os/common/startup/ARMCMx/compilers/GCC/ld/NUC123xD4xx0.ld b/os/common/startup/ARMCMx/compilers/GCC/ld/NUC123xD4xx0.ld index 53867912..86c61bc6 100644 --- a/os/common/startup/ARMCMx/compilers/GCC/ld/NUC123xD4xx0.ld +++ b/os/common/startup/ARMCMx/compilers/GCC/ld/NUC123xD4xx0.ld @@ -20,15 +20,15 @@ */ MEMORY { - flash0 (rx) : org = 0x00000000, len = 64k - flash1 (rx) : org = 0x00000000, len = 0 - flash2 (rx) : org = 0x00000000, len = 0 - flash3 (rx) : org = 0x00000000, len = 0 - flash4 (rx) : org = 0x00000000, len = 0 + flash0 (rx) : org = 0x00000000, len = 0x11000 /* APROM */ + flash1 (rx) : org = 0x00000000, len = 0 /* Data flash placeholder */ + flash2 (rx) : org = 0x00100000, len = 0x1000 /* LDROM */ + flash3 (rx) : org = 0x00300000, len = 4 /* Config0 */ + flash4 (rx) : org = 0x00300004, len = 4 /* Config1 */ flash5 (rx) : org = 0x00000000, len = 0 flash6 (rx) : org = 0x00000000, len = 0 flash7 (rx) : org = 0x00000000, len = 0 - ram0 (wx) : org = 0x20000000, len = 20k + ram0 (wx) : org = 0x20000000, len = 0x5000 ram1 (wx) : org = 0x00000000, len = 0 ram2 (wx) : org = 0x00000000, len = 0 ram3 (wx) : org = 0x00000000, len = 0 @@ -38,6 +38,22 @@ MEMORY ram7 (wx) : org = 0x00000000, len = 0 } +REGION_ALIAS("CONFIG0", flash3); +REGION_ALIAS("CONFIG1", flash4); + +SECTIONS +{ + .nuc123_config0 : ALIGN(4) + { + KEEP(*(.nuc123_config0)) + } > CONFIG0 + + .nuc123_config1 : ALIGN(4) + { + KEEP(*(.nuc123_config1)) + } > CONFIG1 +} + /* For each data/text section two region are defined, a virtual region and a load region (_LMA suffix).*/ diff --git a/os/hal/ports/NUMICRO/NUC123/hal_lld.c b/os/hal/ports/NUMICRO/NUC123/hal_lld.c index 26e18d0d..32862515 100644 --- a/os/hal/ports/NUMICRO/NUC123/hal_lld.c +++ b/os/hal/ports/NUMICRO/NUC123/hal_lld.c @@ -50,6 +50,9 @@ uint32_t SystemCoreClock = __HSI; /* System Clock Frequency (Core Clock)*/ uint32_t CyclesPerUs = (__HSI / 1000000); /* Cycles per micro second */ uint32_t PllClock = __HSI; /*!< PLL Clock Frequency */ +volatile const uint32_t config0 __attribute__((used, unused, section(".nuc123_config0"))) = NUC123_CONFIG0; +volatile const uint32_t config1 __attribute__((used, unused, section(".nuc123_config1"))) = NUC123_CONFIG1; + /*===========================================================================*/ /* Driver local functions. */ /*===========================================================================*/ diff --git a/os/hal/ports/NUMICRO/NUC123/hal_lld.h b/os/hal/ports/NUMICRO/NUC123/hal_lld.h index 639c77b6..8c14bcd9 100644 --- a/os/hal/ports/NUMICRO/NUC123/hal_lld.h +++ b/os/hal/ports/NUMICRO/NUC123/hal_lld.h @@ -114,6 +114,23 @@ #define NUC123_PLLSRC_HSI (1 << CLK_PLLCON_PLL_SRC_Pos) /**< PLL source is HSI. */ /** @} */ +/** + * @name User config bit definitions + * @{ + */ +#define NUC123_CONFIG0_DFEN_Pos 0 +#define NUC123_CONFIG0_DFEN_Msk (1 << NUC123_CONFIG0_DFEN_Pos) + +#define NUC123_CONFIG0_LOCK_Pos 1 +#define NUC123_CONFIG0_LOCK_Msk (1 << NUC123_CONFIG0_LOCK_Pos) + +#define NUC123_CONFIG0_DFVSEN_Pos 2 +#define NUC123_CONFIG0_DFVSEN_Msk (1 << NUC123_CONFIG0_DFVSEN_Pos) + +#define NUC123_CONFIG0_CGPFMFP_Pos 27 +#define NUC123_CONFIG0_CGPFMFP_Msk (1 << NUC123_CONFIG0_CGPFMFP_Pos) +/** @} */ + /*===========================================================================*/ /* Driver pre-compile time settings. */ /*===========================================================================*/ @@ -159,11 +176,26 @@ #endif /** - * @brief Clock source for the PLL. + * @brief Core clock speed. */ #if !defined(NUC123_HCLK) || defined(__DOXYGEN__) #define NUC123_HCLK 72000000UL #endif + +/** + * @brief Enables or disables data flash + */ +#if !defined(NUC123_DATAFLASH_ENABLED) || defined(__DOXYGEN__) +#define NUC123_DATAFLASH_ENABLED FALSE +#endif + +/** + * @brief Sets the data flash size. This is ignored if data flash is disabled. + */ +#if !defined(NUC123_DATAFLASH_SIZE) || defined(__DOXYGEN__) +#define NUC123_DATAFLASH_SIZE 4096 +#endif + /** @} */ /*===========================================================================*/ @@ -187,10 +219,39 @@ #elif (NUC123_HSECLK < NUC123_HSECLK_MIN) || (NUC123_HSECLK > NUC123_HSECLK_MAX) #error "NUC123_HSECLK outside acceptable range (NUC123_HSECLK_MIN...NUC123_HSECLK_MAX)" #endif +#define NUC123_CONFIG0_HSE_PINS 0 +#else +#define NUC123_CONFIG0_HSE_PINS NUC123_CONFIG0_CGPFMFP_Msk #endif #define NUC123_PLLCLK (NUC123_HCLK * 2) +/* +* Persistant configuration settings. +*/ +#if NUC123_DATAFLASH_ENABLE + +#if (NUC123_DATAFLASH_SIZE == 4096) +/* DFVSEN = 1, nothing else matters */ +#define NUC123_CONFIG0_DATAFLASH 0UL +/* NUC123_DFBADDR doesn't actually control anything here, but convenient for flash drivers +which need the starting address */ +#define NUC123_DFBADDR 0x1F000UL +#else +/* DFVSEN = 0, DFEN = 0 */ +#define NUC123_CONFIG0_DATAFLASH (NUC123_CONFIG0_DFVSEN_Msk | NUC123_CONFIG0_DFEN_Msk) +#define NUC123_DFBADDR ((0x11000UL - NUC123_DATAFLASH_SIZE) & ~(0xFFUL)) +#endif +#else +/* DFVSEN = 0, DFEN = 1 */ +#define NUC123_CONFIG0_DATAFLASH NUC123_CONFIG0_DFVSEN_Msk +#define NUC123_DFBADDR 0xFFFFFF00UL +#endif + +#define NUC123_CONFIG0 \ + 0xFFFFFFFFUL & (~NUC123_CONFIG0_DATAFLASH) & (~NUC123_CONFIG0_HSE_PINS) +#define NUC123_CONFIG1 NUC123_DFBADDR + /*===========================================================================*/ /* Driver data structures and types. */ /*===========================================================================*/ @@ -198,6 +259,7 @@ /*===========================================================================*/ /* Driver macros. */ /*===========================================================================*/ + /* Alias for compatibility */ #define SystemUnlockReg() UNLOCKREG() diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/Blinky/Makefile b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/Blinky/Makefile index 1b9b70fb..f61599c6 100644 --- a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/Blinky/Makefile +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/Blinky/Makefile @@ -196,4 +196,4 @@ connect: openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg flash: $(BUILDDIR)/$(PROJECT).elf - openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg -c "program $< verify reset exit" + openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg -c "program $< reset exit" diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/PWM/Makefile b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/PWM/Makefile index 1854bc2d..275dc748 100644 --- a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/PWM/Makefile +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/PWM/Makefile @@ -196,7 +196,7 @@ connect: openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg flash: $(BUILDDIR)/$(PROJECT).elf - openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg -c "program $< verify reset exit" + openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg -c "program $< reset exit" # # Custom rules diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/SERIAL/Makefile b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/SERIAL/Makefile index 81242908..95ea9145 100644 --- a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/SERIAL/Makefile +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/SERIAL/Makefile @@ -193,4 +193,4 @@ connect: openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg flash: $(BUILDDIR)/$(PROJECT).elf - openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg -c "program $< verify reset exit" + openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg -c "program $< reset exit" diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/USB_HID/Makefile b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/USB_HID/Makefile index be859ed7..79010635 100644 --- a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/USB_HID/Makefile +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/USB_HID/Makefile @@ -197,7 +197,7 @@ connect: openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg flash: $(BUILDDIR)/$(PROJECT).elf - openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg -c "program $< verify reset exit" + openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicroM0.cfg -c "program $< reset exit" # From 4cbc3250c0b35edd4d5bd35a78f6006f9e72e43a Mon Sep 17 00:00:00 2001 From: Alex Lewontin Date: Sun, 10 Jan 2021 12:49:16 -0500 Subject: [PATCH 2/5] NUC123: EFL driver --- os/hal/ports/NUMICRO/LLD/FLASHv1/driver.mk | 9 + .../ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.c | 648 ++++++++++++++++++ .../ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h | 167 +++++ os/hal/ports/NUMICRO/NUC123/hal_lld.h | 10 +- os/hal/ports/NUMICRO/NUC123/platform.mk | 1 + 5 files changed, 834 insertions(+), 1 deletion(-) create mode 100644 os/hal/ports/NUMICRO/LLD/FLASHv1/driver.mk create mode 100644 os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.c create mode 100644 os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h diff --git a/os/hal/ports/NUMICRO/LLD/FLASHv1/driver.mk b/os/hal/ports/NUMICRO/LLD/FLASHv1/driver.mk new file mode 100644 index 00000000..3fa4c992 --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/FLASHv1/driver.mk @@ -0,0 +1,9 @@ +ifeq ($(USE_SMART_BUILD),yes) +ifneq ($(findstring HAL_USE_EFL TRUE,$(HALCONF)),) +PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.c +endif +else +PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.c +endif + +PLATFORMINC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/FLASHv1 diff --git a/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.c b/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.c new file mode 100644 index 00000000..a2206e75 --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.c @@ -0,0 +1,648 @@ +/* + ChibiOS - Copyright (C) 2020 Alex Lewontin + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ + +/** + * @file hal_efl_lld.c + * @brief NUC123 Embedded Flash subsystem low level driver source. + * + * @addtogroup HAL_EFL + * @{ + */ + +#include "hal.h" + +#if HAL_USE_EFL || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +#define NUC123_LFOM_UPPERBOUND 25000000UL +#define NUC123_MFOM_UPPERBOUND 50000000UL + +#define FMC_FATCON_LFOM_Pos FMC_FATCON_FOMSEL0_Pos +#define FMC_FATCON_LFOM_Msk FMC_FATCON_FOMSEL0_Msk +#define FMC_FATCON_MFOM_Pos FMC_FATCON_FOMSEL1_Pos +#define FMC_FATCON_MFOM_Msk FMC_FATCON_FOMSEL1_Msk + +#define NUC123_PAGE_SIZE 4UL +#define NUC123_SECTOR_SIZE 0x200UL + +#define NUC123_LDROM_SIZE 0x1000UL +#define NUC123_APROM_SIZE (NUC123_FLASH_SIZE - NUC123_DATAFLASH_SIZE) + +#define NUC123_EFL_CMD_ERASE 0x22UL +#define NUC123_EFL_CMD_PROG 0x21UL +#define NUC123_EFL_CMD_READ 0UL +#define NUC123_EFL_CMD_CHIPERASE 0x26UL /* Undocumented */ + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/** + * @brief EFL1 driver identifier. + */ +#if (NUC123_EFL_USE_EFL1 == TRUE) || defined(__DOXYGEN__) +EFlashDriver EFLD1; +#endif + +/*===========================================================================*/ +/* Driver local variables and types. */ +/*===========================================================================*/ + +static const flash_descriptor_t efl_lld_descriptors[] = { +#if (NUC123_EFL_ACCESS_APROM == TRUE) || defined(__DOXYGEN__) + {.attributes = FLASH_ATTR_ERASED_IS_ONE | FLASH_ATTR_MEMORY_MAPPED | + FLASH_ATTR_REWRITABLE, + .page_size = NUC123_PAGE_SIZE, + .sectors_count = NUC123_APROM_SIZE / NUC123_SECTOR_SIZE, + .sectors = NULL, + .sectors_size = NUC123_SECTOR_SIZE, + .address = (uint8_t *)0, + .size = NUC123_APROM_SIZE}, +#endif +#if (NUC123_EFL_ACCESS_DATAFLASH == TRUE) || defined(__DOXYGEN__) + {.attributes = FLASH_ATTR_ERASED_IS_ONE | FLASH_ATTR_MEMORY_MAPPED | + FLASH_ATTR_REWRITABLE, + .page_size = NUC123_PAGE_SIZE, + .sectors_count = NUC123_DATAFLASH_SIZE / NUC123_SECTOR_SIZE, + .sectors = NULL, + .sectors_size = NUC123_SECTOR_SIZE, + .address = (uint8_t *)NUC123_DFBADDR, + .size = NUC123_DATAFLASH_SIZE}, +#endif +#if (NUC123_EFL_ACCESS_LDROM == TRUE) || defined(__DOXYGEN__) + {.attributes = FLASH_ATTR_ERASED_IS_ONE | FLASH_ATTR_MEMORY_MAPPED | + FLASH_ATTR_REWRITABLE, + .page_size = NUC123_PAGE_SIZE, + .sectors_count = NUC123_LDROM_SIZE / NUC123_SECTOR_SIZE, + .sectors = NULL, + .sectors_size = NUC123_SECTOR_SIZE, + .address = (uint8_t *)0x100000, + .size = NUC123_LDROM_SIZE}, +#endif +#if (NUC123_EFL_ACCESS_CONFIG == TRUE) || defined(__DOXYGEN__) + {.attributes = FLASH_ATTR_ERASED_IS_ONE | FLASH_ATTR_MEMORY_MAPPED | + FLASH_ATTR_REWRITABLE, + .page_size = NUC123_PAGE_SIZE, + .sectors_count = 1, + .sectors = NULL, + .sectors_size = NUC123_SECTOR_SIZE, + .address = (uint8_t *)0x300000, + .size = 8}, +#endif +}; + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +/* Starts the ISP function, does not block */ +static inline void start_ISP(void) +{ + SystemUnlockReg(); + FMC->ISPTRG |= FMC_ISPTRG_ISPGO_Msk; + __ISB(); + LOCKREG(); +} + +/* Starts the ISP function and blocks til conclusion */ +static inline flash_error_t do_ISP(void) +{ + start_ISP(); + while (FMC->ISPTRG & FMC_ISPTRG_ISPGO_Msk) + ; + if (FMC->ISPCON & FMC_ISPCON_ISPFF_Msk) { + return FLASH_ERROR_HW_FAILURE; + } + + return FLASH_NO_ERROR; +} + +/** + * @brief Returns the minimum of two unsigned values. A safer implementation + * of the classic macro + * + * @param[in] x An unsigned value + * @param[in] y An unsigned value + * + * @return The smaller of x and y + * + * @notapi + */ +static inline unsigned min(unsigned x, unsigned y) +{ + return ((x > y) ? y : x); +} + +/*===========================================================================*/ +/* Driver interrupt handlers. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief Low level Embedded Flash driver initialization. + * + * @notapi + */ +void efl_lld_init(void) +{ + +#if (NUC123_EFL_USE_EFL1 == TRUE) + eflObjectInit(&EFLD1); + EFLD1.bank = 0; +#endif + +} + +/** + * @brief Configures and activates the Embedded Flash peripheral. + * + * @param[in] eflp pointer to a @p EFlashDriver structure + * + * @notapi + */ +void efl_lld_start(EFlashDriver* eflp) +{ + uint32_t ispcon; + if (eflp->state == FLASH_STOP) { + SystemUnlockReg(); + ispcon = FMC->ISPCON; + + ispcon |= (FMC_ISPCON_ISPEN_Msk); + /* Enables the peripheral.*/ + CLK->APBCLK |= CLK_AHBCLK_ISP_EN_Msk; + +#if NUC123_HCLK < NUC123_LFOM_UPPERBOUND + FMC->FATCON |= FMC_FATCON_LFOM_Msk; +#elif NUC123_HCLK < NUC123_MFOM_UPPERBOUND + FMC->FATCON |= FMC_FATCON_MFOM_Msk; +#endif + +#if (NUC123_EFL_ACCESS_APROM == TRUE) || (NUC123_EFL_ACCESS_DATAFLASH == TRUE) + ispcon |= FMC_ISPCON_APUEN_Msk; +#endif + +#if (NUC123_EFL_ACCESS_LDROM == TRUE) + ispcon |= FMC_ISPCON_LDUEN_Msk; +#endif + +#if (NUC123_EFL_ACCESS_CONFIG == TRUE) + ispcon |= FMC_ISPCON_CFGUEN_Msk; +#endif + + FMC->ISPCON = ispcon; + LOCKREG(); + } +} + +/** + * @brief Deactivates the Embedded Flash peripheral. + * + * @param[in] eflp pointer to a @p EFlashDriver structure + * + * @notapi + */ +void efl_lld_stop(EFlashDriver* eflp) +{ + uint32_t ispcon; + if (eflp->state == FLASH_READY) { + SystemUnlockReg(); + ispcon = FMC->ISPCON; + + ispcon &= ~FMC_ISPCON_ISPEN_Msk; + /* Disables the peripheral.*/ + +#if (NUC123_EFL_ACCESS_APROM == TRUE) || (NUC123_EFL_ACCESS_DATAFLASH == TRUE) + ispcon &= ~FMC_ISPCON_APUEN_Msk; +#endif +#if (NUC123_EFL_ACCESS_LDROM == TRUE) + ispcon &= ~FMC_ISPCON_LDUEN_Msk; +#endif +#if (NUC123_EFL_ACCESS_CONFIG == TRUE) + ispcon &= ~FMC_ISPCON_CFGUEN_Msk; +#endif + + FMC->ISPCON = ispcon; + CLK->APBCLK &= ~CLK_AHBCLK_ISP_EN_Msk; + LOCKREG(); + } +} + +/** + * @brief Gets the flash descriptor structure. + * + * @param[in] instance pointer to a @p EFlashDriver instance + * @return A flash device descriptor. + * + * @notapi + */ +const flash_descriptor_t* efl_lld_get_descriptor(void* instance) +{ + return efl_lld_descriptors + ((EFlashDriver *)instance)->bank; +} + +/** + * @brief Read operation. + * + * @param[in] instance pointer to a @p EFlashDriver instance + * @param[in] offset flash offset + * @param[in] n number of bytes to be read + * @param[out] rp pointer to the data buffer + * @return An error code. + * @retval FLASH_NO_ERROR if there is no erase operation in progress. + * @retval FLASH_BUSY_ERASING if there is an erase operation in progress. + * @retval FLASH_ERROR_READ if the read operation failed. + * @retval FLASH_ERROR_HW_FAILURE if access to the memory failed. + * + * @notapi + */ +flash_error_t efl_lld_read(void* instance, flash_offset_t offset, size_t n, uint8_t* rp) +{ + EFlashDriver* devp = (EFlashDriver*)instance; + const flash_descriptor_t *desc = efl_lld_get_descriptor(instance); + flash_error_t err = FLASH_NO_ERROR; + uint32_t data; + + osalDbgCheck((instance != NULL) && (rp != NULL) && (n > 0U)); + osalDbgCheck(((size_t)offset + n) <= (size_t)desc->size); + osalDbgAssert((devp->state == FLASH_READY) || (devp->state == FLASH_ERASE), + "invalid state"); + + /* No reading while erasing.*/ + if (devp->state == FLASH_ERASE) { + return FLASH_BUSY_ERASING; + } + + /* FLASH_READ state while the operation is performed.*/ + devp->state = FLASH_READ; + + FMC->ISPCMD = NUC123_EFL_CMD_READ; + + while (n) { + FMC->ISPADR = (uint32_t)desc->address + (offset & ~3); + err = do_ISP(); + if (err) { + break; + } + data = FMC->ISPDAT; + /* For most iterations, the switch doesn't do anything, but it doesn't + hurt, and it allows us to consolidate the leading partial word + with the rest, which compiles smaller. The compiler is pretty good + at pulling things out of the loop, if speed is more important. */ + switch (offset % 4) { + case 0: + *(rp++) = (uint8_t)((data >> 0) & 0xFF); + if (!(--n)) { break; } + /* fallthrough */ + case 1: + *(rp++) = (uint8_t)((data >> 8) & 0xFF); + if (!(--n)) { break; } + /* fallthrough */ + case 2: + *(rp++) = (uint8_t)((data >> 16) & 0xFF); + if (!(--n)) { break; } + /* fallthrough */ + case 3: + *(rp++) = (uint8_t)((data >> 24) & 0xFF); + if (!(--n)) { break; } + } + offset += (4 - (offset % 4)); + } + + /* Ready state again.*/ + devp->state = FLASH_READY; + + return err; +} + +/** + * @brief Program operation. + * + * @param[in] instance pointer to a @p EFlashDriver instance + * @param[in] offset flash offset + * @param[in] n number of bytes to be programmed + * @param[in] pp pointer to the data buffer + * @return An error code. + * @retval FLASH_NO_ERROR if there is no erase operation in progress. + * @retval FLASH_BUSY_ERASING if there is an erase operation in progress. + * @retval FLASH_ERROR_PROGRAM if the program operation failed. + * @retval FLASH_ERROR_HW_FAILURE if access to the memory failed. + * + * @notapi + */ +flash_error_t efl_lld_program(void* instance, flash_offset_t offset, + size_t n, const uint8_t* pp) +{ + EFlashDriver* devp = (EFlashDriver*)instance; + const flash_descriptor_t *desc = efl_lld_get_descriptor(instance); + flash_error_t err = FLASH_NO_ERROR; + uint32_t data; + + osalDbgCheck((instance != NULL) && (pp != NULL) && (n > 0U)); + osalDbgCheck(((size_t)offset + n) <= (size_t)desc->size); + + osalDbgAssert((devp->state == FLASH_READY) || (devp->state == FLASH_ERASE), + "invalid state"); + + /* No programming while erasing.*/ + if (devp->state == FLASH_ERASE) { + return FLASH_BUSY_ERASING; + } + + /* FLASH_PGM state while the operation is performed.*/ + devp->state = FLASH_PGM; + + if (offset % 4) { + FMC->ISPCMD = NUC123_EFL_CMD_READ; + FMC->ISPADR = (uint32_t)desc->address + (offset & ~3); + err = do_ISP(); + if (err) { + /* Ready state again.*/ + devp->state = FLASH_READY; + return err; + } + data = FMC->ISPDAT; + switch (offset % 4) { + case 1: + data &= 0xFFFF00FF; + data |= (*(pp++) << 8); + if (!(--n)) { + break; + } + /* fallthrough */ + case 2: + data &= 0xFF00FFFF; + data |= (*(pp++) << 16); + if (!(--n)) { + break; + } + /* fallthrough */ + case 3: + data &= 0x00FFFFFF; + data |= (*(pp++) << 24); + if (!(--n)) { + break; + } + } + + FMC->ISPDAT = data; + FMC->ISPCMD = NUC123_EFL_CMD_PROG; + err = do_ISP(); + if (err) { + /* Ready state again.*/ + devp->state = FLASH_READY; + return err; + } + + offset += 4 - (offset % 4); + } + + FMC->ISPCMD = NUC123_EFL_CMD_PROG; + + while (n >= 4) { + FMC->ISPADR = (uint32_t)desc->address + offset; + FMC->ISPDAT = (*(pp + 0)) | (*(pp + 1) << 8) | + (*(pp + 2) << 16) | (*(pp + 3) << 24); + err = do_ISP(); + if (err) { + /* Ready state again.*/ + devp->state = FLASH_READY; + return err; + } + n -= 4; + pp += 4; + offset += 4; + } + + if (n) { + FMC->ISPCMD = NUC123_EFL_CMD_READ; + FMC->ISPADR = (uint32_t)desc->address + offset; + err = do_ISP(); + if (err) { + /* Ready state again.*/ + devp->state = FLASH_READY; + return err; + } + data = FMC->ISPDAT; + + switch (n) { + case 3: + data &= 0xFF00FFFF; + data |= (pp[2] << 16); + /* fallthrough */ + case 2: + data &= 0xFFFF00FF; + data |= (pp[1] << 8); + /* fallthrough */ + case 1: + data &= 0xFFFFFF00; + data |= (pp[0] << 0); + } + FMC->ISPDAT = data; + FMC->ISPCMD = NUC123_EFL_CMD_PROG; + err = do_ISP(); + } + + /* Ready state again.*/ + devp->state = FLASH_READY; + return err; +} + +/** + * @brief Starts a whole-device erase operation. + * @note This operation erases the entirety of the bank associated with + * the driver indicated by @p instance. Calling this function on + * the bank that contains the code that is currently executing + * will result in undefined behavior. + * @note This operation is not supported asynchronously, so this will + * not return until all erases have been completed. + * + * @param[in] instance pointer to a @p EFlashDriver instance + * @return An error code. + * @retval FLASH_NO_ERROR if there is no erase operation in progress. + * @retval FLASH_BUSY_ERASING if there is an erase operation in progress. + * @retval FLASH_ERROR_HW_FAILURE if access to the memory failed. + * + * @notapi + */ +flash_error_t efl_lld_start_erase_all(void* instance) +{ + EFlashDriver* devp = (EFlashDriver*)instance; + const flash_descriptor_t *desc = efl_lld_get_descriptor(instance); + flash_error_t err = FLASH_NO_ERROR; + + osalDbgCheck(instance != NULL); + osalDbgAssert((devp->state == FLASH_READY) || (devp->state == FLASH_ERASE), + "invalid state"); + + /* No erasing while erasing.*/ + if (devp->state == FLASH_ERASE) { + return FLASH_BUSY_ERASING; + } + + /* FLASH_PGM state while the operation is performed.*/ + devp->state = FLASH_ERASE; + + FMC->ISPCMD = NUC123_EFL_CMD_ERASE; + + for (uint8_t i = 0; i < desc->sectors_count; ++i) + { + FMC->ISPADR = (uint32_t)((i * (desc->sectors_size)) + + desc->address); + err = do_ISP(); + if (err) { + break; + } + } + + devp->state = FLASH_READY; + return err; +} + +/** + * @brief Starts an sector erase operation. + * + * @param[in] instance pointer to a @p EFlashDriver instance + * @param[in] sector sector to be erased + * @return An error code. + * @retval FLASH_NO_ERROR if there is no erase operation in progress. + * @retval FLASH_BUSY_ERASING if there is an erase operation in progress. + * @retval FLASH_ERROR_HW_FAILURE if access to the memory failed. + * + * @notapi + */ +flash_error_t efl_lld_start_erase_sector(void* instance, + flash_sector_t sector) +{ + EFlashDriver* devp = (EFlashDriver*)instance; + const flash_descriptor_t *desc = efl_lld_get_descriptor(instance); + + osalDbgCheck(instance != NULL); + osalDbgCheck(sector < desc->sectors_count); + osalDbgAssert((devp->state == FLASH_READY) || (devp->state == FLASH_ERASE), + "invalid state"); + + /* No erasing while erasing.*/ + if (devp->state == FLASH_ERASE) { + return FLASH_BUSY_ERASING; + } + + /* FLASH_ERASE state while the operation is performed.*/ + devp->state = FLASH_ERASE; + + FMC->ISPCMD = NUC123_EFL_CMD_ERASE; + FMC->ISPADR = (uint32_t)((sector * (desc->sectors_size)) + + desc->address); + start_ISP(); + + return FLASH_NO_ERROR; +} + +/** + * @brief Queries the driver for erase operation progress. + * + * @param[in] instance pointer to a @p EFlashDriver instance + * @param[out] msec recommended time, in milliseconds, that + * should be spent before calling this + * function again, can be @p NULL + * @return An error code. + * @retval FLASH_NO_ERROR if there is no erase operation in progress. + * @retval FLASH_BUSY_ERASING if there is an erase operation in progress. + * @retval FLASH_ERROR_ERASE if the erase operation failed. + * @retval FLASH_ERROR_HW_FAILURE if access to the memory failed. + * + * @api + */ +flash_error_t efl_lld_query_erase(void* instance, uint32_t* msec) +{ + EFlashDriver* devp = (EFlashDriver*)instance; + + /* TODO: figure out an actual amount of time */ + *msec = 0UL; + + /* If there is an erase in progress then the device must be checked.*/ + if (devp->state == FLASH_ERASE) { + if (FMC->ISPSTA & FMC_ISPSTA_ISPGO_Msk) { + return FLASH_BUSY_ERASING; + } + + if (FMC->ISPCON & FMC_ISPCON_ISPFF_Msk) { + return FLASH_ERROR_HW_FAILURE; + } + + devp->state = FLASH_READY; + } + + return FLASH_NO_ERROR; +} + +/** + * @brief Returns the erase state of a sector. + * + * @param[in] instance pointer to a @p EFlashDriver instance + * @param[in] sector sector to be verified + * @return An error code. + * @retval FLASH_NO_ERROR if the sector is erased. + * @retval FLASH_BUSY_ERASING if there is an erase operation in progress. + * @retval FLASH_ERROR_VERIFY if the verify operation failed. + * @retval FLASH_ERROR_HW_FAILURE if access to the memory failed. + * + * @notapi + */ +flash_error_t efl_lld_verify_erase(void* instance, flash_sector_t sector) +{ + EFlashDriver* devp = (EFlashDriver*)instance; + const flash_descriptor_t *desc = efl_lld_get_descriptor(instance); + flash_error_t err = FLASH_NO_ERROR; + + osalDbgCheck(instance != NULL); + osalDbgCheck(sector < desc->sectors_count); + osalDbgAssert((devp->state == FLASH_READY) || (devp->state == FLASH_ERASE), + "invalid state"); + /* No verifying while erasing.*/ + if (devp->state == FLASH_ERASE) { + return FLASH_BUSY_ERASING; + } + + devp->state = FLASH_READ; + + FMC->ISPCMD = NUC123_EFL_CMD_READ; + + for (size_t i = 0; i < desc->sectors_size; i = i + 4) { + FMC->ISPADR = (uint32_t)desc->address + (desc->sectors_size * sector) + i; + err = do_ISP(); + if (err) { + break; + } + if (FMC->ISPDAT != 0xFFFFFFFF) { + err = FLASH_ERROR_VERIFY; + break; + } + } + + /* Ready state again.*/ + devp->state = FLASH_READY; + return err; +} + +#endif /* HAL_USE_EFL == TRUE */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h b/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h new file mode 100644 index 00000000..200955c2 --- /dev/null +++ b/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h @@ -0,0 +1,167 @@ +/* + ChibiOS - Copyright (C) 2020 Alex Lewontin + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ + +/** + * @file hal_efl_lld.h + * @brief NUC123 Embedded Flash subsystem low level driver header. + * @note This driver only supports management of APROM. LDROM, config + * registers, and data flash (not yet supported by the platform driver) + * are not supported. + * @addtogroup HAL_EFL + * @{ + */ + +#ifndef HAL_EFL_LLD_H +#define HAL_EFL_LLD_H + +#if HAL_USE_EFL || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver constants. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver pre-compile time settings. */ +/*===========================================================================*/ + +/** + * @name NUC123 configuration options + * @{ + */ +/** + * @brief EFL1 driver enable switch. + * @details If set to @p TRUE the support for EFL1 is included. + * + * @note The default is @p TRUE. + */ +#if !defined(NUC123_EFL_USE_EFL1) || defined(__DOXYGEN__) +#define NUC123_EFL_USE_EFL1 TRUE +#endif + +/** + * @brief APROM access enable switch. + * @details If set to @p TRUE the support for APROM access is included. + * + * @note The default is @p FALSE. + */ +#if !defined(NUC123_EFL_ACCESS_APROM) || defined(__DOXYGEN__) +#define NUC123_EFL_ACCESS_APROM FALSE +#endif + +/** + * @brief Data flash access enable switch. + * @details If set to @p TRUE the support for data flash access is included. + * + * @note The default is @p FALSE. + */ +#if !defined(NUC123_EFL_ACCESS_DATAFLASH) || defined(__DOXYGEN__) +#define NUC123_EFL_ACCESS_DATAFLASH FALSE +#endif + +/** + * @brief LDROM access enable switch. + * @details If set to @p FALSE the support for LDROM access is included. + * + * @note The default is @p FALSE. + */ +#if !defined(NUC123_EFL_ACCESS_LDROM) || defined(__DOXYGEN__) +#define NUC123_EFL_ACCESS_LDROM FALSE +#endif + +/** + * @brief CONFIG0/1 access enable switch. + * @details If set to @p FALSE the support for CONFIG0/1 access is included. + * + * @note The default is @p FALSE. + */ +#if !defined(NUC123_EFL_ACCESS_CONFIG) || defined(__DOXYGEN__) +#define NUC123_EFL_ACCESS_CONFIG FALSE +#endif +/** @} */ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver data structures and types. */ +/*===========================================================================*/ + +typedef enum { +#if (NUC123_EFL_ACCESS_APROM == TRUE) || defined(__DOXYGEN__) + NUC123_EFL_BANK_APROM, +#endif +#if (NUC123_EFL_ACCESS_DATAFLASH == TRUE) || defined(__DOXYGEN__) + NUC123_EFL_BANK_DATAFLASH, +#endif +#if (NUC123_EFL_ACCESS_LDROM == TRUE) || defined(__DOXYGEN__) + NUC123_EFL_BANK_LDROM, +#endif +#if (NUC123_EFL_ACCESS_CONFIG == TRUE) || defined(__DOXYGEN__) + NUC123_EFL_BANK_CONFIG, +#endif + NUC123_EFL_BANK_NONE +} nuc123_eflbank_t; +/*===========================================================================*/ +/* Driver macros. */ +/*===========================================================================*/ + +/** + * @brief Low level fields of the embedded flash driver structure. + */ +#define efl_lld_driver_fields \ + /* The currently used bank.*/ \ + nuc123_eflbank_t bank + +/** + * @brief Low level fields of the embedded flash configuration structure. + */ +#define efl_lld_config_fields \ + /* Dummy configuration, it is not needed.*/ \ + uint32_t dummy + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#if (NUC123_EFL_USE_EFL1 == TRUE) && !defined(__DOXYGEN__) + extern EFlashDriver EFLD1; +#endif + +#ifdef __cplusplus +extern "C" { +#endif +void efl_lld_init(void); +void efl_lld_start(EFlashDriver *eflp); +void efl_lld_stop(EFlashDriver *eflp); +const flash_descriptor_t *efl_lld_get_descriptor(void *instance); +flash_error_t efl_lld_read(void *instance, flash_offset_t offset, size_t n, + uint8_t *rp); +flash_error_t efl_lld_program(void *instance, flash_offset_t offset, + size_t n, const uint8_t *pp); +flash_error_t efl_lld_start_erase_all(void *instance); +flash_error_t efl_lld_start_erase_sector(void *instance, flash_sector_t sector); +flash_error_t efl_lld_query_erase(void *instance, uint32_t *msec); +flash_error_t efl_lld_verify_erase(void *instance, flash_sector_t sector); +#ifdef __cplusplus +} +#endif + +#endif /* HAL_USE_EFL == TRUE */ + +#endif /* HAL_EFL_LLD_H */ + +/** @} */ diff --git a/os/hal/ports/NUMICRO/NUC123/hal_lld.h b/os/hal/ports/NUMICRO/NUC123/hal_lld.h index 8c14bcd9..7154ff55 100644 --- a/os/hal/ports/NUMICRO/NUC123/hal_lld.h +++ b/os/hal/ports/NUMICRO/NUC123/hal_lld.h @@ -43,6 +43,7 @@ #define PLATFORM_NAME "NUC123SD4AN0 NUC123 Cortex M0 USB Micro" #define NUC123xxxANx #undef NUC123xxxAEx +#define NUC123_FLASH_SIZE 0x11000 #else #error "NUC123 device unsupported or not specified" #endif @@ -184,6 +185,13 @@ /** * @brief Enables or disables data flash + * @warning If data this is set to @p TRUE, the data flash + * is subtracted from the APROM. The linker script is not aware + * of this, so therefore it is the responsiblity of the user to ensure + * that the combination of the data flash & the text section still fit + * into ROM. + + * @note The default is @p FALSE. */ #if !defined(NUC123_DATAFLASH_ENABLED) || defined(__DOXYGEN__) #define NUC123_DATAFLASH_ENABLED FALSE @@ -229,7 +237,7 @@ /* * Persistant configuration settings. */ -#if NUC123_DATAFLASH_ENABLE +#if (NUC123_DATAFLASH_ENABLED == TRUE) #if (NUC123_DATAFLASH_SIZE == 4096) /* DFVSEN = 1, nothing else matters */ diff --git a/os/hal/ports/NUMICRO/NUC123/platform.mk b/os/hal/ports/NUMICRO/NUC123/platform.mk index 5fc04b14..741d66c8 100644 --- a/os/hal/ports/NUMICRO/NUC123/platform.mk +++ b/os/hal/ports/NUMICRO/NUC123/platform.mk @@ -17,6 +17,7 @@ include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/TIMv1/driver.mk include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/USBv1/driver.mk include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/SERIALv1/driver.mk include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/I2Cv1/driver.mk +include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/FLASHv1/driver.mk # Shared variables ALLCSRC += $(PLATFORMSRC) From 79f9bc06498e983a08a07d0888358dad61acbaa4 Mon Sep 17 00:00:00 2001 From: Alex Lewontin Date: Tue, 9 Feb 2021 14:47:38 -0500 Subject: [PATCH 3/5] NUC123: EFL testhal --- .../NUTINY-SDK-NUC123-V2.0/EFL/Makefile | 203 +++++ .../NUTINY-SDK-NUC123-V2.0/EFL/cfg/chconf.h | 766 ++++++++++++++++++ .../NUTINY-SDK-NUC123-V2.0/EFL/cfg/halconf.h | 533 ++++++++++++ .../EFL/cfg/halconf_community.h | 180 ++++ .../NUTINY-SDK-NUC123-V2.0/EFL/cfg/mcuconf.h | 41 + .../NUTINY-SDK-NUC123-V2.0/EFL/cfg/osalconf.h | 15 + .../EFL/cfg/shellconf.h | 139 ++++ .../NUC123/NUTINY-SDK-NUC123-V2.0/EFL/main.c | 99 +++ .../NUTINY-SDK-NUC123-V2.0/EFL/readme.txt | 47 ++ .../NUC123/NUTINY-SDK-NUC123-V2.0/EFL/shcfg.c | 112 +++ .../NUC123/NUTINY-SDK-NUC123-V2.0/EFL/shcfg.h | 52 ++ 11 files changed, 2187 insertions(+) create mode 100644 testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/Makefile create mode 100644 testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/chconf.h create mode 100644 testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/halconf.h create mode 100644 testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/halconf_community.h create mode 100644 testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/mcuconf.h create mode 100644 testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/osalconf.h create mode 100644 testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/shellconf.h create mode 100644 testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/main.c create mode 100644 testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/readme.txt create mode 100644 testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/shcfg.c create mode 100644 testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/shcfg.h diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/Makefile b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/Makefile new file mode 100644 index 00000000..e1841ed4 --- /dev/null +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/Makefile @@ -0,0 +1,203 @@ +############################################################################## +# Build global options +# NOTE: Can be overridden externally. +# +# Compiler options here. +ifeq ($(USE_OPT),) + USE_OPT = -Og -ggdb3 -g3 -gdwarf-3 -gstrict-dwarf -fomit-frame-pointer -falign-functions=16 -pedantic +endif + +# C specific options here (added to USE_OPT). +ifeq ($(USE_COPT),) + USE_COPT = +endif + +# C++ specific options here (added to USE_OPT). +ifeq ($(USE_CPPOPT),) + USE_CPPOPT = -fno-rtti +endif + +# Enable this if you want the linker to remove unused code and data. +ifeq ($(USE_LINK_GC),) + USE_LINK_GC = yes +endif + +# Linker extra options here. +ifeq ($(USE_LDOPT),) + USE_LDOPT = +endif + +# Enable this if you want link time optimizations (LTO). +ifeq ($(USE_LTO),) + USE_LTO = yes +endif + +# Enable this if you want to see the full log while compiling. +ifeq ($(USE_VERBOSE_COMPILE),) + USE_VERBOSE_COMPILE = no +endif + +# If enabled, this option makes the build process faster by not compiling +# modules not used in the current configuration. +ifeq ($(USE_SMART_BUILD),) + USE_SMART_BUILD = yes +endif + +# +# Build global options +############################################################################## + +############################################################################## +# Architecture or project specific options +# + +# Stack size to be allocated to the Cortex-M process stack. This stack is +# the stack used by the main() thread. +ifeq ($(USE_PROCESS_STACKSIZE),) + USE_PROCESS_STACKSIZE = 0x400 +endif + +# Stack size to the allocated to the Cortex-M main/exceptions stack. This +# stack is used for processing interrupts and exceptions. +ifeq ($(USE_EXCEPTIONS_STACKSIZE),) + USE_EXCEPTIONS_STACKSIZE = 0x400 +endif + +# Enables the use of FPU (no, softfp, hard). +ifeq ($(USE_FPU),) + USE_FPU = no +endif + +# FPU-related options. +ifeq ($(USE_FPU_OPT),) + USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 +endif + +# +# Architecture or project specific options +############################################################################## + +############################################################################## +# Project, target, sources and paths +# + +# Define project name here +PROJECT = ch + +# Target settings. +MCU = cortex-m0 + +# Imported source files and paths. +BASE_PATH := $(shell pwd)/../../../../../../.. +CHIBIOS := $(BASE_PATH)/ChibiOS/ChibiOS +CHIBIOS_CONTRIB := $(BASE_PATH)/ChibiOS/ChibiOS-Contrib +CONFDIR := ./cfg +BUILDDIR := ./build +DEPDIR := ./.dep + +# Licensing files. +include $(CHIBIOS)/os/license/license.mk +# Startup files. +include $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_NUC123.mk +# HAL-OSAL files (optional). +#include $(CHIBIOS)/os/hal/hal.mk +include $(CHIBIOS_CONTRIB)/os/hal/hal.mk +include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/NUC123/platform.mk +include $(CHIBIOS_CONTRIB)/os/hal/boards/NUTINY-SDK-NUC123-V2.0/board.mk +include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk +# RTOS files (optional). +include $(CHIBIOS)/os/rt/rt.mk +include $(CHIBIOS)/test/rt/rt_test.mk +include $(CHIBIOS)/test/lib/test.mk +include $(CHIBIOS)/test/oslib/oslib_test.mk +#include $(CHIBIOS)/os/common/ports/ARMv6-M/compilers/GCC/mk/port.mk +include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v6m.mk +# Auto-build files in ./source recursively. +include $(CHIBIOS)/tools/mk/autobuild.mk +# Other files (optional). +include $(CHIBIOS)/os/hal/lib/streams/streams.mk +include $(CHIBIOS)/os/various/shell/shell.mk +include $(CHIBIOS)/os/hal/lib/complex/mfs/hal_mfs.mk + +# Define linker script file here +LDSCRIPT= $(STARTUPLD_CONTRIB)/NUC123xD4xx0.ld + +# C sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +CSRC = $(ALLCSRC) \ + $(TESTSRC) \ + shcfg.c \ + main.c + +# C++ sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +CPPSRC = $(ALLCPPSRC) + +# List ASM source files here. +ASMSRC = $(ALLASMSRC) + +# List ASM with preprocessor source files here. +ASMXSRC = $(ALLXASMSRC) + +# Inclusion directories. +INCDIR = $(CONFDIR) $(ALLINC) $(TESTINC) + +# Define C warning options here. +CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes + +# Define C++ warning options here. +CPPWARN = -Wall -Wextra -Wundef + +# +# Project, target, sources and paths +############################################################################## + +############################################################################## +# Start of user section +# + +# List all user C define here, like -D_DEBUG=1 +UDEFS = -DSHELL_CONFIG_FILE + +# Define ASM defines here +UADEFS = + +# List all user directories here +UINCDIR = + +# List the user directory to look for the libraries here +ULIBDIR = + +# List all user libraries here +ULIBS = + +# +# End of user section +############################################################################## + +############################################################################## +# Common rules +# + +RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk +include $(RULESPATH)/arm-none-eabi.mk +include $(RULESPATH)/rules.mk + +# +# Common rules +############################################################################## + +############################################################################## +# Custom rules +# + +READLINK:=greadlink +OPENOCD:=$(shell $(READLINK) -f `which openocd`) +OPENOCDPATH:=$(shell dirname $(OPENOCD))/../share/openocd + +flash: $(BUILDDIR)/$(PROJECT).elf + openocd -f ../scripts/interface/nulink.cfg -f ../scripts/target/numicro.cfg -c "program $< reset exit" + +# +# Custom rules +############################################################################## diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/chconf.h b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/chconf.h new file mode 100644 index 00000000..c0e50779 --- /dev/null +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/chconf.h @@ -0,0 +1,766 @@ +/* + ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ + +/** + * @file rt/templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ +#define _CHIBIOS_RT_CONF_VER_6_1_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16, 32 or 64 bits. + */ +#if !defined(CH_CFG_ST_RESOLUTION) +#define CH_CFG_ST_RESOLUTION 32 +#endif + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#if !defined(CH_CFG_ST_FREQUENCY) +#define CH_CFG_ST_FREQUENCY 10000 +#endif + +/** + * @brief Time intervals data size. + * @note Allowed values are 16, 32 or 64 bits. + */ +#if !defined(CH_CFG_INTERVALS_SIZE) +#define CH_CFG_INTERVALS_SIZE 32 +#endif + +/** + * @brief Time types data size. + * @note Allowed values are 16 or 32 bits. + */ +#if !defined(CH_CFG_TIME_TYPES_SIZE) +#define CH_CFG_TIME_TYPES_SIZE 32 +#endif + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#if !defined(CH_CFG_ST_TIMEDELTA) +#define CH_CFG_ST_TIMEDELTA 0 +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#if !defined(CH_CFG_TIME_QUANTUM) +#define CH_CFG_TIME_QUANTUM 0 +#endif + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#if !defined(CH_CFG_NO_IDLE_THREAD) +#define CH_CFG_NO_IDLE_THREAD FALSE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_OPTIMIZE_SPEED) +#define CH_CFG_OPTIMIZE_SPEED TRUE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_TM) +#define CH_CFG_USE_TM FALSE +#endif + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_REGISTRY) +#define CH_CFG_USE_REGISTRY TRUE +#endif + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_WAITEXIT) +#define CH_CFG_USE_WAITEXIT TRUE +#endif + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_SEMAPHORES) +#define CH_CFG_USE_SEMAPHORES FALSE +#endif + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY) +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE +#endif + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_MUTEXES) +#define CH_CFG_USE_MUTEXES TRUE +#endif + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE) +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE +#endif + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#if !defined(CH_CFG_USE_CONDVARS) +#define CH_CFG_USE_CONDVARS FALSE +#endif + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT) +#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE +#endif + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_EVENTS) +#define CH_CFG_USE_EVENTS TRUE +#endif + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#if !defined(CH_CFG_USE_EVENTS_TIMEOUT) +#define CH_CFG_USE_EVENTS_TIMEOUT FALSE +#endif + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_MESSAGES) +#define CH_CFG_USE_MESSAGES FALSE +#endif + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#if !defined(CH_CFG_USE_MESSAGES_PRIORITY) +#define CH_CFG_USE_MESSAGES_PRIORITY FALSE +#endif + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#if !defined(CH_CFG_USE_DYNAMIC) +#define CH_CFG_USE_DYNAMIC TRUE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name OSLIB options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#if !defined(CH_CFG_USE_MAILBOXES) +#define CH_CFG_USE_MAILBOXES FALSE +#endif + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_MEMCORE) +#define CH_CFG_USE_MEMCORE TRUE +#endif + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#if !defined(CH_CFG_MEMCORE_SIZE) +#define CH_CFG_MEMCORE_SIZE 0 +#endif + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#if !defined(CH_CFG_USE_HEAP) +#define CH_CFG_USE_HEAP TRUE +#endif + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_MEMPOOLS) +#define CH_CFG_USE_MEMPOOLS FALSE +#endif + +/** + * @brief Objects FIFOs APIs. + * @details If enabled then the objects FIFOs APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_OBJ_FIFOS) +#define CH_CFG_USE_OBJ_FIFOS FALSE +#endif + +/** + * @brief Pipes APIs. + * @details If enabled then the pipes APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_PIPES) +#define CH_CFG_USE_PIPES FALSE +#endif + +/** + * @brief Objects Caches APIs. + * @details If enabled then the objects caches APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_OBJ_CACHES) +#define CH_CFG_USE_OBJ_CACHES FALSE +#endif + +/** + * @brief Delegate threads APIs. + * @details If enabled then the delegate threads APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_DELEGATES) +#define CH_CFG_USE_DELEGATES FALSE +#endif + +/** + * @brief Jobs Queues APIs. + * @details If enabled then the jobs queues APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#if !defined(CH_CFG_USE_JOBS) +#define CH_CFG_USE_JOBS FALSE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Objects factory options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Objects Factory APIs. + * @details If enabled then the objects factory APIs are included in the + * kernel. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_CFG_USE_FACTORY) +#define CH_CFG_USE_FACTORY FALSE +#endif + +/** + * @brief Maximum length for object names. + * @details If the specified length is zero then the name is stored by + * pointer but this could have unintended side effects. + */ +#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH) +#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8 +#endif + +/** + * @brief Enables the registry of generic objects. + */ +#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY) +#define CH_CFG_FACTORY_OBJECTS_REGISTRY FALSE +#endif + +/** + * @brief Enables factory for generic buffers. + */ +#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS) +#define CH_CFG_FACTORY_GENERIC_BUFFERS FALSE +#endif + +/** + * @brief Enables factory for semaphores. + */ +#if !defined(CH_CFG_FACTORY_SEMAPHORES) +#define CH_CFG_FACTORY_SEMAPHORES FALSE +#endif + +/** + * @brief Enables factory for mailboxes. + */ +#if !defined(CH_CFG_FACTORY_MAILBOXES) +#define CH_CFG_FACTORY_MAILBOXES FALSE +#endif + +/** + * @brief Enables factory for objects FIFOs. + */ +#if !defined(CH_CFG_FACTORY_OBJ_FIFOS) +#define CH_CFG_FACTORY_OBJ_FIFOS FALSE +#endif + +/** + * @brief Enables factory for Pipes. + */ +#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__) +#define CH_CFG_FACTORY_PIPES FALSE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_STATISTICS) +#define CH_DBG_STATISTICS FALSE +#endif + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_SYSTEM_STATE_CHECK) +#define CH_DBG_SYSTEM_STATE_CHECK TRUE +#endif + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_ENABLE_CHECKS) +#define CH_DBG_ENABLE_CHECKS TRUE +#endif + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_ENABLE_ASSERTS) +#define CH_DBG_ENABLE_ASSERTS TRUE +#endif + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#if !defined(CH_DBG_TRACE_MASK) +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_ALL +#endif + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#if !defined(CH_DBG_TRACE_BUFFER_SIZE) +#define CH_DBG_TRACE_BUFFER_SIZE 128 +#endif + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#if !defined(CH_DBG_ENABLE_STACK_CHECK) +#define CH_DBG_ENABLE_STACK_CHECK TRUE +#endif + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#if !defined(CH_DBG_FILL_THREADS) +#define CH_DBG_FILL_THREADS TRUE +#endif + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#if !defined(CH_DBG_THREADS_PROFILING) +#define CH_DBG_THREADS_PROFILING FALSE +#endif + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System structure extension. + * @details User fields added to the end of the @p ch_system_t structure. + */ +#define CH_CFG_SYSTEM_EXTRA_FIELDS /* Add threads custom fields here.*/ + +/** + * @brief System initialization hook. + * @details User initialization code added to the @p chSysInit() function + * just before interrupts are enabled globally. + */ +#define CH_CFG_SYSTEM_INIT_HOOK() \ + { \ + /* Add threads initialization code here.*/ \ + } + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p _thread_init() function. + * + * @note It is invoked from within @p _thread_init() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) \ + { \ + /* Add threads initialization code here.*/ \ + } + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) \ + { \ + /* Add threads finalization code here.*/ \ + } + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) \ + { \ + /* Context switch code here.*/ \ + } + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() \ + { \ + /* IRQ prologue code here.*/ \ + } + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() \ + { \ + /* IRQ epilogue code here.*/ \ + } + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() \ + { \ + /* Idle-enter code here.*/ \ + } + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() \ + { \ + /* Idle-leave code here.*/ \ + } + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() \ + { \ + /* Idle loop code here.*/ \ + } + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() \ + { \ + /* System tick event code here.*/ \ + } + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) \ + { \ + /* System halt code here.*/ \ + } + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) \ + { \ + /* Trace code here.*/ \ + } + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/halconf.h b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/halconf.h new file mode 100644 index 00000000..531d9c1f --- /dev/null +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/halconf.h @@ -0,0 +1,533 @@ +/* + ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef HALCONF_H +#define HALCONF_H + +#define _CHIBIOS_HAL_CONF_ +#define _CHIBIOS_HAL_CONF_VER_7_1_ + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the cryptographic subsystem. + */ +#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__) +#define HAL_USE_CRY FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC FALSE +#endif + +/** + * @brief Enables the EFlash subsystem. + */ +#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__) +#define HAL_USE_EFL TRUE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT FALSE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL TRUE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB FALSE +#endif + +/** + * @brief Enables the SIO subsystem. + */ +#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__) +#define HAL_USE_SIO FALSE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI FALSE +#endif + +/** + * @brief Enables the TRNG subsystem. + */ +#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__) +#define HAL_USE_TRNG FALSE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB FALSE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/** + * @brief Enables the WSPI subsystem. + */ +#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__) +#define HAL_USE_WSPI FALSE +#endif + +/*===========================================================================*/ +/* PAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__) +#define PAL_USE_CALLBACKS FALSE +#endif + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__) +#define PAL_USE_WAIT FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/** + * @brief Enforces the driver to use direct callbacks rather than OSAL events. + */ +#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__) +#define CAN_ENFORCE_USE_CALLBACKS FALSE +#endif + +/*===========================================================================*/ +/* CRY driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the SW fall-back of the cryptographic driver. + * @details When enabled, this option, activates a fall-back software + * implementation for algorithms not supported by the underlying + * hardware. + * @note Fall-back implementations may not be present for all algorithms. + */ +#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__) +#define HAL_CRY_USE_FALLBACK FALSE +#endif + +/** + * @brief Makes the driver forcibly use the fall-back implementations. + */ +#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__) +#define HAL_CRY_ENFORCE_FALLBACK FALSE +#endif + +/*===========================================================================*/ +/* DAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__) +#define DAC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define DAC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the zero-copy API. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/** + * @brief OCR initialization constant for V20 cards. + */ +#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__) +#define SDC_INIT_OCR_V20 0x50FF8000U +#endif + +/** + * @brief OCR initialization constant for non-V20 cards. + */ +#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__) +#define SDC_INIT_OCR 0x80100000U +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 16 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 256 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 256 +#endif + +/** + * @brief Serial over USB number of buffers. + * @note The default is 2 buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_NUMBER 2 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables circular transfers APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__) +#define SPI_USE_CIRCULAR FALSE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +/** + * @brief Handling method for SPI CS line. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__) +#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD +#endif + +/*===========================================================================*/ +/* UART driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) +#define UART_USE_WAIT FALSE +#endif + +/** + * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define UART_USE_MUTUAL_EXCLUSION FALSE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT FALSE +#endif + +/*===========================================================================*/ +/* WSPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__) +#define WSPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define WSPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +#include "halconf_community.h" + +#endif /* HALCONF_H */ + +/** @} */ diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/halconf_community.h b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/halconf_community.h new file mode 100644 index 00000000..8b650109 --- /dev/null +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/halconf_community.h @@ -0,0 +1,180 @@ +/* + ChibiOS - Copyright (C) 2014 Uladzimir Pylinsky aka barthess + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ + +#ifndef HALCONF_COMMUNITY_H +#define HALCONF_COMMUNITY_H + +/** + * @brief Enables the community overlay. + */ +#if !defined(HAL_USE_COMMUNITY) || defined(__DOXYGEN__) +#define HAL_USE_COMMUNITY TRUE +#endif + +/** + * @brief Enables the FSMC subsystem. + */ +#if !defined(HAL_USE_FSMC) || defined(__DOXYGEN__) +#define HAL_USE_FSMC FALSE +#endif + +/** + * @brief Enables the NAND subsystem. + */ +#if !defined(HAL_USE_NAND) || defined(__DOXYGEN__) +#define HAL_USE_NAND FALSE +#endif + +/** + * @brief Enables the 1-wire subsystem. + */ +#if !defined(HAL_USE_ONEWIRE) || defined(__DOXYGEN__) +#define HAL_USE_ONEWIRE FALSE +#endif + +/** + * @brief Enables the EICU subsystem. + */ +#if !defined(HAL_USE_EICU) || defined(__DOXYGEN__) +#define HAL_USE_EICU FALSE +#endif + +/** + * @brief Enables the CRC subsystem. + */ +#if !defined(HAL_USE_CRC) || defined(__DOXYGEN__) +#define HAL_USE_CRC FALSE +#endif + +/** + * @brief Enables the RNG subsystem. + */ +#if !defined(HAL_USE_RNG) || defined(__DOXYGEN__) +#define HAL_USE_RNG FALSE +#endif + +/** + * @brief Enables the EEPROM subsystem. + */ +#if !defined(HAL_USE_EEPROM) || defined(__DOXYGEN__) +#define HAL_USE_EEPROM FALSE +#endif + +/** + * @brief Enables the TIMCAP subsystem. + */ +#if !defined(HAL_USE_TIMCAP) || defined(__DOXYGEN__) +#define HAL_USE_TIMCAP FALSE +#endif + +/** + * @brief Enables the TIMCAP subsystem. + */ +#if !defined(HAL_USE_COMP) || defined(__DOXYGEN__) +#define HAL_USE_COMP FALSE +#endif + +/** + * @brief Enables the QEI subsystem. + */ +#if !defined(HAL_USE_QEI) || defined(__DOXYGEN__) +#define HAL_USE_QEI FALSE +#endif + +/** + * @brief Enables the USBH subsystem. + */ +#if !defined(HAL_USE_USBH) || defined(__DOXYGEN__) +#define HAL_USE_USBH FALSE +#endif + +/** + * @brief Enables the USB_MSD subsystem. + */ +#if !defined(HAL_USE_USB_MSD) || defined(__DOXYGEN__) +#define HAL_USE_USB_MSD FALSE +#endif + +/** + * @brief Enables the USB_HID subsystem. + */ +#if !defined(HAL_USE_USB_HID) || defined(__DOXYGEN__) +#define HAL_USE_USB_HID FALSE +#endif + +/*===========================================================================*/ +/* FSMCNAND driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the @p nandAcquireBus() and @p nanReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(NAND_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define NAND_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* 1-wire driver related settings. */ +/*===========================================================================*/ +/** + * @brief Enables strong pull up feature. + * @note Disabling this option saves both code and data space. + */ +#define ONEWIRE_USE_STRONG_PULLUP FALSE + +/** + * @brief Enables search ROM feature. + * @note Disabling this option saves both code and data space. + */ +#define ONEWIRE_USE_SEARCH_ROM TRUE + +/*===========================================================================*/ +/* QEI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables discard of overlow + */ +#if !defined(QEI_USE_OVERFLOW_DISCARD) || defined(__DOXYGEN__) +#define QEI_USE_OVERFLOW_DISCARD FALSE +#endif + +/** + * @brief Enables min max of overlow + */ +#if !defined(QEI_USE_OVERFLOW_MINMAX) || defined(__DOXYGEN__) +#define QEI_USE_OVERFLOW_MINMAX FALSE +#endif + +/*===========================================================================*/ +/* EEProm driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables 24xx series I2C eeprom device driver. + * @note Disabling this option saves both code and data space. + */ +#define EEPROM_USE_EE24XX FALSE + /** + * @brief Enables 25xx series SPI eeprom device driver. + * @note Disabling this option saves both code and data space. + */ +#define EEPROM_USE_EE25XX FALSE + +#endif /* HALCONF_COMMUNITY_H */ + +/** @} */ diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/mcuconf.h b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/mcuconf.h new file mode 100644 index 00000000..b7e52f87 --- /dev/null +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/mcuconf.h @@ -0,0 +1,41 @@ +/* + ChibiOS - Copyright (C) 2020 Alex Lewontin + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ + +#ifndef _MCUCONF_H_ +#define _MCUCONF_H_ + +/* + * Board setting + */ + +/* + * HAL driver system settings. + */ +#define NUC123_PLL_ENABLED TRUE +#define NUC123_PLLSRC NUC123_PLLSRC_HSE + +#define NUC123_SERIAL_CLKSRC NUC123_SERIAL_CLKSRC_HSI + +#define NUC123_DATAFLASH_ENABLED TRUE +#define NUC123_DATAFLASH_SIZE 4096 +#define NUC123_EFL_ACCESS_APROM TRUE +#define NUC123_EFL_ACCESS_DATAFLASH TRUE +#define NUC123_EFL_ACCESS_LDROM TRUE +#define NUC123_EFL_ACCESS_CONFIG TRUE + +#define NUC123_MCUCONF + +#endif /* _MCUCONF_H_ */ diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/osalconf.h b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/osalconf.h new file mode 100644 index 00000000..0b67c88d --- /dev/null +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/osalconf.h @@ -0,0 +1,15 @@ +/* + ChibiOS - Copyright (C) 2020 Alex Lewontin + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/shellconf.h b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/shellconf.h new file mode 100644 index 00000000..e9599938 --- /dev/null +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/shellconf.h @@ -0,0 +1,139 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ + +/** + * @file shellconf.h + * @brief Simple CLI shell configuration header. + * + * @addtogroup SHELL + * @{ + */ + +#ifndef SHELLCONF_H +#define SHELLCONF_H + +/** + * @brief Shell maximum input line length. + */ +#if !defined(SHELL_MAX_LINE_LENGTH) || defined(__DOXYGEN__) +#define SHELL_MAX_LINE_LENGTH 64 +#endif + +/** + * @brief Shell maximum arguments per command. + */ +#if !defined(SHELL_MAX_ARGUMENTS) || defined(__DOXYGEN__) +#define SHELL_MAX_ARGUMENTS 4 +#endif + +/** + * @brief Shell maximum command history. + */ +#if !defined(SHELL_MAX_HIST_BUFF) || defined(__DOXYGEN__) +#define SHELL_MAX_HIST_BUFF 8 * SHELL_MAX_LINE_LENGTH +#endif + +/** + * @brief Enable shell command history + */ +#if !defined(SHELL_USE_HISTORY) || defined(__DOXYGEN__) +#define SHELL_USE_HISTORY FALSE +#endif + +/** + * @brief Enable shell command completion + */ +#if !defined(SHELL_USE_COMPLETION) || defined(__DOXYGEN__) +#define SHELL_USE_COMPLETION FALSE +#endif + +/** + * @brief Shell Maximum Completions (Set to max commands with common prefix) + */ +#if !defined(SHELL_MAX_COMPLETIONS) || defined(__DOXYGEN__) +#define SHELL_MAX_COMPLETIONS 8 +#endif + +/** + * @brief Enable shell escape sequence processing + */ +#if !defined(SHELL_USE_ESC_SEQ) || defined(__DOXYGEN__) +#define SHELL_USE_ESC_SEQ TRUE +#endif + +/*===========================================================================*/ +/* Shell command settings */ +/*===========================================================================*/ + +/** + * @brief Enable shell exit command + */ +#if !defined(SHELL_CMD_EXIT_ENABLED) || defined(__DOXYGEN__) +#define SHELL_CMD_EXIT_ENABLED TRUE +#endif + +/** + * @brief Enable shell info command + */ +#if !defined(SHELL_CMD_INFO_ENABLED) || defined(__DOXYGEN__) +#define SHELL_CMD_INFO_ENABLED TRUE +#endif + +/** + * @brief Enable shell echo command + */ +#if !defined(SHELL_CMD_ECHO_ENABLED) || defined(__DOXYGEN__) +#define SHELL_CMD_ECHO_ENABLED TRUE +#endif + +/** + * @brief Enable shell systime command + */ +#if !defined(SHELL_CMD_SYSTIME_ENABLED) || defined(__DOXYGEN__) +#define SHELL_CMD_SYSTIME_ENABLED TRUE +#endif + +/** + * @brief Enable shell mem command + */ +#if !defined(SHELL_CMD_MEM_ENABLED) || defined(__DOXYGEN__) +#define SHELL_CMD_MEM_ENABLED TRUE +#endif + +/** + * @brief Enable shell threads command + */ +#if !defined(SHELL_CMD_THREADS_ENABLED) || defined(__DOXYGEN__) +#define SHELL_CMD_THREADS_ENABLED TRUE +#endif + +/** + * @brief Enable shell test command + */ +#if !defined(SHELL_CMD_TEST_ENABLED) || defined(__DOXYGEN__) +#define SHELL_CMD_TEST_ENABLED FALSE +#endif + +/** + * @brief Define test thread working area + */ +#if !defined(SHELL_CMD_TEST_WA_SIZE) || defined(__DOXYGEN__) +#define SHELL_CMD_TEST_WA_SIZE THD_WORKING_AREA_SIZE(256) +#endif + +#endif /* SHELLCONF_H */ + +/** @} */ diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/main.c b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/main.c new file mode 100644 index 00000000..93e86ecb --- /dev/null +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/main.c @@ -0,0 +1,99 @@ +/* + Copyright (C) 2021 Alex Lewontin + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ + +#include "hal.h" +#include "shcfg.h" + + +const SerialConfig shell_serial_cfg = { + .speed = 57600, + .mode = NUC123_SERIAL_MODE_DEFAULT, + .data = NUC123_SERIAL_DATA_8BITS, + .parity = NUC123_SERIAL_PARITY_N, + .stop = NUC123_SERIAL_STOP_1}; + + +/* + * Onboard LED blinker thread, times are in milliseconds. + */ +static THD_WORKING_AREA(waBlinkThread, 128); +static THD_FUNCTION(BlinkThread, arg) +{ + (void)arg; + chRegSetThreadName("blinker"); + while (true) { + systime_t time = 500; + OnboardLED_Toggle(); + chThdSleepMilliseconds(time); + } +} + +/* + * Application entry point. + */ +int main(void) +{ + /* + * System initializations. + * - HAL initialization, this also initializes the configured device drivers + * and performs the board-specific initializations. + * - Kernel initialization, the main() function becomes a thread and the + * RTOS is active. + */ + halInit(); + chSysInit(); + OnboardLED_Init(); + + /* + * Turn off the onboard LED. + */ + OnboardLED_Off(); + + chDbgSuspendTrace(CH_DBG_TRACE_MASK_SWITCH); + + /* + * Activates the serial driver. + */ + sdStart(&SHELL_SERIAL_DRIVER, &shell_serial_cfg); + + /* + * Shell manager initialization. + */ + shellInit(); + + + eflStart(&EFLD1, NULL); + EFLD1.bank = NUC123_EFL_BANK_DATAFLASH; + mfsObjectInit(&mfsd); + mfsStart(&mfsd, &mfsd_config); + + /* + * Creates the blinker thread. + */ + chThdCreateStatic( + waBlinkThread, sizeof(waBlinkThread), NORMALPRIO, BlinkThread, NULL); + + while (true) { + thread_t *shelltp = chThdCreateFromHeap(NULL, + SHELL_WA_SIZE, + "shell", + NORMALPRIO + 1, + shellThread, + (void *)&shell_cfg); + chThdWait(shelltp); /* Waiting termination. */ + chThdSleepMilliseconds(1000); + } +} diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/readme.txt b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/readme.txt new file mode 100644 index 00000000..4f693102 --- /dev/null +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/readme.txt @@ -0,0 +1,47 @@ +***************************************************************************** +** ChibiOS/HAL - EFL driver demo for NUC123. ** +***************************************************************************** + +** TARGET ** + +The demo runs on a NUTINY-SDK-NUC123-V2.0 board with a NUC123SD4AN0 MCU. + +** The Demo ** + +The application demonstrates the use of the NUC123 EFL driver. The test exposes +shell access via the SD0 serial port (configured to 57600 8N1), +accessible through the corresponding pins or via the on-board NuLinkMe. +That shell allows for 3 non-default commands: + + - kvs_put key value : This command stores value associated with key. + value is a string, and key is a numeric value + [1, MFS_CFG_MAX_RECORDS] + - kvs_get key : This command retrieves the value associated with + key. + - kvs_erase {--all|key} : This command either erases the value associated + with key, or all key value pairs. + +The data store should persist, even when the board loses power. Try restarting +the board and make sure the state is as you left it. + +** Board Setup ** + +To use an external serial interface: +- Attach a serial bus to pins 21-24, and the GND: + 21 - NUC123 RX + 22 - NUC123 TX + 23 - NUC123 nRTS (optional) + 24 - NUC123 nCTS (optional) +- Ensure that the interface is set to the same configuration as the demo + (by default 57600 8N1) + +To use the ICE's on-board USB-serial interface: +- Set SW2 1-4 to ON +- Connect a USB cable from a workstation to J5 + +** Build Procedure ** + +The demo has been tested using gcc version 10.2.1 (GNU Arm Embedded Toolchain 10-2020-q4-major). +Just modify the TRGT line in the makefile in order to use different GCC ports. + +** Notes ** diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/shcfg.c b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/shcfg.c new file mode 100644 index 00000000..7a15090f --- /dev/null +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/shcfg.c @@ -0,0 +1,112 @@ +/* + Copyright (C) 2021 Alex Lewontin + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ + +/** + * @file shcfg.c + * @brief Shell config. + * + * @addtogroup Shell + * @{ + */ +#include "hal.h" +#include "shcfg.h" +#include "chprintf.h" + +#include +#include + +MFSDriver mfsd; + +const MFSConfig mfsd_config = {.flashp = (BaseFlash *)&EFLD1, + .erased = 0xFFFFFFFF, + .bank0_sectors = 4, + .bank0_start = 0, + .bank1_sectors = 4, + .bank1_start = 4, + .bank_size = 2048}; + +void sh_kvs_put(BaseSequentialStream *chp, int argc, char *argv[]) { + if (argc < 2) { + chprintf(chp, "Format: kvs_put key [value]\nAt this time, key must be numeric.\n"); + return; + } + mfs_id_t rid = atoi(argv[0]); + if (rid < 1 || MFS_CFG_MAX_RECORDS < rid) { + chprintf(chp, "key must be [%d, %d].\n", 1, MFS_CFG_MAX_RECORDS); + return; + } + mfsWriteRecord(&mfsd, rid, strlen(argv[1]), (uint8_t *)argv[1]); +} + +void sh_kvs_get(BaseSequentialStream *chp, int argc, char *argv[]) { + if (argc < 1) { + chprintf(chp, + "Format: kvs_get key\nAt this time, key must be " + "numeric.\n"); + return; + } + mfs_id_t rid = atoi(argv[0]); + if (rid < 1 || MFS_CFG_MAX_RECORDS < rid) { + chprintf(chp, "key must be [%d, %d].\n", 1, MFS_CFG_MAX_RECORDS); + return; + } + + uint8_t buf[128]; + size_t n = 128; + mfs_error_t err = mfsReadRecord(&mfsd, rid, &n, buf); + switch (err) { + case MFS_WARN_GC: + case MFS_WARN_REPAIR: + case MFS_NO_ERROR: + chprintf(chp, "%.*s\n", n, buf); + break; + case MFS_ERR_NOT_FOUND: + chprintf(chp, "Record not found\n"); + break; + default: + chprintf(chp, "Unknown error reading record: %d\n", err); + } +} + +const char all_flag[] = "--all"; +void sh_kvs_erase(BaseSequentialStream *chp, int argc, char *argv[]) { + + if (argc < 1) { + chprintf(chp, + "Format: kvs_erase [%s] key\nAt this time, key must be" + "numeric.\n", all_flag); + return; + } + + if (strcmp(all_flag, argv[0]) == 0) { + mfsErase(&mfsd); + } else { + mfs_id_t rid = atoi(argv[0]); + if (rid < 1 || MFS_CFG_MAX_RECORDS < rid) { + chprintf(chp, "key must be [%d, %d].\n", 1, MFS_CFG_MAX_RECORDS); + return; + } + mfsEraseRecord(&mfsd, rid); + } + +} + +const ShellCommand commands[] = {{"kvs_put", sh_kvs_put}, + {"kvs_get", sh_kvs_get}, + {"kvs_erase", sh_kvs_erase}, + {NULL, NULL}}; + +const ShellConfig shell_cfg = {(BaseSequentialStream *)&SHELL_SERIAL_DRIVER, commands}; diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/shcfg.h b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/shcfg.h new file mode 100644 index 00000000..ef7ba44e --- /dev/null +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/shcfg.h @@ -0,0 +1,52 @@ +/* + Copyright (C) 2021 Alex Lewontin + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ + +/** + * @file shcfg.h + * @brief Shell config header. + * + * @addtogroup Shell + * @{ + */ + +#ifndef USBCFG_H +#define USBCFG_H + +#include "hal.h" +#include "hal_mfs.h" +#include "shell.h" + +#define SHELL_SERIAL_DRIVER SD0 + +#define SHELL_WA_SIZE THD_WORKING_AREA_SIZE(1024) + +#ifdef __cplusplus + extern "C" { +#endif + + extern const ShellConfig shell_cfg; + extern const ShellCommand commands[]; + + extern MFSDriver mfsd; + extern const MFSConfig mfsd_config; + +#ifdef __cplusplus +} +#endif + +#endif /* USBCFG_H */ + +/** @} */ From c328f805c2cceca386985193c964c36b13884e32 Mon Sep 17 00:00:00 2001 From: Alex Lewontin Date: Mon, 15 Feb 2021 11:35:01 -0500 Subject: [PATCH 4/5] NUC123: Added CONFIG enabling switch --- .../ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h | 4 ++++ os/hal/ports/NUMICRO/NUC123/hal_lld.c | 8 +++++-- os/hal/ports/NUMICRO/NUC123/hal_lld.h | 24 +++++++++++++++++-- .../NUTINY-SDK-NUC123-V2.0/EFL/cfg/mcuconf.h | 1 + 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h b/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h index 200955c2..c49c1499 100644 --- a/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h +++ b/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h @@ -96,6 +96,10 @@ /* Derived constants and error checks. */ /*===========================================================================*/ +#if (NUC123_EFL_ACCESS_DATAFLASH == TRUE) && (NUC123_CONFIG_ENABLED == FALSE) +#error "EFL driver data flash access requires NUC123_CONFIG_ENABLED to be set to TRUE" +#endif + /*===========================================================================*/ /* Driver data structures and types. */ /*===========================================================================*/ diff --git a/os/hal/ports/NUMICRO/NUC123/hal_lld.c b/os/hal/ports/NUMICRO/NUC123/hal_lld.c index 32862515..32548cb0 100644 --- a/os/hal/ports/NUMICRO/NUC123/hal_lld.c +++ b/os/hal/ports/NUMICRO/NUC123/hal_lld.c @@ -50,8 +50,12 @@ uint32_t SystemCoreClock = __HSI; /* System Clock Frequency (Core Clock)*/ uint32_t CyclesPerUs = (__HSI / 1000000); /* Cycles per micro second */ uint32_t PllClock = __HSI; /*!< PLL Clock Frequency */ -volatile const uint32_t config0 __attribute__((used, unused, section(".nuc123_config0"))) = NUC123_CONFIG0; -volatile const uint32_t config1 __attribute__((used, unused, section(".nuc123_config1"))) = NUC123_CONFIG1; +#if (NUC123_CONFIG_ENABLED == TRUE) + +static volatile const uint32_t config0 __attribute__((used, unused, section(".nuc123_config0"))) = NUC123_CONFIG0; +static volatile const uint32_t config1 __attribute__((used, unused, section(".nuc123_config1"))) = NUC123_CONFIG1; + +#endif /*===========================================================================*/ /* Driver local functions. */ diff --git a/os/hal/ports/NUMICRO/NUC123/hal_lld.h b/os/hal/ports/NUMICRO/NUC123/hal_lld.h index 7154ff55..7892c701 100644 --- a/os/hal/ports/NUMICRO/NUC123/hal_lld.h +++ b/os/hal/ports/NUMICRO/NUC123/hal_lld.h @@ -183,6 +183,13 @@ #define NUC123_HCLK 72000000UL #endif +/** + * @brief Enables the use of the CONFIG0/1 registers + */ +#if !defined(NUC123_CONFIG_ENABLED) || defined(__DOXYGEN__) +#define NUC123_CONFIG_ENABLED FALSE +#endif + /** * @brief Enables or disables data flash * @warning If data this is set to @p TRUE, the data flash @@ -191,10 +198,10 @@ * that the combination of the data flash & the text section still fit * into ROM. - * @note The default is @p FALSE. + * @note The default is @p TRUE. */ #if !defined(NUC123_DATAFLASH_ENABLED) || defined(__DOXYGEN__) -#define NUC123_DATAFLASH_ENABLED FALSE +#define NUC123_DATAFLASH_ENABLED TRUE #endif /** @@ -237,6 +244,19 @@ /* * Persistant configuration settings. */ + +#if (NUC123_CONFIG_ENABLED == FALSE) + +#if (NUC123_DATAFLASH_ENABLED == FALSE) +#error "Setting NUC123_DATAFLASH_ENABLED to FALSE requires NUC123_CONFIG_ENABLED to be TRUE" +#endif + +#if (NUC123_DATAFLASH_SIZE != 4096) +#error "Setting NUC123_DATAFLASH_SIZE to a value other than 4096 requires NUC123_CONFIG_ENABLED to be TRUE" +#endif + +#endif + #if (NUC123_DATAFLASH_ENABLED == TRUE) #if (NUC123_DATAFLASH_SIZE == 4096) diff --git a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/mcuconf.h b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/mcuconf.h index b7e52f87..08642c6b 100644 --- a/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/mcuconf.h +++ b/testhal/NUMICRO/NUC123/NUTINY-SDK-NUC123-V2.0/EFL/cfg/mcuconf.h @@ -29,6 +29,7 @@ #define NUC123_SERIAL_CLKSRC NUC123_SERIAL_CLKSRC_HSI +#define NUC123_CONFIG_ENABLED TRUE #define NUC123_DATAFLASH_ENABLED TRUE #define NUC123_DATAFLASH_SIZE 4096 #define NUC123_EFL_ACCESS_APROM TRUE From e4ae11e8c6eafafd067d9d0edf00b929b0c88c87 Mon Sep 17 00:00:00 2001 From: Alex Lewontin Date: Tue, 16 Feb 2021 12:40:10 -0500 Subject: [PATCH 5/5] NUC123: Dynamic CONFIG value read --- .../ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.c | 146 +++++++++++------- .../ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h | 4 - os/hal/ports/NUMICRO/NUC123/hal_lld.h | 55 ++++--- 3 files changed, 127 insertions(+), 78 deletions(-) diff --git a/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.c b/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.c index a2206e75..fed4e16f 100644 --- a/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.c +++ b/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.c @@ -42,13 +42,17 @@ #define NUC123_SECTOR_SIZE 0x200UL #define NUC123_LDROM_SIZE 0x1000UL -#define NUC123_APROM_SIZE (NUC123_FLASH_SIZE - NUC123_DATAFLASH_SIZE) #define NUC123_EFL_CMD_ERASE 0x22UL #define NUC123_EFL_CMD_PROG 0x21UL #define NUC123_EFL_CMD_READ 0UL #define NUC123_EFL_CMD_CHIPERASE 0x26UL /* Undocumented */ +#if ((NUC123_CONFIG_ENABLED == FALSE) || (NUC123_EFL_ACCESS_CONFIG == TRUE)) && \ + (NUC123_EFL_ACCESS_APROM == TRUE) && (NUC123_EFL_ACCESS_DATAFLASH == TRUE) +#define NUC123_EFL_DYNAMICALLY_CHECK_CONFIG TRUE +#endif + /*===========================================================================*/ /* Driver exported variables. */ /*===========================================================================*/ @@ -64,48 +68,7 @@ EFlashDriver EFLD1; /* Driver local variables and types. */ /*===========================================================================*/ -static const flash_descriptor_t efl_lld_descriptors[] = { -#if (NUC123_EFL_ACCESS_APROM == TRUE) || defined(__DOXYGEN__) - {.attributes = FLASH_ATTR_ERASED_IS_ONE | FLASH_ATTR_MEMORY_MAPPED | - FLASH_ATTR_REWRITABLE, - .page_size = NUC123_PAGE_SIZE, - .sectors_count = NUC123_APROM_SIZE / NUC123_SECTOR_SIZE, - .sectors = NULL, - .sectors_size = NUC123_SECTOR_SIZE, - .address = (uint8_t *)0, - .size = NUC123_APROM_SIZE}, -#endif -#if (NUC123_EFL_ACCESS_DATAFLASH == TRUE) || defined(__DOXYGEN__) - {.attributes = FLASH_ATTR_ERASED_IS_ONE | FLASH_ATTR_MEMORY_MAPPED | - FLASH_ATTR_REWRITABLE, - .page_size = NUC123_PAGE_SIZE, - .sectors_count = NUC123_DATAFLASH_SIZE / NUC123_SECTOR_SIZE, - .sectors = NULL, - .sectors_size = NUC123_SECTOR_SIZE, - .address = (uint8_t *)NUC123_DFBADDR, - .size = NUC123_DATAFLASH_SIZE}, -#endif -#if (NUC123_EFL_ACCESS_LDROM == TRUE) || defined(__DOXYGEN__) - {.attributes = FLASH_ATTR_ERASED_IS_ONE | FLASH_ATTR_MEMORY_MAPPED | - FLASH_ATTR_REWRITABLE, - .page_size = NUC123_PAGE_SIZE, - .sectors_count = NUC123_LDROM_SIZE / NUC123_SECTOR_SIZE, - .sectors = NULL, - .sectors_size = NUC123_SECTOR_SIZE, - .address = (uint8_t *)0x100000, - .size = NUC123_LDROM_SIZE}, -#endif -#if (NUC123_EFL_ACCESS_CONFIG == TRUE) || defined(__DOXYGEN__) - {.attributes = FLASH_ATTR_ERASED_IS_ONE | FLASH_ATTR_MEMORY_MAPPED | - FLASH_ATTR_REWRITABLE, - .page_size = NUC123_PAGE_SIZE, - .sectors_count = 1, - .sectors = NULL, - .sectors_size = NUC123_SECTOR_SIZE, - .address = (uint8_t *)0x300000, - .size = 8}, -#endif -}; +static flash_descriptor_t efl_lld_descriptor; /*===========================================================================*/ /* Driver local functions. */ @@ -164,6 +127,13 @@ static inline unsigned min(unsigned x, unsigned y) */ void efl_lld_init(void) { + efl_lld_descriptor = (flash_descriptor_t){ + .attributes = FLASH_ATTR_ERASED_IS_ONE | FLASH_ATTR_MEMORY_MAPPED | + FLASH_ATTR_REWRITABLE, + .page_size = NUC123_PAGE_SIZE, + .sectors = NULL, + .sectors_size = NUC123_SECTOR_SIZE, + }; #if (NUC123_EFL_USE_EFL1 == TRUE) eflObjectInit(&EFLD1); @@ -256,7 +226,79 @@ void efl_lld_stop(EFlashDriver* eflp) */ const flash_descriptor_t* efl_lld_get_descriptor(void* instance) { - return efl_lld_descriptors + ((EFlashDriver *)instance)->bank; + size_t dataflash_size; + void* dfbaddr; + +#if (NUC123_EFL_DYNAMICALLY_CHECK_CONFIG == TRUE) + + uint32_t ispcon = FMC->ISPCON; + + FMC->ISPCON = ispcon | FMC_ISPCON_CFGUEN_Msk; + FMC->ISPCMD = NUC123_EFL_CMD_READ; + + FMC->ISPADR = 0x300000UL; + do_ISP(); + dataflash_size = FMC->ISPDAT; + + if (dataflash_size & 4) { + /* DFVSEN = 1 */ + dataflash_size = 4096; + dfbaddr = (void *)0x1F000UL; + } else { + if (dataflash_size & 1) { + /* DFVSEN = 0 & DFEN = 1 */ + dataflash_size = 0; + dfbaddr = (void *)0xFFFFF000UL; + } else { + /* DFVSEN = 0 & DFEN = 0 */ + dfbaddr = (void *)FMC->DFBADR; + dataflash_size = NUC123_FLASH_SIZE - (uint32_t)dfbaddr; + } + } + + FMC->ISPCON = ispcon; + +#else + + dataflash_size = NUC123_CONFIG_DATAFLASH_SIZE; + dfbaddr = NUC123_DFBADDR; + +#endif + + switch (((EFlashDriver *)instance)->bank) { +#if (NUC123_EFL_ACCESS_APROM == TRUE) + case NUC123_EFL_BANK_APROM: + efl_lld_descriptor.address = (uint8_t *)0; + efl_lld_descriptor.sectors_count = (NUC123_FLASH_SIZE - dataflash_size) / NUC123_SECTOR_SIZE; + efl_lld_descriptor.size = (NUC123_FLASH_SIZE - dataflash_size); + break; +#endif +#if (NUC123_EFL_ACCESS_DATAFLASH == TRUE) + case NUC123_EFL_BANK_DATAFLASH: + efl_lld_descriptor.address = (uint8_t *)dfbaddr; + efl_lld_descriptor.sectors_count = dataflash_size / NUC123_SECTOR_SIZE; + efl_lld_descriptor.size = dataflash_size; + break; +#endif +#if (NUC123_EFL_ACCESS_LDROM == TRUE) + case NUC123_EFL_BANK_LDROM: + efl_lld_descriptor.address = (uint8_t *)0x100000; + efl_lld_descriptor.sectors_count = NUC123_LDROM_SIZE / NUC123_SECTOR_SIZE; + efl_lld_descriptor.size = NUC123_LDROM_SIZE; + break; +#endif +#if (NUC123_EFL_ACCESS_CONFIG == TRUE) + case NUC123_EFL_BANK_CONFIG: + efl_lld_descriptor.address = (uint8_t *)0x300000; + efl_lld_descriptor.sectors_count = 1; + efl_lld_descriptor.size = 8; + break; +#endif + case NUC123_EFL_BANK_NONE: + default: + return NULL; + } + return &efl_lld_descriptor; } /** @@ -274,16 +316,16 @@ const flash_descriptor_t* efl_lld_get_descriptor(void* instance) * * @notapi */ -flash_error_t efl_lld_read(void* instance, flash_offset_t offset, size_t n, uint8_t* rp) +flash_error_t efl_lld_read(void *instance, flash_offset_t offset, size_t n, uint8_t *rp) { - EFlashDriver* devp = (EFlashDriver*)instance; + EFlashDriver *devp = (EFlashDriver *)instance; const flash_descriptor_t *desc = efl_lld_get_descriptor(instance); - flash_error_t err = FLASH_NO_ERROR; - uint32_t data; + flash_error_t err = FLASH_NO_ERROR; + uint32_t data; osalDbgCheck((instance != NULL) && (rp != NULL) && (n > 0U)); osalDbgCheck(((size_t)offset + n) <= (size_t)desc->size); - osalDbgAssert((devp->state == FLASH_READY) || (devp->state == FLASH_ERASE), + osalDbgAssert((devp->state == FLASH_READY) || (devp->state == FLASH_ERASE), "invalid state"); /* No reading while erasing.*/ @@ -327,10 +369,10 @@ flash_error_t efl_lld_read(void* instance, flash_offset_t offset, size_t n, uint offset += (4 - (offset % 4)); } - /* Ready state again.*/ - devp->state = FLASH_READY; + /* Ready state again.*/ + devp->state = FLASH_READY; - return err; + return err; } /** diff --git a/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h b/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h index c49c1499..200955c2 100644 --- a/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h +++ b/os/hal/ports/NUMICRO/LLD/FLASHv1/hal_efl_lld.h @@ -96,10 +96,6 @@ /* Derived constants and error checks. */ /*===========================================================================*/ -#if (NUC123_EFL_ACCESS_DATAFLASH == TRUE) && (NUC123_CONFIG_ENABLED == FALSE) -#error "EFL driver data flash access requires NUC123_CONFIG_ENABLED to be set to TRUE" -#endif - /*===========================================================================*/ /* Driver data structures and types. */ /*===========================================================================*/ diff --git a/os/hal/ports/NUMICRO/NUC123/hal_lld.h b/os/hal/ports/NUMICRO/NUC123/hal_lld.h index 7892c701..8b6f3b06 100644 --- a/os/hal/ports/NUMICRO/NUC123/hal_lld.h +++ b/os/hal/ports/NUMICRO/NUC123/hal_lld.h @@ -190,6 +190,7 @@ #define NUC123_CONFIG_ENABLED FALSE #endif +#if (NUC123_CONFIG_ENABLED == TRUE) /** * @brief Enables or disables data flash * @warning If data this is set to @p TRUE, the data flash @@ -200,17 +201,19 @@ * @note The default is @p TRUE. */ -#if !defined(NUC123_DATAFLASH_ENABLED) || defined(__DOXYGEN__) -#define NUC123_DATAFLASH_ENABLED TRUE +#if !defined(NUC123_CONFIG_DATAFLASH_ENABLED) || defined(__DOXYGEN__) +#define NUC123_CONFIG_DATAFLASH_ENABLED TRUE #endif /** * @brief Sets the data flash size. This is ignored if data flash is disabled. */ -#if !defined(NUC123_DATAFLASH_SIZE) || defined(__DOXYGEN__) -#define NUC123_DATAFLASH_SIZE 4096 +#if !defined(NUC123_CONFIG_DATAFLASH_SIZE) || defined(__DOXYGEN__) +#define NUC123_CONFIG_DATAFLASH_SIZE 4096 #endif +#endif /* NUC123_CONFIG_ENABLED == TRUE */ + /** @} */ /*===========================================================================*/ @@ -245,41 +248,49 @@ * Persistant configuration settings. */ -#if (NUC123_CONFIG_ENABLED == FALSE) +#if (NUC123_CONFIG_ENABLED == TRUE) -#if (NUC123_DATAFLASH_ENABLED == FALSE) -#error "Setting NUC123_DATAFLASH_ENABLED to FALSE requires NUC123_CONFIG_ENABLED to be TRUE" -#endif +#if (NUC123_CONFIG_DATAFLASH_ENABLED == TRUE) -#if (NUC123_DATAFLASH_SIZE != 4096) -#error "Setting NUC123_DATAFLASH_SIZE to a value other than 4096 requires NUC123_CONFIG_ENABLED to be TRUE" -#endif - -#endif - -#if (NUC123_DATAFLASH_ENABLED == TRUE) - -#if (NUC123_DATAFLASH_SIZE == 4096) +#if (NUC123_CONFIG_DATAFLASH_SIZE == 4096) /* DFVSEN = 1, nothing else matters */ #define NUC123_CONFIG0_DATAFLASH 0UL /* NUC123_DFBADDR doesn't actually control anything here, but convenient for flash drivers which need the starting address */ #define NUC123_DFBADDR 0x1F000UL -#else +#else /* NUC123_CONFIG_DATAFLASH_SIZE != 4096 */ /* DFVSEN = 0, DFEN = 0 */ #define NUC123_CONFIG0_DATAFLASH (NUC123_CONFIG0_DFVSEN_Msk | NUC123_CONFIG0_DFEN_Msk) -#define NUC123_DFBADDR ((0x11000UL - NUC123_DATAFLASH_SIZE) & ~(0xFFUL)) -#endif -#else +#define NUC123_DFBADDR ((0x11000UL - NUC123_CONFIG_DATAFLASH_SIZE) & ~(0xFFUL)) +#endif /* NUC123_CONFIG_DATAFLASH_SIZE ?= 4096 */ +#else /* NUC123_CONFIG_DATAFLASH_ENABLED == TRUE/FALSE */ + +#undef NUC123_CONFIG_DATAFLASH_SIZE +#define NUC123_CONFIG_DATAFLASH_SIZE 0 /* DFVSEN = 0, DFEN = 1 */ #define NUC123_CONFIG0_DATAFLASH NUC123_CONFIG0_DFVSEN_Msk #define NUC123_DFBADDR 0xFFFFFF00UL -#endif + +#endif /* NUC123_CONFIG_DATAFLASH_ENABLED == TRUE/FALSE */ #define NUC123_CONFIG0 \ 0xFFFFFFFFUL & (~NUC123_CONFIG0_DATAFLASH) & (~NUC123_CONFIG0_HSE_PINS) #define NUC123_CONFIG1 NUC123_DFBADDR +#else /* NUC123_CONFIG_ENABLED == FALSE */ + +#if defined(NUC123_CONFIG_DATAFLASH_ENABLED) +#error \ + "Defining NUC123_CONFIG_DATAFLASH_ENABLED requires NUC123_CONFIG_ENABLED to be TRUE" +#endif + +#if defined(NUC123_CONFIG_DATAFLASH_SIZE) +#error \ + "Defining NUC123_CONFIG_DATAFLASH_SIZE requires NUC123_CONFIG_ENABLED to be TRUE" +#endif + +#endif /* NUC123_CONFIG_ENABLED == TRUE/FALSE */ + /*===========================================================================*/ /* Driver data structures and types. */ /*===========================================================================*/