#include "system_cfg.h" #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))); 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, ...); uint32_t HLM_work_with_isr(uint32_t mode) { int i; sys_call = (void *)int_svr_code; //复位脉冲 *tx0_softReset = 1; *tx1_softReset = 1; *rx0_softReset = 1; *rx1_softReset = 1; //tx0 下行 //tx1 上行 //rx0 下行 //rx1 上行 if (mode == WORKMODE_MASTER) { uint32_t tx_len; tx_len = 32; for (i = 0; i < tx_len - 1; i++) { MST_TX_BUF[i] = i; } sys_call(SYS_SET_RECV_INFO, MST_RX_BUF); sys_call(SYS_SEND_DATA, MST_TX_BUF, tx_len); } else if (mode == WORKMODE_SLAVE) { } else { } return 0; } /* #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 */ volatile uint32_t isr_flag[32] = {0}; uint32_t HLM_poll(uint32_t mode) { if (mode == WORKMODE_MASTER) { 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 *tx_data_ptr = (uint32_t *)MST_TX_BUF; uint32_t *rx_data_ptr = (uint32_t *)MST_RX_BUF; //准备数据 for (i = 0; i < tx_pkt_len; i++) MST_TX_BUF[i] = i; //开始发送工作 *tx0_txLen = tx_pkt_len + 4; *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) { status = *HLM_status; if (((tx_index * 4) < tx_pkt_len) && (!(status & HLM_TX0_FIFO_FULL))) { *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)) { rx_start = 0; } } if (isr_flag[CDR_INT_RX1START]) { isr_flag[CDR_INT_RX1START] = 0; 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++; } #endif } } 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; 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; } } //rx0 下行 if (isr_flag[CDR_INT_RX0START]) { isr_flag[CDR_INT_RX0START] = 0; rx_start = 1; } } } else { } }