Merge pull request #239 from alexclewontin/nuc123-serial-driver
[NUC123] Serial driver
This commit is contained in:
commit
fe9ac17b74
|
@ -0,0 +1,13 @@
|
|||
ifeq ($(USE_SMART_BUILD),yes)
|
||||
ifneq ($(findstring HAL_USE_SERIAL TRUE,$(HALCONF)),)
|
||||
PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/SERIALv1/hal_serial_lld.c
|
||||
endif
|
||||
# ifneq ($(findstring HAL_USE_UART TRUE,$(HALCONF)),)
|
||||
# PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLDSERIALv1/hal_uart_lld.c
|
||||
# endif
|
||||
else
|
||||
PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/SERIALv1/hal_serial_lld.c
|
||||
# PLATFORMSRC += $(CHIBIOS)/os/hal/ports/NUMICRO/LLD/SERIALv1/hal_uart_lld.c
|
||||
endif
|
||||
|
||||
PLATFORMINC += $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/SERIALv1
|
|
@ -0,0 +1,475 @@
|
|||
/*
|
||||
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_serial_lld.c
|
||||
* @brief NUC123 serial subsystem low level driver source.
|
||||
*
|
||||
* @addtogroup SERIAL
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "hal.h"
|
||||
|
||||
#if (HAL_USE_SERIAL) || defined(__DOXYGEN__)
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local definitions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#define NUC123_BRD_MAX 0xFFFFUL
|
||||
#define NUC123_DIVIDER_X_MAX 0xF
|
||||
|
||||
#define NUC123_BRD_MODE0 ((0UL << UART_BAUD_DIV_X_EN_Pos) | (0UL << UART_BAUD_DIV_X_ONE_Pos))
|
||||
#define NUC123_BRD_MODE1 ((1UL << UART_BAUD_DIV_X_EN_Pos) | (0UL << UART_BAUD_DIV_X_ONE_Pos))
|
||||
#define NUC123_BRD_MODE2 ((1UL << UART_BAUD_DIV_X_EN_Pos) | (1UL << UART_BAUD_DIV_X_ONE_Pos))
|
||||
|
||||
/* Initially, these may not be defined in the header file so that they are not
|
||||
used while unsupported. They are defined here because they are needed for safety
|
||||
checks internally. When they are eventually
|
||||
defined in the header file, they can be removed here */
|
||||
#if !defined(NUC123_SERIAL_MODE_IrDA)
|
||||
#define NUC123_SERIAL_MODE_IrDA (2UL << UART_FUN_SEL_FUN_SEL_Pos)
|
||||
#endif
|
||||
|
||||
#if !defined(NUC123_SERIAL_MODE_RS485)
|
||||
#define NUC123_SERIAL_MODE_RS485 (3UL << UART_FUN_SEL_FUN_SEL_Pos)
|
||||
#endif
|
||||
|
||||
#define UART1_nCTS_PinSelect() \
|
||||
do { \
|
||||
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB7_MFP1_Msk; \
|
||||
SYS->GPB_MFP |= (1 << 7); \
|
||||
} while (0)
|
||||
|
||||
#define UART1_nCTS_PinUnselect() \
|
||||
do { \
|
||||
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB7_MFP1_Msk; \
|
||||
SYS->GPB_MFP &= ~(1 << 7); \
|
||||
} while (0)
|
||||
|
||||
#define UART1_nRTS_PinSelect() \
|
||||
do { \
|
||||
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB6_MFP1_Msk; \
|
||||
SYS->GPB_MFP |= (1 << 6); \
|
||||
} while (0)
|
||||
|
||||
#define UART1_nRTS_PinUnselect() \
|
||||
do { \
|
||||
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB6_MFP1_Msk; \
|
||||
SYS->GPB_MFP &= ~(1 << 6); \
|
||||
} while (0)
|
||||
|
||||
#define UART1_TXD_PinSelect() \
|
||||
do { \
|
||||
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB5_MFP1_Msk; \
|
||||
SYS->GPB_MFP |= (1 << 5); \
|
||||
} while (0)
|
||||
|
||||
#define UART1_TXD_PinUnselect() \
|
||||
do { \
|
||||
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB5_MFP1_Msk; \
|
||||
SYS->GPB_MFP &= ~(1 << 5); \
|
||||
} while (0)
|
||||
|
||||
#define UART1_RXD_PinSelect() \
|
||||
do { \
|
||||
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB4_MFP1_Msk; \
|
||||
SYS->GPB_MFP |= (1 << 4); \
|
||||
} while (0)
|
||||
|
||||
#define UART1_RXD_PinUnselect() \
|
||||
do { \
|
||||
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB4_MFP1_Msk; \
|
||||
SYS->GPB_MFP &= ~(1 << 4); \
|
||||
} while (0)
|
||||
|
||||
#define UART0_nCTS_PinSelect() \
|
||||
do { \
|
||||
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB3_MFP1_Msk; \
|
||||
SYS->GPB_MFP |= (1 << 3); \
|
||||
} while (0)
|
||||
|
||||
#define UART0_nCTS_PinUnselect() \
|
||||
do { \
|
||||
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB3_MFP1_Msk; \
|
||||
SYS->GPB_MFP &= ~(1 << 3); \
|
||||
} while (0)
|
||||
|
||||
#define UART0_nRTS_PinSelect() \
|
||||
do { \
|
||||
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB2_MFP1_Msk; \
|
||||
SYS->GPB_MFP |= (1 << 2); \
|
||||
} while (0)
|
||||
|
||||
#define UART0_nRTS_PinUnselect() \
|
||||
do { \
|
||||
SYS->ALT_MFP &= ~SYS_ALT_MFP_PB2_MFP1_Msk; \
|
||||
SYS->GPB_MFP &= ~(1 << 2); \
|
||||
} while (0)
|
||||
|
||||
#define UART0_TXD_PinSelect() \
|
||||
do { \
|
||||
SYS->GPB_MFP |= (1 << 1); \
|
||||
} while (0)
|
||||
|
||||
#define UART0_TXD_PinUnselect() \
|
||||
do { \
|
||||
SYS->GPB_MFP &= ~(1 << 1); \
|
||||
} while (0)
|
||||
|
||||
#define UART0_RXD_PinSelect() \
|
||||
do { \
|
||||
SYS->GPB_MFP |= (1 << 0); \
|
||||
} while (0)
|
||||
|
||||
#define UART0_RXD_PinUnselect() \
|
||||
do { \
|
||||
SYS->GPB_MFP &= ~(1 << 0); \
|
||||
} while (0)
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported variables. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/** @brief UART0 serial driver identifier.*/
|
||||
#if (NUC123_SERIAL_USE_UART0) || defined(__DOXYGEN__)
|
||||
SerialDriver SD0;
|
||||
#endif
|
||||
|
||||
/** @brief UART1 serial driver identifier.*/
|
||||
#if (NUC123_SERIAL_USE_UART1) || defined(__DOXYGEN__)
|
||||
SerialDriver SD1;
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local variables and types. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Driver default configuration.
|
||||
*/
|
||||
static const SerialConfig default_config = {SERIAL_DEFAULT_BITRATE,
|
||||
NUC123_SERIAL_MODE_DEFAULT,
|
||||
NUC123_SERIAL_DATA_8BITS,
|
||||
NUC123_SERIAL_PARITY_N,
|
||||
NUC123_SERIAL_STOP_1};
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Shared IRQ handler.
|
||||
*
|
||||
* @param[in] gptp pointer to a @p GPTDriver object
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
static void serial_lld_serve_interrupt(SerialDriver* sdp)
|
||||
{
|
||||
/* For now, this assumes UART mode */
|
||||
uint32_t isr = sdp->uart->ISR;
|
||||
uint32_t fsr = sdp->uart->FSR;
|
||||
|
||||
if (isr & (UART_ISR_RLS_IF_Msk | UART_ISR_BUF_ERR_IF_Msk)) {
|
||||
osalSysLockFromISR();
|
||||
|
||||
if (fsr & UART_FSR_BIF_Msk) {
|
||||
chnAddFlagsI(sdp, SD_BREAK_DETECTED);
|
||||
}
|
||||
|
||||
if (fsr & UART_FSR_FEF_Msk) {
|
||||
chnAddFlagsI(sdp, SD_FRAMING_ERROR);
|
||||
}
|
||||
|
||||
if (fsr & UART_FSR_PEF_Msk) {
|
||||
chnAddFlagsI(sdp, SD_PARITY_ERROR);
|
||||
}
|
||||
|
||||
if (fsr & UART_FSR_RX_OVER_IF_Msk) {
|
||||
chnAddFlagsI(sdp, SD_OVERRUN_ERROR);
|
||||
}
|
||||
|
||||
/* Technically, a TX_OVER would trigger BUFF_ERR, and reach this code.
|
||||
We'll come back to how to handle that.
|
||||
*/
|
||||
|
||||
sdp->uart->FSR |=
|
||||
(UART_FSR_BIF_Msk | UART_FSR_FEF_Msk | UART_FSR_PEF_Msk | UART_FSR_RX_OVER_IF_Msk);
|
||||
osalSysUnlockFromISR();
|
||||
}
|
||||
|
||||
osalSysLockFromISR();
|
||||
while (!(sdp->uart->FSR & UART_FSR_RX_EMPTY_Msk)) {
|
||||
/* Originally
|
||||
sdIncomingDataI(sdp, sdp->uart->RBR);
|
||||
copied as per instructions in hal_serial.c for performance gain */
|
||||
osalDbgCheckClassI();
|
||||
osalDbgCheck(sdp != NULL);
|
||||
|
||||
if (iqIsEmptyI(&sdp->iqueue))
|
||||
chnAddFlagsI(sdp, CHN_INPUT_AVAILABLE);
|
||||
if (iqPutI(&sdp->iqueue, sdp->uart->RBR) < MSG_OK)
|
||||
chnAddFlagsI(sdp, SD_QUEUE_FULL_ERROR);
|
||||
}
|
||||
osalSysUnlockFromISR();
|
||||
|
||||
osalSysLockFromISR();
|
||||
while (!(sdp->uart->FSR & UART_FSR_TX_FULL_Msk)) {
|
||||
msg_t b = oqGetI(&(sdp->oqueue));
|
||||
if (b < MSG_OK) {
|
||||
chnAddFlagsI(sdp, CHN_OUTPUT_EMPTY);
|
||||
sdp->uart->IER &= ~(UART_IER_THRE_IEN_Msk);
|
||||
break;
|
||||
}
|
||||
sdp->uart->THR = b;
|
||||
}
|
||||
chnAddFlagsI(sdp, CHN_TRANSMISSION_END);
|
||||
osalSysUnlockFromISR();
|
||||
|
||||
}
|
||||
|
||||
#if NUC123_SERIAL_USE_UART0 || defined(__DOXYGEN__)
|
||||
static void notify0(io_queue_t* qp)
|
||||
{
|
||||
(void)qp;
|
||||
UART0->IER |= UART_IER_THRE_IEN_Msk;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if NUC123_SERIAL_USE_UART1 || defined(__DOXYGEN__)
|
||||
static void notify1(io_queue_t* qp)
|
||||
{
|
||||
(void)qp;
|
||||
UART1->IER |= UART_IER_THRE_IEN_Msk;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver interrupt handlers. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief UART0 interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
#if NUC123_SERIAL_USE_UART0 || defined(__DOXYGEN__)
|
||||
|
||||
OSAL_IRQ_HANDLER(NUC123_UART0_HANDLER)
|
||||
{
|
||||
OSAL_IRQ_PROLOGUE();
|
||||
serial_lld_serve_interrupt(&SD0);
|
||||
OSAL_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief UART1 interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
#if NUC123_SERIAL_USE_UART1 || defined(__DOXYGEN__)
|
||||
|
||||
OSAL_IRQ_HANDLER(NUC123_UART1_HANDLER)
|
||||
{
|
||||
OSAL_IRQ_PROLOGUE();
|
||||
serial_lld_serve_interrupt(&SD1);
|
||||
OSAL_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Low level serial driver initialization.
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void sd_lld_init(void)
|
||||
{
|
||||
|
||||
#if NUC123_SERIAL_USE_UART0
|
||||
sdObjectInit(&SD0, NULL, notify0);
|
||||
/* Select UART0 Pins */
|
||||
SYS->ALT_MFP &= ~(SYS_ALT_MFP_PB3_MFP1_Msk | SYS_ALT_MFP_PB3_MFP1_Msk);
|
||||
SYS->GPB_MFP |= 0x0FUL;
|
||||
SD0.uart = UART0;
|
||||
#endif
|
||||
|
||||
#if NUC123_SERIAL_USE_UART1
|
||||
sdObjectInit(&SD1, NULL, notify1);
|
||||
/* Select UART1 Pins */
|
||||
SYS->ALT_MFP &= ~(SYS_ALT_MFP_PB7_MFP1_Msk | SYS_ALT_MFP_PB6_MFP1_Msk |
|
||||
SYS_ALT_MFP_PB5_MFP1_Msk | SYS_ALT_MFP_PB4_MFP1_Msk);
|
||||
SYS->GPB_MFP |= 0xF0UL;
|
||||
SD1.uart = UART1;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Low level serial driver configuration and (re)start.
|
||||
*
|
||||
* @param[in] sdp pointer to a @p SerialDriver object
|
||||
* @param[in] config the architecture-dependent serial driver configuration.
|
||||
* If this parameter is set to @p NULL then a default
|
||||
* configuration is used.
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void sd_lld_start(SerialDriver* sdp, const SerialConfig* config)
|
||||
{
|
||||
|
||||
if (!config) {
|
||||
config = &default_config;
|
||||
}
|
||||
|
||||
if (sdp->state == SD_STOP) {
|
||||
#if NUC123_SERIAL_USE_UART0
|
||||
if (&SD0 == sdp) {
|
||||
CLK->APBCLK |= CLK_APBCLK_UART0_EN_Msk;
|
||||
CLK->CLKSEL1 = (CLK->CLKSEL1 & ~(CLK_CLKSEL1_UART_S_Msk)) | NUC123_SERIAL_CLKSRC;
|
||||
nvicEnableVector(UART0_IRQn, NUC123_SERIAL_UART0_IRQ_PRIORITY);
|
||||
SYS->IPRSTC2 |= SYS_IPRSTC2_UART0_RST_Msk;
|
||||
SYS->IPRSTC2 &= ~(SYS_IPRSTC2_UART0_RST_Msk);
|
||||
}
|
||||
#endif
|
||||
#if NUC123_SERIAL_USE_UART1
|
||||
if (&SD1 == sdp) {
|
||||
CLK->APBCLK |= CLK_APBCLK_UART1_EN_Msk;
|
||||
nvicEnableVector(NUC123_UART1_IRQn, NUC123_SERIAL_UART1_IRQ_PRIORITY);
|
||||
SYS->IPRSTC2 |= SYS_IPRSTC2_UART1_RST_Msk;
|
||||
SYS->IPRSTC2 &= ~(SYS_IPRSTC2_UART1_RST_Msk);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Configures the peripheral.*/
|
||||
|
||||
osalDbgAssert((NUC123_SERIAL_CLK % config->speed == 0),
|
||||
"NUC123_SERIAL_CLK % config->speed must be 0 or speed cannot be generated");
|
||||
uint32_t baud_found = false;
|
||||
|
||||
/* Speed is controlled by the expression
|
||||
BAUD = UART_CLK / (m * (BRD + 2))
|
||||
Here, baud_denom represents the (m * (BRD + 2)) part of the expression */
|
||||
uint32_t baud_denom = (NUC123_SERIAL_CLK / config->speed);
|
||||
|
||||
/* Mode 0: m = 16 */
|
||||
if ((baud_denom % 16 == 0) && (((baud_denom / 16) - 2) <= NUC123_BRD_MAX)) {
|
||||
sdp->uart->BAUD = NUC123_BRD_MODE0 | ((baud_denom / 16) - 2);
|
||||
baud_found = true;
|
||||
}
|
||||
|
||||
/* If the peripheral is in IrDA mode, it can only use baud generation mode 0 */
|
||||
else if (config->mode != NUC123_SERIAL_MODE_IrDA) {
|
||||
|
||||
/* Mode 2: m = 1. The exact behavior of mode 2 varies depending on
|
||||
a) the model of the chip
|
||||
b) UART_CLK relative to HCLK
|
||||
*/
|
||||
#if defined(NUC123xxxANx)
|
||||
#if NUC123_SERIAL_CLK <= NUC123_HCLK
|
||||
if ((9 <= (baud_denom - 2)) && ((baud_denom - 2) <= NUC123_BRD_MAX)) {
|
||||
sdp->uart->BAUD = NUC123_BRD_MODE2 | (baud_denom - 2);
|
||||
baud_found = true;
|
||||
}
|
||||
#elif NUC123_SERIAL_CLK <= (2 * NUC123_HCLK)
|
||||
if ((15 <= (baud_denom - 2)) && ((baud_denom - 2) <= NUC123_BRD_MAX)) {
|
||||
sdp->uart->BAUD = NUC123_BRD_MODE2 | (baud_denom - 2);
|
||||
baud_found = true;
|
||||
}
|
||||
#elif NUC123_SERIAL_CLK <= (3 * NUC123_HCLK)
|
||||
if ((21 <= (baud_denom - 2)) && ((baud_denom - 2) <= NUC123_BRD_MAX)) {
|
||||
sdp->uart->BAUD = NUC123_BRD_MODE2 | (baud_denom - 2);
|
||||
baud_found = true;
|
||||
}
|
||||
#else
|
||||
/* Dummy statement to prevent an orphaned else at the begining of the Mode 1 block */
|
||||
if (FALSE) {
|
||||
}
|
||||
#endif
|
||||
#elif defined(NUC123xxxAEx)
|
||||
/* TODO: Implement the specific requirements for the AE series */
|
||||
/* Dummy statement to prevent an orphaned else at the begining of the Mode 1 block */
|
||||
if (FALSE) {
|
||||
}
|
||||
#endif
|
||||
/* Mode 1: m = (DIVIDER_X + 1), 8 <= DIVIDER_X <= 16 */
|
||||
else {
|
||||
for (uint32_t m = 9; m <= (NUC123_DIVIDER_X_MAX + 1); ++m) {
|
||||
if ((baud_denom % m == 0) && ((baud_denom / m) - 2 <= NUC123_BRD_MAX)) {
|
||||
sdp->uart->BAUD =
|
||||
NUC123_BRD_MODE1 | ((m - 1) << UART_BAUD_DIVIDER_X_Pos) | ((baud_denom / m) - 2);
|
||||
baud_found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If we couldn't generate the desired frequency from any of the available modes, halt */
|
||||
osalDbgCheck(baud_found);
|
||||
|
||||
sdp->uart->FUN_SEL = config->mode & UART_FUN_SEL_FUN_SEL_Msk;
|
||||
sdp->uart->LCR = config->data | config->parity | config->stop;
|
||||
sdp->uart->IER = UART_IER_RLS_IEN_Msk | UART_IER_RDA_IEN_Msk | UART_IER_BUF_ERR_IEN_Msk;
|
||||
sdp->uart->FCR &= ~UART_FCR_RFITL_Msk;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Low level serial driver stop.
|
||||
* @details De-initializes the USART, stops the associated clock, resets the
|
||||
* interrupt vector.
|
||||
*
|
||||
* @param[in] sdp pointer to a @p SerialDriver object
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void sd_lld_stop(SerialDriver* sdp)
|
||||
{
|
||||
|
||||
if (sdp->state == SD_READY) {
|
||||
#if NUC123_SERIAL_USE_UART0
|
||||
if (&SD0 == sdp) {
|
||||
CLK->APBCLK &= ~CLK_APBCLK_UART0_EN_Msk;
|
||||
nvicDisableVector(UART0_IRQn);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if NUC123_SERIAL_USE_UART1
|
||||
if (&SD1 == sdp) {
|
||||
CLK->APBCLK &= ~CLK_APBCLK_UART1_EN_Msk;
|
||||
nvicDisableVector(NUC123_UART1_IRQn);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
sdp->uart->FUN_SEL = 0;
|
||||
sdp->uart->LCR = 0;
|
||||
sdp->uart->BAUD = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* HAL_USE_SERIAL */
|
||||
|
||||
/** @} */
|
|
@ -0,0 +1,228 @@
|
|||
/*
|
||||
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_serial_lld.h
|
||||
* @brief NUC123 serial subsystem low level driver header.
|
||||
*
|
||||
* @addtogroup SERIAL
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef HAL_SERIAL_LLD_H
|
||||
#define HAL_SERIAL_LLD_H
|
||||
|
||||
#if (HAL_USE_SERIAL) || defined(__DOXYGEN__)
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver constants. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief UART clock sources.
|
||||
*/
|
||||
#define NUC123_SERIAL_CLKSRC_HSE (0UL << CLK_CLKSEL1_UART_S_Pos)
|
||||
#define NUC123_SERIAL_CLKSRC_PLL (1UL << CLK_CLKSEL1_UART_S_Pos)
|
||||
#define NUC123_SERIAL_CLKSRC_HSI (3UL << CLK_CLKSEL1_UART_S_Pos)
|
||||
|
||||
#define NUC123_SERIAL_MODE_UART (0UL << UART_FUN_SEL_FUN_SEL_Pos)
|
||||
/*
|
||||
TODO: add IrDA and RS485 support
|
||||
#define NUC123_SERIAL_MODE_IrDA (2UL << UART_FUN_SEL_FUN_SEL_Pos)
|
||||
#define NUC123_SERIAL_MODE_RS485 (3UL << UART_FUN_SEL_FUN_SEL_Pos)
|
||||
*/
|
||||
|
||||
#define NUC123_SERIAL_DATA_5BITS (0U << UART_LCR_WLS_Pos)
|
||||
#define NUC123_SERIAL_DATA_6BITS (1U << UART_LCR_WLS_Pos)
|
||||
#define NUC123_SERIAL_DATA_7BITS (2U << UART_LCR_WLS_Pos)
|
||||
#define NUC123_SERIAL_DATA_8BITS (3U << UART_LCR_WLS_Pos)
|
||||
|
||||
#define NUC123_SERIAL_PARITY_N (0U << UART_LCR_PBE_Pos)
|
||||
#define NUC123_SERIAL_PARITY_O (1U << UART_LCR_PBE_Pos)
|
||||
#define NUC123_SERIAL_PARITY_E (3U << UART_LCR_PBE_Pos)
|
||||
#define NUC123_SERIAL_PARITY_M (5U << UART_LCR_PBE_Pos)
|
||||
#define NUC123_SERIAL_PARITY_S (7U << UART_LCR_PBE_Pos)
|
||||
|
||||
#define NUC123_SERIAL_STOP_1 (0U << UART_LCR_NSB_Pos)
|
||||
#define NUC123_SERIAL_STOP_MULTI (1U << UART_LCR_NSB_Pos)
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver pre-compile time settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @name NUC123 configuration options
|
||||
* @{
|
||||
*/
|
||||
/**
|
||||
* @brief UART0 driver enable switch.
|
||||
* @details If set to @p TRUE the support for USART0 is included.
|
||||
* @note The default is @p TRUE.
|
||||
*/
|
||||
#if !defined(NUC123_SERIAL_USE_UART0) || defined(__DOXYGEN__)
|
||||
#define NUC123_SERIAL_USE_UART0 TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief UART1 driver enable switch.
|
||||
* @details If set to @p TRUE the support for USART1 is included.
|
||||
* @note The default is @p FALSE.
|
||||
*/
|
||||
#if !defined(NUC123_SERIAL_USE_UART1) || defined(__DOXYGEN__)
|
||||
#define NUC123_SERIAL_USE_UART1 FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief UART0 mode
|
||||
*/
|
||||
#if !defined(NUC123_SERIAL_MODE_DEFAULT) || defined(__DOXYGEN__)
|
||||
#define NUC123_SERIAL_MODE_DEFAULT NUC123_SERIAL_MODE_UART
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief UART clock source
|
||||
*/
|
||||
#if !defined(NUC123_SERIAL_CLKSRC) || defined(__DOXYGEN__)
|
||||
#if NUC123_PLL_ENABLED
|
||||
#define NUC123_SERIAL_CLKSRC NUC123_SERIAL_CLKSRC_PLL
|
||||
#elif NUC123_HSI_ENABLED
|
||||
#define NUC123_SERIAL_CLKSRC NUC123_SERIAL_CLKSRC_HSI
|
||||
#elif NUC123_HSE_ENABLED
|
||||
#define NUC123_SERIAL_CLKSRC NUC123_SERIAL_CLKSRC_HSE
|
||||
#else
|
||||
#error "Using the serial module requires either the HSE, the HSI, or the PLL to be enabled."
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(NUC123_SERIAL_IRQ_PRIORITY) || defined(__DOXYGEN__)
|
||||
#define NUC123_SERIAL_IRQ_PRIORITY 3
|
||||
#endif
|
||||
|
||||
#if !defined(NUC123_SERIAL_UART0_IRQ_PRIORITY) || defined(__DOXYGEN__)
|
||||
#define NUC123_SERIAL_UART0_IRQ_PRIORITY NUC123_SERIAL_IRQ_PRIORITY
|
||||
#endif
|
||||
|
||||
#if !defined(NUC123_SERIAL_UART1_IRQ_PRIORITY) || defined(__DOXYGEN__)
|
||||
#define NUC123_SERIAL_UART1_IRQ_PRIORITY NUC123_SERIAL_IRQ_PRIORITY
|
||||
#endif
|
||||
|
||||
/** @} */
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Derived constants and error checks. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#if !NUC123_SERIAL_USE_UART0 && !NUC123_SERIAL_USE_UART1
|
||||
#error "SERIAL driver activated but no USART/UART peripheral in use"
|
||||
#endif
|
||||
|
||||
#if (NUC123_SERIAL_CLKSRC != NUC123_SERIAL_CLKSRC_PLL) && \
|
||||
(NUC123_SERIAL_CLKSRC != NUC123_SERIAL_CLKSRC_HSE) && \
|
||||
(NUC123_SERIAL_CLKSRC != NUC123_SERIAL_CLKSRC_HSI)
|
||||
#error \
|
||||
"NUC123_SERIAL_CLKSRC must be NUC123_SERIAL_CLKSRC_PLL, NUC123_SERIAL_CLKSRC_HSE, or NUC123_SERIAL_CLKSRC_HSI"
|
||||
#endif
|
||||
|
||||
#if NUC123_SERIAL_CLKSRC == NUC123_SERIAL_CLKSRC_PLL
|
||||
#define NUC123_SERIAL_CLK NUC123_PLLCLK
|
||||
#elif NUC123_SERIAL_CLKSRC == NUC123_SERIAL_CLKSRC_HSE
|
||||
#define NUC123_SERIAL_CLK NUC123_HSECLK
|
||||
#elif NUC123_SERIAL_CLKSRC == NUC123_SERIAL_CLKSRC_HSI
|
||||
#define NUC123_SERIAL_CLK NUC123_HSICLK
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver data structures and types. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Serial modes
|
||||
*/
|
||||
typedef uint32_t serial_mode_t;
|
||||
|
||||
/**
|
||||
* @brief NUC123 Serial Driver configuration structure.
|
||||
* @details An instance of this structure must be passed to @p sdStart()
|
||||
* in order to configure and start a serial driver operations.
|
||||
* @note This structure content is architecture dependent, each driver
|
||||
* implementation defines its own version and the custom static
|
||||
* initializers.
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* @brief Bit rate.
|
||||
*/
|
||||
uint32_t speed;
|
||||
/* End of the mandatory fields.*/
|
||||
|
||||
/**
|
||||
* @brief Mode
|
||||
*/
|
||||
serial_mode_t mode;
|
||||
uint8_t data;
|
||||
uint8_t parity;
|
||||
uint8_t stop;
|
||||
|
||||
} SerialConfig;
|
||||
|
||||
/**
|
||||
* @brief @p SerialDriver specific data.
|
||||
*/
|
||||
#define _serial_driver_data \
|
||||
_base_asynchronous_channel_data /* Driver state.*/ \
|
||||
sdstate_t state; \
|
||||
/* Input queue.*/ \
|
||||
input_queue_t iqueue; \
|
||||
/* Output queue.*/ \
|
||||
output_queue_t oqueue; \
|
||||
/* Input circular buffer.*/ \
|
||||
uint8_t ib[SERIAL_BUFFERS_SIZE]; \
|
||||
/* Output circular buffer.*/ \
|
||||
uint8_t ob[SERIAL_BUFFERS_SIZE]; \
|
||||
/* End of the mandatory fields.*/ \
|
||||
UART_T* uart;
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver macros. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* External declarations. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#if (NUC123_SERIAL_USE_UART0) && !defined(__DOXYGEN__)
|
||||
extern SerialDriver SD0;
|
||||
#endif
|
||||
|
||||
#if (NUC123_SERIAL_USE_UART1) && !defined(__DOXYGEN__)
|
||||
extern SerialDriver SD1;
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void sd_lld_init(void);
|
||||
void sd_lld_start(SerialDriver* sdp, const SerialConfig* config);
|
||||
void sd_lld_stop(SerialDriver* sdp);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* HAL_USE_SERIAL */
|
||||
|
||||
#endif /* HAL_SERIAL_LLD_H */
|
||||
|
||||
/** @} */
|
|
@ -107,13 +107,13 @@
|
|||
#define NUC123_TIM4_NUMBER TMR3_IRQn
|
||||
|
||||
/*
|
||||
* USART units.
|
||||
* UART units.
|
||||
*/
|
||||
#define NUC123_USART1_HANDLER Vector70
|
||||
#define NUC123_USART2_HANDLER Vector74
|
||||
#define NUC123_UART0_HANDLER Vector70
|
||||
#define NUC123_UART1_HANDLER Vector74
|
||||
|
||||
#define NUC123_USART1_NUMBER UART0_IRQn
|
||||
#define NUC123_USART2_NUMBER UART1_IRQn
|
||||
#define NUC123_UART0_NUMBER UART0_IRQn
|
||||
#define NUC123_UART1_NUMBER UART1_IRQn
|
||||
|
||||
/*
|
||||
* USB units.
|
||||
|
|
|
@ -15,6 +15,7 @@ endif
|
|||
include $(CHIBIOS_CONTRIB)/os/hal/ports/NUMICRO/LLD/GPIOv1/driver.mk
|
||||
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
|
||||
|
||||
# Shared variables
|
||||
ALLCSRC += $(PLATFORMSRC)
|
||||
|
|
|
@ -0,0 +1,196 @@
|
|||
##############################################################################
|
||||
# Build global options
|
||||
# NOTE: Can be overridden externally.
|
||||
#
|
||||
|
||||
# Compiler options here.
|
||||
ifeq ($(USE_OPT),)
|
||||
USE_OPT = -ggdb -g3 -gdwarf-3 -gstrict-dwarf -fomit-frame-pointer -falign-functions=16
|
||||
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 := ../../../../../../..
|
||||
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/ports/NUMICRO/NUC123/platform.mk
|
||||
include $(CHIBIOS_CONTRIB)/os/hal/boards/NUTINY-SDK-NUC123-V2.0/board.mk
|
||||
include $(CHIBIOS)/os/hal/osal/os-less/ARMCMx/osal.mk
|
||||
# RTOS files (optional).
|
||||
|
||||
# Auto-build files in ./source recursively.
|
||||
include $(CHIBIOS)/tools/mk/autobuild.mk
|
||||
# Other files (optional).
|
||||
include $(CHIBIOS)/os/hal/lib/streams/streams.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) \
|
||||
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 =
|
||||
|
||||
# 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
|
||||
#
|
||||
|
||||
OPENOCD:=$(shell readlink -f `which openocd`)
|
||||
OPENOCDPATH:=$(shell dirname $(OPENOCD))/../share/openocd
|
||||
|
||||
install-openocd-config:
|
||||
rm $(OPENOCDPATH)/scripts/target/numicroM0.cfg && cp $(CHIBIOS_CONTRIB)/ext/numicroM0.cfg $(OPENOCDPATH)/scripts/target/
|
||||
|
||||
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"
|
|
@ -0,0 +1,536 @@
|
|||
/*
|
||||
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 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"
|
||||
|
||||
#define PAL_USE_CALLBACKS TRUE
|
||||
#define PAL_USE_WAIT TRUE
|
||||
|
||||
#define NUC123_SERIAL_CLKSRC NUC123_SERIAL_CLKSRC_HSI
|
||||
|
||||
/**
|
||||
* @brief Enables the PAL subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_PAL FALSE
|
||||
#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 FALSE
|
||||
#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 32
|
||||
#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
|
||||
|
||||
#endif /* HALCONF_H */
|
||||
|
||||
/** @} */
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
Copyright (C) 2016 Stephane D'Alu
|
||||
|
||||
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_HSE_ENABLED TRUE
|
||||
#define NUC123_PLL_ENABLED TRUE
|
||||
#define NUC123_PLLSRC NUC123_PLLSRC_HSE
|
||||
#define NUC123_HCLKSRC NUC123_HCLKSRC_PLL
|
||||
|
||||
#define NUC123_MCUCONF
|
||||
|
||||
#endif /* _MCUCONF_H_ */
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "hal.h"
|
||||
#include "chprintf.h"
|
||||
|
||||
#define SERIAL_DRIVER SD0
|
||||
|
||||
#define toupper(c) __builtin_toupper(c)
|
||||
|
||||
char buf;
|
||||
|
||||
const SerialConfig scfg = {.speed = 57600,
|
||||
.mode = NUC123_SERIAL_MODE_DEFAULT,
|
||||
.data = NUC123_SERIAL_DATA_8BITS,
|
||||
.parity = NUC123_SERIAL_PARITY_N,
|
||||
.stop = NUC123_SERIAL_STOP_1};
|
||||
|
||||
/*
|
||||
* Application entry point.
|
||||
*/
|
||||
int main(void)
|
||||
{
|
||||
|
||||
/*
|
||||
* System initializations.
|
||||
* - HAL initialization, this also initializes the configured device drivers
|
||||
* and performs the board-specific initializations.
|
||||
*/
|
||||
|
||||
halInit();
|
||||
|
||||
/*
|
||||
* Enabling interrupts, initialization done.
|
||||
*/
|
||||
osalSysEnable();
|
||||
|
||||
sdStart(&SERIAL_DRIVER, &scfg);
|
||||
|
||||
chprintf((BaseSequentialStream *)&SERIAL_DRIVER, "\nInitialized...\n");
|
||||
while (true) {
|
||||
buf = streamGet((BaseSequentialStream *)&SERIAL_DRIVER);
|
||||
buf = toupper(buf);
|
||||
streamPut((BaseSequentialStream *)&SERIAL_DRIVER, buf);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
*****************************************************************************
|
||||
** ChibiOS/HAL - SERIAL 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 SERIAL driver. When successful,
|
||||
SD0 should be used for serial communication with another serial device. The
|
||||
target board should output `\nInitialized...\n` upon power-on, and should
|
||||
immediately echo any character sent to it, with the standard C function toupper
|
||||
called on 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 9.3.1 (GNU Arm Embedded Toolchain 9-2020-q2-update).
|
||||
Just modify the TRGT line in the makefile in order to use different GCC ports.
|
Loading…
Reference in New Issue