From c2893668218075f929cb99d5b7a1b5fb92b771c3 Mon Sep 17 00:00:00 2001 From: Laurens Valk Date: Thu, 2 Jan 2025 12:07:02 +0100 Subject: [PATCH] pbio/drv/uart: Add context to uart callback. --- lib/pbio/drv/legodev/legodev_pup.c | 2 +- lib/pbio/drv/uart/uart_stm32f0.c | 9 ++++++--- lib/pbio/drv/uart/uart_stm32f4_ll_irq.c | 9 ++++++--- lib/pbio/drv/uart/uart_stm32l4_ll_dma.c | 7 +++++-- lib/pbio/include/pbdrv/uart.h | 4 ++-- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/lib/pbio/drv/legodev/legodev_pup.c b/lib/pbio/drv/legodev/legodev_pup.c index 4abbb7ad3..44e99542c 100644 --- a/lib/pbio/drv/legodev/legodev_pup.c +++ b/lib/pbio/drv/legodev/legodev_pup.c @@ -453,7 +453,7 @@ void pbdrv_legodev_init(void) { pbdrv_uart_get(port_data->uart_driver_index, &uart); // Set callback for uart driver. - pbdrv_uart_set_poll_callback(uart, uart_poll_callback); + pbdrv_uart_set_poll_callback(uart, uart_poll_callback, NULL); } process_start(&pbio_legodev_pup_process); diff --git a/lib/pbio/drv/uart/uart_stm32f0.c b/lib/pbio/drv/uart/uart_stm32f0.c index 7de5949e2..4e3806fdb 100644 --- a/lib/pbio/drv/uart/uart_stm32f0.c +++ b/lib/pbio/drv/uart/uart_stm32f0.c @@ -46,6 +46,8 @@ typedef struct { bool initialized; /** Callback to call on read or write completion events */ pbdrv_uart_poll_callback_t poll_callback; + /** Context for callback caller */ + void *poll_callback_context; } pbdrv_uart_t; static pbdrv_uart_t pbdrv_uart[PBDRV_CONFIG_UART_STM32F0_NUM_UART]; @@ -64,9 +66,10 @@ pbio_error_t pbdrv_uart_get(uint8_t id, pbdrv_uart_dev_t **uart_dev) { return PBIO_SUCCESS; } -void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback) { +void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback, void *context) { pbdrv_uart_t *uart = PBIO_CONTAINER_OF(uart_dev, pbdrv_uart_t, uart_dev); uart->poll_callback = callback; + uart->poll_callback_context = context; } PT_THREAD(pbdrv_uart_read(struct pt *pt, pbdrv_uart_dev_t *uart_dev, uint8_t *msg, uint8_t length, uint32_t timeout, pbio_error_t *err)) { @@ -179,7 +182,7 @@ void pbdrv_uart_stm32f0_handle_irq(uint8_t id) { uart->rx_ring_buf[uart->rx_ring_buf_head] = uart->USART->RDR; uart->rx_ring_buf_head = (uart->rx_ring_buf_head + 1) & (UART_RING_BUF_SIZE - 1); if (uart->poll_callback) { - uart->poll_callback(&uart->uart_dev); + uart->poll_callback(uart->poll_callback_context); } } @@ -200,7 +203,7 @@ void pbdrv_uart_stm32f0_handle_irq(uint8_t id) { if (uart->USART->CR1 & USART_CR1_TCIE && isr & USART_ISR_TC) { uart->USART->CR1 &= ~USART_CR1_TCIE; if (uart->poll_callback) { - uart->poll_callback(&uart->uart_dev); + uart->poll_callback(uart->poll_callback_context); } } } diff --git a/lib/pbio/drv/uart/uart_stm32f4_ll_irq.c b/lib/pbio/drv/uart/uart_stm32f4_ll_irq.c index 60fbd7114..b2f38e95b 100644 --- a/lib/pbio/drv/uart/uart_stm32f4_ll_irq.c +++ b/lib/pbio/drv/uart/uart_stm32f4_ll_irq.c @@ -51,14 +51,17 @@ typedef struct { volatile uint8_t write_pos; /** Callback to call on read or write completion events */ pbdrv_uart_poll_callback_t poll_callback; + /** Context for callback caller */ + void *poll_callback_context; } pbdrv_uart_t; static pbdrv_uart_t pbdrv_uart[PBDRV_CONFIG_UART_STM32F4_LL_IRQ_NUM_UART]; static uint8_t pbdrv_uart_rx_data[PBDRV_CONFIG_UART_STM32F4_LL_IRQ_NUM_UART][RX_DATA_SIZE]; -void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback) { +void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback, void *context) { pbdrv_uart_t *uart = PBIO_CONTAINER_OF(uart_dev, pbdrv_uart_t, uart_dev); uart->poll_callback = callback; + uart->poll_callback_context = context; } pbio_error_t pbdrv_uart_get(uint8_t id, pbdrv_uart_dev_t **uart_dev) { @@ -213,7 +216,7 @@ void pbdrv_uart_stm32f4_ll_irq_handle_irq(uint8_t id) { // Poll parent process for each received byte, since the IRQ handler // has no awareness of the expected length of the read operation. if (uart->poll_callback) { - uart->poll_callback(&uart->uart_dev); + uart->poll_callback(uart->poll_callback_context); } } @@ -238,7 +241,7 @@ void pbdrv_uart_stm32f4_ll_irq_handle_irq(uint8_t id) { LL_USART_DisableIT_TC(USARTx); // Poll parent process to indicate the write operation is complete. if (uart->poll_callback) { - uart->poll_callback(&uart->uart_dev); + uart->poll_callback(uart->poll_callback_context); } } } diff --git a/lib/pbio/drv/uart/uart_stm32l4_ll_dma.c b/lib/pbio/drv/uart/uart_stm32l4_ll_dma.c index b0d92e250..2ceba05f4 100644 --- a/lib/pbio/drv/uart/uart_stm32l4_ll_dma.c +++ b/lib/pbio/drv/uart/uart_stm32l4_ll_dma.c @@ -40,14 +40,17 @@ typedef struct { uint8_t read_length; /** Callback to call on read or write completion events */ pbdrv_uart_poll_callback_t poll_callback; + /** Context for callback caller */ + void *poll_callback_context; } pbdrv_uart_t; static pbdrv_uart_t pbdrv_uart[PBDRV_CONFIG_UART_STM32L4_LL_DMA_NUM_UART]; static volatile uint8_t pbdrv_uart_rx_data[PBDRV_CONFIG_UART_STM32L4_LL_DMA_NUM_UART][RX_DATA_SIZE]; -void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback) { +void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback, void *context) { pbdrv_uart_t *uart = PBIO_CONTAINER_OF(uart_dev, pbdrv_uart_t, uart_dev); uart->poll_callback = callback; + uart->poll_callback_context = context; } pbio_error_t pbdrv_uart_get(uint8_t id, pbdrv_uart_dev_t **uart_dev) { @@ -326,7 +329,7 @@ void pbdrv_uart_flush(pbdrv_uart_dev_t *uart_dev) { static void poll_process_by_id(uint8_t id) { pbdrv_uart_t *uart = &pbdrv_uart[id]; if (uart->poll_callback) { - uart->poll_callback(&uart->uart_dev); + uart->poll_callback(uart->poll_callback_context); } } diff --git a/lib/pbio/include/pbdrv/uart.h b/lib/pbio/include/pbdrv/uart.h index 97eb23ccd..89abdcd19 100644 --- a/lib/pbio/include/pbdrv/uart.h +++ b/lib/pbio/include/pbdrv/uart.h @@ -29,7 +29,7 @@ pbio_error_t pbdrv_uart_get(uint8_t id, pbdrv_uart_dev_t **uart_dev); void pbdrv_uart_set_baud_rate(pbdrv_uart_dev_t *uart_dev, uint32_t baud); void pbdrv_uart_stop(pbdrv_uart_dev_t *uart_dev); void pbdrv_uart_flush(pbdrv_uart_dev_t *uart_dev); -void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback); +void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback, void *context); PT_THREAD(pbdrv_uart_read(struct pt *pt, pbdrv_uart_dev_t *uart_dev, uint8_t *msg, uint8_t length, uint32_t timeout, pbio_error_t *err)); PT_THREAD(pbdrv_uart_write(struct pt *pt, pbdrv_uart_dev_t *uart_dev, uint8_t *msg, uint8_t length, uint32_t timeout, pbio_error_t *err)); @@ -60,7 +60,7 @@ static inline void pbdrv_uart_write_cancel(pbdrv_uart_dev_t *uart_dev) { } static inline void pbdrv_uart_flush(pbdrv_uart_dev_t *uart_dev) { } -static inline void pbdrv_uart_set_poll_callback(pbdrv_uart_poll_callback_t callback) { +static inline void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback, void *context) { } static inline PT_THREAD(pbdrv_uart_write(struct pt *pt, pbdrv_uart_dev_t *uart_dev, uint8_t *msg, uint8_t length, uint32_t timeout, pbio_error_t *err)) {