2025-02-10 14:38:49 +08:00
|
|
|
|
#include "system_cfg.h"
|
|
|
|
|
|
#include "sysDef.h"
|
|
|
|
|
|
#include "tl2cdr.h"
|
|
|
|
|
|
#include "halfLvdsMacSvr.h"
|
2025-02-10 23:59:35 +08:00
|
|
|
|
#include "plic.h"
|
2025-02-13 22:46:21 +08:00
|
|
|
|
#include "clint.h"
|
2025-02-10 14:38:49 +08:00
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
|
|
uint8_t MST_TX_BUF[TX_BUF_NUM * TX_BUF_MAX_LEN] __attribute__((aligned(32)));
|
|
|
|
|
|
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, ...);
|
|
|
|
|
|
|
2025-02-12 19:41:33 +08:00
|
|
|
|
static uint32_t HLM_slave_poll(void);
|
2025-02-13 22:46:21 +08:00
|
|
|
|
volatile uint32_t exti_isr_flag[32] = {0};
|
2025-02-12 19:41:33 +08:00
|
|
|
|
|
2025-02-10 14:38:49 +08:00
|
|
|
|
uint32_t HLM_poll(uint32_t mode)
|
|
|
|
|
|
{
|
2025-02-12 15:58:50 +08:00
|
|
|
|
sys_call = (void *)int_svr_code;
|
|
|
|
|
|
//复位脉冲
|
|
|
|
|
|
*tx0_softReset = 1;
|
|
|
|
|
|
*tx1_softReset = 1;
|
|
|
|
|
|
*rx0_softReset = 1;
|
|
|
|
|
|
*rx1_softReset = 1;
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-02-10 14:38:49 +08:00
|
|
|
|
if (mode == WORKMODE_MASTER)
|
|
|
|
|
|
{
|
2025-02-12 19:41:33 +08:00
|
|
|
|
uint32_t tx_pkt_len = 1024;
|
2025-02-10 23:59:35 +08:00
|
|
|
|
uint32_t rx_pkt_len = 0;
|
|
|
|
|
|
uint32_t rx_start = 0;
|
|
|
|
|
|
uint32_t status;
|
2025-02-13 22:46:21 +08:00
|
|
|
|
uint32_t is_exit = 0;
|
2025-02-10 23:59:35 +08:00
|
|
|
|
|
2025-02-10 14:38:49 +08:00
|
|
|
|
uint32_t i;
|
2025-02-10 23:59:35 +08:00
|
|
|
|
uint32_t *tx_data_ptr = (uint32_t *)MST_TX_BUF;
|
|
|
|
|
|
uint32_t *rx_data_ptr = (uint32_t *)MST_RX_BUF;
|
2025-02-10 14:38:49 +08:00
|
|
|
|
|
|
|
|
|
|
//准备数据
|
2025-02-10 23:59:35 +08:00
|
|
|
|
for (i = 0; i < tx_pkt_len; i++)
|
2025-02-10 14:38:49 +08:00
|
|
|
|
MST_TX_BUF[i] = i;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//开始发送工作
|
2025-02-11 17:56:44 +08:00
|
|
|
|
*tx0_txLen = tx_pkt_len + 4;
|
2025-02-12 01:17:54 +08:00
|
|
|
|
*tx0_txFifo = (tx_pkt_len << 20) | 0;
|
2025-02-10 14:38:49 +08:00
|
|
|
|
|
|
|
|
|
|
uint32_t tx_index = 0;
|
|
|
|
|
|
uint32_t rx_index = 0;
|
2025-02-10 23:59:35 +08:00
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < HLM_TX_FIFO_LEN - 1; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((tx_index * 4) < tx_pkt_len)
|
|
|
|
|
|
{
|
|
|
|
|
|
*tx0_txFifo = tx_data_ptr[tx_index];
|
|
|
|
|
|
tx_index++;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-13 22:46:21 +08:00
|
|
|
|
while (!is_exit)
|
2025-02-10 14:38:49 +08:00
|
|
|
|
{
|
2025-02-10 23:59:35 +08:00
|
|
|
|
status = *HLM_status;
|
|
|
|
|
|
|
2025-02-12 17:52:55 +08:00
|
|
|
|
for (i = 0; i < HLM_TX_FIFO_LEN - HLM_TX0_FIFO_LEFT(status); i++)
|
2025-02-10 14:38:49 +08:00
|
|
|
|
{
|
2025-02-12 17:52:55 +08:00
|
|
|
|
if ((tx_index * 4) < tx_pkt_len)
|
|
|
|
|
|
{
|
|
|
|
|
|
*tx0_txFifo = tx_data_ptr[tx_index];
|
|
|
|
|
|
tx_index++;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
break;
|
2025-02-12 01:17:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-12 17:52:55 +08:00
|
|
|
|
for (i = 0; i < HLM_RX1_FIFO_LEFT(status); i++)
|
2025-02-10 23:59:35 +08:00
|
|
|
|
{
|
2025-02-12 17:52:55 +08:00
|
|
|
|
//if ((rx_start) && (status & HLM_RX1_VALID))
|
|
|
|
|
|
if (rx_start)
|
2025-02-10 14:38:49 +08:00
|
|
|
|
{
|
2025-02-12 17:52:55 +08:00
|
|
|
|
rx_data_ptr[rx_index] = *rx1_rxFifo;
|
|
|
|
|
|
if (rx_index == 0)
|
|
|
|
|
|
rx_pkt_len = (rx_data_ptr[rx_index] >> 20) + 4;
|
|
|
|
|
|
|
|
|
|
|
|
rx_index++;
|
|
|
|
|
|
|
|
|
|
|
|
if (rx_pkt_len <= (rx_index * 4))
|
|
|
|
|
|
{
|
|
|
|
|
|
rx_start = 0;
|
|
|
|
|
|
rx_index = 0;
|
2025-02-13 22:46:21 +08:00
|
|
|
|
is_exit = 1;
|
2025-02-12 17:52:55 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2025-02-10 14:38:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-13 22:46:21 +08:00
|
|
|
|
if (exti_isr_flag[CDR_INT_RX1START])
|
2025-02-10 14:38:49 +08:00
|
|
|
|
{
|
2025-02-13 22:46:21 +08:00
|
|
|
|
exti_isr_flag[CDR_INT_RX1START] = 0;
|
2025-02-10 23:59:35 +08:00
|
|
|
|
rx_start = 1;
|
|
|
|
|
|
rx_index = 0;
|
2025-02-10 14:38:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-02-13 22:46:21 +08:00
|
|
|
|
|
2025-02-10 14:38:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
else if (mode == WORKMODE_SLAVE)
|
|
|
|
|
|
{
|
2025-02-12 19:41:33 +08:00
|
|
|
|
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
|
2025-02-15 01:05:16 +08:00
|
|
|
|
#define DETECT_DEV_INTERVAL ((200)/CLINT_MTIME_TICK_PERIOD)
|
|
|
|
|
|
|
2025-02-12 19:41:33 +08:00
|
|
|
|
uint32_t HLM_slave_poll(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint32_t rx_index = 0;
|
|
|
|
|
|
uint32_t tx_pkt_len;
|
|
|
|
|
|
uint32_t rx_pkt_len = 0;
|
|
|
|
|
|
|
2025-02-15 01:05:16 +08:00
|
|
|
|
uint32_t down_rx_work = 0;
|
|
|
|
|
|
uint32_t detect_work = 0;
|
2025-02-12 19:41:33 +08:00
|
|
|
|
|
2025-02-15 01:05:16 +08:00
|
|
|
|
uint32_t hlm_status;
|
2025-02-12 19:41:33 +08:00
|
|
|
|
uint32_t is_terminal = 1;
|
2025-02-15 01:05:16 +08:00
|
|
|
|
uint32_t detect_result = 0;
|
|
|
|
|
|
|
|
|
|
|
|
uint64_t stamp_time;
|
|
|
|
|
|
uint64_t cur_time;
|
2025-02-12 19:41:33 +08:00
|
|
|
|
|
|
|
|
|
|
//填充检测下行设备的包
|
|
|
|
|
|
uint32_t detect_pkt = MAGIC_NUM;
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
*rx0_rxTxPair = 1;
|
2025-02-15 01:05:16 +08:00
|
|
|
|
*rx0_rxTimerAim = 0;// 280;
|
2025-02-12 19:41:33 +08:00
|
|
|
|
*rx1_rxTxPair = 0;
|
|
|
|
|
|
*rx1_rxTimerAim = 0;
|
|
|
|
|
|
*plic_enable_0_31 = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-02-15 01:05:16 +08:00
|
|
|
|
stamp_time = read_mtimer();
|
|
|
|
|
|
//set_mtimer(150);
|
|
|
|
|
|
//enable_mtimer_int();
|
2025-02-13 22:46:21 +08:00
|
|
|
|
|
2025-02-12 19:41:33 +08:00
|
|
|
|
|
|
|
|
|
|
#ifdef __riscv_e
|
|
|
|
|
|
sys_call(SYS_SLAVE_WORK);
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (is_terminal)
|
|
|
|
|
|
{//是终节点
|
2025-02-15 01:05:16 +08:00
|
|
|
|
hlm_status = *HLM_status;
|
|
|
|
|
|
if ((!down_rx_work) && (hlm_status & HLM_RX0_VALID))
|
|
|
|
|
|
{
|
|
|
|
|
|
down_rx_work = 1;
|
|
|
|
|
|
}
|
2025-02-12 19:41:33 +08:00
|
|
|
|
|
2025-02-15 01:05:16 +08:00
|
|
|
|
for (i = 0; i < HLM_RX0_FIFO_LEFT(hlm_status); i++)
|
2025-02-12 15:58:50 +08:00
|
|
|
|
{
|
2025-02-15 01:05:16 +08:00
|
|
|
|
uint32_t data;
|
|
|
|
|
|
if (down_rx_work)
|
2025-02-12 19:41:33 +08:00
|
|
|
|
{//处理上行接收
|
2025-02-15 01:05:16 +08:00
|
|
|
|
|
2025-02-12 19:41:33 +08:00
|
|
|
|
data = *rx0_rxFifo;
|
|
|
|
|
|
if (rx_index == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
rx_pkt_len = (data >> 20) + 4;
|
|
|
|
|
|
*tx1_txLen = rx_pkt_len;
|
2025-02-15 01:05:16 +08:00
|
|
|
|
//rx_pkt_len += 4; //最后是一个0,接收入队列,但不写入tx_fifo
|
2025-02-12 19:41:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
rx_index++;
|
2025-02-15 01:05:16 +08:00
|
|
|
|
|
|
|
|
|
|
if (rx_pkt_len >= (rx_index * 4))
|
|
|
|
|
|
{
|
|
|
|
|
|
*tx1_txFifo = data;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
2025-02-12 19:41:33 +08:00
|
|
|
|
{
|
2025-02-15 01:05:16 +08:00
|
|
|
|
down_rx_work = 0;
|
|
|
|
|
|
rx_index = 0;
|
|
|
|
|
|
//*rx0_softReset = 1;
|
2025-02-12 19:41:33 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
break;
|
2025-02-12 15:58:50 +08:00
|
|
|
|
}
|
2025-02-10 23:59:35 +08:00
|
|
|
|
|
2025-02-15 01:05:16 +08:00
|
|
|
|
if (down_rx_work == 0)
|
2025-02-12 19:41:33 +08:00
|
|
|
|
{
|
2025-02-15 01:05:16 +08:00
|
|
|
|
if ((detect_work == 1))
|
|
|
|
|
|
{
|
|
|
|
|
|
detect_work = 2;
|
2025-02-10 14:38:49 +08:00
|
|
|
|
|
2025-02-15 01:05:16 +08:00
|
|
|
|
*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))
|
2025-02-10 23:59:35 +08:00
|
|
|
|
{
|
2025-02-15 01:05:16 +08:00
|
|
|
|
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;
|
|
|
|
|
|
|
2025-02-12 19:41:33 +08:00
|
|
|
|
*rx1_softReset = 1;
|
|
|
|
|
|
*tx0_softReset = 1;
|
2025-02-15 01:05:16 +08:00
|
|
|
|
|
|
|
|
|
|
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;
|
2025-02-10 23:59:35 +08:00
|
|
|
|
}
|
2025-02-13 22:46:21 +08:00
|
|
|
|
}
|
2025-02-10 14:38:49 +08:00
|
|
|
|
}
|
2025-02-12 19:41:33 +08:00
|
|
|
|
else
|
|
|
|
|
|
{//不是终节点
|
2025-02-10 14:38:49 +08:00
|
|
|
|
|
2025-02-12 19:41:33 +08:00
|
|
|
|
}
|
2025-02-10 14:38:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-12 19:41:33 +08:00
|
|
|
|
#endif
|
|
|
|
|
|
}
|
2025-02-10 14:38:49 +08:00
|
|
|
|
|
|
|
|
|
|
|