📄 mac_rx_engine.s51
字号:
// 58 // DESCRIPTION:
// 59 // Increments the "RX on" counter, and turns on RX on a 0 -> 1 transition
// 60 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 61 void mrxIncrOnCounter(void) NEAR {
mrxIncrOnCounter:
CFI Block cfiBlock0 Using cfiCommon0
CFI Function mrxIncrOnCounter
FUNCALL mrxIncrOnCounter, msupIsTxActive
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
PUSH DPL
CFI DPL0 Frame(CFA_SP, 4)
CFI CFA_SP SP+-4
PUSH DPH
CFI DPH0 Frame(CFA_SP, 5)
CFI CFA_SP SP+-5
; Saved register size: 2
; Auto size: 0
// 62 DISABLE_GLOBAL_INT();
CLR 0xa8.7
// 63 if (!mrxInfo.onCounter) {
MOV DPTR,#(mrxInfo + 13)
MOVX A,@DPTR
JNZ ??mrxIncrOnCounter_0
// 64 CSP_INDICATE_RX_ON(TRUE);
MOV A,#0x1
MOV DPTR,#-0x20eb
MOVX @DPTR,A
// 65 if (!msupIsTxActive()) {
; Setup parameters for call to function msupIsTxActive
LCALL msupIsTxActive & 0xFFFF
MOV A,R1
JNZ ??mrxIncrOnCounter_0
// 66 ISRXON;
MOV 0xe1,#-0x1e
// 67 }
// 68 }
// 69 mrxInfo.onCounter++;
??mrxIncrOnCounter_0:
MOV DPTR,#(mrxInfo + 13)
MOVX A,@DPTR
INC A
SJMP ?Subroutine0
CFI EndBlock cfiBlock0
// 70 ENABLE_GLOBAL_INT();
// 71 } // mrxIncrOnCounter
// 72
// 73
// 74
// 75
// 76 //-------------------------------------------------------------------------------------------------------
// 77 // void mrxAutoIncrOnCounter(void)
// 78 //
// 79 // DESCRIPTION:
// 80 // Increments the "RX on" counter, but does not turn on RX on a 0 -> 1 transition. This function
// 81 // should be used when issuing the STXON(CCA) or SACK(PEND) command strobes.
// 82 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 83 void mrxAutoIncrOnCounter(void) NEAR {
mrxAutoIncrOnCounter:
CFI Block cfiBlock1 Using cfiCommon0
CFI Function mrxAutoIncrOnCounter
PUSH DPL
CFI DPL0 Frame(CFA_SP, 4)
CFI CFA_SP SP+-4
PUSH DPH
CFI DPH0 Frame(CFA_SP, 5)
CFI CFA_SP SP+-5
; Saved register size: 2
; Auto size: 0
// 84 DISABLE_GLOBAL_INT();
CLR 0xa8.7
// 85 mrxInfo.onCounter++;
MOV DPTR,#(mrxInfo + 13)
MOVX A,@DPTR
INC A
MOVX @DPTR,A
// 86 CSP_INDICATE_RX_ON(TRUE);
MOV A,#0x1
MOV DPTR,#-0x20eb
SJMP ?Subroutine0
CFI EndBlock cfiBlock1
// 87 ENABLE_GLOBAL_INT();
// 88 } // mrxAutoIncrOnCounter
// 89
// 90
// 91
// 92
// 93 //-------------------------------------------------------------------------------------------------------
// 94 // void mrxDecrOnCounter(void)
// 95 //
// 96 // DESCRIPTION:
// 97 // Decrements the "RX on" counter, and turns off RX on a 1 -> 0 transition if SFD is low. If SFD is
// 98 // high, the turn-off operation is delayed by one backoff period by using a callback.
// 99 //
// 100 // Note: Because of the CSP handling, this function must only be called at the start of a backoff
// 101 // period
// 102 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 103 void mrxDecrOnCounter(void) NEAR {
mrxDecrOnCounter:
CFI Block cfiBlock2 Using cfiCommon0
CFI Function mrxDecrOnCounter
FUNCALL mrxDecrOnCounter, msupIsSfdActive
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
FUNCALL mrxDecrOnCounter, msupIsTxActive
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
FUNCALL mrxDecrOnCounter, msupIsCspInCriticalSection
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
FUNCALL mrxDecrOnCounter, mtimSetCallback
LOCFRAME ISTACK, 2, STACK
LOCFRAME XSTACK, 4, STACK
ARGFRAME ISTACK, 2, STACK
ARGFRAME XSTACK, 4, STACK
PUSH DPL
CFI DPL0 Frame(CFA_SP, 4)
CFI CFA_SP SP+-4
PUSH DPH
CFI DPH0 Frame(CFA_SP, 5)
CFI CFA_SP SP+-5
; Saved register size: 2
; Auto size: 0
// 104
// 105 DISABLE_GLOBAL_INT();
CLR 0xa8.7
// 106
// 107 // Decrement counter and check for 1->0
// 108 if (mrxInfo.onCounter) mrxInfo.onCounter--;
MOV DPTR,#(mrxInfo + 13)
MOVX A,@DPTR
JZ ??mrxDecrOnCounter_0
DEC A
MOVX @DPTR,A
// 109 if (mrxInfo.onCounter == 0) {
??mrxDecrOnCounter_0:
MOVX A,@DPTR
JNZ ??mrxDecrOnCounter_1
// 110
// 111 // Avoid interrupting RX or TX (come back later when busy)
// 112 if (msupIsSfdActive() || msupIsTxActive() || msupIsCspInCriticalSection()) {
; Setup parameters for call to function msupIsSfdActive
LCALL msupIsSfdActive & 0xFFFF
MOV A,R1
JNZ ??mrxDecrOnCounter_2
; Setup parameters for call to function msupIsTxActive
LCALL msupIsTxActive & 0xFFFF
MOV A,R1
JNZ ??mrxDecrOnCounter_2
; Setup parameters for call to function msupIsCspInCriticalSection
LCALL msupIsCspInCriticalSection & 0xFFFF
MOV A,R1
JZ ??mrxDecrOnCounter_3
// 113 mrxInfo.onCounter++;
??mrxDecrOnCounter_2:
MOVX A,@DPTR
INC A
MOVX @DPTR,A
// 114 mtimSetCallback(mrxDecrOnCounter, 1);
; Setup parameters for call to function mtimSetCallback
MOV DPTR,#__Constant_1
LCALL ?PUSH_XSTACK8_X_FOUR
CFI CFA_XSP16 add(XSP16, 4)
MOV R1,#(mrxDecrOnCounter & 0xff)
MOV R2,#((mrxDecrOnCounter >> 8) & 0xff)
MOV R3,#((mrxDecrOnCounter >> 16) & 0xff)
LCALL mtimSetCallback & 0xFFFF
MOV A,#0x4
LCALL ?DEALLOC_XSTACK8
CFI CFA_XSP16 XSP16+0
SJMP ??mrxDecrOnCounter_1
// 115 } else {
// 116 ISRFOFF;
??mrxDecrOnCounter_3:
MOV 0xe1,#-0x1b
// 117 CSP_INDICATE_RX_ON(FALSE);
CLR A
MOV DPTR,#-0x20eb
MOVX @DPTR,A
// 118 }
// 119 }
// 120 ENABLE_GLOBAL_INT();
??mrxDecrOnCounter_1:
SJMP ??Subroutine0_0
CFI EndBlock cfiBlock2
// 121
// 122 } // mrxDecrOnCounter
RSEG NEAR_CODE:CODE:NOROOT(0)
?Subroutine0:
CFI Block cfiBlock3 Using cfiCommon0
CFI NoFunction
CFI CFA_SP SP+-5
CFI DPL0 Frame(CFA_SP, 4)
CFI DPH0 Frame(CFA_SP, 5)
MOVX @DPTR,A
??Subroutine0_0:
SETB 0xa8.7
??Subroutine0_1:
POP DPH
CFI CFA_SP SP+-4
CFI DPH0 SameValue
POP DPL
CFI CFA_SP SP+-3
CFI DPL0 SameValue
LJMP ?BRET
CFI EndBlock cfiBlock3
// 123
// 124
// 125
// 126
// 127 //-------------------------------------------------------------------------------------------------------
// 128 // void mrxRxEnableRequestOff(void)
// 129 //
// 130 // DESCRIPTION:
// 131 // Used in connection with mrxRxEnableRequestTask() to make sure that a mtimCancelCallback operation
// 132 // only removes callbacks initiated by mrxRxEnableRequestTask()
// 133 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 134 void mrxRxEnableRequestOff(void) NEAR {
mrxRxEnableRequestOff:
CFI Block cfiBlock4 Using cfiCommon0
CFI Function mrxRxEnableRequestOff
FUNCALL mrxRxEnableRequestOff, mrxDecrOnCounter
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
PUSH DPL
CFI DPL0 Frame(CFA_SP, 4)
CFI CFA_SP SP+-4
PUSH DPH
CFI DPH0 Frame(CFA_SP, 5)
CFI CFA_SP SP+-5
; Saved register size: 2
; Auto size: 0
// 135 mrxDecrOnCounter();
; Setup parameters for call to function mrxDecrOnCounter
MOV DPTR,#(mrxDecrOnCounter & 0xffff)
MOV A,#((mrxDecrOnCounter >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 136 } // mrxRxEnableRequestOff
SJMP ??Subroutine0_1
CFI EndBlock cfiBlock4
// 137
// 138
// 139
// 140
// 141 //-------------------------------------------------------------------------------------------------------
// 142 // void mrxRxEnableRequestTask(MAC_TASK_INFO *pTask)
// 143 //
// 144 // DESCRIPTION:
// 145 // The task created by mlmeRxEnableRequest() to turn on RX for a period of time. The current version
// 146 // only supports non-beacon PANs.
// 147 //
// 148 // TASK DATA
// 149 // 0
// 150 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 151 void mrxRxEnableRequestTask(MAC_TASK_INFO *pTask) NEAR {
mrxRxEnableRequestTask:
CFI Block cfiBlock5 Using cfiCommon0
CFI Function mrxRxEnableRequestTask
FUNCALL mrxRxEnableRequestTask, mtimCancelCallback
LOCFRAME XSTACK, 12, STACK
ARGFRAME XSTACK, 12, STACK
FUNCALL mrxRxEnableRequestTask, mrxDecrOnCounter
LOCFRAME XSTACK, 12, STACK
ARGFRAME XSTACK, 12, STACK
FUNCALL mrxRxEnableRequestTask, mtimSetCallback
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL mrxRxEnableRequestTask, mrxIncrOnCounter
LOCFRAME XSTACK, 12, STACK
ARGFRAME XSTACK, 12, STACK
FUNCALL mrxRxEnableRequestTask, mschRemoveTask
LOCFRAME XSTACK, 12, STACK
ARGFRAME XSTACK, 12, STACK
FUNCALL mrxRxEnableRequestTask, mlmeRxEnableConfirm
LOCFRAME XSTACK, 12, STACK
ARGFRAME XSTACK, 12, STACK
MOV A,#-0xc
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 V3 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-10)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-11)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-12)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 12)
; Saved register size: 12
; Auto size: 0
MOV A,R2
MOV R6,A
MOV A,R3
MOV R7,A
// 152 MAC_ENUM status;
// 153
// 154 // Only implemented for non-beacon PANs
// 155 if (mpib.macBeaconOrder == 15) {
MOV DPTR,#(mpib + 8)
MOVX A,@DPTR
XRL A,#0xf
JNZ ??mrxRxEnableRequestTask_0
// 156
// 157 // Turn off?
// 158 if (mrxInfo.rxEnableOnDuration == 0) {
MOV DPTR,#(mrxInfo + 16)
MOV R0,#?V0 + 0
LCALL ?L_MOV_X
MOV DPTR,#__Constant_0
MOV R0,#?V0 + 0
LCALL ?L_EQ_X
JNZ ??mrxRxEnableRequestTask_1
// 159 if (mtimCancelCallback(mrxRxEnableRequestOff)) {
; Setup parameters for call to function mtimCancelCallback
MOV R1,#(mrxRxEnableRequestOff & 0xff)
MOV R2,#((mrxRxEnableRequestOff >> 8) & 0xff)
MOV R3,#((mrxRxEnableRequestOff >> 16) & 0xff)
LCALL mtimCancelCallback & 0xFFFF
MOV A,R1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -