📄 mac_sleep.s51
字号:
// 48 uint8 macSleepState = MAC_SLEEP_STATE_RADIO_OFF;
macSleepState:
DS 1
REQUIRE `?<Initializer for macSleepState>`
REQUIRE __INIT_XDATA_I
// 49
// 50
// 51 /**************************************************************************************************
// 52 * @fn macSleepWakeUp
// 53 *
// 54 * @brief Wake up the radio from sleep mode.
// 55 *
// 56 * @param none
// 57 *
// 58 * @return none
// 59 **************************************************************************************************
// 60 */
RSEG BANKED_CODE:CODE:NOROOT(0)
// 61 void macSleepWakeUp(void)
macSleepWakeUp:
CFI Block cfiBlock0 Using cfiCommon0
CFI Function macSleepWakeUp
// 62 {
FUNCALL macSleepWakeUp, macRxRadioPowerUpInit
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
FUNCALL macSleepWakeUp, halAssertHandler
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
FUNCALL macSleepWakeUp, macRxOnRequest
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
// 63 /* don't wake up radio if it's already awake */
// 64 if (macSleepState == MAC_SLEEP_STATE_AWAKE)
MOV DPTR,#macSleepState
MOVX A,@DPTR
JZ ??macSleepWakeUp_0
// 65 {
// 66 return;
// 67 }
// 68
// 69 /* wake up MAC timer */
// 70 MAC_RADIO_TIMER_WAKE_UP();
ORL 0xc3,#0x1
??macSleepWakeUp_1:
MOV A,0xc3
MOV C,0xE0 /* A */.0
JNC ??macSleepWakeUp_1
// 71
// 72 /* if radio was completely off, restore from that state first */
// 73 if (macSleepState == MAC_SLEEP_STATE_RADIO_OFF)
MOVX A,@DPTR
XRL A,#0x2
JNZ ??macSleepWakeUp_2
// 74 {
// 75 /* turn on radio power */
// 76 MAC_RADIO_TURN_ON_POWER();
MOV DPTR,#-0x20e9
MOVX A,@DPTR
CLR 0xE0 /* A */.3
MOVX @DPTR,A
??macSleepWakeUp_3:
MOVX A,@DPTR
MOV C,0xE0 /* A */.4
JC ??macSleepWakeUp_3
// 77
// 78 /* power-up initialization of receive logic */
// 79 macRxRadioPowerUpInit();
; Setup parameters for call to function macRxRadioPowerUpInit
MOV DPTR,#(macRxRadioPowerUpInit & 0xffff)
MOV A,#((macRxRadioPowerUpInit >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 80 }
// 81
// 82 /* turn on the oscillator */
// 83 MAC_RADIO_TURN_ON_OSC();
??macSleepWakeUp_2:
MOV A,0xbe
MOV C,0xE0 /* A */.6
JC ??macSleepWakeUp_4
; Setup parameters for call to function halAssertHandler
MOV DPTR,#(halAssertHandler & 0xffff)
MOV A,#((halAssertHandler >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 84
// 85 /* update sleep state here before requesting to turn on receiver */
// 86 macSleepState = MAC_SLEEP_STATE_AWAKE;
??macSleepWakeUp_4:
CLR A
MOV DPTR,#macSleepState
MOVX @DPTR,A
// 87
// 88 /* turn on the receiver if enabled */
// 89 macRxOnRequest();
; Setup parameters for call to function macRxOnRequest
MOV DPTR,#(macRxOnRequest & 0xffff)
MOV A,#((macRxOnRequest >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 90 }
??macSleepWakeUp_0:
POP DPH
CFI DPH0 SameValue
CFI CFA_SP SP+-4
POP DPL
CFI DPL0 SameValue
CFI CFA_SP SP+-3
LJMP ?BRET
CFI EndBlock cfiBlock0
// 91
// 92
// 93 /**************************************************************************************************
// 94 * @fn macSleep
// 95 *
// 96 * @brief Puts radio into the selected sleep mode.
// 97 *
// 98 * @param sleepState - selected sleep level, see #defines in .h file
// 99 *
// 100 * @return TRUE if radio was successfully put into selected sleep mode.
// 101 * FALSE if it was not safe for radio to go to sleep.
// 102 **************************************************************************************************
// 103 */
RSEG BANKED_CODE:CODE:NOROOT(0)
// 104 uint8 macSleep(uint8 sleepState)
macSleep:
CFI Block cfiBlock1 Using cfiCommon0
CFI Function macSleep
// 105 {
FUNCALL macSleep, halAssertHandler
LOCFRAME XSTACK, 9, STACK
ARGFRAME XSTACK, 9, STACK
FUNCALL macSleep, halAssertHandler
LOCFRAME XSTACK, 9, STACK
ARGFRAME XSTACK, 9, STACK
FUNCALL macSleep, macRxOff
LOCFRAME XSTACK, 9, STACK
ARGFRAME XSTACK, 9, STACK
FUNCALL macSleep, halAssertHandler
LOCFRAME XSTACK, 9, STACK
ARGFRAME XSTACK, 9, STACK
MOV A,#-0x9
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 V0 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 9)
; Saved register size: 9
; Auto size: 0
MOV A,R1
MOV R6,A
// 106 halIntState_t s;
// 107
// 108 /* disable interrupts until macSleepState can be set */
// 109 HAL_ENTER_CRITICAL_SECTION(s);
MOV C,0xa8.7
CLR A
MOV 0xE0 /* A */.0,C
MOV R7,A
CLR 0xa8.7
// 110
// 111 /* assert checks */
// 112 MAC_ASSERT(macSleepState == MAC_SLEEP_STATE_AWAKE); /* radio must be awake to put it to sleep */
MOV DPTR,#macSleepState
MOVX A,@DPTR
JZ ??macSleep_0
; Setup parameters for call to function halAssertHandler
MOV DPTR,#(halAssertHandler & 0xffff)
MOV A,#((halAssertHandler >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 113 MAC_ASSERT(macRxFilter == RX_FILTER_OFF); /* do not sleep when scanning or in promiscuous mode */
??macSleep_0:
MOV DPTR,#macRxFilter
MOVX A,@DPTR
JZ ??macSleep_1
; Setup parameters for call to function halAssertHandler
MOV DPTR,#(halAssertHandler & 0xffff)
MOV A,#((halAssertHandler >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 114
// 115 /* if either RX or TX is active or any RX enable flags are set, it's not OK to sleep */
// 116 if (macRxActive || macRxOutgoingAckFlag || macTxActive || macRxEnableFlags)
??macSleep_1:
MOV DPTR,#macRxActive
MOVX A,@DPTR
JNZ ??macSleep_2
MOV DPTR,#macRxOutgoingAckFlag
MOVX A,@DPTR
JNZ ??macSleep_2
MOV DPTR,#macTxActive
MOVX A,@DPTR
JNZ ??macSleep_2
MOV DPTR,#macRxEnableFlags
MOVX A,@DPTR
JZ ??macSleep_3
// 117 {
// 118 HAL_EXIT_CRITICAL_SECTION(s);
??macSleep_2:
MOV A,R7
MOV C,0xE0 /* A */.0
MOV 0xa8.7,C
// 119 return(FALSE);
MOV R1,#0x0
SJMP ??macSleep_4
// 120 }
// 121
// 122 /* turn off the receiver */
// 123 macRxOff();
??macSleep_3:
; Setup parameters for call to function macRxOff
MOV DPTR,#(macRxOff & 0xffff)
MOV A,#((macRxOff >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 124
// 125 /* update sleep state variable */
// 126 macSleepState = sleepState;
MOV A,R6
MOV DPTR,#macSleepState
MOVX @DPTR,A
// 127
// 128 /* macSleepState is now set, re-enable interrupts */
// 129 HAL_EXIT_CRITICAL_SECTION(s);
MOV A,R7
MOV C,0xE0 /* A */.0
MOV 0xa8.7,C
// 130
// 131 /* put MAC timer to sleep */
// 132 MAC_RADIO_TIMER_SLEEP();
ANL 0xc3,#0xfe
??macSleep_5:
MOV A,0xc3
MOV C,0xE0 /* A */.0
JC ??macSleep_5
// 133
// 134 /* put radio in selected sleep mode */
// 135 if (sleepState == MAC_SLEEP_STATE_OSC_OFF)
MOV A,#0x1
XRL A,R6
JZ ??macSleep_6
// 136 {
// 137 MAC_RADIO_TURN_OFF_OSC();
// 138 }
// 139 else
// 140 {
// 141 MAC_ASSERT(sleepState == MAC_SLEEP_STATE_RADIO_OFF); /* unknown sleep state */
MOV A,#0x2
XRL A,R6
JZ ??macSleep_7
; Setup parameters for call to function halAssertHandler
MOV DPTR,#(halAssertHandler & 0xffff)
MOV A,#((halAssertHandler >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 142 MAC_RADIO_TURN_OFF_POWER();
??macSleep_7:
MOV DPTR,#-0x20e9
MOVX A,@DPTR
SETB 0xE0 /* A */.3
MOVX @DPTR,A
// 143 }
// 144
// 145 /* radio successfully entered sleep mode */
// 146 return(TRUE);
??macSleep_6:
MOV R1,#0x1
??macSleep_4:
MOV R7,#0x1
LJMP ?BANKED_LEAVE_XDATA
CFI EndBlock cfiBlock1
// 147 }
RSEG XDATA_ID:CODE:NOROOT(0)
`?<Initializer for macSleepState>`:
DB 2
ASEGN SFR_AN:DATA:NOROOT,0a8H
// union <unnamed> volatile __sfr _A_IEN0
_A_IEN0:
DS 1
END
// 148
// 149
// 150
// 151 /**************************************************************************************************
// 152 * Compile Time Integrity Checks
// 153 **************************************************************************************************
// 154 */
// 155 #if ((MAC_SLEEP_STATE_AWAKE == MAC_SLEEP_STATE_OSC_OFF) || \
// 156 (MAC_SLEEP_STATE_AWAKE == MAC_SLEEP_STATE_RADIO_OFF))
// 157 #error "ERROR! Non-unique state values."
// 158 #endif
// 159
// 160
// 161 /**************************************************************************************************
// 162 */
//
// 213 bytes in segment BANKED_CODE
// 3 bytes in segment SFR_AN
// 1 byte in segment XDATA_I
// 1 byte in segment XDATA_ID
//
// 214 bytes of CODE memory
// 0 bytes of DATA memory (+ 3 bytes shared)
// 1 byte of XDATA memory
//
//Errors: none
//Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -