📄 mac_beacon_handler.s51
字号:
// 171
// 172 switch (pTask->state) {
MOV DPL,?XSP + 0
MOV DPH,?XSP + 1
MOVX A,@DPTR
ADD A,#0x8
MOV R6,A
INC DPTR
MOVX A,@DPTR
ADDC A,#0x0
MOV R7,A
MOV DPL,?XSP + 0
MOV DPH,?XSP + 1
MOVX A,@DPTR
ADD A,#0x5
MOV R0,A
INC DPTR
MOVX A,@DPTR
ADDC A,#0x0
MOV R1,A
MOV A,#0x4
LCALL ?XSTACK_DISP0_8
MOV A,R0
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
MOV A,#0x4
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV DPH,A
MOV DPL,R0
MOVX A,@DPTR
LCALL ?UC_SWITCH_DENSE
`?<Jumptable for mbcnTxPeriodicalBeaconTask>_0`:
DB 0
DB 1
DW ??mbcnTxPeriodicalBeaconTask_0
DW ??mbcnTxPeriodicalBeaconTask_1
DW ??mbcnTxPeriodicalBeaconTask_2
// 173 case MBCN_SET_NEXT_CALLBACK_PREPTX:
// 174
// 175 // Set the RF channel
// 176 msupSetChannel(ppib.phyCurrentChannel, FALSE);
??mbcnTxPeriodicalBeaconTask_1:
; Setup parameters for call to function msupSetChannel
MOV R2,#0x0
MOV DPTR,#ppib
MOVX A,@DPTR
MOV R1,A
LCALL msupSetChannel & 0xFFFF
// 177
// 178 // Update buffered PIB attributes
// 179 oldBeaconInterval = msupCalcBeaconInterval();
; Setup parameters for call to function msupCalcBeaconInterval
LCALL msupCalcBeaconInterval & 0xFFFF
MOV ?V0 + 0,R2
MOV ?V0 + 1,R3
MOV ?V0 + 2,R4
MOV ?V0 + 3,R5
MOV DPTR,#??oldBeaconInterval
MOV R0,#?V0 + 0
LCALL ?L_MOV_TO_X
// 180 mbcnUpdateBufferedPibAttributes();
; Setup parameters for call to function mbcnUpdateBufferedPibAttributes
MOV DPTR,#(mbcnUpdateBufferedPibAttributes & 0xffff)
MOV A,#((mbcnUpdateBufferedPibAttributes >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 181
// 182 // Transmit the beacon, unless we're in scan mode (just increment the sequence number)
// 183 if (macInfo.state & MAC_STATE_SCAN_BM) {
MOV DPTR,#macInfo
MOVX A,@DPTR
MOV C,0xE0 /* A */.6
JNC ??mbcnTxPeriodicalBeaconTask_3
// 184 mpib.macBSN++;
MOV DPTR,#(mpib + 13)
MOVX A,@DPTR
INC A
MOVX @DPTR,A
// 185 mschRemoveTask(pTask->priority, MSCH_KEEP_TASK_RESERVED_BM | MSCH_KEEP_TASK_IN_PROGRESS_BM);
; Setup parameters for call to function mschRemoveTask
LJMP ??mbcnTxPeriodicalBeaconTask_4
// 186
// 187 } else {
// 188
// 189 // TBD: Set mpib.macBeaconTxTime (here?)
// 190
// 191 // Unrequest all indirect packets, and decrement timeToLive
// 192 miqUnrequestAll();
??mbcnTxPeriodicalBeaconTask_3:
; Setup parameters for call to function miqUnrequestAll
LCALL miqUnrequestAll & 0xFFFF
// 193 miqDecrTimeToLive();
; Setup parameters for call to function miqDecrTimeToLive
LCALL miqDecrTimeToLive & 0xFFFF
// 194
// 195 // Create the task that later on will remove expired packets
// 196 mschAddTask(mschReserveTask(), MAC_TASK_PRI_MEDIUM, miqExpireIndirectPacketsTask, NULL);
; Setup parameters for call to function mschAddTask
MOV ?V0 + 0,#(miqExpireIndirectPacketsTask & 0xff)
MOV ?V0 + 1,#((miqExpireIndirectPacketsTask >> 8) & 0xff)
MOV ?V0 + 2,#((miqExpireIndirectPacketsTask >> 16) & 0xff)
MOV R0,#?V0 + 0
LCALL ?PUSH_XSTACK_I_THREE
CFI CFA_XSP16 add(XSP16, 25)
MOV R2,#0x1
MOV A,R2
PUSH A
CFI CFA_SP SP+-1
; Setup parameters for call to function mschReserveTask
LCALL mschReserveTask & 0xFFFF
CLR A
MOV R4,A
MOV R5,A
POP A
CFI CFA_SP SP+0
MOV R2,A
LCALL mschAddTask & 0xFFFF
MOV A,#0x3
LCALL ?DEALLOC_XSTACK8
CFI CFA_XSP16 add(XSP16, 22)
// 197
// 198 // Generate the beacon frame
// 199 mbcnPrepareBeacon(pPacket);
; Setup parameters for call to function mbcnPrepareBeacon
MOV A,#0x2
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
MOV DPTR,#(mbcnPrepareBeacon & 0xffff)
MOV A,#((mbcnPrepareBeacon >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 200 pPacket->slotted = TRUE;
MOV A,#0x2
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
ADD A,#-0x79
MOV R0,A
INC DPTR
MOVX A,@DPTR
ADDC A,#0x0
MOV R1,A
MOV DPL,R0
MOV DPH,R1
MOV A,#0x1
MOVX @DPTR,A
// 201 pTask->state = MBCN_START_TRANSMISSION;
MOV A,#0x4
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV DPH,A
MOV DPL,R0
MOV A,#0x1
??mbcnTxPeriodicalBeaconTask_5:
MOVX @DPTR,A
LJMP ??mbcnTxPeriodicalBeaconTask_0 & 0xFFFF
// 202 }
// 203 break;
// 204
// 205 case MBCN_START_TRANSMISSION:
// 206
// 207 // Remain in this state until the beacon transmission can begin
// 208 if (T2_GET_OVERFLOW_COUNTER() == (oldBeaconInterval - MBCN_TX_STARTUP_OVERHEAD)) {
??mbcnTxPeriodicalBeaconTask_2:
; Setup parameters for call to function T2_GET_OVERFLOW_COUNTER
MOV DPTR,#(T2_GET_OVERFLOW_COUNTER & 0xffff)
MOV A,#((T2_GET_OVERFLOW_COUNTER >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
MOV ?V0 + 4,R2
MOV ?V0 + 5,R3
MOV ?V0 + 6,R4
MOV ?V0 + 7,R5
MOV DPTR,#__Constant_fffffffc
MOV R0,#?V0 + 0
LCALL ?L_MOV_X
MOV DPH,#((??oldBeaconInterval >> 8) & 0xff)
MOV DPL,#(??oldBeaconInterval & 0xff)
MOV R0,#?V0 + 0
LCALL ?L_ADD_X
MOV R0,#?V0 + 4
MOV R1,#?V0 + 0
LCALL ?L_EQ
JZ $+5
LJMP ??mbcnTxPeriodicalBeaconTask_6 & 0xFFFF
// 209
// 210 // Schedule backoff slot counter reset (which in turn schedules the next mbcnTxPeriodicalBeacon)
// 211 mtimSetCallback(mtxResetBosCounter, MBCN_TX_STARTUP_OVERHEAD);
; Setup parameters for call to function mtimSetCallback
MOV DPTR,#__Constant_4
LCALL ?PUSH_XSTACK8_X_FOUR
CFI CFA_XSP16 add(XSP16, 26)
MOV R1,#(mtxResetBosCounter & 0xff)
MOV R2,#((mtxResetBosCounter >> 8) & 0xff)
MOV R3,#((mtxResetBosCounter >> 16) & 0xff)
LCALL mtimSetCallback & 0xFFFF
MOV A,#0x4
LCALL ?DEALLOC_XSTACK8
CFI CFA_XSP16 add(XSP16, 22)
// 212
// 213 // Resume transmission of direct packets after the beacon transmission
// 214 if (mtxInfo.waitForBeacon)
MOV A,#0x2
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
ADD A,#-0x7b
MOV R6,A
INC DPTR
MOVX A,@DPTR
ADDC A,#0x0
MOV R7,A
MOV DPTR,#(mtxInfo + 5)
MOVX A,@DPTR
JZ ??mbcnTxPeriodicalBeaconTask_7
// 215 mtimSetCallback(mtxResumeAfterBeaconCallback, (INT32)(pPacket->duration + MBCN_TX_STARTUP_OVERHEAD));
; Setup parameters for call to function mtimSetCallback
MOV DPL,R6
MOV DPH,R7
MOVX A,@DPTR
MOV R0,A
MOV A,#0x4
ADD A,R0
MOV ?V0 + 0,A
CLR A
ADDC A,#0x0
MOV ?V0 + 1,A
MOV ?V0 + 2,#0x0
MOV ?V0 + 3,#0x0
MOV R0,#?V0 + 0
LCALL ?PUSH_XSTACK_I_FOUR
CFI CFA_XSP16 add(XSP16, 26)
MOV R1,#(mtxResumeAfterBeaconCallback & 0xff)
MOV R2,#((mtxResumeAfterBeaconCallback >> 8) & 0xff)
MOV R3,#((mtxResumeAfterBeaconCallback >> 16) & 0xff)
LCALL mtimSetCallback & 0xFFFF
MOV A,#0x4
LCALL ?DEALLOC_XSTACK8
CFI CFA_XSP16 add(XSP16, 22)
// 216
// 217 // Set the RX interval (if any)
// 218 if (mpib.macSuperframeOrder != 15) {
??mbcnTxPeriodicalBeaconTask_7:
MOV DPTR,#(mpib + 34)
MOVX A,@DPTR
XRL A,#0xf
JNZ $+5
LJMP ??mbcnTxPeriodicalBeaconTask_8 & 0xFFFF
// 219 if (mpib.macRxOnWhenIdle) {
MOV DPTR,#(mpib + 31)
MOVX A,@DPTR
JNZ $+5
LJMP ??mbcnTxPeriodicalBeaconTask_8 & 0xFFFF
// 220
// 221 // On:
// 222 mrxAutoIncrOnCounter();
; Setup parameters for call to function mrxAutoIncrOnCounter
MOV DPTR,#(mrxAutoIncrOnCounter & 0xffff)
MOV A,#((mrxAutoIncrOnCounter >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 223
// 224 // TBD: Move this stuff to mtxResetBosCounter?
// 225 // Off:
// 226 if (mpib.macBattLifeExt) {
MOV DPTR,#(mpib + 3)
MOVX A,@DPTR
JZ ??mbcnTxPeriodicalBeaconTask_9
// 227 // Soft off
// 228 mtimSetCallback(mrxDecrOnCounter, (INT32) pPacket->duration + mpib.macBattLifeExtPeriods + MBCN_TX_STARTUP_OVERHEAD);
; Setup parameters for call to function mtimSetCallback
MOV DPL,R6
MOV DPH,R7
MOVX A,@DPTR
MOV ?V0 + 0,A
MOV ?V0 + 1,#0x0
MOV ?V0 + 2,#0x0
MOV ?V0 + 3,#0x0
MOV DPTR,#(mpib + 4)
MOVX A,@DPTR
MOV ?V0 + 4,A
MOV ?V0 + 5,#0x0
MOV ?V0 + 6,#0x0
MOV ?V0 + 7,#0x0
MOV R0,#?V0 + 0
MOV R1,#?V0 + 4
LCALL ?L_ADD
MOV DPTR,#__Constant_4
MOV R0,#?V0 + 0
LCALL ?L_ADD_X
MOV R0,#?V0 + 0
LCALL ?PUSH_XSTACK_I_FOUR
CFI CFA_XSP16 add(XSP16, 26)
MOV R1,#(mrxDecrOnCounter & 0xff)
MOV R2,#((mrxDecrOnCounter >> 8) & 0xff)
MOV R3,#((mrxDecrOnCounter >> 16) & 0xff)
SJMP ??mbcnTxPeriodicalBeaconTask_10
CFI CFA_XSP16 add(XSP16, 22)
// 229 } else {
// 230 // Force when the superframe is shorter than the beacon interval
// 231 mtimSetCallback((mpib.macBeaconOrder == mpib.macSuperframeOrder) ? mrxDecrOnCounter : mrxForceRxOff, (INT32) msupCalcSuperframeDuration() + MBCN_TX_STARTUP_OVERHEAD);
??mbcnTxPeriodicalBeaconTask_9:
; Setup parameters for call to function msupCalcSuperframeDuration
LCALL msupCalcSuperframeDuration & 0xFFFF
MOV ?V0 + 0,R2
MOV ?V0 + 1,R3
MOV ?V0 + 2,R4
MOV ?V0 + 3,R5
MOV DPTR,#(mpib + 8)
MOVX A,@DPTR
MOV R2,A
MOV DPTR,#(mpib + 34)
MOVX A,@DPTR
XRL A,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -