Skip to content

Commit 3425a00

Browse files
authored
fix: HSLink Pro delay issues for uart rx to usb (cherry-embedded#16)
1 parent 4f8848c commit 3425a00

File tree

2 files changed

+45
-27
lines changed

2 files changed

+45
-27
lines changed

projects/HSLink-Pro/src/main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "projects/HSLink-Pro/common/HSLink_Pro_expansion.h"
99

1010
extern void uartx_preinit(void);
11+
extern void usb2uart_handler (void);
1112

1213
char serial_number[32];
1314

@@ -61,6 +62,7 @@ int main(void)
6162
while (1) {
6263
chry_dap_handle();
6364
chry_dap_usb2uart_handle();
65+
usb2uart_handler();
6466
HSP_Loop();
6567
}
6668
}

projects/HSLink-Pro/src/usb2uart.c

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,19 @@
1616

1717
#define UART_TX_DMA HPM_DMA_SRC_UART2_TX
1818
#define UART_TX_DMA_RESOURCE_INDEX (1U)
19-
#define UART_TX_DMA_BUFFER_SIZE (8192U)
19+
// #define UART_TX_DMA_BUFFER_SIZE (8192U)
2020

21-
ATTR_PLACE_AT_NONCACHEABLE_BSS_WITH_ALIGNMENT(4)
22-
uint8_t uart_tx_buf[UART_TX_DMA_BUFFER_SIZE];
21+
static uint32_t rb_write_pos = 0;
22+
// ATTR_PLACE_AT_NONCACHEABLE_BSS_WITH_ALIGNMENT(4)
23+
// uint8_t uart_tx_buf[UART_TX_DMA_BUFFER_SIZE];
2324
ATTR_PLACE_AT_NONCACHEABLE_BSS_WITH_ALIGNMENT(4)
2425
uint8_t uart_rx_buf[UART_RX_DMA_BUFFER_COUNT][UART_RX_DMA_BUFFER_SIZE];
2526
ATTR_PLACE_AT_NONCACHEABLE_BSS_WITH_ALIGNMENT(8)
26-
dma_linked_descriptor_t rx_descriptors[UART_RX_DMA_BUFFER_COUNT - 1];
27+
dma_linked_descriptor_t rx_descriptors[UART_RX_DMA_BUFFER_COUNT];
2728

2829
static dma_resource_t dma_resource_pools[2];
2930
volatile uint32_t g_uart_tx_transfer_length = 0;
3031
static hpm_stat_t board_uart_dma_config(void);
31-
static hpm_stat_t board_uart_rx_dma_restart(void);
3232

3333
void dma_channel_tc_callback(DMA_Type *ptr, uint32_t channel, void *user_data)
3434
{
@@ -41,13 +41,10 @@ void dma_channel_tc_callback(DMA_Type *ptr, uint32_t channel, void *user_data)
4141
uint32_t link_addr = ptr->CHCTRL[channel].LLPOINTER;
4242
uint32_t rx_desc_size = (sizeof(rx_descriptors) / sizeof(dma_linked_descriptor_t));
4343
if (rx_resource->channel == channel) {
44-
if (link_addr == (uint32_t)NULL) {
45-
board_uart_rx_dma_restart();
46-
return;
47-
}
4844
for (i = 0; i < rx_desc_size; i++) {
4945
if (link_addr == core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)&rx_descriptors[i])) {
50-
chry_ringbuffer_write(&g_uartrx, uart_rx_buf[i - 1], UART_RX_DMA_BUFFER_SIZE);
46+
chry_ringbuffer_write(&g_uartrx, &uart_rx_buf[i][rb_write_pos], UART_RX_DMA_BUFFER_SIZE - rb_write_pos);
47+
rb_write_pos = 0;
5148
}
5249
}
5350
}
@@ -69,8 +66,8 @@ void uart_isr(void)
6966
if (uart_received_data_count > 0) {
7067
for (i = 0; i < rx_desc_size; i++) {
7168
if (link_addr == core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)&rx_descriptors[i])) {
72-
chry_ringbuffer_write(&g_uartrx, uart_rx_buf[i], uart_received_data_count);
73-
board_uart_rx_dma_restart();
69+
chry_ringbuffer_write(&g_uartrx, &uart_rx_buf[i][rb_write_pos], uart_received_data_count - rb_write_pos);
70+
rb_write_pos += uart_received_data_count - rb_write_pos;
7471
break;
7572
}
7673
}
@@ -79,6 +76,37 @@ void uart_isr(void)
7976
}
8077
SDK_DECLARE_EXT_ISR_M(UART_IRQ, uart_isr)
8178

79+
void usb2uart_handler (void)
80+
{
81+
dma_resource_t *rx_resource = &dma_resource_pools[UART_RX_DMA_RESOURCE_INDEX];
82+
const uint32_t rx_desc_size = (sizeof(rx_descriptors) / sizeof(dma_linked_descriptor_t));
83+
uint32_t uart_received_data_count = UART_RX_DMA_BUFFER_SIZE - dma_get_remaining_transfer_size(rx_resource->base, rx_resource->channel);
84+
85+
if ((uart_received_data_count - rb_write_pos) > 0)
86+
{
87+
uint32_t level = disable_global_irq(CSR_MSTATUS_MIE_MASK);
88+
uint32_t link_addr = rx_resource->base->CHCTRL[rx_resource->channel].LLPOINTER;
89+
90+
/* data may be preempted by interrupts, need to reread the count */
91+
uart_received_data_count = UART_RX_DMA_BUFFER_SIZE - dma_get_remaining_transfer_size(rx_resource->base, rx_resource->channel);
92+
93+
if ((uart_received_data_count - rb_write_pos) > 0)
94+
{
95+
for (int i = 0; i < rx_desc_size; i++)
96+
{
97+
if (link_addr == core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)&rx_descriptors[i]))
98+
{
99+
chry_ringbuffer_write(&g_uartrx, &uart_rx_buf[i][rb_write_pos], uart_received_data_count - rb_write_pos);
100+
rb_write_pos += uart_received_data_count - rb_write_pos;
101+
break;
102+
}
103+
}
104+
}
105+
106+
restore_global_irq(level);
107+
}
108+
}
109+
82110
void uartx_preinit(void)
83111
{
84112
// board_init_uart(UART_BASE);
@@ -131,18 +159,6 @@ void chry_dap_usb2uart_uart_send_bydma(uint8_t *data, uint16_t len)
131159
dma_mgr_enable_channel(tx_resource);
132160
}
133161

134-
static hpm_stat_t board_uart_rx_dma_restart(void)
135-
{
136-
dma_resource_t *resource = &dma_resource_pools[UART_RX_DMA_RESOURCE_INDEX];
137-
dma_mgr_disable_channel(resource);
138-
uint32_t addr = core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)uart_rx_buf[0]);
139-
dma_mgr_set_chn_dst_addr(resource, addr);
140-
addr = core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)&rx_descriptors[0]);
141-
resource->base->CHCTRL[resource->channel].LLPOINTER = addr;
142-
dma_mgr_set_chn_transize(resource, UART_RX_DMA_BUFFER_SIZE);
143-
dma_mgr_enable_channel(resource);
144-
return status_success;
145-
}
146162
static hpm_stat_t board_uart_dma_config(void)
147163
{
148164
dma_mgr_chn_conf_t chg_config;
@@ -165,10 +181,10 @@ static hpm_stat_t board_uart_dma_config(void)
165181
chg_config.dmamux_src = UART_RX_DMA;
166182
for (i = 0; i < rx_desc_size; i++) {
167183
if (i < (rx_desc_size - 1)) {
168-
chg_config.dst_addr = core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)uart_rx_buf[i + 1]);
169-
chg_config.linked_ptr = core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)&rx_descriptors[i + 1]);
184+
chg_config.dst_addr = core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)uart_rx_buf[i]);
185+
chg_config.linked_ptr = core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)&rx_descriptors[i]);
170186
} else {
171-
chg_config.dst_addr = core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)uart_rx_buf[1]);
187+
chg_config.dst_addr = core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)uart_rx_buf[0]);
172188
chg_config.linked_ptr = core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)&rx_descriptors[0]);
173189
}
174190
if (dma_mgr_config_linked_descriptor(resource, &chg_config, (dma_mgr_linked_descriptor_t *)&rx_descriptors[i]) != status_success) {

0 commit comments

Comments
 (0)