Skip to content

Commit 57c9fdd

Browse files
committed
fix(dma): fix DMA callback again
1 parent 1ad9257 commit 57c9fdd

2 files changed

Lines changed: 52 additions & 16 deletions

File tree

src/fw/drivers/sf32lb/uart.c

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@
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

3029
typedef 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+
143170
static 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

186215
void 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

190222
void 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

379410
void 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

third_party/hal_sifli/SiFliSDK

0 commit comments

Comments
 (0)