2424#include "system/passert.h"
2525#include "uart_definitions.h"
2626
27- #define container_of (ptr , type , member ) \
28- ((type *)((char *)(ptr) - offsetof(type, member)))
27+ static UARTDevice * s_uart_dev_ptr [6 ] = {0 };
2928
3029typedef enum {
3130 UART_FullDuplex = 0 ,
@@ -140,6 +139,34 @@ static UARTPinFunction_t get_uart_pin_fun(UART_HandleTypeDef *uart) {
140139 return pin_fun ;
141140}
142141
142+ static uint32_t get_uart_index (UART_HandleTypeDef * uart ) {
143+ if (uart -> Instance == USART1 ) {
144+ return 0 ;
145+ } else if (uart -> Instance == USART2 ) {
146+ return 0 ;
147+ } else if (uart -> Instance == USART3 ) {
148+ return 0 ;
149+ }
150+ #ifdef USART4
151+ else if (uart -> Instance == USART4 ) {
152+ return 0 ;
153+ }
154+ #endif
155+ #ifdef USART5
156+ else if (uart -> Instance == USART5 ) {
157+ return 0 ;
158+ }
159+ #endif
160+ #ifdef USART6
161+ else if (uart -> Instance == USART6 ) {
162+ return 0 ;
163+ }
164+ #endif
165+ else {
166+ WTF ;
167+ }
168+ }
169+
143170static void prv_init (UARTDevice * dev , UARTInitMode_t mode ) {
144171 if (mode == UART_FullDuplex ) {
145172 dev -> periph -> Init .Mode = UART_MODE_TX_RX ;
@@ -151,6 +178,8 @@ static void prv_init(UARTDevice *dev, UARTInitMode_t mode) {
151178 WTF ;
152179 }
153180
181+ s_uart_dev_ptr [get_uart_index (dev -> periph )] = dev ;
182+
154183 UARTPinFunction_t pin_fun = get_uart_pin_fun (dev -> periph );
155184 switch (mode ) {
156185 case UART_FullDuplex :
@@ -185,7 +214,10 @@ void uart_init_tx_only(UARTDevice *dev) { prv_init(dev, UART_TxOnly); }
185214
186215void uart_init_rx_only (UARTDevice * dev ) { prv_init (dev , UART_RxOnly ); }
187216
188- void uart_deinit (UARTDevice * dev ) { HAL_UART_DeInit (dev -> periph ); }
217+ void uart_deinit (UARTDevice * dev ) {
218+ HAL_UART_DeInit (dev -> periph );
219+ s_uart_dev_ptr [get_uart_index (dev -> periph )] = NULL ;
220+ }
189221
190222void uart_set_baud_rate (UARTDevice * dev , uint32_t baud_rate ) {
191223 PBL_ASSERTN (dev -> state -> initialized );
@@ -299,8 +331,7 @@ void uart_irq_handler(UARTDevice *dev) {
299331 .framing_error = uart_has_rx_framing_error (dev ),
300332 };
301333 // DMA
302- if (dev -> state -> rx_dma_buffer &&
303- (__HAL_UART_GET_FLAG (dev -> periph , UART_FLAG_IDLE ) != RESET ) &&
334+ if (dev -> state -> rx_dma_buffer && (__HAL_UART_GET_FLAG (dev -> periph , UART_FLAG_IDLE ) != RESET ) &&
304335 (__HAL_UART_GET_IT_SOURCE (dev -> periph , UART_IT_IDLE ) != RESET )) {
305336 // process bytes from the DMA buffer
306337 const uint32_t dma_length = dev -> state -> rx_dma_length ;
@@ -377,33 +408,38 @@ void uart_clear_all_interrupt_flags(UARTDevice *dev) {
377408}
378409
379410void HAL_UART_RxHalfCpltCallback (UART_HandleTypeDef * huart ) {
380- //TODO: need to find a way to convert huart to dev as dev is not container of huart
381- #if 0
382411 size_t recv_len ;
383412 size_t recv_total_index ;
384- UARTDevice * dev = container_of (huart , UARTDevice , periph );
413+ uint32_t idx ;
414+ bool should_context_switch = false;
415+ UARTDevice * dev = s_uart_dev_ptr [get_uart_index (huart )];
385416
386417 recv_total_index = dev -> state -> rx_dma_length - __HAL_DMA_GET_COUNTER (dev -> rx_dma );
387418 if (recv_total_index < dev -> state -> rx_dma_index )
388419 recv_len = dev -> state -> rx_dma_length + recv_total_index - dev -> state -> rx_dma_index ;
389420 else
390421 recv_len = recv_total_index - dev -> state -> rx_dma_index ;
391- dev -> state -> rx_dma_index = recv_total_index ;
392422
423+ idx = dev -> state -> rx_dma_index ;
424+ dev -> state -> rx_dma_index = recv_total_index ;
393425 if (recv_len ) {
394426 for (size_t i = 0 ; i < recv_len ; i ++ ) {
395- const uint8_t data = dev -> state -> rx_dma_buffer [dev -> state -> rx_dma_index + i ];
427+ uint8_t data ;
428+ data = dev -> state -> rx_dma_buffer [idx ];
396429 if (dev -> state -> rx_irq_handler (dev , data , NULL )) {
397- // context switch
430+ should_context_switch = true;
431+ }
432+ idx ++ ;
433+ if (idx >= dev -> state -> rx_dma_length ) {
434+ idx = 0 ;
398435 }
399436 }
400437 }
401- #endif
438+ portEND_SWITCHING_ISR ( should_context_switch );
402439}
403440
404- void HAL_UART_RxCpltCallback (UART_HandleTypeDef * huart ) {
405- //TODO:
406- //HAL_UART_RxHalfCpltCallback(huart);
441+ void HAL_UART_RxCpltCallback (UART_HandleTypeDef * huart ) {
442+ HAL_UART_RxHalfCpltCallback (huart );
407443}
408444
409445// DMA
0 commit comments