Skip to content

Commit

Permalink
pbio/drv/uart: Add context to uart callback.
Browse files Browse the repository at this point in the history
  • Loading branch information
laurensvalk committed Jan 15, 2025
1 parent 67884e5 commit 14a141b
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 11 deletions.
2 changes: 1 addition & 1 deletion lib/pbio/drv/legodev/legodev_pup.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
9 changes: 6 additions & 3 deletions lib/pbio/drv/uart/uart_stm32f0.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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)) {
Expand Down Expand Up @@ -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);
}
}

Expand All @@ -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);
}
}
}
Expand Down
9 changes: 6 additions & 3 deletions lib/pbio/drv/uart/uart_stm32f4_ll_irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
}
}

Expand All @@ -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);
}
}
}
Expand Down
7 changes: 5 additions & 2 deletions lib/pbio/drv/uart/uart_stm32l4_ll_dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
}
}

Expand Down
4 changes: 2 additions & 2 deletions lib/pbio/include/pbdrv/uart.h
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down Expand Up @@ -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)) {
Expand Down

0 comments on commit 14a141b

Please sign in to comment.