Compare commits
15
Commits
5a46a21d4f
...
6f98baf096
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f98baf096 | ||
|
|
bac0860b7b | ||
|
|
ae9c0d5243 | ||
|
|
222e262194 | ||
|
|
383de5a3c9 | ||
|
|
7157cf668c | ||
|
|
54c20aa46e | ||
|
|
ab9ef5b06c | ||
|
|
da008809de | ||
|
|
eba0147d2f | ||
|
|
2a20921193 | ||
|
|
6ab4293c76 | ||
|
|
d746215628 | ||
|
|
4b79a1436a | ||
|
|
7b1c20e054 |
@@ -40,6 +40,6 @@
|
|||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
void AppAssert(const char * file, int line){
|
void AppAssert(const char * file, int line){
|
||||||
DBG_PRINT("in %s #%4d [assert] .\n",file, line);
|
DBG_PRINT("[assert]\tin %s:%4d.\n",file, line);
|
||||||
while(1);
|
while(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#if _814_DEBUG_LEVEL >= 1
|
#if _814_DEBUG_LEVEL >= 1
|
||||||
#define DBG_ERROR(...) __PRINT_BLOCK( \
|
#define DBG_ERROR(...) __PRINT_BLOCK( \
|
||||||
printf("[error]\tin"__FILE__":%4d ",__LINE__); \
|
printf("[error]\tin "__FILE__":%4d ",__LINE__); \
|
||||||
printf(__VA_ARGS__); \
|
printf(__VA_ARGS__); \
|
||||||
)
|
)
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -59,6 +59,7 @@
|
|||||||
#define PHY_DEVICE_ID 0
|
#define PHY_DEVICE_ID 0
|
||||||
|
|
||||||
// Interrupt Configs
|
// Interrupt Configs
|
||||||
|
#define PHY_INTR_ID XPAR_FABRIC_PHY_IRQ_INTR
|
||||||
#define PERIODIC_5MS_INTR_ID XPAR_FABRIC_PHY_5MS_DELAY_2MS_INTR
|
#define PERIODIC_5MS_INTR_ID XPAR_FABRIC_PHY_5MS_DELAY_2MS_INTR
|
||||||
#define MPC_RX_DONE_INTR_ID XPAR_FABRIC_MPC_IRQ_INTR
|
#define MPC_RX_DONE_INTR_ID XPAR_FABRIC_MPC_IRQ_INTR
|
||||||
#define MPC_BUFFER_LENGTH (XPAR_MPC_BRAM_INTERFACE_MPC_BRAM_CTRL_S_AXI_HIGHADDR \
|
#define MPC_BUFFER_LENGTH (XPAR_MPC_BRAM_INTERFACE_MPC_BRAM_CTRL_S_AXI_HIGHADDR \
|
||||||
|
|||||||
@@ -296,9 +296,6 @@ void L2_FrameStateUpdate(L2_INST* instPtr) {
|
|||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
PHY_INST* phyRef = instPtr->config.phyInstPtr;
|
PHY_INST* phyRef = instPtr->config.phyInstPtr;
|
||||||
|
|
||||||
// Update physical layer status.
|
|
||||||
// Phy_UpdateState(phyRef);
|
|
||||||
|
|
||||||
// Update frame state.
|
// Update frame state.
|
||||||
if (Phy_IsFrameValid(phyRef) == false) {
|
if (Phy_IsFrameValid(phyRef) == false) {
|
||||||
L2_DataAvailUpdate(instPtr, false);
|
L2_DataAvailUpdate(instPtr, false);
|
||||||
@@ -450,8 +447,9 @@ int32_t L2_SetupNextSlot(L2_INST* instPtr, L2_TOR_TYPE txrxMode, L2_FRAME_TYPE f
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Update frame and tx/rx mode record.
|
// Update frame and tx/rx mode record.
|
||||||
instPtr->frame.next = frameType;
|
// Frame types shift (last <- curr <- next)
|
||||||
instPtr->tor.next = txrxMode;
|
L2_RcdShift(&(instPtr->frame), frameType);
|
||||||
|
L2_RcdShift(&(instPtr->tor), txrxMode);
|
||||||
|
|
||||||
TIME_WORD pullTime = {0, 0};
|
TIME_WORD pullTime = {0, 0};
|
||||||
pullTime.int_part = TimeCtrl_GetIntCnt(instPtr->config.tmcInstPtr) + 1;
|
pullTime.int_part = TimeCtrl_GetIntCnt(instPtr->config.tmcInstPtr) + 1;
|
||||||
@@ -1106,6 +1104,9 @@ int32_t Linklayer_Proc(L2_INST* instPtr) {
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update slot number.
|
||||||
|
L2_UpdateSlotNum(instPtr);
|
||||||
|
|
||||||
DBG_INFO("######## Current frameNum: %u, SlotNo: %u ########\n",
|
DBG_INFO("######## Current frameNum: %u, SlotNo: %u ########\n",
|
||||||
instPtr->frameNum.curr, instPtr->slotNum.curr);
|
instPtr->frameNum.curr, instPtr->slotNum.curr);
|
||||||
|
|
||||||
@@ -1140,13 +1141,6 @@ int32_t Linklayer_Proc(L2_INST* instPtr) {
|
|||||||
// Check and execute scheduled event.
|
// Check and execute scheduled event.
|
||||||
L2_EventPoolHandler(instPtr);
|
L2_EventPoolHandler(instPtr);
|
||||||
|
|
||||||
// Update slot number.
|
|
||||||
L2_UpdateSlotNum(instPtr);
|
|
||||||
|
|
||||||
// Frame types shift (last <- curr <- next)
|
|
||||||
L2_RcdShift(&(instPtr->frame), L2_NONE_FRAME);
|
|
||||||
L2_RcdShift(&(instPtr->tor), L2_TOR_SUSPEND);
|
|
||||||
|
|
||||||
// Update link layer state.
|
// Update link layer state.
|
||||||
instPtr->mainState = instPtr->nextState;
|
instPtr->mainState = instPtr->nextState;
|
||||||
|
|
||||||
|
|||||||
@@ -584,11 +584,11 @@ int32_t ScanNet_PktHandler(L2_INST* instPtr) {
|
|||||||
switch (L2_GetLastFrameType(instPtr)) {
|
switch (L2_GetLastFrameType(instPtr)) {
|
||||||
case L2_INTER_SCAN_FRAME:
|
case L2_INTER_SCAN_FRAME:
|
||||||
case L2_INTRA_SCAN_FRAME:
|
case L2_INTRA_SCAN_FRAME:
|
||||||
// refer to "linklayer814.c/L2_FrameStateUpdate"
|
// INTRA_BM_FRAME could be received if current frame type is L2_INTRA_SCAN_FRAME
|
||||||
// INTRA_BM_FRAME could be received if current frame type is INTRA_BM_FRAME
|
// in net setup stage (for member node).
|
||||||
// in net setup stage(for member node).
|
|
||||||
// When SCAN frame was considered as received, handle the frame as BM frame.
|
// When SCAN frame was considered as received, handle the frame as BM frame.
|
||||||
break;
|
LockStateUpdate(scanFsmPtr, true);
|
||||||
|
StageUpdate(scanFsmPtr, L2_SCAN_BMADVT_STAGE);
|
||||||
case L2_INTER_BM_FRAME:
|
case L2_INTER_BM_FRAME:
|
||||||
case L2_INTRA_BM_FRAME: {
|
case L2_INTRA_BM_FRAME: {
|
||||||
for (int i = 0; i < ARRAY_SIZE(intraBmFrameMsgs); i++) {
|
for (int i = 0; i < ARRAY_SIZE(intraBmFrameMsgs); i++) {
|
||||||
|
|||||||
@@ -45,11 +45,23 @@ static void entry_free(void* val){
|
|||||||
/**
|
/**
|
||||||
* @brief helper function to match node entries by nodeIds
|
* @brief helper function to match node entries by nodeIds
|
||||||
*/
|
*/
|
||||||
static bool entry_match(void* a, void* b){
|
static int8_t entry_compare(void* a, void* b){
|
||||||
ASSERT(a != NULL);
|
ASSERT(a != NULL);
|
||||||
ASSERT(b != NULL);
|
ASSERT(b != NULL);
|
||||||
return (((NODE_ENTRY*)a)->nodeInfo.nodeId
|
register uint8_t idA, idB;
|
||||||
== ((NODE_ENTRY*)b)->nodeInfo.nodeId);
|
idA = ((NODE_ENTRY*)a)->nodeInfo.nodeId;
|
||||||
|
idB = ((NODE_ENTRY*)b)->nodeInfo.nodeId;
|
||||||
|
if (idA == idB)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if(idA < idB) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
@@ -67,7 +79,7 @@ int32_t L2_NodeList_Init(NODE_LIST **list) {
|
|||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
(*list)->free = entry_free;
|
(*list)->free = entry_free;
|
||||||
(*list)->match = entry_match;
|
(*list)->compare = entry_compare;
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,7 +110,7 @@ void L2_NodeList_Destroy(NODE_LIST *list){
|
|||||||
}
|
}
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* @brief Get node entry frome node list base on node id.
|
* @brief Get node entry from node list base on node id.
|
||||||
*
|
*
|
||||||
* @param list
|
* @param list
|
||||||
* @param nodeId
|
* @param nodeId
|
||||||
@@ -334,7 +346,7 @@ int32_t L2_GetNodeSpeed(NODE_LIST *list, uint8_t nodeId, COORD *speed) {
|
|||||||
*
|
*
|
||||||
* @param list
|
* @param list
|
||||||
* @param nodeId
|
* @param nodeId
|
||||||
* @param defl
|
* @param devi
|
||||||
*
|
*
|
||||||
* @return SUCCESS update successfully.
|
* @return SUCCESS update successfully.
|
||||||
* FAILURE Node not exist.
|
* FAILURE Node not exist.
|
||||||
|
|||||||
@@ -40,11 +40,21 @@ static void schdevent_free(void* val){
|
|||||||
/**
|
/**
|
||||||
* @brief helper function to match events by ids.
|
* @brief helper function to match events by ids.
|
||||||
*/
|
*/
|
||||||
static bool schdevent_match(void* a, void* b){
|
static int8_t schdevent_compare(void* a, void* b){
|
||||||
ASSERT(a == NULL);
|
ASSERT(a == NULL);
|
||||||
ASSERT(b != NULL);
|
ASSERT(b != NULL);
|
||||||
return (((L2_SCHD_EVENT*)a)->eventId
|
register uint32_t idA, idB;
|
||||||
== ((L2_SCHD_EVENT*)b)->eventId);
|
idA = ((L2_SCHD_EVENT*)a)->eventId;
|
||||||
|
idB = ((L2_SCHD_EVENT*)b)->eventId;
|
||||||
|
if( idA== idB) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (idA < idB) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@@ -69,7 +79,7 @@ int32_t L2_CreateSchedEventPool(L2_SCHD_POOL** schdPool) {
|
|||||||
return EALLOC;
|
return EALLOC;
|
||||||
}
|
}
|
||||||
(*schdPool)->schdList->free = schdevent_free;
|
(*schdPool)->schdList->free = schdevent_free;
|
||||||
(*schdPool)->schdList->match = schdevent_match;
|
(*schdPool)->schdList->compare = schdevent_compare;
|
||||||
(*schdPool)->envCnt = 0;
|
(*schdPool)->envCnt = 0;
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -137,7 +147,7 @@ L2_SCHD_EVENT* L2_CreatNewSchdEvent(L2_SCHD_POOL* schdPool, L2_EVENT_TYPE event,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
schdEvent->eventId = schdPool->envCnt++;
|
schdEvent->eventId = schdPool->envCnt++;
|
||||||
schdEvent->ocurrCnt = 0;
|
schdEvent->occurCnt = 0;
|
||||||
schdEvent->l2Event.event = event;
|
schdEvent->l2Event.event = event;
|
||||||
schdEvent->l2Event.msg = NULL;
|
schdEvent->l2Event.msg = NULL;
|
||||||
schdEvent->isSchd = false;
|
schdEvent->isSchd = false;
|
||||||
@@ -327,7 +337,7 @@ void L2_EventPoolHandler(L2_INST* instPtr){
|
|||||||
list_remove(pool->schdList, node);
|
list_remove(pool->schdList, node);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
event->ocurrCnt++;
|
event->occurCnt++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ typedef struct {
|
|||||||
bool isVolatile;
|
bool isVolatile;
|
||||||
L2_EVENT l2Event;
|
L2_EVENT l2Event;
|
||||||
uint32_t eventId;
|
uint32_t eventId;
|
||||||
uint32_t ocurrCnt;
|
uint32_t occurCnt;
|
||||||
uint32_t schdFrame;
|
uint32_t schdFrame;
|
||||||
uint32_t schdSlot;
|
uint32_t schdSlot;
|
||||||
} L2_SCHD_EVENT;
|
} L2_SCHD_EVENT;
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ static void RTT_GetFrameStart(L2_INST* instPtr, TIME_WORD *tmStamp, L2_TOR_TYPE
|
|||||||
int32_t L2_TimeAlign(L2_INST* instPtr, uint32_t frameNum, uint32_t slotNum){
|
int32_t L2_TimeAlign(L2_INST* instPtr, uint32_t frameNum, uint32_t slotNum){
|
||||||
L1_FRAME_TYPE lastRecvdFrame;
|
L1_FRAME_TYPE lastRecvdFrame;
|
||||||
lastRecvdFrame = Phy_GetLastRecvFrameType(instPtr->config.phyInstPtr);
|
lastRecvdFrame = Phy_GetLastRecvFrameType(instPtr->config.phyInstPtr);
|
||||||
if(lastRecvdFrame != L1_NONE_FRAME){
|
if(lastRecvdFrame == L1_NONE_FRAME){
|
||||||
return EIGNORE;
|
return EIGNORE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,17 +68,17 @@ int32_t L2_TimeAlign(L2_INST* instPtr, uint32_t frameNum, uint32_t slotNum){
|
|||||||
uint64_t currTime, expctTime;
|
uint64_t currTime, expctTime;
|
||||||
int64_t timeDiff;
|
int64_t timeDiff;
|
||||||
TIME_WORD timeStamp, slotTimerAdjmet;
|
TIME_WORD timeStamp, slotTimerAdjmet;
|
||||||
expctTime = ((uint64_t)(frameNum*L2_SLOTS_PER_FRAME + slotNum))*COUNTE_FRAC_MAX;
|
expctTime = ((uint64_t)(frameNum*L2_SLOTS_PER_FRAME + slotNum))*TIME_FRAC_MAX;
|
||||||
expctTime += Phy_GetTimeComp(lastRecvdFrame);
|
expctTime += Phy_GetTimeComp(lastRecvdFrame);
|
||||||
|
|
||||||
Phy_GetFrameSyncTimeStamp(instPtr->config.phyInstPtr, &timeStamp);
|
Phy_GetFrameSyncTimeStamp(instPtr->config.phyInstPtr, &timeStamp);
|
||||||
currTime = (uint64_t)timeStamp.frac_part;
|
currTime = (uint64_t)timeStamp.frac_part;
|
||||||
currTime += ((uint64_t)timeStamp.int_part) * COUNTE_FRAC_MAX;
|
currTime += ((uint64_t)timeStamp.int_part) * TIME_FRAC_MAX;
|
||||||
|
|
||||||
timeDiff = (int64_t)(expctTime - currTime);
|
timeDiff = (int64_t)(expctTime - currTime);
|
||||||
|
|
||||||
slotTimerAdjmet.int_part = (uint32_t)(timeDiff / COUNTE_FRAC_MAX);
|
slotTimerAdjmet.int_part = (uint32_t)(timeDiff / TIME_FRAC_MAX);
|
||||||
slotTimerAdjmet.frac_part = (uint32_t)(timeDiff % COUNTE_FRAC_MAX);
|
slotTimerAdjmet.frac_part = (uint32_t)(timeDiff % TIME_FRAC_MAX);
|
||||||
TimeCtrl_TimeAdjust(instPtr->config.tmcInstPtr, &slotTimerAdjmet, TM_ADJ_ADD);
|
TimeCtrl_TimeAdjust(instPtr->config.tmcInstPtr, &slotTimerAdjmet, TM_ADJ_ADD);
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -164,13 +164,13 @@ void RTT_GetFrameStart(L2_INST* instPtr, TIME_WORD *tmStamp, L2_TOR_TYPE torType
|
|||||||
int64_t timeDiff;
|
int64_t timeDiff;
|
||||||
Phy_GetFrameSyncTimeStamp(phyRef, &timeStamp);
|
Phy_GetFrameSyncTimeStamp(phyRef, &timeStamp);
|
||||||
timeDiff = (uint64_t) timeStamp.frac_part;
|
timeDiff = (uint64_t) timeStamp.frac_part;
|
||||||
timeDiff += ((uint64_t)timeStamp.int_part) * COUNTE_FRAC_MAX;
|
timeDiff += ((uint64_t)timeStamp.int_part) * TIME_FRAC_MAX;
|
||||||
Phy_GetLastSlotStartTimeStamp(phyRef, tmStamp);
|
Phy_GetLastSlotStartTimeStamp(phyRef, tmStamp);
|
||||||
timeDiff -= ((uint64_t) tmStamp->int_part) * COUNTE_FRAC_MAX;
|
timeDiff -= ((uint64_t) tmStamp->int_part) * TIME_FRAC_MAX;
|
||||||
timeDiff -= (uint64_t) tmStamp->frac_part;
|
timeDiff -= (uint64_t) tmStamp->frac_part;
|
||||||
timeDiff = (int64_t)Phy_GetTimeComp(L2_L2frame2L1frame(L2_GetLastFrameType(instPtr))) - timeDiff;
|
timeDiff = (int64_t)Phy_GetTimeComp(L2_L2frame2L1frame(L2_GetLastFrameType(instPtr))) - timeDiff;
|
||||||
if (timeDiff < 0) {
|
if (timeDiff < 0) {
|
||||||
timeDiff += COUNTE_FRAC_MAX;
|
timeDiff += TIME_FRAC_MAX;
|
||||||
tmStamp->int_part--;
|
tmStamp->int_part--;
|
||||||
_nop_();
|
_nop_();
|
||||||
}
|
}
|
||||||
|
|||||||
+42
-33
@@ -69,6 +69,7 @@ MPC_CONFIG mpcConfig = {
|
|||||||
static bool mpcStatusUpAssert = false;
|
static bool mpcStatusUpAssert = false;
|
||||||
/************************** Function Prototypes ******************************/
|
/************************** Function Prototypes ******************************/
|
||||||
int SetupInterruptSystem(XScuGic* instPtr, uint32_t devId);
|
int SetupInterruptSystem(XScuGic* instPtr, uint32_t devId);
|
||||||
|
void PhysicalIntr_Handler(void *callBackRef);
|
||||||
void PeriodicPull_Handler(void *callBackRef);
|
void PeriodicPull_Handler(void *callBackRef);
|
||||||
#ifdef _MPC_CTRL
|
#ifdef _MPC_CTRL
|
||||||
void MPC_IntrHandler(void* CallBackRef);
|
void MPC_IntrHandler(void* CallBackRef);
|
||||||
@@ -134,29 +135,41 @@ int SetupInterruptSystem(XScuGic* instPtr, uint32_t devId){
|
|||||||
* rising edge 0x03.
|
* rising edge 0x03.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Initialize physical layer interrupt.
|
||||||
|
XScuGic_SetPriorityTriggerType(instPtr, PHY_INTR_ID, 0x00, 0x03);
|
||||||
|
|
||||||
|
// Connect the interrupt service routine isr1 to the interrupt controller
|
||||||
|
Status = XScuGic_Connect(instPtr, PHY_INTR_ID,
|
||||||
|
(Xil_ExceptionHandler) PhysicalIntr_Handler, (void *) phyInstPtr);
|
||||||
|
if (Status != SUCCESS) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize physical layer interrupt.
|
// Initialize physical layer interrupt.
|
||||||
XScuGic_SetPriorityTriggerType(instPtr, PERIODIC_5MS_INTR_ID, 0x00, 0x03);
|
XScuGic_SetPriorityTriggerType(instPtr, PERIODIC_5MS_INTR_ID, 0x00, 0x03);
|
||||||
|
|
||||||
// Connect the interrupt service routine isr1 to the interrupt controller
|
// Connect the interrupt service routine isr1 to the interrupt controller
|
||||||
Status = XScuGic_Connect(instPtr, PERIODIC_5MS_INTR_ID,
|
Status = XScuGic_Connect(instPtr, PERIODIC_5MS_INTR_ID,
|
||||||
(Xil_ExceptionHandler) PeriodicPull_Handler, (void *) instPtr);
|
(Xil_ExceptionHandler) PeriodicPull_Handler, (void *) linkInstPtr);
|
||||||
if (Status != SUCCESS) {
|
if (Status != SUCCESS) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
XScuGic_Enable(instPtr, PERIODIC_5MS_INTR_ID);
|
|
||||||
|
|
||||||
#ifdef _MPC_CTRL
|
#ifdef _MPC_CTRL
|
||||||
// Initialize MPC interrupt.
|
// Initialize MPC interrupt.
|
||||||
XScuGic_SetPriorityTriggerType(instPtr, MPC_RX_DONE_INTR_ID, 0x00, 0x03);
|
XScuGic_SetPriorityTriggerType(instPtr, MPC_RX_DONE_INTR_ID, 0x00, 0x03);
|
||||||
// Connect the interrupt service routine isr1 to the interrupt controller
|
// Connect the interrupt service routine isr1 to the interrupt controller
|
||||||
Status = XScuGic_Connect(instPtr, MPC_RX_DONE_INTR_ID,
|
Status = XScuGic_Connect(instPtr, MPC_RX_DONE_INTR_ID,
|
||||||
(Xil_ExceptionHandler) MPC_IntrHandler, (void *) instPtr);
|
(Xil_ExceptionHandler) MPC_IntrHandler, (void *) mpcInstPtr);
|
||||||
if (Status != XST_SUCCESS) {
|
if (Status != XST_SUCCESS) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
XScuGic_Enable(instPtr, MPC_RX_DONE_INTR_ID);
|
XScuGic_Enable(instPtr, MPC_RX_DONE_INTR_ID);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
XScuGic_Enable(instPtr, PHY_INTR_ID);
|
||||||
|
XScuGic_Enable(instPtr, PERIODIC_5MS_INTR_ID);
|
||||||
|
|
||||||
/* Initialize the exception table and register the interrupt controller
|
/* Initialize the exception table and register the interrupt controller
|
||||||
* handler with the exception table
|
* handler with the exception table
|
||||||
*/
|
*/
|
||||||
@@ -185,7 +198,7 @@ void MPC_PCIESentStart(){
|
|||||||
/**
|
/**
|
||||||
* @brief Handler of mater pc contrl interrupt.
|
* @brief Handler of mater pc contrl interrupt.
|
||||||
*
|
*
|
||||||
* @param CallBackRef A pointer to corresponding frame UART instance.
|
* @param CallBackRef A pointer to corresponding mpcInstPtr instance.
|
||||||
*
|
*
|
||||||
* @return None.
|
* @return None.
|
||||||
*
|
*
|
||||||
@@ -195,22 +208,21 @@ void MPC_IntrHandler(void* CallBackRef) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* This function is a interrupt service routine for IRQ_F2P[1:1], IRQ_F2P[1:1]
|
* @brief Handler of physical layer interrupt.
|
||||||
* tells CPU that the data in OCM is ready!
|
|
||||||
*
|
*
|
||||||
* @param callBackRef is the SCUGIC instance pointer.
|
* @param CallBackRef A pointer to corresponding physical layer instance.
|
||||||
*
|
*
|
||||||
* @return None.
|
* @return None.
|
||||||
*
|
*
|
||||||
* @note None.
|
******************************************************************************/
|
||||||
*
|
void PhysicalIntr_Handler(void *callBackRef) {
|
||||||
*****************************************************************************/
|
|
||||||
void PeriodicPull_Handler(void *callBackRef) {
|
|
||||||
int32_t Status;
|
|
||||||
Phy_UpdateState(phyInstPtr);
|
|
||||||
uint32_t GpioConfig = XGpio_DiscreteRead(&configGpio, 2);
|
uint32_t GpioConfig = XGpio_DiscreteRead(&configGpio, 2);
|
||||||
|
if(L2_isDataAvail(linkInstPtr) == true ){
|
||||||
|
GpioConfig^=0x00000001;
|
||||||
|
}
|
||||||
|
Phy_UpdateState(phyInstPtr);
|
||||||
if(phyInstPtr->TOR.curr == PHY_TOR_TX){
|
if(phyInstPtr->TOR.curr == PHY_TOR_TX){
|
||||||
switch(phyInstPtr->frameType.curr){
|
switch(phyInstPtr->frameType.curr){
|
||||||
case L1_1M2BPS_5MS_FRAME:
|
case L1_1M2BPS_5MS_FRAME:
|
||||||
@@ -271,17 +283,27 @@ void PeriodicPull_Handler(void *callBackRef) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
XGpio_DiscreteWrite(&configGpio, 2, GpioConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/**
|
||||||
|
* Handler of periodic 5ms interrupt
|
||||||
|
*
|
||||||
|
* @param callBackRef is the linklayer instance pointer.
|
||||||
|
*
|
||||||
|
* @return None.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
void PeriodicPull_Handler(void *callBackRef) {
|
||||||
|
int32_t Status;
|
||||||
|
|
||||||
Status = Linklayer_Proc(linkInstPtr);
|
Status = Linklayer_Proc(linkInstPtr);
|
||||||
if(Status != SUCCESS){
|
if(Status != SUCCESS){
|
||||||
DBG_ERROR("Link layer runs failed, with error code: %ld\n", Status);
|
DBG_ERROR("Link layer runs failed, with error code: %ld\n", Status);
|
||||||
_nop_();
|
_nop_();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(L2_isDataAvail(linkInstPtr) == true ){
|
|
||||||
GpioConfig^=0x00000001;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (linkInstPtr->slotNum.next % DATA_STORE_INTERVAL == 1) {
|
if (linkInstPtr->slotNum.next % DATA_STORE_INTERVAL == 1) {
|
||||||
mpcStatusUpAssert = true;
|
mpcStatusUpAssert = true;
|
||||||
mpcRecord->frame1Cnt = mpcRecord->frame1Recv - mpcRecord->frame1CntLast;
|
mpcRecord->frame1Cnt = mpcRecord->frame1Recv - mpcRecord->frame1CntLast;
|
||||||
@@ -303,11 +325,6 @@ void PeriodicPull_Handler(void *callBackRef) {
|
|||||||
mpcRecord->frame7CntLast = mpcRecord->frame7Recv;
|
mpcRecord->frame7CntLast = mpcRecord->frame7Recv;
|
||||||
mpcRecord->frame8CntLast = mpcRecord->frame8Recv;
|
mpcRecord->frame8CntLast = mpcRecord->frame8Recv;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Dijian frequency pattern TX_RX State.
|
|
||||||
GpioConfig ^= 0x80000000;
|
|
||||||
GpioConfig = (phyInstPtr->TOR.next == PHY_TOR_TX) ? GpioConfig|0x40000000 : GpioConfig&0xBFFFFFFF;
|
|
||||||
XGpio_DiscreteWrite(&configGpio, 2, GpioConfig);
|
|
||||||
} // PhyIntr_Handler
|
} // PhyIntr_Handler
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@@ -392,18 +409,10 @@ int main(void) {
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = Phy_SetMode(phyInstPtr, PHY_MODE_SCHEDULE);
|
|
||||||
if (Status == SUCCESS) {
|
|
||||||
DBG_PRINT("Physical Mode %u Setup SUCCESS! \n", PHY_MODE_LISTEN);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
DBG_PRINT("Physical Mode %u Setup FAILED! \n", PHY_MODE_LISTEN);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBG_PRINT("Starting Physical Layer...");
|
DBG_PRINT("Starting Physical Layer...");
|
||||||
Phy_Start(phyInstPtr);
|
Phy_Start(phyInstPtr);
|
||||||
|
|
||||||
|
// FIXME: only for debug, linklayer should be start by MPC
|
||||||
Linklayer_Start(linkInstPtr);
|
Linklayer_Start(linkInstPtr);
|
||||||
|
|
||||||
while(true) {
|
while(true) {
|
||||||
|
|||||||
@@ -242,12 +242,6 @@ void Phy_UpdateState(PHY_INST* instPtr) {
|
|||||||
else {
|
else {
|
||||||
instPtr->isValid = false;
|
instPtr->isValid = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Phy_RcdShift(&(instPtr->TOR),PHY_TOR_SUSPEND);
|
|
||||||
Phy_RcdShift(&(instPtr->frameType),L1_NONE_FRAME);
|
|
||||||
Phy_RcdShift(&(instPtr->antNo), INIT_ANT_NO);
|
|
||||||
Phy_RcdShift(&(instPtr->beamNo), INIT_BEAM_NO);
|
|
||||||
Phy_RcdShift(&(instPtr->beamWd), INIT_ANT_WD);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -586,6 +580,13 @@ int32_t Phy_SetupNextSlot(PHY_INST* instPtr, PHY_TOR_TYPE txrxMode,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
PhyWrite(instPtr, SLOT_CMD, SLOT_CMD_KEY); // Phy statr fetching data.
|
PhyWrite(instPtr, SLOT_CMD, SLOT_CMD_KEY); // Phy statr fetching data.
|
||||||
|
|
||||||
|
Phy_RcdShift(&(instPtr->TOR),txrxMode);
|
||||||
|
Phy_RcdShift(&(instPtr->frameType),frameType);
|
||||||
|
// TODO:
|
||||||
|
Phy_RcdShift(&(instPtr->antNo), INIT_ANT_NO);
|
||||||
|
Phy_RcdShift(&(instPtr->beamNo), INIT_BEAM_NO);
|
||||||
|
Phy_RcdShift(&(instPtr->beamWd), INIT_ANT_WD);
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -596,8 +597,7 @@ int32_t Phy_SetupNextSlot(PHY_INST* instPtr, PHY_TOR_TYPE txrxMode,
|
|||||||
*
|
*
|
||||||
* @param instPtr a pointer to physical instance
|
* @param instPtr a pointer to physical instance
|
||||||
*
|
*
|
||||||
* @return SUCCESS If load the data successfully.
|
* @return frequency estimation
|
||||||
* FAILURE If last receive frame is not valid.
|
|
||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
@@ -626,7 +626,7 @@ double Phy_GetCoarseFreqEst(PHY_INST* instPtr) {
|
|||||||
freqEst = acqFreqIdx*(250e3/4);
|
freqEst = acqFreqIdx*(250e3/4);
|
||||||
freqEst += (double)syncFreqIdx*12e6/64/128;
|
freqEst += (double)syncFreqIdx*12e6/64/128;
|
||||||
}
|
}
|
||||||
|
|
||||||
return freqEst;
|
return freqEst;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -786,17 +786,20 @@ void Phy_GetLastSlotStartTimeStamp(PHY_INST* instPtr, TIME_WORD* slotStart) {
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/**
|
/**
|
||||||
* @brief Get received data (base on PL Record), store it to data buffer.
|
* @brief Copy ans store the received data, if received data valid.
|
||||||
*
|
*
|
||||||
* @param instPtr a pointer to physical layer control instance.
|
* @param instPtr a pointer to physical layer control instance.
|
||||||
*
|
*
|
||||||
* @return SUCCESS
|
* @return NONE
|
||||||
* FAILURE last frame type cannot be recognized.
|
|
||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
void Phy_RetrieveRecvData(PHY_INST* instPtr, uint8_t* dataBuff) {
|
void Phy_PeekRecvData(PHY_INST* instPtr, uint8_t* dataBuff) {
|
||||||
ASSERT(instPtr != NULL);
|
ASSERT(instPtr != NULL);
|
||||||
ASSERT(dataBuff != NULL);
|
ASSERT(dataBuff != NULL);
|
||||||
|
if (instPtr->isValid == false)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
uint32_t frameLen, offset;
|
uint32_t frameLen, offset;
|
||||||
|
|
||||||
frameLen = (PhyRead(instPtr, RECVDATA_STATE) & RECVDATA_STATE_LEN_MASK) >> RECVDATA_STATE_LEN_SHIFT;
|
frameLen = (PhyRead(instPtr, RECVDATA_STATE) & RECVDATA_STATE_LEN_MASK) >> RECVDATA_STATE_LEN_SHIFT;
|
||||||
@@ -804,3 +807,24 @@ void Phy_RetrieveRecvData(PHY_INST* instPtr, uint8_t* dataBuff) {
|
|||||||
|
|
||||||
memcpy(dataBuff, (uint8_t*)(instPtr->recvDataAddr + offset), frameLen);
|
memcpy(dataBuff, (uint8_t*)(instPtr->recvDataAddr + offset), frameLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/**
|
||||||
|
* @brief Get the received data (if valid), store it to data buffer.
|
||||||
|
* and clear data valid flag.
|
||||||
|
*
|
||||||
|
* @param instPtr a pointer to physical layer control instance.
|
||||||
|
*
|
||||||
|
* @return NONE
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
void Phy_RetrieveRecvData(PHY_INST* instPtr, uint8_t* dataBuff) {
|
||||||
|
ASSERT(instPtr != NULL);
|
||||||
|
ASSERT(dataBuff != NULL);
|
||||||
|
if (instPtr->isValid == false)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Phy_PeekRecvData(instPtr, dataBuff);
|
||||||
|
instPtr->isValid = false;
|
||||||
|
}
|
||||||
|
|||||||
@@ -242,6 +242,7 @@ void Phy_Halt(PHY_INST* instPtr);
|
|||||||
int32_t Phy_SetMode(PHY_INST* instPtr, PHY_MODE modeCod);
|
int32_t Phy_SetMode(PHY_INST* instPtr, PHY_MODE modeCod);
|
||||||
|
|
||||||
int32_t Phy_SetupNextSlot(PHY_INST* instPtr, PHY_TOR_TYPE txrxMode, L1_FRAME_TYPE frameType, uint8_t* dataBuff);
|
int32_t Phy_SetupNextSlot(PHY_INST* instPtr, PHY_TOR_TYPE txrxMode, L1_FRAME_TYPE frameType, uint8_t* dataBuff);
|
||||||
|
void Phy_PeekRecvData(PHY_INST* instPtr, uint8_t* dataBuff);
|
||||||
void Phy_RetrieveRecvData(PHY_INST* instPtr, uint8_t* dataBuff);
|
void Phy_RetrieveRecvData(PHY_INST* instPtr, uint8_t* dataBuff);
|
||||||
|
|
||||||
bool Phy_IsFrameDetected(PHY_INST* instPtr);
|
bool Phy_IsFrameDetected(PHY_INST* instPtr);
|
||||||
|
|||||||
@@ -194,9 +194,10 @@ void TimeCtrl_TimeAdjust(TIMECTRL_INST *instPtr, const TIME_WORD* tmWord, TIMECT
|
|||||||
DBG_ERROR("Unsupported adjustment type: %d", type);
|
DBG_ERROR("Unsupported adjustment type: %d", type);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(((int32_t)tmWord->frac_part) > COUNTE_FRAC_MAX ) {
|
if(((int32_t)tmWord->frac_part) > TIME_FRAC_MAX
|
||||||
DBG_ERROR("Invalid fractional value 0x%08X (should <= 0x%08X).\n",
|
|| ((int32_t)tmWord->frac_part) < -TIME_FRAC_MAX) {
|
||||||
tmWord->frac_part, COUNTE_FRAC_MAX);
|
DBG_WARNING("Invalid fractional value %d (should between %d~%d)\n",
|
||||||
|
tmWord->frac_part, -TIME_FRAC_MAX, TIME_FRAC_MAX);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
TMC_Write(instPtr, TIME_ADJ_FRAC, tmWord->frac_part);
|
TMC_Write(instPtr, TIME_ADJ_FRAC, tmWord->frac_part);
|
||||||
@@ -238,9 +239,9 @@ void TimeCtrl_CalculateTimeGap(const TIME_WORD *a, const TIME_WORD *b, TIME_WORD
|
|||||||
ASSERT(gap != NULL);
|
ASSERT(gap != NULL);
|
||||||
uint64_t timeDiff;
|
uint64_t timeDiff;
|
||||||
timeDiff = (uint64_t) b->frac_part;
|
timeDiff = (uint64_t) b->frac_part;
|
||||||
timeDiff += ((uint64_t)b->int_part) * COUNTE_FRAC_MAX;
|
timeDiff += ((uint64_t)b->int_part) * TIME_FRAC_MAX;
|
||||||
timeDiff -= ((uint64_t)a->int_part) * COUNTE_FRAC_MAX;
|
timeDiff -= ((uint64_t)a->int_part) * TIME_FRAC_MAX;
|
||||||
timeDiff -= (uint64_t) a->frac_part;
|
timeDiff -= (uint64_t) a->frac_part;
|
||||||
gap->frac_part = (TIME_FRAC)(timeDiff % COUNTE_FRAC_MAX);
|
gap->frac_part = (TIME_FRAC)(timeDiff % TIME_FRAC_MAX);
|
||||||
gap->frac_part = (TIME_INT)(timeDiff / COUNTE_FRAC_MAX);
|
gap->frac_part = (TIME_INT)(timeDiff / TIME_FRAC_MAX);
|
||||||
}
|
}
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
/***************************** Include Files *********************************/
|
/***************************** Include Files *********************************/
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
/************************** Constant Definitions *****************************/
|
/************************** Constant Definitions *****************************/
|
||||||
#define COUNTE_FRAC_MAX 500000 // how many 10ns in a 5ms
|
#define TIME_FRAC_MAX 500000 // how many 10ns in a 5ms
|
||||||
/***************** Macros (Inline Functions) Definitions *********************/
|
/***************** Macros (Inline Functions) Definitions *********************/
|
||||||
/**************************** Type Definitions *******************************/
|
/**************************** Type Definitions *******************************/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
// Copyright (c) 2010 TJ Holowaychuk <[email protected]>
|
// Copyright (c) 2010 TJ Holowaychuk <[email protected]>
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -41,7 +42,7 @@ list_new(void) {
|
|||||||
self->head = NULL;
|
self->head = NULL;
|
||||||
self->tail = NULL;
|
self->tail = NULL;
|
||||||
self->free = NULL;
|
self->free = NULL;
|
||||||
self->match = NULL;
|
self->compare = NULL;
|
||||||
self->len = 0;
|
self->len = 0;
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
@@ -181,8 +182,8 @@ list_find(list_t *self, void *val) {
|
|||||||
list_node_t *node;
|
list_node_t *node;
|
||||||
|
|
||||||
while ((node = list_iterator_next(it))) {
|
while ((node = list_iterator_next(it))) {
|
||||||
if (self->match) {
|
if (self->compare) {
|
||||||
if (self->match(val, node->val)) {
|
if (self->compare(val, node->val) == 0) {
|
||||||
list_iterator_destroy(it);
|
list_iterator_destroy(it);
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -44,7 +43,7 @@ typedef struct {
|
|||||||
list_node_t *tail;
|
list_node_t *tail;
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
void (*free)(void *val);
|
void (*free)(void *val);
|
||||||
bool (*match)(void *a, void *b);
|
int8_t (*compare)(void *a, void *b);
|
||||||
} list_t;
|
} list_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -371,30 +371,33 @@ TEST(linklayer_master_routine) {
|
|||||||
for(int i = 0; i < 200*30; i++) {
|
for(int i = 0; i < 200*30; i++) {
|
||||||
tmcReg[TIME_INT_REG]++;
|
tmcReg[TIME_INT_REG]++;
|
||||||
|
|
||||||
if (L2_GetLastTor(linkInstPtr) == L2_TOR_TX)
|
if (L2_GetNextTor(linkInstPtr) == L2_TOR_TX)
|
||||||
{
|
{
|
||||||
if (L2_GetLastFrameType(linkInstPtr) == L2_INTRA_TSYNC_FRAME)
|
if (L2_GetNextFrameType(linkInstPtr) == L2_INTRA_TSYNC_FRAME)
|
||||||
{
|
{
|
||||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampA);
|
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampA);
|
||||||
timeStampA.int_part--;
|
// ASSERT_EQUAL(linkInstPtr->rttFSM->rttRecord.Tt1.int_part + linkInstPtr->netStartTime*L2_SLOTS_PER_FRAME,
|
||||||
|
// timeStampA.int_part);
|
||||||
|
// ASSERT_EQUAL(linkInstPtr->rttFSM->rttRecord.Tt1.frac_part, timeStampA.frac_part);
|
||||||
timeStampA.frac_part = rand()%1000; // 10us deviation.
|
timeStampA.frac_part = rand()%1000; // 10us deviation.
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (L2_GetLastTor(linkInstPtr) == L2_TOR_RX)
|
if (L2_GetCurrentTor(linkInstPtr) == L2_TOR_RX)
|
||||||
{
|
{
|
||||||
if(L2_GetLastFrameType(linkInstPtr) == L2_INTRA_W2_ACQ_FRAME) {
|
if(L2_GetCurrentFrameType(linkInstPtr) == L2_INTRA_W2_ACQ_FRAME) {
|
||||||
forge_w2acq_frame((uint8_t*)phyInstPtr->recvDataAddr, L2_NODE_MEMBER, 2, 1, 1, -1, L2_INIT_STATE);
|
forge_w2acq_frame((uint8_t*)phyInstPtr->recvDataAddr, L2_NODE_MEMBER, 2, 1, 1, -1, L2_INIT_STATE);
|
||||||
PhyWrite(phyInstPtr, TXRX_STATE, 0x01010101);
|
PhyWrite(phyInstPtr, TXRX_STATE, 0x01010101);
|
||||||
PhyWrite(phyInstPtr, RECVDATA_STATE, INTRA_W2ACQ_FRAME_LENGTH_MAX);
|
PhyWrite(phyInstPtr, RECVDATA_STATE, INTRA_W2ACQ_FRAME_LENGTH_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (L2_GetLastFrameType(linkInstPtr) == L2_INTRA_MGMT_FRAME)
|
if (L2_GetCurrentFrameType(linkInstPtr) == L2_INTRA_MGMT_FRAME)
|
||||||
{
|
{
|
||||||
forge_mgmt_frame((uint8_t*)phyInstPtr->recvDataAddr, L2_NORMAL_STATE);
|
forge_mgmt_frame((uint8_t*)phyInstPtr->recvDataAddr, L2_NORMAL_STATE);
|
||||||
PhyWrite(phyInstPtr, TXRX_STATE, 0x01010101);
|
PhyWrite(phyInstPtr, TXRX_STATE, 0x01010101);
|
||||||
PhyWrite(phyInstPtr, RECVDATA_STATE, INTRA_MGMT_FRAME_LENGTH_MAX);
|
PhyWrite(phyInstPtr, RECVDATA_STATE, INTRA_MGMT_FRAME_LENGTH_MAX);
|
||||||
}
|
}
|
||||||
if (L2_GetLastFrameType(linkInstPtr) == L2_INTRA_TSYNC_FRAME)
|
if (L2_GetCurrentFrameType(linkInstPtr) == L2_INTRA_TSYNC_FRAME)
|
||||||
{
|
{
|
||||||
timeDiff = Phy_GetTimeComp(L2_L2frame2L1frame(L2_INTRA_TSYNC_FRAME)) + (rand()-RAND_MAX)%1000;
|
timeDiff = Phy_GetTimeComp(L2_L2frame2L1frame(L2_INTRA_TSYNC_FRAME)) + (rand()-RAND_MAX)%1000;
|
||||||
TimeCtrl_CalculateTimeGap(&timeStampA, &timeStampB, &timeGap);
|
TimeCtrl_CalculateTimeGap(&timeStampA, &timeStampB, &timeGap);
|
||||||
@@ -405,7 +408,7 @@ TEST(linklayer_master_routine) {
|
|||||||
PhyWrite(phyInstPtr, RECVDATA_STATE, INTRA_MGMT_FRAME_LENGTH_MAX);
|
PhyWrite(phyInstPtr, RECVDATA_STATE, INTRA_MGMT_FRAME_LENGTH_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (L2_GetLastFrameType(linkInstPtr) == L2_INTRA_SVC_FRAME)
|
if (L2_GetCurrentFrameType(linkInstPtr) == L2_INTRA_SVC_FRAME)
|
||||||
{
|
{
|
||||||
forge_mgmt_frame((uint8_t*)phyInstPtr->recvDataAddr, L2_NORMAL_STATE);
|
forge_mgmt_frame((uint8_t*)phyInstPtr->recvDataAddr, L2_NORMAL_STATE);
|
||||||
PhyWrite(phyInstPtr, TXRX_STATE, 0x01010101);
|
PhyWrite(phyInstPtr, TXRX_STATE, 0x01010101);
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ TEST(tmc_read_time) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ASSERT_EQUAL(timeH, timeStamp.int_part+1);
|
ASSERT_EQUAL(timeH, timeStamp.int_part+1);
|
||||||
ASSERT_TRUE(timeL + COUNTE_FRAC_MAX - timeStamp.frac_part < MAX_OPT_DELAY);
|
ASSERT_TRUE(timeL + TIME_FRAC_MAX - timeStamp.frac_part < MAX_OPT_DELAY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,14 +69,14 @@ TEST(tmc_adjustment) {
|
|||||||
ASSERT_EQUAL(timeAdj.int_part, timeStampPost.int_part);
|
ASSERT_EQUAL(timeAdj.int_part, timeStampPost.int_part);
|
||||||
ASSERT_TRUE(timeStampPost.frac_part < MAX_OPT_DELAY);
|
ASSERT_TRUE(timeStampPost.frac_part < MAX_OPT_DELAY);
|
||||||
|
|
||||||
timeAdj.frac_part = COUNTE_FRAC_MAX;
|
timeAdj.frac_part = TIME_FRAC_MAX;
|
||||||
timeAdj.int_part = 0x00000203;
|
timeAdj.int_part = 0x00000203;
|
||||||
TimeCtrl_TimeAdjust(tmcInstPtr, &timeAdj, TM_ADJ_SET);
|
TimeCtrl_TimeAdjust(tmcInstPtr, &timeAdj, TM_ADJ_SET);
|
||||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPost);
|
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPost);
|
||||||
ASSERT_EQUAL(timeAdj.int_part, timeStampPost.int_part+1);
|
ASSERT_EQUAL(timeAdj.int_part, timeStampPost.int_part+1);
|
||||||
ASSERT_TRUE(timeStampPost.frac_part < MAX_OPT_DELAY);
|
ASSERT_TRUE(timeStampPost.frac_part < MAX_OPT_DELAY);
|
||||||
|
|
||||||
timeAdj.frac_part = COUNTE_FRAC_MAX*2;
|
timeAdj.frac_part = TIME_FRAC_MAX*2;
|
||||||
timeAdj.int_part = 0x00000203;
|
timeAdj.int_part = 0x00000203;
|
||||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPre);
|
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPre);
|
||||||
TimeCtrl_TimeAdjust(tmcInstPtr, &timeAdj, TM_ADJ_SET);
|
TimeCtrl_TimeAdjust(tmcInstPtr, &timeAdj, TM_ADJ_SET);
|
||||||
@@ -87,7 +87,7 @@ TEST(tmc_adjustment) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ASSERT_EQUAL(timeStampPost.int_part, timeStampPre.int_part + 1);
|
ASSERT_EQUAL(timeStampPost.int_part, timeStampPre.int_part + 1);
|
||||||
ASSERT_TRUE(timeStampPost.frac_part + COUNTE_FRAC_MAX - timeStampPre.frac_part < MAX_OPT_DELAY);
|
ASSERT_TRUE(timeStampPost.frac_part + TIME_FRAC_MAX - timeStampPre.frac_part < MAX_OPT_DELAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adjustment -- add
|
// Adjustment -- add
|
||||||
@@ -96,9 +96,9 @@ TEST(tmc_adjustment) {
|
|||||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPre);
|
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPre);
|
||||||
TimeCtrl_TimeAdjust(tmcInstPtr, &timeAdj, TM_ADJ_ADD);
|
TimeCtrl_TimeAdjust(tmcInstPtr, &timeAdj, TM_ADJ_ADD);
|
||||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPost);
|
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPost);
|
||||||
if(timeStampPre.frac_part + timeAdj.frac_part > COUNTE_FRAC_MAX) {
|
if(timeStampPre.frac_part + timeAdj.frac_part > TIME_FRAC_MAX) {
|
||||||
ASSERT_TRUE(timeStampPost.int_part <= timeStampPre.int_part + timeAdj.int_part + 2);
|
ASSERT_TRUE(timeStampPost.int_part <= timeStampPre.int_part + timeAdj.int_part + 2);
|
||||||
ASSERT_TRUE(timeStampPost.frac_part + COUNTE_FRAC_MAX - timeStampPre.frac_part
|
ASSERT_TRUE(timeStampPost.frac_part + TIME_FRAC_MAX - timeStampPre.frac_part
|
||||||
< MAX_OPT_DELAY + timeAdj.frac_part);
|
< MAX_OPT_DELAY + timeAdj.frac_part);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,9 +107,9 @@ TEST(tmc_adjustment) {
|
|||||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPre);
|
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPre);
|
||||||
TimeCtrl_TimeAdjust(tmcInstPtr, &timeAdj, TM_ADJ_ADD);
|
TimeCtrl_TimeAdjust(tmcInstPtr, &timeAdj, TM_ADJ_ADD);
|
||||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPost);
|
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPost);
|
||||||
if(timeStampPre.frac_part + timeAdj.frac_part > COUNTE_FRAC_MAX) {
|
if(timeStampPre.frac_part + timeAdj.frac_part > TIME_FRAC_MAX) {
|
||||||
ASSERT_TRUE(timeStampPost.int_part <= timeStampPre.int_part + timeAdj.int_part + 2);
|
ASSERT_TRUE(timeStampPost.int_part <= timeStampPre.int_part + timeAdj.int_part + 2);
|
||||||
ASSERT_TRUE(timeStampPost.frac_part + COUNTE_FRAC_MAX - timeStampPre.frac_part
|
ASSERT_TRUE(timeStampPost.frac_part + TIME_FRAC_MAX - timeStampPre.frac_part
|
||||||
< MAX_OPT_DELAY + timeAdj.frac_part);
|
< MAX_OPT_DELAY + timeAdj.frac_part);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ TEST(tmc_basic_operations) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ASSERT_EQUAL(timeH, timeStamp.int_part+1);
|
ASSERT_EQUAL(timeH, timeStamp.int_part+1);
|
||||||
ASSERT_TRUE(timeL + COUNTE_FRAC_MAX - timeStamp.frac_part < MAX_OPT_DELAY);
|
ASSERT_TRUE(timeL + TIME_FRAC_MAX - timeStamp.frac_part < MAX_OPT_DELAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
TIME_FRAC stepOpt;
|
TIME_FRAC stepOpt;
|
||||||
|
|||||||
Reference in New Issue
Block a user