Skip to content

Commit 14a141b

Browse files
committed
pbio/drv/uart: Add context to uart callback.
1 parent 67884e5 commit 14a141b

File tree

5 files changed

+20
-11
lines changed

5 files changed

+20
-11
lines changed

lib/pbio/drv/legodev/legodev_pup.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ void pbdrv_legodev_init(void) {
453453
pbdrv_uart_get(port_data->uart_driver_index, &uart);
454454

455455
// Set callback for uart driver.
456-
pbdrv_uart_set_poll_callback(uart, uart_poll_callback);
456+
pbdrv_uart_set_poll_callback(uart, uart_poll_callback, NULL);
457457
}
458458

459459
process_start(&pbio_legodev_pup_process);

lib/pbio/drv/uart/uart_stm32f0.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ typedef struct {
4646
bool initialized;
4747
/** Callback to call on read or write completion events */
4848
pbdrv_uart_poll_callback_t poll_callback;
49+
/** Context for callback caller */
50+
void *poll_callback_context;
4951
} pbdrv_uart_t;
5052

5153
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) {
6466
return PBIO_SUCCESS;
6567
}
6668

67-
void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback) {
69+
void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback, void *context) {
6870
pbdrv_uart_t *uart = PBIO_CONTAINER_OF(uart_dev, pbdrv_uart_t, uart_dev);
6971
uart->poll_callback = callback;
72+
uart->poll_callback_context = context;
7073
}
7174

7275
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) {
179182
uart->rx_ring_buf[uart->rx_ring_buf_head] = uart->USART->RDR;
180183
uart->rx_ring_buf_head = (uart->rx_ring_buf_head + 1) & (UART_RING_BUF_SIZE - 1);
181184
if (uart->poll_callback) {
182-
uart->poll_callback(&uart->uart_dev);
185+
uart->poll_callback(uart->poll_callback_context);
183186
}
184187
}
185188

@@ -200,7 +203,7 @@ void pbdrv_uart_stm32f0_handle_irq(uint8_t id) {
200203
if (uart->USART->CR1 & USART_CR1_TCIE && isr & USART_ISR_TC) {
201204
uart->USART->CR1 &= ~USART_CR1_TCIE;
202205
if (uart->poll_callback) {
203-
uart->poll_callback(&uart->uart_dev);
206+
uart->poll_callback(uart->poll_callback_context);
204207
}
205208
}
206209
}

lib/pbio/drv/uart/uart_stm32f4_ll_irq.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,17 @@ typedef struct {
5151
volatile uint8_t write_pos;
5252
/** Callback to call on read or write completion events */
5353
pbdrv_uart_poll_callback_t poll_callback;
54+
/** Context for callback caller */
55+
void *poll_callback_context;
5456
} pbdrv_uart_t;
5557

5658
static pbdrv_uart_t pbdrv_uart[PBDRV_CONFIG_UART_STM32F4_LL_IRQ_NUM_UART];
5759
static uint8_t pbdrv_uart_rx_data[PBDRV_CONFIG_UART_STM32F4_LL_IRQ_NUM_UART][RX_DATA_SIZE];
5860

59-
void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback) {
61+
void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback, void *context) {
6062
pbdrv_uart_t *uart = PBIO_CONTAINER_OF(uart_dev, pbdrv_uart_t, uart_dev);
6163
uart->poll_callback = callback;
64+
uart->poll_callback_context = context;
6265
}
6366

6467
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) {
213216
// Poll parent process for each received byte, since the IRQ handler
214217
// has no awareness of the expected length of the read operation.
215218
if (uart->poll_callback) {
216-
uart->poll_callback(&uart->uart_dev);
219+
uart->poll_callback(uart->poll_callback_context);
217220
}
218221
}
219222

@@ -238,7 +241,7 @@ void pbdrv_uart_stm32f4_ll_irq_handle_irq(uint8_t id) {
238241
LL_USART_DisableIT_TC(USARTx);
239242
// Poll parent process to indicate the write operation is complete.
240243
if (uart->poll_callback) {
241-
uart->poll_callback(&uart->uart_dev);
244+
uart->poll_callback(uart->poll_callback_context);
242245
}
243246
}
244247
}

lib/pbio/drv/uart/uart_stm32l4_ll_dma.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,17 @@ typedef struct {
4040
uint8_t read_length;
4141
/** Callback to call on read or write completion events */
4242
pbdrv_uart_poll_callback_t poll_callback;
43+
/** Context for callback caller */
44+
void *poll_callback_context;
4345
} pbdrv_uart_t;
4446

4547
static pbdrv_uart_t pbdrv_uart[PBDRV_CONFIG_UART_STM32L4_LL_DMA_NUM_UART];
4648
static volatile uint8_t pbdrv_uart_rx_data[PBDRV_CONFIG_UART_STM32L4_LL_DMA_NUM_UART][RX_DATA_SIZE];
4749

48-
void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback) {
50+
void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback, void *context) {
4951
pbdrv_uart_t *uart = PBIO_CONTAINER_OF(uart_dev, pbdrv_uart_t, uart_dev);
5052
uart->poll_callback = callback;
53+
uart->poll_callback_context = context;
5154
}
5255

5356
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) {
326329
static void poll_process_by_id(uint8_t id) {
327330
pbdrv_uart_t *uart = &pbdrv_uart[id];
328331
if (uart->poll_callback) {
329-
uart->poll_callback(&uart->uart_dev);
332+
uart->poll_callback(uart->poll_callback_context);
330333
}
331334
}
332335

lib/pbio/include/pbdrv/uart.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pbio_error_t pbdrv_uart_get(uint8_t id, pbdrv_uart_dev_t **uart_dev);
2929
void pbdrv_uart_set_baud_rate(pbdrv_uart_dev_t *uart_dev, uint32_t baud);
3030
void pbdrv_uart_stop(pbdrv_uart_dev_t *uart_dev);
3131
void pbdrv_uart_flush(pbdrv_uart_dev_t *uart_dev);
32-
void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback);
32+
void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback, void *context);
3333

3434
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));
3535
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) {
6060
}
6161
static inline void pbdrv_uart_flush(pbdrv_uart_dev_t *uart_dev) {
6262
}
63-
static inline void pbdrv_uart_set_poll_callback(pbdrv_uart_poll_callback_t callback) {
63+
static inline void pbdrv_uart_set_poll_callback(pbdrv_uart_dev_t *uart_dev, pbdrv_uart_poll_callback_t callback, void *context) {
6464
}
6565

6666
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)) {

0 commit comments

Comments
 (0)