📄 mac_power_management.lst
字号:
\ 000000 C082 PUSH DPL
\ 000002 C083 PUSH DPH
\ 000004 ; Saved register size: 2
\ 000004 ; Auto size: 0
96
97 // Write default register values
98 DISABLE_GLOBAL_INT();
\ 000004 C2AF CLR 0xa8.7
99 #if MAC_OPT_FFD
100 WRITE_RFR16(MDMCTRL0, GET_MF(MF_PAN_COORDINATOR) ? MDMCTRL0_PAN_COORDINATOR : MDMCTRL0_NO_PAN_COORDINATOR);
\ 000006 90.... MOV DPTR,#(macInfo + 6)
\ 000009 E0 MOVX A,@DPTR
\ 00000A A2E1 MOV C,0xE0 /* A */.1
\ 00000C 5004 JNC ??mpmRestoreRegsAndRam_0
\ 00000E 791A MOV R1,#0x1a
\ 000010 8002 SJMP ??mpmRestoreRegsAndRam_1
\ ??mpmRestoreRegsAndRam_0:
\ 000012 790A MOV R1,#0xa
\ ??mpmRestoreRegsAndRam_1:
\ 000014 E9 MOV A,R1
\ 000015 90DF02 MOV DPTR,#-0x20fe
\ 000018 F0 MOVX @DPTR,A
\ 000019 90.... MOV DPTR,#(macInfo + 6)
\ 00001C E0 MOVX A,@DPTR
\ 00001D A2E1 MOV C,0xE0 /* A */.1
\ 00001F 74E2 MOV A,#-0x1e
\ 000021 90DF03 MOV DPTR,#-0x20fd
\ 000024 F0 MOVX @DPTR,A
101 #endif
102 ENABLE_AUTOACK();
\ 000025 E0 MOVX A,@DPTR
\ 000026 D2E4 SETB 0xE0 /* A */.4
\ 000028 F0 MOVX @DPTR,A
103 WRITE_RFR16(MDMCTRL1, 0x1400);
\ 000029 7414 MOV A,#0x14
\ 00002B 90DF04 MOV DPTR,#-0x20fc
\ 00002E F0 MOVX @DPTR,A
\ 00002F E4 CLR A
\ 000030 90DF05 MOV DPTR,#-0x20fb
\ 000033 F0 MOVX @DPTR,A
104 SET_FIFOP_THRESHOLD(4);
\ 000034 7403 MOV A,#0x3
\ 000036 90DF4F MOV DPTR,#-0x20b1
\ 000039 F0 MOVX @DPTR,A
105 ENABLE_GLOBAL_INT();
\ 00003A D2AF SETB 0xa8.7
106
107 // PAN ID, extended and short addresses
108 WRITE_RFR16(PANID, mpib.macPANId);
\ 00003C 90.... MOV DPTR,#(mpib + 29)
\ 00003F E0 MOVX A,@DPTR
\ 000040 90DF4B MOV DPTR,#-0x20b5
\ 000043 F0 MOVX @DPTR,A
\ 000044 90.... MOV DPTR,#(mpib + 28)
\ 000047 E0 MOVX A,@DPTR
\ 000048 90DF4C MOV DPTR,#-0x20b4
\ 00004B F0 MOVX @DPTR,A
109 WRITE_RFR16(SHORTADDR, mpib.macShortAddress);
\ 00004C 90.... MOV DPTR,#(mpib + 33)
\ 00004F E0 MOVX A,@DPTR
\ 000050 90DF4D MOV DPTR,#-0x20b3
\ 000053 F0 MOVX @DPTR,A
\ 000054 90.... MOV DPTR,#(mpib + 32)
\ 000057 E0 MOVX A,@DPTR
\ 000058 90DF4E MOV DPTR,#-0x20b2
\ 00005B F0 MOVX @DPTR,A
110 msupWriteExtendedAddress(aExtendedAddress);
\ 00005C ; Setup parameters for call to function msupWriteExtendedAddress
\ 00005C 7A.. MOV R2,#(aExtendedAddress & 0xff)
\ 00005E 7B.. MOV R3,#((aExtendedAddress >> 8) & 0xff)
\ 000060 12.... LCALL msupWriteExtendedAddress
111
112 // Frequency word
113 msupSetChannel(ppib.phyCurrentChannel, TRUE);
\ 000063 ; Setup parameters for call to function msupSetChannel
\ 000063 7A01 MOV R2,#0x1
\ 000065 90.... MOV DPTR,#ppib
\ 000068 E0 MOVX A,@DPTR
\ 000069 F9 MOV R1,A
\ 00006A 12.... LCALL msupSetChannel
114
115 } // mpmRestoreRegsAndRam
\ 00006D 80.. SJMP ??Subroutine0_0
116
117
118
119
120 //-------------------------------------------------------------------------------------------------------
121 // void mpmSetTask(MAC_TASK_INFO *pTask)
122 //
123 // DESCRIPTION:
124 // This task is responsible for controlling CC2430 power, as requested by the higher layer through
125 // mpmSetRequest. Power-down is currently only supported for non-beacon PANs.
126 //
127 // TASK DATA:
128 // The new power mode (MPM_CC2430_ON, MPM_CC2430_XOSC_OFF, or MPM_CC2430_XOSC_AND_VREG_OFF)
129 //-------------------------------------------------------------------------------------------------------
\ In segment NEAR_CODE, align 1, keep-with-next
130 void mpmSetTask(MAC_TASK_INFO *pTask) NEAR {
\ mpmSetTask:
\ 000000 74F7 MOV A,#-0x9
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 9
\ 000005 ; Auto size: 0
131
132 // Powerdown is not permitted in non-beacon mode when "RX on when idle" is enabled
133 if ((mpib.macBeaconOrder == 15) && mpib.macRxOnWhenIdle) {
\ 000005 EA MOV A,R2
\ 000006 2408 ADD A,#0x8
\ 000008 FE MOV R6,A
\ 000009 EB MOV A,R3
\ 00000A 3400 ADDC A,#0x0
\ 00000C FF MOV R7,A
\ 00000D 90.... MOV DPTR,#(mpib + 8)
\ 000010 E0 MOVX A,@DPTR
\ 000011 640F XRL A,#0xf
\ 000013 7015 JNZ ??mpmSetTask_0
\ 000015 90.... MOV DPTR,#(mpib + 31)
\ 000018 E0 MOVX A,@DPTR
\ 000019 600F JZ ??mpmSetTask_0
134 mschRemoveTask(pTask->priority, 0);
\ 00001B ; Setup parameters for call to function mschRemoveTask
\ 00001B 7A00 MOV R2,#0x0
\ 00001D 8E82 MOV DPL,R6
\ 00001F 8F83 MOV DPH,R7
\ 000021 E0 MOVX A,@DPTR
\ 000022 F9 MOV R1,A
\ 000023 12.... LCALL mschRemoveTask & 0xFFFF
135 mpmSetConfirm(ERR_RX_ON_WHEN_IDLE);
\ 000026 ; Setup parameters for call to function mpmSetConfirm
\ 000026 7902 MOV R1,#0x2
\ 000028 806D SJMP ??mpmSetTask_1
136 return;
137 }
138
139 // Come back later if we're not in the default MAC state (there's something going on...)
140 if (macInfo.state != MAC_STATE_DEFAULT) {
\ ??mpmSetTask_0:
\ 00002A 90.... MOV DPTR,#macInfo
\ 00002D E0 MOVX A,@DPTR
\ 00002E 6007 JZ ??mpmSetTask_2
141 mschRescheduleTask(pTask, 0);
\ 000030 ; Setup parameters for call to function mschRescheduleTask
\ 000030 7900 MOV R1,#0x0
\ 000032 12.... LCALL mschRescheduleTask & 0xFFFF
142 return;
\ 000035 8063 SJMP ??mpmSetTask_3
143 }
144
145 // Switch to the new power mode
146 mpmInfo.selectedMode = (BYTE) pTask->taskData;
\ ??mpmSetTask_2:
\ 000037 8A82 MOV DPL,R2
\ 000039 8B83 MOV DPH,R3
\ 00003B A3 INC DPTR
\ 00003C A3 INC DPTR
\ 00003D A3 INC DPTR
\ 00003E E0 MOVX A,@DPTR
\ 00003F 90.... MOV DPTR,#(mpmInfo + 1)
\ 000042 F0 MOVX @DPTR,A
147
148 // In a beacon-enabled network the beacon handler will control powerup and powerdown
149 // In a non-beacon network the changes will be made directly from here:
150 switch (mpmInfo.selectedMode) {
\ 000043 12.... LCALL ?UC_SWITCH_DENSE
\ `?<Jumptable for mpmSetTask>_0`:
\ 000046 00 DB 0
\ 000047 02 DB 2
\ 000048 .... DW ??mpmSetTask_4
\ 00004A .... DW ??mpmSetTask_5
\ 00004C .... DW ??mpmSetTask_6
\ 00004E .... DW ??mpmSetTask_7
151 case MPM_CC2430_ON:
152
153 // Turn on VREG?
154 if (mpmInfo.currentState == MPM_CC2430_XOSC_AND_VREG_OFF) {
\ ??mpmSetTask_5:
\ 000050 90.... MOV DPTR,#mpmInfo
\ 000053 E0 MOVX A,@DPTR
\ 000054 6402 XRL A,#0x2
\ 000056 7003 JNZ ??mpmSetTask_8
155 mpmTurnOnVregAndReset();
\ 000058 ; Setup parameters for call to function mpmTurnOnVregAndReset
\ 000058 12.... LCALL mpmTurnOnVregAndReset & 0xFFFF
156 }
157
158 /*
159 // Restore registers and RAM if the voltage regulator was turned off
160 if (mpmInfo.currentState == MPM_CC2430_XOSC_AND_VREG_OFF) {
161 mpmRestoreRegsAndRam();
162 }
163 */
164
165 // Turn on XOSC?
166 if (mpmInfo.currentState != MPM_CC2430_ON) {
\ ??mpmSetTask_8:
\ 00005B E0 MOVX A,@DPTR
\ 00005C 6003 JZ ??mpmSetTask_9
167 mpmTurnOnXosc();
\ 00005E ; Setup parameters for call to function mpmTurnOnXosc
\ 00005E 12.... LCALL mpmTurnOnXosc & 0xFFFF
168 }
169
170 mrxInfo.keepFifopIntOff = FALSE;
\ ??mpmSetTask_9:
\ 000061 E4 CLR A
\ 000062 90.... MOV DPTR,#(mrxInfo + 15)
\ 000065 F0 MOVX @DPTR,A
171
172 mpmInfo.currentState = MPM_CC2430_ON;
\ 000066 801A SJMP ??mpmSetTask_4
173 break;
174
175 case MPM_CC2430_XOSC_OFF:
176 T2_STOP();
\ ??mpmSetTask_6:
\ 000068 53C3FE ANL 0xc3,#0xfe
177 mrxInfo.keepFifopIntOff = TRUE;
\ 00006B 7401 MOV A,#0x1
\ 00006D 90.... MOV DPTR,#(mrxInfo + 15)
\ 000070 F0 MOVX @DPTR,A
178 mpmTurnOffXosc();
\ 000071 ; Setup parameters for call to function mpmTurnOffXosc
\ 000071 12.... LCALL mpmTurnOffXosc & 0xFFFF
\ 000074 800C SJMP ??mpmSetTask_4
179 break;
180
181 case MPM_CC2430_XOSC_AND_VREG_OFF:
182 T2_STOP();
\ ??mpmSetTask_7:
\ 000076 53C3FE ANL 0xc3,#0xfe
183 mrxInfo.keepFifopIntOff = TRUE;
\ 000079 7401 MOV A,#0x1
\ 00007B 90.... MOV DPTR,#(mrxInfo + 15)
\ 00007E F0 MOVX @DPTR,A
184 mpmTurnOffVreg();
\ 00007F ; Setup parameters for call to function mpmTurnOffVreg
\ 00007F 12.... LCALL mpmTurnOffVreg & 0xFFFF
185 break;
186 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -