Implemented advanced queues in STM32 USARTv2 driver.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9752 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
Giovanni Di Sirio 2016-08-27 14:36:31 +00:00
parent 59a0e57530
commit c976acc335
6 changed files with 256 additions and 10 deletions

View File

@ -65,6 +65,8 @@
* buffers depending on the requirements of your application.
* @note The default is 16 bytes for both the transmission and receive
* buffers.
* @note This is a global setting and it can be overridden by low level
* driver specific settings.
*/
#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
#define SERIAL_BUFFERS_SIZE 16
@ -268,7 +270,12 @@ struct SerialDriver {
extern "C" {
#endif
void sdInit(void);
#if !defined(SERIAL_ADVANCED_BUFFERING_SUPPORT) || \
(SERIAL_ADVANCED_BUFFERING_SUPPORT == FALSE)
void sdObjectInit(SerialDriver *sdp, qnotify_t inotify, qnotify_t onotify);
#else
void sdObjectInit(SerialDriver *sdp);
#endif
void sdStart(SerialDriver *sdp, const SerialConfig *config);
void sdStop(SerialDriver *sdp);
void sdIncomingDataI(SerialDriver *sdp, uint8_t b);

View File

@ -125,6 +125,78 @@ static const SerialConfig default_config =
0
};
#if STM32_SERIAL_USE_USART1 || defined(__DOXYGEN__)
/** @brief Input buffer for SD1.*/
static uint8_t sd_in_buf1[STM32_SERIAL_USART1_IN_BUF_SIZE];
/** @brief Output buffer for SD1.*/
static uint8_t sd_out_buf1[STM32_SERIAL_USART1_OUT_BUF_SIZE];
#endif
#if STM32_SERIAL_USE_USART2 || defined(__DOXYGEN__)
/** @brief Input buffer for SD2.*/
static uint8_t sd_in_buf2[STM32_SERIAL_USART2_IN_BUF_SIZE];
/** @brief Output buffer for SD2.*/
static uint8_t sd_out_buf2[STM32_SERIAL_USART2_OUT_BUF_SIZE];
#endif
#if STM32_SERIAL_USE_USART3 || defined(__DOXYGEN__)
/** @brief Input buffer for SD3.*/
static uint8_t sd_in_buf3[STM32_SERIAL_USART3_IN_BUF_SIZE];
/** @brief Output buffer for SD3.*/
static uint8_t sd_out_buf3[STM32_SERIAL_USART3_OUT_BUF_SIZE];
#endif
#if STM32_SERIAL_USE_UART4 || defined(__DOXYGEN__)
/** @brief Input buffer for SD4.*/
static uint8_t sd_in_buf4[STM32_SERIAL_UART4_IN_BUF_SIZE];
/** @brief Output buffer for SD4.*/
static uint8_t sd_out_buf4[STM32_SERIAL_UART4_IN_BUF_SIZE];
#endif
#if STM32_SERIAL_USE_UART5 || defined(__DOXYGEN__)
/** @brief Input buffer for SD5.*/
static uint8_t sd_in_buf5[STM32_SERIAL_UART5_IN_BUF_SIZE];
/** @brief Output buffer for SD5.*/
static uint8_t sd_out_buf5[STM32_SERIAL_UART5_IN_BUF_SIZE];
#endif
#if STM32_SERIAL_USE_USART6 || defined(__DOXYGEN__)
/** @brief Input buffer for SD6.*/
static uint8_t sd_in_buf6[STM32_SERIAL_USART6_IN_BUF_SIZE];
/** @brief Output buffer for SD6.*/
static uint8_t sd_out_buf6[STM32_SERIAL_USART6_OUT_BUF_SIZE];
#endif
#if STM32_SERIAL_USE_UART7 || defined(__DOXYGEN__)
/** @brief Input buffer for SD7.*/
static uint8_t sd_in_buf7[STM32_SERIAL_UART7_IN_BUF_SIZE];
/** @brief Output buffer for SD7.*/
static uint8_t sd_out_buf7[STM32_SERIAL_UART7_OUT_BUF_SIZE];
#endif
#if STM32_SERIAL_USE_UART8 || defined(__DOXYGEN__)
/** @brief Input buffer for SD8.*/
static uint8_t sd_in_buf8[STM32_SERIAL_UART8_IN_BUF_SIZE];
/** @brief Output buffer for SD8.*/
static uint8_t sd_out_buf8[STM32_SERIAL_UART8_OUT_BUF_SIZE];
#endif
#if STM32_SERIAL_USE_LPUART1 || defined(__DOXYGEN__)
/** @brief Input buffer for LPSD1.*/
static uint8_t sd_in_buflp1[STM32_SERIAL_LPUART1_IN_BUF_SIZE];
/** @brief Output buffer for LPSD1.*/
static uint8_t sd_out_buflp1[STM32_SERIAL_LPUART1_OUT_BUF_SIZE];
#endif
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
@ -560,7 +632,9 @@ OSAL_IRQ_HANDLER(STM32_LPUART1_HANDLER) {
void sd_lld_init(void) {
#if STM32_SERIAL_USE_USART1
sdObjectInit(&SD1, NULL, notify1);
sdObjectInit(&SD1);
iqObjectInit(&SD1.iqueue, sd_in_buf1, sizeof sd_in_buf1, NULL, &SD1);
oqObjectInit(&SD1.oqueue, sd_out_buf1, sizeof sd_out_buf1, notify1, &SD1);
SD1.usart = USART1;
SD1.clock = STM32_USART1CLK;
#if defined(STM32_USART1_NUMBER)
@ -569,7 +643,9 @@ void sd_lld_init(void) {
#endif
#if STM32_SERIAL_USE_USART2
sdObjectInit(&SD2, NULL, notify2);
sdObjectInit(&SD2);
iqObjectInit(&SD2.iqueue, sd_in_buf2, sizeof sd_in_buf2, NULL, &SD2);
oqObjectInit(&SD2.oqueue, sd_out_buf2, sizeof sd_out_buf2, notify2, &SD2);
SD2.usart = USART2;
SD2.clock = STM32_USART2CLK;
#if defined(STM32_USART2_NUMBER)
@ -578,7 +654,9 @@ void sd_lld_init(void) {
#endif
#if STM32_SERIAL_USE_USART3
sdObjectInit(&SD3, NULL, notify3);
sdObjectInit(&SD3);
iqObjectInit(&SD3.iqueue, sd_in_buf3, sizeof sd_in_buf3, NULL, &SD3);
oqObjectInit(&SD3.oqueue, sd_out_buf3, sizeof sd_out_buf3, notify3, &SD3);
SD3.usart = USART3;
SD3.clock = STM32_USART3CLK;
#if defined(STM32_USART3_NUMBER)
@ -587,7 +665,9 @@ void sd_lld_init(void) {
#endif
#if STM32_SERIAL_USE_UART4
sdObjectInit(&SD4, NULL, notify4);
sdObjectInit(&SD4);
iqObjectInit(&SD4.iqueue, sd_in_buf4, sizeof sd_in_buf4, NULL, &SD4);
oqObjectInit(&SD4.oqueue, sd_out_buf4, sizeof sd_out_buf4, notify4, &SD4);
SD4.usart = UART4;
SD4.clock = STM32_UART4CLK;
#if defined(STM32_UART4_NUMBER)
@ -596,7 +676,9 @@ void sd_lld_init(void) {
#endif
#if STM32_SERIAL_USE_UART5
sdObjectInit(&SD5, NULL, notify5);
sdObjectInit(&SD5);
iqObjectInit(&SD5.iqueue, sd_in_buf5, sizeof sd_in_buf5, NULL, &SD5);
oqObjectInit(&SD5.oqueue, sd_out_buf5, sizeof sd_out_buf5, notify5, &SD5);
SD5.usart = UART5;
SD5.clock = STM32_UART5CLK;
#if defined(STM32_UART5_NUMBER)
@ -605,7 +687,9 @@ void sd_lld_init(void) {
#endif
#if STM32_SERIAL_USE_USART6
sdObjectInit(&SD6, NULL, notify6);
sdObjectInit(&SD6);
iqObjectInit(&SD6.iqueue, sd_in_buf6, sizeof sd_in_buf6, NULL, &SD6);
oqObjectInit(&SD6.oqueue, sd_out_buf6, sizeof sd_out_buf6, notify6, &SD6);
SD6.usart = USART6;
SD6.clock = STM32_USART6CLK;
#if defined(STM32_USART6_NUMBER)
@ -614,7 +698,9 @@ void sd_lld_init(void) {
#endif
#if STM32_SERIAL_USE_UART7
sdObjectInit(&SD7, NULL, notify7);
sdObjectInit(&SD7);
iqObjectInit(&SD7.iqueue, sd_in_buf7, sizeof sd_in_buf7, NULL, &SD7);
oqObjectInit(&SD7.oqueue, sd_out_buf7, sizeof sd_out_buf7, notify7, &SD7);
SD7.usart = UART7;
SD7.clock = STM32_UART7CLK;
#if defined(STM32_UART7_NUMBER)
@ -623,7 +709,9 @@ void sd_lld_init(void) {
#endif
#if STM32_SERIAL_USE_UART8
sdObjectInit(&SD8, NULL, notify8);
sdObjectInit(&SD8);
iqObjectInit(&SD8.iqueue, sd_in_buf8, sizeof sd_in_buf8, NULL, &SD8);
oqObjectInit(&SD8.oqueue, sd_out_buf8, sizeof sd_out_buf8, notify8, &SD8);
SD8.usart = UART8;
SD8.clock = STM32_UART8CLK;
#if defined(STM32_UART8_NUMBER)
@ -633,6 +721,8 @@ void sd_lld_init(void) {
#if STM32_SERIAL_USE_LPUART1
sdObjectInit(&LPSD1, NULL, notifylp1);
iqObjectInit(&LPSD1.iqueue, sd_in_buflp1, sizeof sd_in_buflp1, NULL, &LPSD1);
oqObjectInit(&LPSD1.oqueue, sd_out_buflp1, sizeof sd_out_buflp1, notifylp1, &LPSD1);
LPSD1.usart = LPUART1;
LPSD1.clock = STM32_LPUART1CLK;
#if defined(STM32_LPUART1_NUMBER)

View File

@ -31,6 +31,15 @@
/* Driver constants. */
/*===========================================================================*/
/**
* @brief Advanced buffering support switch.
* @details This constants enables the advanced buffering support in the
* low level driver, the queue buffer is no more part of the
* @p SerialDriver structure, each driver can have a different
* queue size.
*/
#define SERIAL_ADVANCED_BUFFERING_SUPPORT TRUE
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
@ -190,6 +199,132 @@
#if !defined(STM32_SERIAL_LPUART1_PRIORITY) || defined(__DOXYGEN__)
#define STM32_SERIAL_LPUART1_PRIORITY 12
#endif
/**
* @brief Input buffer size for USART1.
*/
#if !defined(STM32_SERIAL_USART1_IN_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_USART1_IN_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Output buffer size for USART1.
*/
#if !defined(STM32_SERIAL_USART1_OUT_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_USART1_OUT_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Input buffer size for USART2.
*/
#if !defined(STM32_SERIAL_USART2_IN_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_USART2_IN_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Output buffer size for USART2.
*/
#if !defined(STM32_SERIAL_USART2_OUT_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_USART2_OUT_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Input buffer size for USART3.
*/
#if !defined(STM32_SERIAL_USART3_IN_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_USART3_IN_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Output buffer size for USART3.
*/
#if !defined(STM32_SERIAL_USART3_OUT_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_USART3_OUT_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Input buffer size for UART4.
*/
#if !defined(STM32_SERIAL_UART4_IN_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_UART4_IN_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Output buffer size for UART4.
*/
#if !defined(STM32_SERIAL_UART4_OUT_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_UART4_OUT_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Input buffer size for UART5.
*/
#if !defined(STM32_SERIAL_UART5_IN_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_UART5_IN_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Output buffer size for UART5.
*/
#if !defined(STM32_SERIAL_UART5_OUT_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_UART5_OUT_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Input buffer size for USART6.
*/
#if !defined(STM32_SERIAL_USART6_IN_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_USART6_IN_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Output buffer size for USART6.
*/
#if !defined(STM32_SERIAL_USART6_OUT_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_USART6_OUT_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Input buffer size for UART7.
*/
#if !defined(STM32_SERIAL_UART7_IN_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_UART7_IN_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Output buffer size for UART7.
*/
#if !defined(STM32_SERIAL_UART7_OUT_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_UART7_OUT_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Input buffer size for UART8.
*/
#if !defined(STM32_SERIAL_UART8_IN_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_UART8_IN_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Output buffer size for UART8.
*/
#if !defined(STM32_SERIAL_UART8_OUT_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_UART8_OUT_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Input buffer size for LPUART1.
*/
#if !defined(STM32_SERIAL_LPUART1_IN_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_LPUART1_IN_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/**
* @brief Output buffer size for LPUART1.
*/
#if !defined(STM32_SERIAL_LPUART1_OUT_BUF_SIZE) || defined(__DOXYGEN__)
#define STM32_SERIAL_LPUART1_OUT_BUF_SIZE SERIAL_BUFFERS_SIZE
#endif
/** @} */
/*===========================================================================*/
@ -328,11 +463,11 @@ typedef struct {
input_queue_t iqueue; \
/* Output queue.*/ \
output_queue_t oqueue; \
/* End of the mandatory fields.*/ \
/* Input circular buffer.*/ \
uint8_t ib[SERIAL_BUFFERS_SIZE]; \
/* Output circular buffer.*/ \
uint8_t ob[SERIAL_BUFFERS_SIZE]; \
/* End of the mandatory fields.*/ \
/* Pointer to the USART registers block.*/ \
USART_TypeDef *usart; \
/* Clock frequency for the associated USART/UART.*/ \

View File

@ -839,7 +839,7 @@
*
* @api
*/
#define rccEnableUART5(lp) rccEnableAPB1(RCC_APB1ENR_USARTS5EN, lp)
#define rccEnableUART5(lp) rccEnableAPB1(RCC_APB1ENR_USART5EN, lp)
/**
* @brief Disables the USART5 peripheral clock.

View File

@ -125,6 +125,9 @@ void sdInit(void) {
*
* @init
*/
#if !defined(SERIAL_ADVANCED_BUFFERING_SUPPORT) || \
(SERIAL_ADVANCED_BUFFERING_SUPPORT == FALSE) || \
defined(__DOXYGEN__)
void sdObjectInit(SerialDriver *sdp, qnotify_t inotify, qnotify_t onotify) {
sdp->vmt = &vmt;
@ -133,6 +136,14 @@ void sdObjectInit(SerialDriver *sdp, qnotify_t inotify, qnotify_t onotify) {
iqObjectInit(&sdp->iqueue, sdp->ib, SERIAL_BUFFERS_SIZE, inotify, sdp);
oqObjectInit(&sdp->oqueue, sdp->ob, SERIAL_BUFFERS_SIZE, onotify, sdp);
}
#else
void sdObjectInit(SerialDriver *sdp) {
sdp->vmt = &vmt;
osalEventObjectInit(&sdp->event);
sdp->state = SD_STOP;
}
#endif
/**
* @brief Configures and starts the driver.

View File

@ -79,6 +79,9 @@
*****************************************************************************
*** Next ***
- HAL: Added an advanced buffering mode to the serial driver, now, if the
LLD supports it, it is possible to set the size of each queue
independently.
- EX: Added compass implementation for ST LSM303DLHC device.
- EX: Added accelerometer implementation for ST LSM303DLHC device.
- EX: Added gyroscope implementation for ST L3GD20 device.