From 8c3c0112fbe943d61863df42bf21a2277b383259 Mon Sep 17 00:00:00 2001 From: bacon Date: Wed, 12 Feb 2025 19:41:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E9=82=BB=E5=B1=85=E7=9A=84=E5=8D=8F=E8=AE=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tb/sw/src/halfLvdsMacSvr.c | 176 +++++++++++++++++++++++-------------- tb/sw/src/halfLvdsMacSvr.h | 3 - 2 files changed, 108 insertions(+), 71 deletions(-) diff --git a/tb/sw/src/halfLvdsMacSvr.c b/tb/sw/src/halfLvdsMacSvr.c index 60394d0..b35b987 100644 --- a/tb/sw/src/halfLvdsMacSvr.c +++ b/tb/sw/src/halfLvdsMacSvr.c @@ -13,21 +13,13 @@ uint8_t MST_RX_BUF[RX_BUF_NUM * RX_BUF_MAX_LEN] __attribute__((aligned(32))); extern const uint8_t int_svr_code[]; uint32_t (*sys_call)(uint32_t no, ...); -/* -#define CDR_INT_TX0END 14U -#define CDR_INT_TX1END 15U -#define CDR_INT_RX0ERROR 16U -#define CDR_INT_RX1ERROR 17U -#define CDR_INT_RX0START 18U -#define CDR_INT_RX1START 19U -#define CDR_INT_RX0END 20U -#define CDR_INT_RX1END 21U -#define CDR_INT_TX0_FIFO_DEQ 22U -#define CDR_INT_TX1_FIFO_DEQ 23U -#define CDR_INT_RX0_FIFO_ENQ 24U -#define CDR_INT_RX1_FIFO_ENQ 25U -*/ + + + +static uint32_t HLM_slave_poll(void); + volatile uint32_t isr_flag[32] = {0}; + uint32_t HLM_poll(uint32_t mode) { sys_call = (void *)int_svr_code; @@ -40,7 +32,7 @@ uint32_t HLM_poll(uint32_t mode) if (mode == WORKMODE_MASTER) { - uint32_t tx_pkt_len = 256; + uint32_t tx_pkt_len = 1024; uint32_t rx_pkt_len = 0; uint32_t rx_start = 0; uint32_t status; @@ -118,66 +110,114 @@ uint32_t HLM_poll(uint32_t mode) } else if (mode == WORKMODE_SLAVE) { - uint32_t rx_index = 0; - uint32_t tx_pkt_len; - uint32_t rx_pkt_len = 0; - uint32_t rx_start = 0; - uint32_t status; - - *rx0_rxTxPair = 1; - *rx0_rxTimerAim = 0; //240; - *rx1_rxTxPair = 0; - *rx1_rxTimerAim = 0; - *plic_enable_0_31 = 0; - - #ifdef __riscv_e - sys_call(SYS_SLAVE_WORK); - - #else - while(1) - { - status = *HLM_status; - if (status & HLM_RX0_VALID) - { - rx_start = 1; - break; - } - } - - while (1) - { - status = *HLM_status; - - if (rx_start && (status & HLM_RX0_VALID)) - { - uint32_t data; - data = *rx0_rxFifo; - if (rx_index == 0) - { - rx_pkt_len = (data >> 20) + 4; - *tx1_txLen = rx_pkt_len; - } - - rx_index++; - *tx1_txFifo = data; - if (rx_pkt_len <= (rx_index * 4)) - { - rx_start = 0; - break; - } - } - } - #endif + HLM_slave_poll(); } else { } + return 0; +} + +#define DETECT_DEVICE_PKT_LEN 4 +#define DETECT_DEVICE_PKT_TX_LEN (DETECT_DEVICE_PKT_LEN + 4) +#define MAGIC_NUM 0xa53fd1a0U +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 status; + uint32_t is_terminal = 1; + + //填充检测下行设备的包 + uint32_t detect_pkt = MAGIC_NUM; + + int i; + + *rx0_rxTxPair = 1; + *rx0_rxTimerAim = 0; //240; + *rx1_rxTxPair = 0; + *rx1_rxTimerAim = 0; + *plic_enable_0_31 = 0; + + + + #ifdef __riscv_e + sys_call(SYS_SLAVE_WORK); + #else + + + + + while (1) + { + 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++) + { + if (down_rx_start) // && (status & HLM_RX0_VALID)) + {//处理上行接收 + uint32_t data; + data = *rx0_rxFifo; + if (rx_index == 0) + { + rx_pkt_len = (data >> 20) + 4; + *tx1_txLen = rx_pkt_len; + } + + rx_index++; + *tx1_txFifo = data; + if (rx_pkt_len <= (rx_index * 4)) + { + down_rx_start = 0; + break; + } + if ((rx_index & 0x1f) == 10) + detect_start = 1; + } + else + break; + } + + if (detect_start) + { + *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)) + { + *rx1_softReset = 1; + *tx0_softReset = 1; + } + } + } + else + {//不是终节点 + + } + } + + #endif } - - - diff --git a/tb/sw/src/halfLvdsMacSvr.h b/tb/sw/src/halfLvdsMacSvr.h index c4b6da6..f6af98e 100644 --- a/tb/sw/src/halfLvdsMacSvr.h +++ b/tb/sw/src/halfLvdsMacSvr.h @@ -3,10 +3,7 @@ #include "stdint.h" - - uint32_t HLM_poll(uint32_t mode); -uint32_t HLM_work_with_isr(uint32_t mode); #endif