📄 mac_scan.s51
字号:
// 304 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 305 void mscScanProcedure(MAC_TASK_INFO *pTask) NEAR {
mscScanProcedure:
CFI Block cfiBlock7 Using cfiCommon1
CFI Function mscScanProcedure
FUNCALL mscScanProcedure, macSetState
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mscScanProcedure, mschRescheduleTask
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mscScanProcedure, mrxIncrOnCounter
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mscScanProcedure, miqUnrequestAll
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mscScanProcedure, mscSetNextChannel
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mscScanProcedure, msupSetChannel
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mscScanProcedure, mtimSetCallback
LOCFRAME XSTACK, 20, STACK
ARGFRAME XSTACK, 20, STACK
FUNCALL mscScanProcedure, mscTransmitBeaconRequest
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mscScanProcedure, mschRescheduleTask
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mscScanProcedure, mscTransmitOrphanNotification
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mscScanProcedure, mscSetNextChannel
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mscScanProcedure, macSetState
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mscScanProcedure, mrxDecrOnCounter
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mscScanProcedure, msupSetChannel
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mscScanProcedure, mschRemoveTask
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
MOV A,#-0x10
LCALL ?BANKED_ENTER_XDATA
CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
CFI ?BRET_EXT load(1, XDATA, add(CFA_XSP16, literal(-3)))
CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-4)))
CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-5)))
CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI V7 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI V6 load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI V5 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI V4 load(1, XDATA, add(CFA_XSP16, literal(-10)))
CFI V3 load(1, XDATA, add(CFA_XSP16, literal(-11)))
CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-12)))
CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-13)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-14)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-15)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-16)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 16)
; Saved register size: 16
; Auto size: 0
MOV ?V0 + 0,R2
MOV ?V0 + 1,R3
// 306 INT8 maxRssi;
// 307 MAC_STATE_TYPE macState = MAC_STATE_DEFAULT;
MOV R1,#0x0
// 308
// 309 switch (pTask->state) {
MOV A,R2
ADD A,#0x5
MOV R6,A
MOV A,R3
ADDC A,#0x0
MOV R7,A
MOV DPL,R6
MOV DPH,R7
MOVX A,@DPTR
LCALL ?UC_SWITCH_DENSE
`?<Jumptable for mscScanProcedure>_0`:
DB 0
DB 8
DW ??mscScanProcedure_0
DW ??mscScanProcedure_1
DW ??mscScanProcedure_2
DW ??mscScanProcedure_3
DW ??mscScanProcedure_4
DW ??mscScanProcedure_5
DW ??mscScanProcedure_6
DW ??mscScanProcedure_7
DW ??mscScanProcedure_8
DW ??mscScanProcedure_9
// 310 case MSC_STATE_INITIALIZE_SCAN:
// 311
// 312 // If the state cannot be switched now, then reschedule this task (move it to the back of the
// 313 // queue) to avoid potential deadlock...
// 314 switch (mscInfo.scanType) {
??mscScanProcedure_1:
MOV DPTR,#mscInfo
MOVX A,@DPTR
LCALL ?UC_SWITCH_DENSE
`?<Jumptable for mscScanProcedure>_1`:
DB 0
DB 3
DW ??mscScanProcedure_10
DW ??mscScanProcedure_11
DW ??mscScanProcedure_12
DW ??mscScanProcedure_12
DW ??mscScanProcedure_13
// 315 case ENERGY_SCAN: macState = MAC_STATE_ENERGY_SCAN; break;
??mscScanProcedure_11:
MOV R1,#0x40
SJMP ??mscScanProcedure_10
// 316 case PASSIVE_SCAN:
// 317 case ACTIVE_SCAN: macState = MAC_STATE_ACTIVE_OR_PASSIVE_SCAN; break;
??mscScanProcedure_12:
MOV R1,#0x41
SJMP ??mscScanProcedure_10
// 318 case ORPHAN_SCAN: macState = MAC_STATE_ORPHAN_SCAN; break;
??mscScanProcedure_13:
MOV R1,#0x43
// 319 }
// 320 if (!macSetState(macState)) {
??mscScanProcedure_10:
; Setup parameters for call to function macSetState
LCALL macSetState & 0xFFFF
MOV A,R1
JNZ ??mscScanProcedure_14
// 321 mschRescheduleTask(pTask, MSC_STATE_INITIALIZE_SCAN);
; Setup parameters for call to function mschRescheduleTask
MOV R1,#0x0
??mscScanProcedure_15:
MOV R2,?V0 + 0
MOV R3,?V0 + 1
LCALL mschRescheduleTask & 0xFFFF
// 322 break;
LJMP ??mscScanProcedure_0 & 0xFFFF
// 323 }
// 324
// 325 // Configure CC2430 for scanning
// 326 if (mscInfo.scanType != ORPHAN_SCAN) {
??mscScanProcedure_14:
MOV DPTR,#mscInfo
MOVX A,@DPTR
XRL A,#0x3
JZ ??mscScanProcedure_16
// 327 DISABLE_GLOBAL_INT(); // TBD: Can this line be removed?
CLR 0xa8.7
// 328 WRITE_RFR16(PANID, 0xFFFF);
MOV A,#-0x1
MOV DPTR,#-0x20b5
MOVX @DPTR,A
MOV DPTR,#-0x20b4
MOVX @DPTR,A
// 329 }
// 330
// 331 // Increment the RX on counter, so that other events don't turn it off
// 332 mrxIncrOnCounter();
??mscScanProcedure_16:
; Setup parameters for call to function mrxIncrOnCounter
MOV DPTR,#(mrxIncrOnCounter & 0xffff)
MOV A,#((mrxIncrOnCounter >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 333
// 334 pTask->state = MSC_STATE_UNREQUEST_INDIRECT;
MOV A,#0x1
??mscScanProcedure_17:
MOV DPL,R6
MOV DPH,R7
MOVX @DPTR,A
LJMP ??mscScanProcedure_0 & 0xFFFF
// 335 break;
// 336
// 337 case MSC_STATE_UNREQUEST_INDIRECT:
// 338
// 339 // At this point we can be sure that RX has been shut down, that the RX engine is not running, including
// 340 // the high-priority processing tasks. There are no direct packet transmissions in progress, because
// 341 // that would have blocked this task. The beacon transmission and reception tasks, and the force RX off
// 342 // function are blocked by the MAC state.
// 343
// 344 #if MAC_OPT_FFD
// 345 // Unrequest all indirect packets to avoid that the miqTransmitRequestedPackets() function eats up the
// 346 // whole task pool (requested packets are usually transmitted in between).
// 347 miqUnrequestAll();
??mscScanProcedure_2:
; Setup parameters for call to function miqUnrequestAll
LCALL miqUnrequestAll & 0xFFFF
// 348 #endif
// 349
// 350 // Remove invalid channels from the mask, and go to the first channel to be scanned
// 351 mscInfo.pScanResult->unscannedChannels = mscInfo.scanChannels;
MOV DPTR,#(mscInfo + 6)
MOVX A,@DPTR
MOV ?V0 + 4,A
INC DPTR
MOVX A,@DPTR
MOV ?V0 + 5,A
MOV DPTR,#(mscInfo + 1)
MOV R0,#?V0 + 0
LCALL ?L_MOV_X
MOV DPL,?V0 + 4
MOV DPH,?V0 + 5
INC DPTR
MOV A,?V0 + 0
MOVX @DPTR,A
INC DPTR
MOV A,?V0 + 1
MOVX @DPTR,A
INC DPTR
MOV A,?V0 + 2
MOVX @DPTR,A
INC DPTR
MOV A,?V0 + 3
MOVX @DPTR,A
// 352 mscInfo.scanChannels &= MSC_VALID_CHANNELS;
MOV DPTR,#__Constant_7fff800
MOV R0,#?V0 + 0
LCALL ?L_MOV_X
MOV DPTR,#(mscInfo + 1)
MOV R0,#?V0 + 0
LCALL ?L_AND_TO_X
// 353 mscInfo.pScanResult->resultListSize = 0;
CLR A
MOV DPL,?V0 + 4
MOV DPH,?V0 + 5
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX @DPTR,A
// 354 mscInfo.currentChannel = 0;
MOV DPTR,#(mscInfo + 8)
MOVX @DPTR,A
// 355 mscInfo.oldPhyCurrentChannel = ppib.phyCurrentChannel;
MOV DPTR,#ppib
MOVX A,@DPTR
MOV DPTR,#(mscInfo + 11)
MOVX @DPTR,A
// 356 if (mscSetNextChannel()) {
; Setup parameters for call to function mscSetNextChannel
LCALL mscSetNextChannel & 0xFFFF
MOV A,R1
JNZ $+5
LJMP ??mscScanProcedure_18 & 0xFFFF
// 357 pTask->state = MSC_STATE_SET_CHANNEL;
??mscScanProcedure_19:
MOV A,#0x2
SJMP ??mscScanProcedure_17
// 358 } else {
// 359 pTask->state = MSC_STATE_FINISH;
// 360 }
// 361 break;
// 362
// 363 case MSC_STATE_SET_CHANNEL:
// 364
// 365 // Set the timer which will tell us when to move on to the next channel
// 366 mscInfo.channelComplete = FALSE;
??mscScanProcedure_3:
CLR A
MOV DPTR,#(mscInfo + 9)
MOVX @DPTR,A
// 367
// 368 // Set the new channel and turn on RX
// 369 msupSetChannel(mscInfo.currentChannel, TRUE);
; Setup parameters for call to function msupSetChannel
MOV R2,#0x1
MOV DPTR,#(mscInfo + 8)
MOVX A,@DPTR
MOV R1,A
LCALL msupSetChannel & 0xFFFF
// 370
// 371 // Set the channel timeout
// 372 switch (mscInfo.scanType) {
MOV DPTR,#mscInfo
MOVX A,@DPTR
LCALL ?UC_SWITCH_DENSE
`?<Jumptable for mscScanProcedure>_2`:
DB 0
DB 2
DW ??mscScanProcedure_20
DW ??mscScanProcedure_21
DW ??mscScanProcedure_20
DW ??mscScanProcedure_21
// 373 case ENERGY_SCAN:
// 374 case PASSIVE_SCAN:
// 375 mtimSetCallback(mscChannelTimeout, ((UINT32) aBaseSuperframeDuration / (UINT32) aUnitBackoffPeriod) * (((UINT32) 1 << mscInfo.scanDuration) + 1));
??mscScanProcedure_21:
; Setup parameters for call to function mtimSetCallback
MOV ?V0 + 4,#0x1
MOV ?V0 + 5,#0x0
MOV ?V0 + 6,#0x0
MOV ?V0 + 7,#0x0
MOV DPTR,#(mscInfo + 5)
MOVX A,@DPTR
MOV R0,#?V0 + 4
LCALL ?L_SHL
MOV DPTR,#__Constant_1
MOV R0,#?V0 + 4
LCALL ?L_ADD_X
MOV DPTR,#__Constant_30
MOV R0,#?V0 + 0
LCALL ?L_MOV_X
MOV R0,#?V0 + 4
MOV R1,#?V0 + 0
LCALL ?L_MUL
MOV R0,#?V0 + 4
LCALL ?PUSH_XSTACK_I_FOUR
CFI CFA_XSP16 add(XSP16, 20)
MOV R1,#(mscChannelTimeout & 0xff)
MOV R2,#((mscChannelTimeout >> 8) & 0xff)
MOV R3,#((mscChannelTimeout >> 16) & 0xff)
LCALL mtimSetCallback & 0xFFFF
MOV A,#0x4
LCALL ?DEALLOC_XSTACK8
CFI CFA_XSP16 add(XSP16, 16)
// 376 break;
// 377 case ACTIVE_SCAN:
// 378 case ORPHAN_SCAN:
// 379 // The channel timeout is set by mtxFinishTransmission (when the packet has been transmitted)
// 380 break;
// 381 }
// 382
// 383 // Jump to the next state
// 384 switch (mscInfo.scanType) {
??mscScanProcedure_20:
MOV DPTR,#mscInfo
MOVX A,@DPTR
LCALL ?UC_SWITCH_DENSE
`?<Jumptable for mscScanProcedure>_3`:
DB 0
DB 3
DW ??mscScanProcedure_0
DW ??mscScanProcedure_22
DW ??mscScanProcedure_23
DW ??mscScanProcedure_24
DW ??mscScanProcedure_25
// 385 case ENERGY_SCAN: pTask->state = MSC_STATE_E_SAMPLE; break;
??mscScanProcedure_22:
MOV A,#0x3
LJMP ??mscScanProcedure_17
// 386 case ACTIVE_SCAN: pTask->state = MSC_STATE_A_TX_BEACON_REQUEST; break;
??mscScanProcedure_23:
MOV A,#0x4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -