@@ -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
5153static 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
7275PT_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}
0 commit comments