#include "system_cfg.h" #include "sysDef.h" #include "tl2cdr.h" #include "halfLvdsMacSvr.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 pkt_len = 32; uint32_t i; uint32_t *data_ptr = (uint32_t *)MST_TX_BUF; //准备数据 for (i = 0; i < pkt_len; i++) MST_TX_BUF[i] = i; //开始发送工作 *tx0_txLen = pkt_len + 8; *tx0_txFifo = (pkt_len << 20) | (0 << 16) | 0; uint32_t tx_index = 0; uint32_t rx_index = 0; while (1) { if (isr_flag[CDR_INT_TX0_FIFO_DEQ]) { isr_flag[CDR_INT_TX0_FIFO_DEQ] = 0; if (tx_index < pkt_len / 4) { *tx0_txFifo = data_ptr[tx_index]; tx_index++; } } if (isr_flag[CDR_INT_RX1START]) { isr_flag[CDR_INT_RX1START] = 0; MST_RX_BUF[rx_index] = *rx1_rxFifo; rx_index++; } 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; } } else if (mode == WORKMODE_SLAVE) { uint32_t rx_index = 0; while (1) { if (isr_flag[CDR_INT_TX0_FIFO_DEQ]) { isr_flag[CDR_INT_TX0_FIFO_DEQ] = 0; } //tx1 上行 if (isr_flag[CDR_INT_TX1_FIFO_DEQ]) { isr_flag[CDR_INT_TX1_FIFO_DEQ] = 0; } //rx0 下行 if (isr_flag[CDR_INT_RX0START]) { isr_flag[CDR_INT_RX0START] = 0; } if (isr_flag[CDR_INT_RX0_FIFO_ENQ]) { 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_index += 4U; } else { *tx1_txFifo = *rx0_rxFifo; rx_index += 4U; } } if (isr_flag[CDR_INT_RX0END]) { isr_flag[CDR_INT_RX0END] = 0; break; } if (isr_flag[CDR_INT_RX1END]) { isr_flag[CDR_INT_RX1END] = 0; break; } } } else { } }