forked from 0xha0/df_datalink
feat: 完成上位机控制逻辑修改
仅在业务阶段传输上位机数据, 上位机下发数据入队, 待发送时隙进行发送, 收到数据自动上传
This commit is contained in:
+215
-289
@@ -46,7 +46,7 @@
|
||||
// -- Production type
|
||||
#define WD_PRD 0x01
|
||||
#define PRD_DL_K 0xDD
|
||||
#define PRD_DL_S 0xEE
|
||||
#define PRD_DL_C 0xEE
|
||||
#define PRD_ALL 0xFF
|
||||
|
||||
// Self-Test
|
||||
@@ -54,158 +54,104 @@
|
||||
// -- Request
|
||||
// -- -- --
|
||||
// -- Response
|
||||
#define ST_RSP_LEN 23
|
||||
// -- -- Self-Test Result
|
||||
#define ST_RSP_LEN 16
|
||||
#define WD_ST_RET 0x02
|
||||
#define ST_RET_OK 0xAA
|
||||
#define ST_RET_ERROR 0x55
|
||||
#define ST_RET_INFO_LEN 13
|
||||
// -- -- Signal processor PS voltage
|
||||
#define WD_SP_FPGA_VOLT 0x03
|
||||
// -- -- Signal processor PS AUX voltage
|
||||
#define WD_SP_CLK_STATE 0x04
|
||||
// -- -- Signal processor DDR voltage
|
||||
#define WD_SP_AD_LOCK_STATE 0x05
|
||||
// -- -- Signal processor PL voltage
|
||||
#define WD_SP_AD_TEMP_0 0x06
|
||||
// -- -- Signal processor PL AUX voltage
|
||||
#define WD_SP_AD_TEMP_1 0x07
|
||||
// -- -- Signal processor Bram voltage
|
||||
#define WD_SP_FPGA_TEMP 0x08
|
||||
// -- -- Hardware info offset
|
||||
#define SP_INFO_OFFSET 0x03
|
||||
#define ST_INFO_LEN 20
|
||||
|
||||
// -- -- Signal processor antenna voltage status
|
||||
#define WD_ANT_VOLT 0x09
|
||||
// Data Echo Test Command
|
||||
#define CMD_ECHO 0xE2
|
||||
|
||||
// -- -- Signal processor antenna RF temperature
|
||||
#define WD_ANT_RF_TEMP 0x0A
|
||||
// -- -- Signal processor antenna PLL lock status
|
||||
#define WD_ANT_RF_PLL 0x0B
|
||||
// -- -- Signal processor antenna MGC
|
||||
#define WD_ANT_MGC_0 0x0C
|
||||
#define WD_ANT_MGC_1 0x0D
|
||||
// -- -- Reserved
|
||||
#define WD_ANT_RESERVE 0x0E
|
||||
|
||||
// Data Send Test Command
|
||||
#define CMD_DATA_TEST_A 0xE2
|
||||
// -- Request
|
||||
#define DATA_TEST_REQ_A_LEN 68
|
||||
// -- -- 68 byte payload
|
||||
// -- Response
|
||||
#define DATA_TEST_RSP_A_LEN 68
|
||||
// -- -- 68 byte payload
|
||||
|
||||
// Data Send Test Command
|
||||
#define CMD_DATA_TEST_B 0xF2
|
||||
// -- Request
|
||||
#define DATA_TEST_REQ_B_LEN 170
|
||||
// -- -- 170 byte payload
|
||||
// -- Response
|
||||
#define DATA_TEST_RSP_B_LEN 170
|
||||
// -- -- 170 byte payload
|
||||
|
||||
// Config load
|
||||
// Configuration
|
||||
#define CMD_CONFIG 0xE3
|
||||
// -- Request
|
||||
// -- -- Enable control
|
||||
#define WD_EN_CMD 0x02
|
||||
#define EN_CMD_ON_HIGH_POWER 0x66
|
||||
#define EN_CMD_ON_LOW_POWER 0x77
|
||||
#define EN_CMD_ENABLE 0x66
|
||||
#define EN_CMD_SILENT 0x88
|
||||
|
||||
#define WD_MODE_CMD 0x03
|
||||
#define MODE_CMD_HEAD 0x11
|
||||
#define MODE_CMD_MEMBER 0x00
|
||||
// -- -- Node mode control
|
||||
#define WD_ID_CMD 0x03
|
||||
// -- -- Service Rate control
|
||||
#define WD_RATE_CMD 0x04
|
||||
#define RATE_CMD_128K 0x22
|
||||
#define RATE_CMD_512K 0x33
|
||||
#define RATE_CMD_2M 0x44
|
||||
// -- -- Routing table select
|
||||
#define WD_RTNE_CMD 0x05
|
||||
// -- Response
|
||||
// -- -- none response
|
||||
|
||||
// System info update
|
||||
#define CMD_SYS_INFO 0x33
|
||||
#define SYS_INFO_OFFSET 2
|
||||
// -- Request
|
||||
// -- -- 54 byte system info
|
||||
#define SYS_INFO_OFFSET 0x02
|
||||
// -- Response
|
||||
// -- -- none response
|
||||
|
||||
// Data Send Test Command
|
||||
#define CMD_FLJ_SEND 0xE4
|
||||
#define FLJ_DATA_OFFSET 2
|
||||
// Data Send Command
|
||||
#define CMD_SEND_DATA 0xE4
|
||||
// -- Request
|
||||
// -- -- 78 byte payload
|
||||
// -- -- destination ID
|
||||
#define SEND_DATA_ID_OFFSET 0x02
|
||||
#define SEND_DATA_ID_LEN 4
|
||||
#define WD_DST_ID 0x06
|
||||
// -- -- data length
|
||||
#define SEND_DATA_LEN_OFFSET 0x07
|
||||
#define SEND_DATA_LEN_LEN 2
|
||||
// -- -- <= 1000 byte payload
|
||||
#define SEND_DATA_OFFSET 0x09
|
||||
// -- Response
|
||||
// -- -- none response
|
||||
|
||||
// Data Send Test Command
|
||||
#define CMD_LJ_SEND 0xF4
|
||||
#define LJ_DATA_OFFSET 2
|
||||
// Data Receive Command
|
||||
#define CMD_RECV_DATA 0xE5
|
||||
// -- Request
|
||||
// -- -- 156 byte payload
|
||||
// -- -- --
|
||||
// -- Response
|
||||
// -- -- none response
|
||||
// -- -- source ID
|
||||
#define RECV_DATA_ID_OFFSET 0x02
|
||||
#define RECV_DATA_ID_LEN 4
|
||||
#define WD_SRC_ID 0x06
|
||||
// -- -- data length
|
||||
#define RECV_DATA_LEN_OFFSET 0x07
|
||||
#define RECV_DATA_LEN_LEN 2
|
||||
// -- -- <= 1000 byte payload
|
||||
#define RECV_DATA_OFFSET 0x09
|
||||
|
||||
// FLJ Poll
|
||||
#define CMD_FLJ_POLL 0xE5
|
||||
// Remote Test
|
||||
#define CMD_RM_TEST 0xE6
|
||||
// -- Request
|
||||
#define WD_FLJ_POLL 0x02
|
||||
#define FLJ_POLL_CODE 0x77
|
||||
// -- -- --
|
||||
// -- Response
|
||||
#define FLJ_POLL_RESP_LEN 170
|
||||
// -- -- received 170 byte payload
|
||||
|
||||
// LJ Poll
|
||||
#define CMD_LJ_POLL 0xF5
|
||||
// -- Request
|
||||
#define WD_LJ_POLL 0x02
|
||||
#define LJ_POLL_CODE 0x77
|
||||
// -- Response
|
||||
#define LJ_POLL_RESP_LEN 68
|
||||
// -- -- received 68 byte payload
|
||||
|
||||
// Remote Test FLJ
|
||||
#define CMD_FLJ_RM_TEST 0xE6
|
||||
// -- Request
|
||||
#define WD_FLJ_RM_TEST 0x02
|
||||
#define FLJ_RM_TEST_CODE 0x99
|
||||
// -- Response
|
||||
#define WD_FLJ_TIME_STAMP 0x02
|
||||
#define WD_FLJ_TIME_STAMP_LEN 8
|
||||
#define WD_FLJ_SYSBUS_LOG 0x0A
|
||||
#define WD_FLJ_SYSBUS_LOG_LEN 14
|
||||
#define WD_FLJ_LINK_LOG 0x18
|
||||
#define WD_FLJ_LINK_LOG_LEN 64
|
||||
#define WD_FLJ_PHY_LOG 0x58
|
||||
#define WD_FLJ_PHY_LOG_LEN 57
|
||||
#define WD_FLJ_HARDWARE_ST 0x91
|
||||
#define WD_FLJ_HARDWARE_ST_LEN 13
|
||||
|
||||
#define FLJ_RM_TEST_RESP_LEN 158
|
||||
|
||||
// Remote Test LJ
|
||||
#define CMD_LJ_RM_TEST 0xF6
|
||||
// -- Request
|
||||
#define WD_LJ_RM_TEST 0x02
|
||||
#define LJ_RM_TEST_CODE 0x99
|
||||
// -- Response
|
||||
#define WD_LJ_TIME_STAMP 0x02
|
||||
#define WD_LJ_TIME_STAMP_LEN 8
|
||||
#define WD_LJ_SYSBUS_LOG 0x0A
|
||||
#define WD_LJ_SYSBUS_LOG_LEN 14
|
||||
#define WD_LJ_LINK_LOG 0x18
|
||||
#define WD_LJ_LINK_LOG_LEN 64
|
||||
#define WD_LJ_PHY_LOG 0x58
|
||||
#define WD_LJ_PHY_LOG_LEN 57
|
||||
#define WD_LJ_HARDWARE_ST 0x91
|
||||
#define WD_LJ_HARDWARE_ST_LEN 13
|
||||
|
||||
#define LJ_RM_TEST_RESP_LEN 158
|
||||
#define RM_TEST_RSP_LEN 190
|
||||
// -- -- 8 byte time stamp
|
||||
#define RT_TIME_STAMP_OFFSET 0x02
|
||||
#define RT_TIME_STAMP_LEN 8
|
||||
// -- -- 16 byte system bus log
|
||||
#define RT_SYSBUS_LOG_OFFSET 0x0A
|
||||
#define RT_SYSBUS_LOG_LEN 16
|
||||
// -- -- 88 byte link layer log
|
||||
#define RT_LINK_LOG_OFFSET 0x1A
|
||||
#define RT_LINK_LOG_LEN 88
|
||||
// -- -- 56 byte physical layer log
|
||||
#define RT_PHY_LOG_OFFSET 0x72
|
||||
#define RT_PHY_LOG_LEN 56
|
||||
// -- -- 20 byte hardware log
|
||||
#define RT_HARDWARE_ST_OFFSET 0xAA
|
||||
#define RT_HARDWARE_ST_LEN 20
|
||||
|
||||
// My Production Type
|
||||
#define MY_PRD_ID PRD_DL_K
|
||||
#define MY_PRD_ID PRD_DL_C
|
||||
/** @} SystemBus_MSG_Constants*/
|
||||
/************************** Function Prototypes ******************************/
|
||||
static int32_t SystemBus_GenSelfTestRsp(SYSBUS *instPtr);
|
||||
static int32_t SystemBus_SystemConfig(SYSBUS *instPtr, uint8_t *msg);
|
||||
static int32_t SystemBus_Echo(SYSBUS *instPtr, SYSBUS_UART_FRAME *frame);
|
||||
static int32_t SystemBus_GenPollRsp(SYSBUS *instPtr, uint8_t *msg);
|
||||
static int32_t SystemBus_GenRemoteTestRsp(SYSBUS *instPtr, uint8_t *msg);
|
||||
/**************************** Type Definitions *******************************/
|
||||
/************************** Variable Definitions *****************************/
|
||||
@@ -221,7 +167,7 @@ inline bool SystemBus_IsReqPending(SYSBUS *instPtr)
|
||||
return (!isCircQueueEmpty(instPtr->rxQueue));
|
||||
}
|
||||
|
||||
inline bool SystemBus_IsRsqPending(SYSBUS *instPtr)
|
||||
inline bool SystemBus_IsRespPending(SYSBUS *instPtr)
|
||||
{
|
||||
ASSERT(instPtr != NULL);
|
||||
return (!isCircQueueEmpty(instPtr->txQueue));
|
||||
@@ -265,7 +211,7 @@ static int32_t SystemBus_GenSelfTestRsp(SYSBUS *instPtr)
|
||||
sysbusRsp->data[WD_ST_RET] = (hwStatsPtr->isSpOk) ? ST_RET_OK : ST_RET_ERROR;
|
||||
}
|
||||
// apply status and omit 2 bytes of overhead.
|
||||
memcpy(sysbusRsp->data + WD_SP_FPGA_VOLT, &(hwStatsPtr->spFpgaVolt), ST_RET_INFO_LEN);
|
||||
memcpy(sysbusRsp->data + SP_INFO_OFFSET, &(hwStatsPtr->spFpgaVolt), ST_INFO_LEN);
|
||||
|
||||
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
|
||||
{
|
||||
@@ -287,72 +233,137 @@ static int32_t SystemBus_SystemConfig(SYSBUS *instPtr, uint8_t *msg)
|
||||
TMC_INST *tmcRef = linkInstPtr->config.tmcInstPtr;
|
||||
bool reconfig = false;
|
||||
|
||||
if (msg[WD_MODE_CMD] == MODE_CMD_HEAD)
|
||||
// Node mode control
|
||||
if (msg[WD_ID_CMD] >= 0 && msg[WD_ID_CMD] < linkConfig.netScale)
|
||||
{
|
||||
// head node config
|
||||
reconfig = (L2_NODE_HEAD != L2_GetNodeType(linkInstPtr));
|
||||
linkConfig.myType = L2_NODE_HEAD;
|
||||
linkConfig.myId = 1;
|
||||
}
|
||||
|
||||
else if (msg[WD_MODE_CMD] == MODE_CMD_MEMBER)
|
||||
{
|
||||
// member node config
|
||||
reconfig = (L2_NODE_MEMBER != L2_GetNodeType(linkInstPtr));
|
||||
linkConfig.myType = L2_NODE_MEMBER;
|
||||
linkConfig.myId = 2;
|
||||
reconfig |= (msg[WD_ID_CMD] != linkConfig.myId);
|
||||
linkConfig.myType = (msg[WD_ID_CMD] == 0) ? L2_NODE_HEAD : L2_NODE_MEMBER;
|
||||
linkConfig.myId = msg[WD_ID_CMD];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Ignore current command
|
||||
DBG_ERROR("Unexpected config command 0x%02X:0x%02X",
|
||||
WD_MODE_CMD, msg[WD_MODE_CMD]);
|
||||
WD_ID_CMD, msg[WD_ID_CMD]);
|
||||
return EPARAM;
|
||||
}
|
||||
|
||||
// if (msg[WD_EN_CMD] == EN_CMD_ON_HIGH_POWER)
|
||||
// {
|
||||
// // full power config
|
||||
// Phy_AntConfigMode(phyRef, PHY_ANT_MODE_POWER_FULL);
|
||||
// if (reconfig || !L2_isStarted(linkInstPtr))
|
||||
// {
|
||||
// Linklayer_Reconfig(linkInstPtr, &linkConfig);
|
||||
// }
|
||||
// Linklayer_Start(linkInstPtr);
|
||||
// }
|
||||
// else if (msg[WD_EN_CMD] == EN_CMD_ON_LOW_POWER)
|
||||
// {
|
||||
// // low power config
|
||||
// Phy_AntConfigMode(phyRef, PHY_ANT_MODE_POWER_LOW);
|
||||
// if (reconfig || !L2_isStarted(linkInstPtr))
|
||||
// {
|
||||
// Linklayer_Reconfig(linkInstPtr, &linkConfig);
|
||||
// }
|
||||
// Linklayer_Start(linkInstPtr);
|
||||
// }
|
||||
// else if (msg[WD_EN_CMD] == EN_CMD_SILENT)
|
||||
// {
|
||||
// // silence config
|
||||
// // TODO: better approach?
|
||||
// Linklayer_Halt(linkInstPtr);
|
||||
// Phy_AntConfigMode(phyRef, PHY_ANT_MODE_STANDBY);
|
||||
// TIME_WORD pullTime = {0, 0};
|
||||
// pullTime.int_part = TimeCtrl_GetIntCnt(tmcRef) + 1;
|
||||
// if (Phy_SetTimeWord(phyRef, &pullTime, PHY_TIME_WORD_POLL) != SUCCESS)
|
||||
// {
|
||||
// DBG_ERROR("Physical set pull time failed.\n");
|
||||
// }
|
||||
// Phy_SetupNextSlot(phyRef, PHY_TOR_RX, L1_10KBPS_10MS_FRAME, NULL);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// // Ignore current command
|
||||
// DBG_ERROR("Unexpected config command 0x%02X:0x%02X",
|
||||
// WD_EN_CMD, msg[WD_EN_CMD]);
|
||||
// return EIGNORE;
|
||||
// }
|
||||
instPtr->sysbusLog.lastConfig[0] = msg[WD_MODE_CMD];
|
||||
instPtr->sysbusLog.lastConfig[1] = msg[WD_EN_CMD];
|
||||
// Service Rate control
|
||||
switch (msg[WD_RATE_CMD])
|
||||
{
|
||||
case RATE_CMD_128K:
|
||||
{
|
||||
reconfig |= (linkConfig.serviceRate != L2_SVC_128K);
|
||||
linkConfig.serviceRate = L2_SVC_128K;
|
||||
break;
|
||||
}
|
||||
case RATE_CMD_512K:
|
||||
{
|
||||
reconfig |= (linkConfig.serviceRate != L2_SVC_512K);
|
||||
linkConfig.serviceRate = L2_SVC_512K;
|
||||
break;
|
||||
}
|
||||
case RATE_CMD_2M:
|
||||
{
|
||||
reconfig |= (linkConfig.serviceRate != L2_SVC_2M);
|
||||
linkConfig.serviceRate = L2_SVC_2M;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Ignore current command
|
||||
DBG_ERROR("Unexpected config command 0x%02X:0x%02X",
|
||||
WD_RATE_CMD, msg[WD_RATE_CMD]);
|
||||
return EPARAM;
|
||||
}
|
||||
}
|
||||
|
||||
// Enable control
|
||||
if (msg[WD_EN_CMD] == EN_CMD_ENABLE)
|
||||
{
|
||||
if (reconfig || !L2_isStarted(linkInstPtr))
|
||||
{
|
||||
Linklayer_Reconfig(linkInstPtr, &linkConfig);
|
||||
}
|
||||
Linklayer_Start(linkInstPtr);
|
||||
}
|
||||
else if (msg[WD_EN_CMD] == EN_CMD_SILENT)
|
||||
{
|
||||
Linklayer_Halt(linkInstPtr);
|
||||
// configure phy to generate remote test
|
||||
TIME_WORD pullTime = {0, 0};
|
||||
pullTime.int_part = TimeCtrl_GetIntCnt(tmcRef) + 1;
|
||||
if (Phy_SetTimeWord(phyRef, &pullTime, PHY_TIME_WORD_POLL) != SUCCESS)
|
||||
{
|
||||
DBG_ERROR("Physical set pull time failed.\n");
|
||||
}
|
||||
Phy_SetupNextSlot(phyRef, PHY_TOR_RX, L1_FRAME_ADV_24MS, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Ignore current command
|
||||
DBG_ERROR("Unexpected config command 0x%02X:0x%02X",
|
||||
WD_EN_CMD, msg[WD_EN_CMD]);
|
||||
return EIGNORE;
|
||||
}
|
||||
|
||||
// Routing table selection
|
||||
if (msg[WD_RTNE_CMD] != instPtr->sysbusLog.lastConfig[3])
|
||||
{
|
||||
L2_RTNE_CONFIG newRtneConfig;
|
||||
switch (msg[WD_RTNE_CMD])
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
newRtneConfig.rtneTable = normalTable0;
|
||||
newRtneConfig.rtnePrd = ARRAY_SIZE(normalTable0);
|
||||
L2_EVENT l2Event =
|
||||
{
|
||||
.event = L2_ROUTINE_UPDATE,
|
||||
.msg = &newRtneConfig
|
||||
};
|
||||
AssertL2Event(instPtr, &l2Event);
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
newRtneConfig.rtneTable = normalTable1;
|
||||
newRtneConfig.rtnePrd = ARRAY_SIZE(normalTable1);
|
||||
L2_EVENT l2Event =
|
||||
{
|
||||
.event = L2_ROUTINE_UPDATE,
|
||||
.msg = &newRtneConfig
|
||||
};
|
||||
AssertL2Event(instPtr, &l2Event);
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
newRtneConfig.rtneTable = normalTable2;
|
||||
newRtneConfig.rtnePrd = ARRAY_SIZE(normalTable2);
|
||||
L2_EVENT l2Event =
|
||||
{
|
||||
.event = L2_ROUTINE_UPDATE,
|
||||
.msg = &newRtneConfig
|
||||
};
|
||||
AssertL2Event(instPtr, &l2Event);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Ignore current command
|
||||
DBG_ERROR("Unexpected config command 0x%02X:0x%02X",
|
||||
WD_RTNE_CMD, msg[WD_RTNE_CMD]);
|
||||
return EIGNORE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
instPtr->sysbusLog.lastConfig[0] = msg[WD_EN_CMD];
|
||||
instPtr->sysbusLog.lastConfig[1] = msg[WD_ID_CMD];
|
||||
instPtr->sysbusLog.lastConfig[2] = msg[WD_RATE_CMD];
|
||||
instPtr->sysbusLog.lastConfig[3] = msg[WD_RTNE_CMD];
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
@@ -366,7 +377,7 @@ static int32_t SystemBus_Echo(SYSBUS *instPtr, SYSBUS_UART_FRAME *frame)
|
||||
SYSBUS_UART_FRAME *sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
||||
if (sysbusRsp == NULL)
|
||||
{
|
||||
DBG_ERROR("Failed to allocate memory for DATA TEST A Response!\n");
|
||||
DBG_ERROR("Failed to allocate memory for ECHO TEST Response!\n");
|
||||
return ENOMEM;
|
||||
}
|
||||
sysbusRsp->len = frame->len;
|
||||
@@ -381,58 +392,33 @@ static int32_t SystemBus_Echo(SYSBUS *instPtr, SYSBUS_UART_FRAME *frame)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Generate System Bus poll call command response
|
||||
* @brief Generate System Bus receive call command response
|
||||
*/
|
||||
static int32_t SystemBus_GenPollRsp(SYSBUS *instPtr, uint8_t *msg)
|
||||
int32_t SystemBus_GenRecvRsp(SYSBUS *instPtr, SYSMON_SVC_PAYLOAD *payload)
|
||||
{
|
||||
ASSERT(instPtr != NULL);
|
||||
ASSERT(msg != NULL);
|
||||
size_t dataLen;
|
||||
uint8_t *payload;
|
||||
ASSERT(payload != NULL);
|
||||
|
||||
SYSBUS_UART_FRAME *sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
||||
if (sysbusRsp == NULL)
|
||||
{
|
||||
DBG_ERROR("Failed to allocate memory for FLJ POLL Response!\n");
|
||||
DBG_ERROR("Failed to allocate memory for Receive Response!\n");
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
if (msg[WD_CMD] == CMD_FLJ_POLL)
|
||||
{
|
||||
sysbusRsp->len = FLJ_POLL_RESP_LEN;
|
||||
sysbusRsp->data[WD_CMD] = CMD_FLJ_POLL;
|
||||
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
||||
dataLen = PAYLOAD_LEN_FLJ_RX;
|
||||
payload = sysbusRsp->data + FLJ_DATA_OFFSET;
|
||||
}
|
||||
else if (msg[WD_CMD] == CMD_LJ_POLL)
|
||||
{
|
||||
sysbusRsp->len = LJ_POLL_RESP_LEN;
|
||||
sysbusRsp->data[WD_CMD] = CMD_LJ_POLL;
|
||||
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
||||
dataLen = PAYLOAD_LEN_LJ_RX;
|
||||
payload = sysbusRsp->data + LJ_DATA_OFFSET;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG_ERROR("Unexpected command 0x%02X.\n", msg[WD_CMD]);
|
||||
free(sysbusRsp);
|
||||
return EUNEXP;
|
||||
}
|
||||
uint32_t dataId;
|
||||
SysMonitor_GetRecvPayload(payload, &dataId, dataLen); // omit control info
|
||||
if (dataId == DATA_ID_NONE)
|
||||
{
|
||||
free(sysbusRsp);
|
||||
DBG_WARNING("SystemBus::no RX data!\n");
|
||||
return SUCCESS;
|
||||
}
|
||||
sysbusRsp->len = payload->dataLen + RECV_DATA_LEN_OFFSET;
|
||||
|
||||
sysbusRsp->data[WD_CMD] = CMD_RECV_DATA;
|
||||
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
||||
memcpy(sysbusRsp->data + RECV_DATA_ID_OFFSET, payload, sizeof(SYSMON_SVC_PAYLOAD));
|
||||
|
||||
if (CircQueuePush(instPtr->txQueue, (void *)sysbusRsp) == false)
|
||||
{
|
||||
free(sysbusRsp);
|
||||
DBG_WARNING("SystemBus::TX Queue overflowed!\n");
|
||||
return EQUEUE;
|
||||
}
|
||||
instPtr->sysbusLog.pollCnt++;
|
||||
instPtr->sysbusLog.recvCnt++;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
@@ -455,36 +441,21 @@ static int32_t SystemBus_GenRemoteTestRsp(SYSBUS *instPtr, uint8_t *msg)
|
||||
TimeCtrl_GetCurrentTime(linkInstPtr->config.tmcInstPtr, &tmWord);
|
||||
time = (uint64_t)tmWord.int_part * TIME_FRAC_MAX + tmWord.frac_part;
|
||||
|
||||
if (msg[WD_CMD] == CMD_FLJ_RM_TEST)
|
||||
if (msg[WD_CMD] == CMD_RM_TEST)
|
||||
{
|
||||
sysbusRsp->len = FLJ_RM_TEST_RESP_LEN;
|
||||
memset(sysbusRsp->data, 0x00, FLJ_RM_TEST_RESP_LEN);
|
||||
sysbusRsp->data[WD_CMD] = CMD_FLJ_RM_TEST;
|
||||
sysbusRsp->len = RM_TEST_RSP_LEN;
|
||||
memset(sysbusRsp->data, 0x00, RM_TEST_RSP_LEN);
|
||||
sysbusRsp->data[WD_CMD] = CMD_RM_TEST;
|
||||
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
||||
|
||||
memcpy(sysbusRsp->data + WD_FLJ_TIME_STAMP, &time, WD_FLJ_TIME_STAMP_LEN);
|
||||
memcpy(sysbusRsp->data + RT_TIME_STAMP_OFFSET, &time, RT_TIME_STAMP_LEN);
|
||||
SysMonitor_GetLinklayerLog(&(instPtr->linkLog));
|
||||
SysMonitor_GetPhysicalLayerLog(&(instPtr->phyLog));
|
||||
SysMonitor_GetHardwareStatus(&(instPtr->hwState));
|
||||
memcpy(sysbusRsp->data + WD_FLJ_SYSBUS_LOG, &(instPtr->sysbusLog), WD_FLJ_SYSBUS_LOG_LEN);
|
||||
memcpy(sysbusRsp->data + WD_FLJ_LINK_LOG, &(instPtr->linkLog), WD_FLJ_LINK_LOG_LEN);
|
||||
memcpy(sysbusRsp->data + WD_FLJ_PHY_LOG, &(instPtr->phyLog), WD_FLJ_PHY_LOG_LEN);
|
||||
memcpy(sysbusRsp->data + WD_FLJ_HARDWARE_ST, &(instPtr->hwState.spFpgaVolt), WD_FLJ_HARDWARE_ST_LEN);
|
||||
}
|
||||
else if (msg[WD_CMD] == CMD_LJ_RM_TEST)
|
||||
{
|
||||
sysbusRsp->len = LJ_RM_TEST_RESP_LEN;
|
||||
sysbusRsp->data[WD_CMD] = CMD_LJ_RM_TEST;
|
||||
sysbusRsp->data[WD_PRD] = MY_PRD_ID;
|
||||
|
||||
memcpy(sysbusRsp->data + WD_LJ_TIME_STAMP, &time, WD_LJ_TIME_STAMP_LEN);
|
||||
SysMonitor_GetLinklayerLog(&(instPtr->linkLog));
|
||||
SysMonitor_GetPhysicalLayerLog(&(instPtr->phyLog));
|
||||
SysMonitor_GetHardwareStatus(&(instPtr->hwState));
|
||||
memcpy(sysbusRsp->data + WD_LJ_SYSBUS_LOG, &(instPtr->sysbusLog), WD_LJ_SYSBUS_LOG_LEN);
|
||||
memcpy(sysbusRsp->data + WD_LJ_LINK_LOG, &(instPtr->linkLog), WD_LJ_LINK_LOG_LEN);
|
||||
memcpy(sysbusRsp->data + WD_LJ_PHY_LOG, &(instPtr->phyLog), WD_LJ_PHY_LOG_LEN);
|
||||
memcpy(sysbusRsp->data + WD_LJ_HARDWARE_ST, &(instPtr->hwState.spFpgaVolt), WD_LJ_HARDWARE_ST_LEN);
|
||||
memcpy(sysbusRsp->data + RT_SYSBUS_LOG_OFFSET, &(instPtr->sysbusLog), RT_SYSBUS_LOG_LEN);
|
||||
memcpy(sysbusRsp->data + RT_LINK_LOG_OFFSET, &(instPtr->linkLog), RT_LINK_LOG_LEN);
|
||||
memcpy(sysbusRsp->data + RT_PHY_LOG_OFFSET, &(instPtr->phyLog), RT_PHY_LOG_LEN);
|
||||
memcpy(sysbusRsp->data + RT_HARDWARE_ST_OFFSET, &(instPtr->hwState.spFpgaVolt), RT_HARDWARE_ST_LEN);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -538,8 +509,7 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
|
||||
Status = SystemBus_GenSelfTestRsp(instPtr);
|
||||
break;
|
||||
}
|
||||
case CMD_DATA_TEST_A:
|
||||
case CMD_DATA_TEST_B:
|
||||
case CMD_ECHO:
|
||||
{
|
||||
Status = SystemBus_Echo(instPtr, sysbusReq);
|
||||
break;
|
||||
@@ -555,61 +525,17 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
|
||||
Status = SUCCESS;
|
||||
break;
|
||||
}
|
||||
case CMD_FLJ_SEND:
|
||||
case CMD_SEND_DATA:
|
||||
{
|
||||
SysMonitor_UpdateSendPayload(msg + FLJ_DATA_OFFSET, PAYLOAD_LEN_FLJ_TX); // omit control info
|
||||
instPtr->sysbusLog.svcCnt++;
|
||||
Status = SUCCESS;
|
||||
break;
|
||||
}
|
||||
case CMD_LJ_SEND:
|
||||
{
|
||||
SysMonitor_UpdateSendPayload(msg + LJ_DATA_OFFSET, PAYLOAD_LEN_LJ_TX); // omit control info
|
||||
instPtr->sysbusLog.svcCnt++;
|
||||
Status = SUCCESS;
|
||||
break;
|
||||
}
|
||||
case CMD_FLJ_POLL:
|
||||
{
|
||||
if (msg[WD_FLJ_POLL] != FLJ_POLL_CODE)
|
||||
Status = SysMonitor_UpdateSendPayload((SYSMON_SVC_PAYLOAD *)(msg + SEND_DATA_ID_OFFSET));
|
||||
if (Status == SUCCESS)
|
||||
{
|
||||
DBG_ERROR("SystemBus::Invalid roll call code!\n");
|
||||
Status = EIGNORE;
|
||||
break;
|
||||
instPtr->sysbusLog.sendCnt++;
|
||||
}
|
||||
Status = SystemBus_GenPollRsp(instPtr, msg);
|
||||
break;
|
||||
}
|
||||
case CMD_LJ_POLL:
|
||||
case CMD_RM_TEST:
|
||||
{
|
||||
if (msg[WD_LJ_POLL] != LJ_POLL_CODE)
|
||||
{
|
||||
DBG_WARNING("SystemBus::Invalid roll call code!\n");
|
||||
Status = EIGNORE;
|
||||
break;
|
||||
}
|
||||
Status = SystemBus_GenPollRsp(instPtr, msg);
|
||||
break;
|
||||
}
|
||||
case CMD_FLJ_RM_TEST:
|
||||
{
|
||||
if (msg[WD_FLJ_RM_TEST] != FLJ_RM_TEST_CODE)
|
||||
{
|
||||
DBG_WARNING("SystemBus::Invalid remote test code!\n");
|
||||
Status = EIGNORE;
|
||||
break;
|
||||
}
|
||||
Status = SystemBus_GenRemoteTestRsp(instPtr, msg);
|
||||
break;
|
||||
}
|
||||
case CMD_LJ_RM_TEST:
|
||||
{
|
||||
if (msg[WD_LJ_RM_TEST] != LJ_RM_TEST_CODE)
|
||||
{
|
||||
DBG_WARNING("SystemBus::Invalid remote test code!\n");
|
||||
Status = EIGNORE;
|
||||
break;
|
||||
}
|
||||
Status = SystemBus_GenRemoteTestRsp(instPtr, msg);
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user