增加plic文件,测试仿真

This commit is contained in:
2025-02-10 23:59:35 +08:00
parent be04224806
commit 0dc8c40076
8 changed files with 159 additions and 84 deletions

View File

@@ -2,6 +2,7 @@
#include "sysDef.h"
#include "tl2cdr.h"
#include "halfLvdsMacSvr.h"
#include "plic.h"
//-------------------------------------------------------------------
uint8_t MST_TX_BUF[TX_BUF_NUM * TX_BUF_MAX_LEN] __attribute__((aligned(32)));
@@ -76,110 +77,135 @@ uint32_t HLM_poll(uint32_t mode)
{
if (mode == WORKMODE_MASTER)
{
uint32_t pkt_len = 32;
uint32_t tx_pkt_len = 128;
uint32_t rx_pkt_len = 0;
uint32_t rx_start = 0;
uint32_t status;
uint32_t i;
uint32_t *data_ptr = (uint32_t *)MST_TX_BUF;
uint32_t *tx_data_ptr = (uint32_t *)MST_TX_BUF;
uint32_t *rx_data_ptr = (uint32_t *)MST_RX_BUF;
//准备数据
for (i = 0; i < pkt_len; i++)
for (i = 0; i < tx_pkt_len; i++)
MST_TX_BUF[i] = i;
//开始发送工作
*tx0_txLen = pkt_len + 8;
*tx0_txFifo = (pkt_len << 20) | (0 << 16) | 0;
*tx0_txLen = tx_pkt_len + 8;
*tx0_txFifo = (tx_pkt_len << 20) | (0 << 16) | 0;
uint32_t tx_index = 0;
uint32_t rx_index = 0;
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;
}
while (1)
{
if (isr_flag[CDR_INT_TX0_FIFO_DEQ])
status = *HLM_status;
if (((tx_index * 4) < tx_pkt_len) && (status & HLM_TX0_FIFO_FULL))
{
isr_flag[CDR_INT_TX0_FIFO_DEQ] = 0;
if (tx_index < pkt_len / 4)
*tx0_txFifo = tx_data_ptr[tx_index];
tx_index++;
}
if ((rx_start) && (status & HLM_RX1_VALID))
{
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))
{
*tx0_txFifo = data_ptr[tx_index];
tx_index++;
rx_start = 0;
*rx0_softReset = 1;
*tx1_softReset = 1;
}
}
if (isr_flag[CDR_INT_RX1START])
{
isr_flag[CDR_INT_RX1START] = 0;
MST_RX_BUF[rx_index] = *rx1_rxFifo;
rx_index++;
rx_start = 1;
rx_index = 0;
}
#if 0
if (isr_flag[CDR_INT_RX1_FIFO_ENQ])
{
isr_flag[CDR_INT_RX1_FIFO_ENQ] = 0;
MST_RX_BUF[rx_index] = *rx1_rxFifo;
rx_index++;
}
if (isr_flag[CDR_INT_RX1END])
break;
#endif
}
}
else if (mode == WORKMODE_SLAVE)
{
uint32_t rx_index = 0;
uint32_t rx_len;
uint32_t tx_pkt_len;
uint32_t rx_pkt_len = 0;
uint32_t rx_start = 0;
uint32_t status;
while (1)
{
if (isr_flag[CDR_INT_TX0_FIFO_DEQ])
//status = *HLM_status;
if (rx_start) // && (status & HLM_RX0_VALID))
{
isr_flag[CDR_INT_TX0_FIFO_DEQ] = 0;
uint32_t data;
data = *rx0_rxFifo;
if (rx_index == 0)
{
rx_pkt_len = (data >> 20) + 4;
*tx1_txLen = rx_pkt_len + 4;
}
rx_index++;
*tx1_txFifo = data;
if (rx_pkt_len <= (rx_index * 4))
{
rx_start = 0;
}
}
//tx1 上
if (isr_flag[CDR_INT_TX1_FIFO_DEQ])
{
isr_flag[CDR_INT_TX1_FIFO_DEQ] = 0;
}
//rx0 下行
//rx0 下
if (isr_flag[CDR_INT_RX0START])
{
isr_flag[CDR_INT_RX0START] = 0;
rx_start = 1;
}
if (isr_flag[CDR_INT_RX0_FIFO_ENQ])
//rx1 上行
if (isr_flag[CDR_INT_RX1START])
{
isr_flag[CDR_INT_RX0_FIFO_ENQ] = 0;
if (rx_index == 0)
{
uint32_t first = *rx0_rxFifo;
uint32_t len;
len = (first >> 20U);
*tx1_txLen = len + 8U;
*tx1_txFifo = first;
rx_len = len + 4;
rx_index += 4U;
}
else
{
if (rx_len > rx_index)
{
*tx1_txFifo = *rx0_rxFifo;
rx_index += 4U;
}
}
isr_flag[CDR_INT_RX1START] = 0;
}
if (isr_flag[CDR_INT_RX0END])
{
isr_flag[CDR_INT_RX0END] = 0;
break;
//break;
}
if (isr_flag[CDR_INT_RX1END])
{
isr_flag[CDR_INT_RX1END] = 0;
break;
//break;
}
}
}