📄 mac_beacon_handler.s51
字号:
// 17 * The use of this file is restricted by the signed MAC software license agreement. *
// 18 * *
// 19 * Copyright Chipcon AS, 2005 *
// 20 *******************************************************************************************************
// 21 * This module contains functions the functions responsible for receiving and transmitting beacons, *
// 22 * and related functions, such as synchronization and coordinator realignment. *
// 23 *******************************************************************************************************/
// 24 #include "mac_headers.h"
// 25
// 26
// 27 //-------------------------------------------------------------------------------------------------------
// 28 // Beacon-related variables
RSEG XDATA_Z:XDATA:NOROOT(0)
REQUIRE __INIT_XDATA_Z
// 29 MAC_BEACON_INFO mbcnInfo;
mbcnInfo:
DS 10
// 30 //-------------------------------------------------------------------------------------------------------
// 31
// 32
// 33
// 34
// 35 /*******************************************************************************************************
// 36 *******************************************************************************************************
// 37 ************************** BEACON RECEPTION **************************
// 38 *******************************************************************************************************
// 39 *******************************************************************************************************/
// 40
// 41
// 42
// 43
// 44 //-------------------------------------------------------------------------------------------------------
// 45 // void mbcnRxPeriodicalBeacon(void)
// 46 //
// 47 // DESCRIPTION:
// 48 // Creates the task that handles reception of periodical beacons (in a beacon-enabled PAN)
// 49 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 50 void mbcnRxPeriodicalBeacon(void) NEAR {
mbcnRxPeriodicalBeacon:
CFI Block cfiBlock0 Using cfiCommon0
CFI Function mbcnRxPeriodicalBeacon
FUNCALL mbcnRxPeriodicalBeacon, mschAddTask
LOCFRAME XSTACK, 14, STACK
ARGFRAME XSTACK, 14, STACK
MOV A,#-0xb
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 V2 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-10)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-11)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 11)
; Saved register size: 11
; Auto size: 0
// 51 mschAddTask(mbcnInfo.rxTaskNumber, MAC_TASK_PRI_HIGHEST, mbcnRxPeriodicalBeaconTask, NULL);
; Setup parameters for call to function mschAddTask
MOV ?V0 + 0,#(mbcnRxPeriodicalBeaconTask & 0xff)
MOV ?V0 + 1,#((mbcnRxPeriodicalBeaconTask >> 8) & 0xff)
MOV ?V0 + 2,#((mbcnRxPeriodicalBeaconTask >> 16) & 0xff)
MOV R0,#?V0 + 0
LCALL ?PUSH_XSTACK_I_THREE
CFI CFA_XSP16 add(XSP16, 14)
MOV R4,#0x0
MOV R5,#0x0
MOV R2,#0x3
MOV DPTR,#(mbcnInfo + 1)
CFI EndBlock cfiBlock0
REQUIRE ?Subroutine0
; // Fall through to label ?Subroutine0
// 52 } // mbcnRxPeriodicalBeacon
RSEG NEAR_CODE:CODE:NOROOT(0)
?Subroutine0:
CFI Block cfiBlock1 Using cfiCommon0
CFI NoFunction
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 14)
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-10)))
CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-11)))
CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-7)))
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)))
MOVX A,@DPTR
MOV R1,A
??Subroutine0_0:
LCALL mschAddTask & 0xFFFF
MOV A,#0x3
LCALL ?DEALLOC_XSTACK8
CFI CFA_XSP16 add(XSP16, 11)
MOV R7,#0x3
LJMP ?BANKED_LEAVE_XDATA
CFI EndBlock cfiBlock1
// 53
// 54
// 55
// 56
// 57 //-------------------------------------------------------------------------------------------------------
// 58 // void mbcnRxPeriodicalBeaconTask(MAC_TASK_INFO *pTask)
// 59 //
// 60 // DESCRIPTION:
// 61 // Handles configuration of timers related to beacon reception (including starting RX and the
// 62 // timeout to be generated when no beacon is received). It also handles beacon loss.
// 63 //
// 64 // Note: When a beacon is received, the current mbcnRxPeriodicalBeacon callback must be cancelled,
// 65 // and a new callback must be set up.
// 66 //
// 67 // TASK DATA:
// 68 // 0
// 69 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 70 void mbcnRxPeriodicalBeaconTask(MAC_TASK_INFO *pTask) NEAR {
mbcnRxPeriodicalBeaconTask:
CFI Block cfiBlock2 Using cfiCommon0
CFI Function mbcnRxPeriodicalBeaconTask
FUNCALL mbcnRxPeriodicalBeaconTask, mrxDecrOnCounter
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mbcnRxPeriodicalBeaconTask, mbcnUpdateBufferedPibAttributes
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mbcnRxPeriodicalBeaconTask, mschRemoveTask
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mbcnRxPeriodicalBeaconTask, mlmeSyncLossIndication
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mbcnRxPeriodicalBeaconTask, mrxIncrOnCounter
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mbcnRxPeriodicalBeaconTask, mbcnUpdateBufferedPibAttributes
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mbcnRxPeriodicalBeaconTask, msupCalcBeaconInterval
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mbcnRxPeriodicalBeaconTask, mbcnGetBeaconMargin
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mbcnRxPeriodicalBeaconTask, mtimSetCallback
LOCFRAME XSTACK, 20, STACK
ARGFRAME XSTACK, 20, STACK
FUNCALL mbcnRxPeriodicalBeaconTask, msupSetChannel
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mbcnRxPeriodicalBeaconTask, mbcnGetBeaconMargin
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mbcnRxPeriodicalBeaconTask, mtimSetCallback
LOCFRAME XSTACK, 20, STACK
ARGFRAME XSTACK, 20, STACK
FUNCALL mbcnRxPeriodicalBeaconTask, 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
// 71
// 72 // Beacon loss?
// 73 if (!mbcnInfo.noBcnCountdown) {
MOV A,R2
ADD A,#0x8
MOV R6,A
MOV A,R3
ADDC A,#0x0
MOV R7,A
MOV DPTR,#(mbcnInfo + 7)
MOVX A,@DPTR
JNZ ??mbcnRxPeriodicalBeaconTask_0
// 74
// 75 // Stop the search/tracking
// 76 if (mbcnInfo.findBeacon) mrxDecrOnCounter();
MOV DPTR,#(mbcnInfo + 6)
MOVX A,@DPTR
JZ ??mbcnRxPeriodicalBeaconTask_1
; Setup parameters for call to function mrxDecrOnCounter
MOV DPTR,#(mrxDecrOnCounter & 0xffff)
MOV A,#((mrxDecrOnCounter >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 77
// 78 mbcnInfo.findBeacon = FALSE;
??mbcnRxPeriodicalBeaconTask_1:
CLR A
MOV DPTR,#(mbcnInfo + 6)
MOVX @DPTR,A
// 79 mbcnInfo.trackBeacon = FALSE;
MOV DPTR,#(mbcnInfo + 5)
MOVX @DPTR,A
// 80
// 81 // Update buffered PIB attributes
// 82 mbcnUpdateBufferedPibAttributes();
; Setup parameters for call to function mbcnUpdateBufferedPibAttributes
MOV DPTR,#(mbcnUpdateBufferedPibAttributes & 0xffff)
MOV A,#((mbcnUpdateBufferedPibAttributes >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 83
// 84 // Remove and release the task
// 85 mschRemoveTask(pTask->priority, 0);
; Setup parameters for call to function mschRemoveTask
MOV R2,#0x0
MOV DPL,R6
MOV DPH,R7
MOVX A,@DPTR
MOV R1,A
LCALL mschRemoveTask & 0xFFFF
// 86 mbcnInfo.rxTaskNumber = NO_TASK;
MOV A,#-0x1
MOV DPTR,#(mbcnInfo + 1)
MOVX @DPTR,A
// 87
// 88 // Make the call to the higher layer
// 89 mlmeSyncLossIndication(BEACON_LOSS);
; Setup parameters for call to function mlmeSyncLossIndication
MOV R1,#-0x20
LCALL mlmeSyncLossIndication & 0xFFFF
LJMP ??mbcnRxPeriodicalBeaconTask_2 & 0xFFFF
// 90
// 91 } else {
// 92 mrxIncrOnCounter();
??mbcnRxPeriodicalBeaconTask_0:
; Setup parameters for call to function mrxIncrOnCounter
MOV DPTR,#(mrxIncrOnCounter & 0xffff)
MOV A,#((mrxIncrOnCounter >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 93
// 94 // Update buffered PIB attributes
// 95 mbcnUpdateBufferedPibAttributes();
; Setup parameters for call to function mbcnUpdateBufferedPibAttributes
MOV DPTR,#(mbcnUpdateBufferedPibAttributes & 0xffff)
MOV A,#((mbcnUpdateBufferedPibAttributes >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 96
// 97 // Schedule the next beacon handler, including XTAL error margin (the startup margin is cumulative when missing beacons)
// 98 mtimSetCallback(mbcnRxPeriodicalBeacon, msupCalcBeaconInterval() - mbcnGetBeaconMargin());
; Setup parameters for call to function msupCalcBeaconInterval
LCALL msupCalcBeaconInterval & 0xFFFF
MOV ?V0 + 4,R2
MOV ?V0 + 5,R3
MOV ?V0 + 6,R4
MOV ?V0 + 7,R5
; Setup parameters for call to function mtimSetCallback
; Setup parameters for call to function mbcnGetBeaconMargin
MOV DPTR,#(mbcnGetBeaconMargin & 0xffff)
MOV A,#((mbcnGetBeaconMargin >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
MOV A,R1
MOV ?V0 + 0,A
MOV ?V0 + 1,#0x0
MOV ?V0 + 2,#0x0
MOV ?V0 + 3,#0x0
MOV R0,#?V0 + 4
MOV R1,#?V0 + 0
LCALL ?L_SUB
MOV R0,#?V0 + 4
LCALL ?PUSH_XSTACK_I_FOUR
CFI CFA_XSP16 add(XSP16, 20)
MOV R1,#(mbcnRxPeriodicalBeacon & 0xff)
MOV R2,#((mbcnRxPeriodicalBeacon >> 8) & 0xff)
MOV R3,#((mbcnRxPeriodicalBeacon >> 16) & 0xff)
LCALL mtimSetCallback & 0xFFFF
MOV A,#0x4
LCALL ?DEALLOC_XSTACK8
CFI CFA_XSP16 add(XSP16, 16)
// 99
// 100 // Set the RF channel (but don't mess up scanning)
// 101 if (!(macInfo.state & MAC_STATE_SCAN_BM)) msupSetChannel(ppib.phyCurrentChannel, FALSE);
MOV DPTR,#macInfo
MOVX A,@DPTR
MOV C,0xE0 /* A */.6
JC ??mbcnRxPeriodicalBeaconTask_3
; Setup parameters for call to function msupSetChannel
MOV R2,#0x0
MOV DPTR,#ppib
MOVX A,@DPTR
MOV R1,A
LCALL msupSetChannel & 0xFFFF
// 102
// 103 // Set the off-timer (the off-time is also cumulative)
// 104 mtimSetCallback(mbcnRxBeaconTimeout, (UINT16) 2 * ((UINT16) aMaxLostBeacons - (UINT16) mbcnInfo.noBcnCountdown + (UINT16) 1) * (UINT16) mbcnGetBeaconMargin() + (UINT16) MBCN_RX_STARTUP_OVERHEAD);
??mbcnRxPeriodicalBeaconTask_3:
; Setup parameters for call to function mtimSetCallback
MOV DPTR,#(mbcnInfo + 7)
MOVX A,@DPTR
MOV R0,A
MOV A,#0x5
CLR C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -