Merge pull request #262 from alexclewontin/nuc123-kvs-example
[NUC123] EFL subsystem driver, and updated flash control
This commit is contained in:
commit
a9297a6b34
|
@ -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).*/
|
||||
|
||||
|
|
|
@ -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
|
|
@ -0,0 +1,690 @@
|
|||
/*
|
||||
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_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. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief EFL1 driver identifier.
|
||||
*/
|
||||
#if (NUC123_EFL_USE_EFL1 == TRUE) || defined(__DOXYGEN__)
|
||||
EFlashDriver EFLD1;
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local variables and types. */
|
||||
/*===========================================================================*/
|
||||
|
||||
static flash_descriptor_t efl_lld_descriptor;
|
||||
|
||||
/*===========================================================================*/
|
||||
/* 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)
|
||||
{
|
||||
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);
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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 */
|
||||
|
||||
/** @} */
|
|
@ -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 */
|
||||
|
||||
/** @} */
|
|
@ -50,6 +50,13 @@ 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 */
|
||||
|
||||
#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. */
|
||||
/*===========================================================================*/
|
||||
|
|
|
@ -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
|
||||
|
@ -114,6 +115,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 +177,43 @@
|
|||
#endif
|
||||
|
||||
/**
|
||||
* @brief Clock source for the PLL.
|
||||
* @brief Core clock speed.
|
||||
*/
|
||||
#if !defined(NUC123_HCLK) || defined(__DOXYGEN__)
|
||||
#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
|
||||
|
||||
#if (NUC123_CONFIG_ENABLED == TRUE)
|
||||
/**
|
||||
* @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 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_CONFIG_DATAFLASH_SIZE) || defined(__DOXYGEN__)
|
||||
#define NUC123_CONFIG_DATAFLASH_SIZE 4096
|
||||
#endif
|
||||
|
||||
#endif /* NUC123_CONFIG_ENABLED == TRUE */
|
||||
|
||||
/** @} */
|
||||
|
||||
/*===========================================================================*/
|
||||
|
@ -187,10 +237,60 @@
|
|||
#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_CONFIG_ENABLED == TRUE)
|
||||
|
||||
#if (NUC123_CONFIG_DATAFLASH_ENABLED == TRUE)
|
||||
|
||||
#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 /* 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_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 /* 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. */
|
||||
/*===========================================================================*/
|
||||
|
@ -198,6 +298,7 @@
|
|||
/*===========================================================================*/
|
||||
/* Driver macros. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/* Alias for compatibility */
|
||||
#define SystemUnlockReg() UNLOCKREG()
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
##############################################################################
|
|
@ -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 */
|
||||
|
||||
/** @} */
|
|
@ -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 */
|
||||
|
||||
/** @} */
|
|
@ -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 */
|
||||
|
||||
/** @} */
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
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_CONFIG_ENABLED TRUE
|
||||
#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_ */
|
|
@ -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.
|
||||
*/
|
|
@ -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 */
|
||||
|
||||
/** @} */
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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 **
|
|
@ -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 <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
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};
|
|
@ -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 */
|
||||
|
||||
/** @} */
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
||||
#
|
||||
|
|
Loading…
Reference in New Issue