From 7b457e9e2261d4e0891bfd7cebc764226f084ea7 Mon Sep 17 00:00:00 2001 From: bacon Date: Sat, 15 Feb 2025 01:05:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8E=E7=AB=99=E9=82=BB=E8=BF=91=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=9A=84=E4=BB=A3=E7=A0=81=E6=AD=A3=E5=B8=B8=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=EF=BC=8C=E5=92=8C=E6=AD=A3=E5=B8=B8=E8=BD=AC=E5=8F=91?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81=E8=83=BD=E5=90=8C=E6=97=B6=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E4=B8=8D=E4=BC=9A=E4=BA=A7=E7=94=9Ffifo=E4=B8=8A?= =?UTF-8?q?=E4=B8=8B=E6=BA=A2=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tb/sw/src/clint.c | 5 +- tb/sw/src/clint.h | 2 +- tb/sw/src/halfLvdsMacSvr.c | 111 ++++++++++++++++++++++++------------- 3 files changed, 77 insertions(+), 41 deletions(-) diff --git a/tb/sw/src/clint.c b/tb/sw/src/clint.c index c0db90d..b95d986 100644 --- a/tb/sw/src/clint.c +++ b/tb/sw/src/clint.c @@ -39,12 +39,13 @@ void disable_mtimer_int() void set_mtimer(uint32_t delta_t) { + #if 0 uint64_t t; - + t = read_mtimer(); t += delta_t; set_mtimecmp(t); - #if 0 + #else uint64_t t; t = *(volatile uint64_t *)(CLINT_BASE + CLINT_MTIME_LOW); diff --git a/tb/sw/src/clint.h b/tb/sw/src/clint.h index 11f8fcb..b893431 100644 --- a/tb/sw/src/clint.h +++ b/tb/sw/src/clint.h @@ -24,7 +24,7 @@ extern volatile uint32_t * const mtimecmp_low; extern volatile uint32_t mtimer_int_flag; -uint64_t read_timer(void); +uint64_t read_mtimer(void); void set_mtimecmp(uint64_t value) ; void enable_mtimer_int(); void disable_mtimer_int(); diff --git a/tb/sw/src/halfLvdsMacSvr.c b/tb/sw/src/halfLvdsMacSvr.c index 2f385fb..f392d90 100644 --- a/tb/sw/src/halfLvdsMacSvr.c +++ b/tb/sw/src/halfLvdsMacSvr.c @@ -121,18 +121,23 @@ uint32_t HLM_poll(uint32_t mode) #define DETECT_DEVICE_PKT_LEN 4 #define DETECT_DEVICE_PKT_TX_LEN (DETECT_DEVICE_PKT_LEN + 4) #define MAGIC_NUM 0xa53fd1a0U +#define DETECT_DEV_INTERVAL ((200)/CLINT_MTIME_TICK_PERIOD) + uint32_t HLM_slave_poll(void) { uint32_t rx_index = 0; uint32_t tx_pkt_len; uint32_t rx_pkt_len = 0; - uint32_t down_rx_start = 0; - uint32_t detect_start = 0; + uint32_t down_rx_work = 0; + uint32_t detect_work = 0; - uint32_t status; + uint32_t hlm_status; uint32_t is_terminal = 1; - uint32_t detect_status = 1; + uint32_t detect_result = 0; + + uint64_t stamp_time; + uint64_t cur_time; //填充检测下行设备的包 uint32_t detect_pkt = MAGIC_NUM; @@ -140,14 +145,15 @@ uint32_t HLM_slave_poll(void) int i; *rx0_rxTxPair = 1; - *rx0_rxTimerAim = 0; //240; + *rx0_rxTimerAim = 0;// 280; *rx1_rxTxPair = 0; *rx1_rxTimerAim = 0; *plic_enable_0_31 = 0; - set_mtimer(100); - enable_mtimer_int(); + stamp_time = read_mtimer(); + //set_mtimer(150); + //enable_mtimer_int(); #ifdef __riscv_e @@ -158,27 +164,37 @@ uint32_t HLM_slave_poll(void) { if (is_terminal) {//是终节点 - status = *HLM_status; - if ((!down_rx_start) && (status & HLM_RX0_VALID)) - down_rx_start = 1; - - for (i = 0; i < HLM_RX0_FIFO_LEFT(status); i++) + hlm_status = *HLM_status; + if ((!down_rx_work) && (hlm_status & HLM_RX0_VALID)) { - if (down_rx_start) + down_rx_work = 1; + } + + for (i = 0; i < HLM_RX0_FIFO_LEFT(hlm_status); i++) + { + uint32_t data; + if (down_rx_work) {//处理上行接收 - uint32_t data; + data = *rx0_rxFifo; if (rx_index == 0) { rx_pkt_len = (data >> 20) + 4; *tx1_txLen = rx_pkt_len; + //rx_pkt_len += 4; //最后是一个0,接收入队列,但不写入tx_fifo } rx_index++; - *tx1_txFifo = data; - if (rx_pkt_len <= (rx_index * 4)) + + if (rx_pkt_len >= (rx_index * 4)) { - down_rx_start = 0; + *tx1_txFifo = data; + } + else + { + down_rx_work = 0; + rx_index = 0; + //*rx0_softReset = 1; break; } } @@ -186,32 +202,51 @@ uint32_t HLM_slave_poll(void) break; } - if (detect_start) + if (down_rx_work == 0) { - *tx0_txLen = DETECT_DEVICE_PKT_TX_LEN; - *tx0_txFifo = (DETECT_DEVICE_PKT_LEN << 20) | 1; - *tx0_txFifo = detect_pkt; - detect_start = 0; - } - - if (status & HLM_RX1_VALID) - { - uint32_t data; - uint32_t num; - data = *rx1_rxFifo; - num = *rx1_rxFifo; - if ((data & 0x1) && (num == MAGIC_NUM)) + if ((detect_work == 1)) { + detect_work = 2; + + *tx0_txLen = (DETECT_DEVICE_PKT_TX_LEN); + *tx0_txFifo = ((DETECT_DEVICE_PKT_LEN << 20) | 1); + *tx0_txFifo = detect_pkt; + } + + if ((detect_work == 2) && (HLM_RX1_FIFO_LEFT(hlm_status) >= 2)) + { + uint32_t data; + uint32_t num; + uint32_t dummy; + + data = *rx1_rxFifo; + num = *rx1_rxFifo; + for (i = 0; i < HLM_RX1_FIFO_LEFT(hlm_status) - 2; i++) + dummy = *rx1_rxFifo; + *rx1_softReset = 1; *tx0_softReset = 1; - detect_status = 1; + + if (((data & 0xff) == 0x1) && (num == MAGIC_NUM)) + detect_result = 1; + + detect_work = 3; + } + + if (detect_work == 0) + { + cur_time = read_mtimer(); + if ((cur_time - stamp_time) >= DETECT_DEV_INTERVAL) + { + stamp_time = cur_time; + detect_work = 1; + } + } + + if ((detect_work == 3)) + { + detect_work = 0; } - } - - if (mtimer_int_flag) - { - mtimer_int_flag = 0; - detect_start = 1; } } else