From adfc7e798b9cbdd022bf8df971843436912a0fe5 Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期日, 20 七月 2025 16:58:30 +0800 Subject: [PATCH] 成功移植g_com_map表逻辑,初步测试能读能写,并且TDOA效果和官方一致 --- keil/include/components/uci/src/uci_uart_driver.c | 204 ++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 169 insertions(+), 35 deletions(-) diff --git a/keil/include/components/uci/src/uci_uart_driver.c b/keil/include/components/uci/src/uci_uart_driver.c index c27e250..c28e586 100644 --- a/keil/include/components/uci/src/uci_uart_driver.c +++ b/keil/include/components/uci/src/uci_uart_driver.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and + * Copyright (c) 2019-2025 Beijing Hanwei Innovation Technology Ltd. Co. and * its subsidiaries and affiliates (collectly called MKSEMI). * * All rights reserved. @@ -46,26 +46,47 @@ #include "uwb_api.h" #include "uci_tl_comm.h" #include "uci_tl_task.h" +#include "math.h" #include "board.h" -#if UCI_INTF_PORT == 0 +#if (UCI_INTF_PORT == 0) && (UCI_INTF_UART_WITH_IDLE_DET == 0) +#define FINE_TUNING_FACTOR (1.3) + +#if 1 #define UCI_PORT UART_ID0 +#define UART_BASE (UART0) +#define RX_DMA_CH (DMA_CH4) +#else +#define UCI_PORT UART_ID1 +#define UART_BASE (UART1) +#define RX_DMA_CH (DMA_CH6) +#endif static void uci_tl_up_req(void); static void uci_tl_timer_notify(void); static void uci_tl_setup(void); static bool uci_tl_up_is_active(void); -static void uci_rx_header_callback(void *dev, uint32_t err_code); -static void rx_over_callback(void *dev, uint32_t err_code); +static void uci_rx_callback(void *dev, uint32_t err_code); static void uci_tx_over_callback(void *dev, uint32_t err_code); +static void uci_tl_stop_rx(void); +static void uci_tl_restart_rx(void); +#if !UCI_INTF_UART_HS +static void uci_tl_reset(void); +#endif extern int uci_validate(uint8_t *buf); uci_tl_dev_t g_uci_tl_dev = { .uci_tl_setup = &uci_tl_setup, +#if UCI_INTF_UART_HS .uci_tl_resume = &uci_tl_setup, +#else + .uci_tl_resume = &uci_tl_reset, +#endif + .uci_tl_rx_stop = &uci_tl_stop_rx, + .uci_tl_rx_restart = &uci_tl_restart_rx, .uci_tl_up_is_active = &uci_tl_up_is_active, .uci_tl_up_req = &uci_tl_up_req, .uci_tl_timer_notify = &uci_tl_timer_notify, @@ -83,6 +104,15 @@ .int_tx = false}; static uint8_t recv_buff[UCI_RX_BUFF_SIZE] = {0}; + +static struct DMA_LINK_DESC_T desc = { + .dst_addr = (uint32_t)&recv_buff[UCI_HEADER_SIZE], + .nxt = NULL, + .size = UCI_RX_BUFF_SIZE - UCI_HEADER_SIZE, +}; + +const static uint8_t retry_ntf[] = {0x60, 0x01, 0x00, 0x01, 0x0A}; + static struct UCI_TL_MSG_T *tl_up_msg = NULL; static bool tx_idle = true; @@ -106,47 +136,111 @@ rx_idle = true; gpio_enable_irq(HOST2SLAVE_HS_GPIO, GPIO_IRQ_TYPE_FALLING_EDGE, host2slave_gpio_callback); #else - uart_receive(UCI_PORT, recv_buff, UCI_HEADER_SIZE, uci_rx_header_callback); + memset(recv_buff, 0, UCI_HEADER_SIZE); + desc.size = UCI_RX_BUFF_SIZE - UCI_HEADER_SIZE; + uart_dma_receive_with_llp(UCI_PORT, recv_buff, UCI_HEADER_SIZE, &desc, uci_rx_callback); #endif } -static void uci_rx_header_callback(void *dev, uint32_t err_code) +#if !UCI_INTF_UART_HS +static void uci_tl_reset(void) { - if (err_code != DMA_INT_TYPE_DONE) - { - uart_receive(UCI_PORT, recv_buff, UCI_HEADER_SIZE, uci_rx_header_callback); - return; - } + uart_open(UCI_PORT, &uci_uart_cfg); +} +#endif - if (uci_validate(recv_buff)) +static void uci_tl_send_ntf(const uint8_t *msg, uint16_t len) +{ + struct UCI_TL_MSG_T *p = WsfBufAlloc((uint16_t)(len + sizeof(struct UCI_TL_MSG_T))); + + if (p != NULL) { - uint16_t payload_len = *(recv_buff + 3) & 0xFFU; - if (payload_len) - { - WsfTimerStartMs(&g_uci_tl_dev.tl_timer, 50, WSF_TIMER_ONE_SHOT); - uart_receive(UCI_PORT, recv_buff + UCI_HEADER_SIZE, payload_len, rx_over_callback); - } - else - { - rx_over_callback(dev, err_code); - } - } - else - { - uart_receive(UCI_PORT, recv_buff, UCI_HEADER_SIZE, uci_rx_header_callback); + p->msg_length = len; + memcpy(p->msg, msg, len); + WsfQueueEnq(&g_uci_tl_dev.tl_up_queue, p); + g_uci_tl_dev.uci_tl_up_done_notify(); } } -static void rx_over_callback(void *dev, uint32_t err_code) +static void uci_rx_callback(void *dev, uint32_t err_code) { - if (err_code != DMA_INT_TYPE_DONE) + uint16_t frame_len; + uint32_t lock; + + if (err_code != DMA_INT_TYPE_DONE || (UART_BASE->STATUS & UART_STATUS_OE_MSK)) { - return; + uci_tl_send_ntf(retry_ntf, sizeof(retry_ntf)); + goto exit; } - WsfTimerStop(&g_uci_tl_dev.tl_timer); + if (((recv_buff[0] >> 5) & 0x0F) > 3) + { + LOG_INFO(TRACE_MODULE_UCI, "Unkown MT field:%X\r\n", (recv_buff[0] >> 5) & 0x0F); + goto exit; + } - uint16_t frame_len = *(recv_buff + 3) + UCI_HEADER_SIZE; + frame_len = (uint16_t)(((*(recv_buff + 2)) << 8) + *(recv_buff + 3) + UCI_HEADER_SIZE); + + if (frame_len > UCI_RX_BUFF_SIZE) + { + LOG_INFO(TRACE_MODULE_UCI, "Message length(%d) is too long\r\n", frame_len); + goto exit; + } + + lock = int_lock(); + + while ((UART_BASE->STATUS & (1 << 0)) && (DMA->CH[RX_DMA_CH].DATA_SIZE != 0)) + { + } + UART_BASE->CTRL0 = UART_CTRL0_FIFO_ENABLE_MSK; + while (DMA->STATUS1 & (1 << RX_DMA_CH)) + { + } + + if (((DMA->CH[RX_DMA_CH].CFG & 0x000F0000) >> 16) == 1) + { + uint32_t remain; + + if (DMA->CH[RX_DMA_CH].DATA_SIZE == 0) + { + if (DMA->CH[RX_DMA_CH].CHAIN_PTR != 0) + { + // first transmission completed, second transmission has not started yet. + remain = frame_len - UCI_HEADER_SIZE; + desc.size = remain; + } + else + { + // second transmission completed. + remain = 0; + } + } + else + { + // second transmission started, has not finished yet. + if (frame_len > (UCI_RX_BUFF_SIZE - DMA->CH[RX_DMA_CH].DATA_SIZE)) + { + remain = frame_len - (UCI_RX_BUFF_SIZE - DMA->CH[RX_DMA_CH].DATA_SIZE); + DMA->CH[RX_DMA_CH].DATA_SIZE = remain; + } + else + { + remain = 0; + } + } + + if (remain > 0) + { + UART_BASE->CTRL0 = UART_CTRL0_FIFO_ENABLE_MSK | UART_CTRL0_DMA_MODE_MSK; + int_unlock(lock); + + mk_timer_list_start_timer(&g_uci_tl_dev.tl_timer, UCI_HS_TIMEOUT_MS, MK_TIMER_ONE_SHOT); + return; + } + } + + UART_BASE->CTRL0 = UART_CTRL0_FIFO_ENABLE_MSK | UART_CTRL0_DMA_MODE_MSK; + int_unlock(lock); if (WsfQueueCount(&g_uci_tl_dev.tl_down_queue) < UCI_MAX_DL_ITEMS) { @@ -170,13 +264,19 @@ g_uci_tl_dev.uci_tl_down_notify(); } +exit: + mk_timer_list_stop_timer(&g_uci_tl_dev.tl_timer); + uart_rx_force_abort_dma(UCI_PORT, NULL); + power_mode_clear(POWER_UNIT_UCI_RX); #if (UCI_INTF_UART_HS) rx_idle = true; return; #else - uart_receive(UCI_PORT, recv_buff, UCI_HEADER_SIZE, uci_rx_header_callback); + memset(recv_buff, 0, UCI_HEADER_SIZE); + desc.size = UCI_RX_BUFF_SIZE - UCI_HEADER_SIZE; + uart_dma_receive_with_llp(UCI_PORT, recv_buff, UCI_HEADER_SIZE, &desc, uci_rx_callback); #endif } @@ -197,8 +297,10 @@ if (!gpio_pin_get_val(HOST2SLAVE_HS_GPIO) && rx_idle) { rx_idle = false; - WsfTimerStartMs(&g_uci_tl_dev.tl_timer, UCI_HS_TIMEOUT_MS, WSF_TIMER_ONE_SHOT); - uart_receive(UCI_PORT, recv_buff, UCI_HEADER_SIZE, uci_rx_header_callback); + mk_timer_list_start_timer(&g_uci_tl_dev.tl_timer, UCI_HS_TIMEOUT_MS, MK_TIMER_ONE_SHOT); + memset(recv_buff, 0, UCI_HEADER_SIZE); + desc.size = UCI_RX_BUFF_SIZE - UCI_HEADER_SIZE; + uart_dma_receive_with_llp(UCI_PORT, recv_buff, UCI_HEADER_SIZE, &desc, uci_rx_callback); power_mode_request(POWER_UNIT_UCI_RX, POWER_MODE_SLEEP); } } @@ -243,7 +345,7 @@ static bool uci_tl_up_is_active(void) { - if (!uart_fifo_busy(UCI_PORT) && !tx_idle) + if (!uart_tx_in_progress(UCI_PORT) && !tx_idle) { #if (UCI_INTF_UART_HS) gpio_pin_set(SLAVE2HOST_HS_GPIO); @@ -257,9 +359,41 @@ static void uci_tl_timer_notify(void) { + LOG_INFO(TRACE_MODULE_UCI, "UCI message rx timeout\r\n"); + + mk_timer_list_stop_timer(&g_uci_tl_dev.tl_timer); + uart_rx_force_abort_dma(UCI_PORT, NULL); + power_mode_clear(POWER_UNIT_UCI_RX); + + uci_tl_send_ntf(retry_ntf, sizeof(retry_ntf)); + #if (UCI_INTF_UART_HS) rx_idle = true; + return; +#else + memset(recv_buff, 0, UCI_HEADER_SIZE); + desc.size = UCI_RX_BUFF_SIZE - UCI_HEADER_SIZE; + uart_dma_receive_with_llp(UCI_PORT, recv_buff, UCI_HEADER_SIZE, &desc, uci_rx_callback); +#endif +} + +static void uci_tl_stop_rx(void) +{ +#if (UCI_INTF_UART_HS) +#else + mk_timer_list_stop_timer(&g_uci_tl_dev.tl_timer); + uart_rx_force_abort_dma(UCI_PORT, NULL); +#endif +} + +static void uci_tl_restart_rx(void) +{ +#if (UCI_INTF_UART_HS) +#else + memset(recv_buff, 0, UCI_HEADER_SIZE); + desc.size = UCI_RX_BUFF_SIZE - UCI_HEADER_SIZE; + uart_dma_receive_with_llp(UCI_PORT, recv_buff, UCI_HEADER_SIZE, &desc, uci_rx_callback); #endif } -- Gitblit v1.9.3