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:
parent
59a0e57530
commit
c976acc335
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.*/ \
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue