📄 mac_rx_engine.lst
字号:
\ 00000B 4025 JC ??mrxForceRxOff_0
202 mschAddTask(mschReserveTask(), MAC_TASK_PRI_HIGHEST, mrxForceRxOffTask, MRX_RESET_ON_COUNTER);
\ 00000D ; Setup parameters for call to function mschAddTask
\ 00000D 75.... MOV ?V0 + 0,#(mrxForceRxOffTask & 0xff)
\ 000010 75.... MOV ?V0 + 1,#((mrxForceRxOffTask >> 8) & 0xff)
\ 000013 75.... MOV ?V0 + 2,#((mrxForceRxOffTask >> 16) & 0xff)
\ 000016 78.. MOV R0,#?V0 + 0
\ 000018 12.... LCALL ?PUSH_XSTACK_I_THREE
\ 00001B 7A03 MOV R2,#0x3
\ 00001D EA MOV A,R2
\ 00001E C0E0 PUSH A
\ 000020 ; Setup parameters for call to function mschReserveTask
\ 000020 12.... LCALL mschReserveTask & 0xFFFF
\ 000023 7C01 MOV R4,#0x1
\ 000025 E4 CLR A
\ 000026 FD MOV R5,A
\ 000027 D0E0 POP A
\ 000029 FA MOV R2,A
\ 00002A 12.... LCALL mschAddTask & 0xFFFF
\ 00002D 7403 MOV A,#0x3
\ 00002F 12.... LCALL ?DEALLOC_XSTACK8
203 } // mrxForceRxOff
\ ??mrxForceRxOff_0:
\ 000032 7F03 MOV R7,#0x3
\ 000034 02.... LJMP ?BANKED_LEAVE_XDATA
204
205
206
207
208 //-------------------------------------------------------------------------------------------------------
209 // void mrxForceRxOffTask(MAC_TASK_INFO *pTask)
210 //
211 // DESCRIPTION:
212 // This task forces RX off by issuing a SRFOFF command strobe, regardless of whether the SFD pin
213 // state. If SFD was high before the command was issued, an RX engine cleanup is performed.
214 //
215 // TASK DATA:
216 // Flags (MRX_RESET_ON_COUNTER)
217 //-------------------------------------------------------------------------------------------------------
\ In segment NEAR_CODE, align 1, keep-with-next
218 void mrxForceRxOffTask(MAC_TASK_INFO *pTask) NEAR {
\ mrxForceRxOffTask:
\ 000000 74F7 MOV A,#-0x9
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 9
\ 000005 ; Auto size: 0
\ 000005 EA MOV A,R2
\ 000006 FE MOV R6,A
\ 000007 EB MOV A,R3
\ 000008 FF MOV R7,A
219 DISABLE_GLOBAL_INT();
\ 000009 C2AF CLR 0xa8.7
220 if (pTask->taskData & MRX_RESET_ON_COUNTER) mrxInfo.onCounter = 0;
\ 00000B 8E82 MOV DPL,R6
\ 00000D 8F83 MOV DPH,R7
\ 00000F A3 INC DPTR
\ 000010 A3 INC DPTR
\ 000011 A3 INC DPTR
\ 000012 E0 MOVX A,@DPTR
\ 000013 A2E0 MOV C,0xE0 /* A */.0
\ 000015 5005 JNC ??mrxForceRxOffTask_0
\ 000017 E4 CLR A
\ 000018 90.... MOV DPTR,#(mrxInfo + 13)
\ 00001B F0 MOVX @DPTR,A
221 ISRFOFF;
\ ??mrxForceRxOffTask_0:
\ 00001C 75E1E5 MOV 0xe1,#-0x1b
222 mrxResetRxEngine();
\ 00001F ; Setup parameters for call to function mrxResetRxEngine
\ 00001F 12.... LCALL mrxResetRxEngine & 0xFFFF
223 ENABLE_GLOBAL_INT();
\ 000022 D2AF SETB 0xa8.7
224 mschRemoveTask(pTask->priority, MSCH_KEEP_TASK_IN_PROGRESS_BM);
\ 000024 ; Setup parameters for call to function mschRemoveTask
\ 000024 7A02 MOV R2,#0x2
\ 000026 8E82 MOV DPL,R6
\ 000028 8F83 MOV DPH,R7
\ 00002A A3 INC DPTR
\ 00002B A3 INC DPTR
\ 00002C A3 INC DPTR
\ 00002D A3 INC DPTR
\ 00002E A3 INC DPTR
\ 00002F A3 INC DPTR
\ 000030 A3 INC DPTR
\ 000031 A3 INC DPTR
\ 000032 E0 MOVX A,@DPTR
\ 000033 F9 MOV R1,A
\ 000034 12.... LCALL mschRemoveTask & 0xFFFF
225 } // mrxForceRxOffTask
\ 000037 REQUIRE ?Subroutine2
\ 000037 ; // Fall through to label ?Subroutine2
\ In segment NEAR_CODE, align 1, keep-with-next
\ ?Subroutine2:
\ 000000 7F01 MOV R7,#0x1
\ 000002 02.... LJMP ?BANKED_LEAVE_XDATA
226
227
228
229
230 static ROOT void mrxStartPayloadDmaTransfer(void) {
231 pDma1234Configs[DMA_RFRX_CHANNEL - 1].destMsb = HIBYTE(mrxInfo.pPacket->mdi.pMsdu);
232 pDma1234Configs[DMA_RFRX_CHANNEL - 1].destLsb = LOBYTE(mrxInfo.pPacket->mdi.pMsdu);
233 pDma1234Configs[DMA_RFRX_CHANNEL - 1].lenLsb = mrxInfo.length;
234
235 while (RXFIFOCNT < 2);
236
237 DMA_ARM_CHANNEL(DMA_RFRX_CHANNEL);
238 DMA_START_CHANNEL(DMA_RFRX_CHANNEL);
239
240 DISABLE_FIFOP_INT_BIT();
241 }
242
243
244
245
246 //-------------------------------------------------------------------------------------------------------
247 // void mrxResetRxEngine(void)
248 //
249 // DESCRIPTION:
250 // Resets the RX engine by clearing the RX FIFO, freeing any recently acquired resources, and
251 // resetting the RX engine state.
252 //-------------------------------------------------------------------------------------------------------
\ In segment NEAR_CODE, align 1, keep-with-next
253 ROOT void mrxResetRxEngine(void) {
\ mrxResetRxEngine:
\ 000000 C082 PUSH DPL
\ 000002 C083 PUSH DPH
\ 000004 ; Saved register size: 2
\ 000004 ; Auto size: 0
254 DISABLE_GLOBAL_INT();
\ 000004 C2AF CLR 0xa8.7
255
256 // Free resources
257 switch (mrxInfo.state) {
\ 000006 90.... MOV DPTR,#(mrxInfo + 12)
\ 000009 E0 MOVX A,@DPTR
\ 00000A 12.... LCALL ?UC_SWITCH_DENSE
\ `?<Jumptable for mrxResetRxEngine>_0`:
\ 00000D 01 DB 1
\ 00000E 02 DB 2
\ 00000F .... DW ??mrxResetRxEngine_0
\ 000011 .... DW ??mrxResetRxEngine_1
\ 000013 .... DW ??mrxResetRxEngine_2
\ 000015 .... DW ??mrxResetRxEngine_3
258 case MRX_STATE_LEN_FCF_SEQ:
259 // Nothing happened yet, so just flush the FIFO
260 break;
261 case MRX_STATE_FCS:
262 DMA_ABORT_CHANNEL(DMA_RFRX_CHANNEL);
\ ??mrxResetRxEngine_2:
\ 000017 75D690 MOV 0xd6,#-0x70
263 // No break here!
264
265 case MRX_STATE_ADDR:
266 mschReleaseTask(mrxInfo.taskNumber);
\ ??mrxResetRxEngine_1:
\ 00001A ; Setup parameters for call to function mschReleaseTask
\ 00001A 90.... MOV DPTR,#(mrxInfo + 10)
\ 00001D E0 MOVX A,@DPTR
\ 00001E F9 MOV R1,A
\ 00001F 12.... LCALL mschReleaseTask
267 mrxInfo.taskNumber = NO_TASK;
\ 000022 74FF MOV A,#-0x1
\ 000024 F0 MOVX @DPTR,A
268 mrxpReleasePacket(mrxInfo.pPacket);
\ 000025 ; Setup parameters for call to function mrxpReleasePacket
\ 000025 90.... MOV DPTR,#(mrxInfo + 8)
\ 000028 E0 MOVX A,@DPTR
\ 000029 FA MOV R2,A
\ 00002A A3 INC DPTR
\ 00002B E0 MOVX A,@DPTR
\ 00002C FB MOV R3,A
\ 00002D 12.... LCALL mrxpReleasePacket
269 mrxInfo.pPacket = NULL;
\ 000030 90.... MOV DPTR,#(mrxInfo + 8)
\ 000033 E4 CLR A
\ 000034 F0 MOVX @DPTR,A
\ 000035 A3 INC DPTR
\ 000036 F0 MOVX @DPTR,A
270 // No break here!
271
272 case MRX_STATE_DISCARD:
273 mrxDecrOnCounter();
\ ??mrxResetRxEngine_3:
\ 000037 ; Setup parameters for call to function mrxDecrOnCounter
\ 000037 90.... MOV DPTR,#(mrxDecrOnCounter & 0xffff)
\ 00003A 74.. MOV A,#((mrxDecrOnCounter >> 16) & 0xff)
\ 00003C 12.... LCALL ?BCALL ; Banked call to: DPTR()
274 break;
275 }
276
277 // Flush the RX FIFO twice (chip bug)
278 ISFLUSHRX;
\ ??mrxResetRxEngine_0:
\ 00003F 75E1E6 MOV 0xe1,#-0x1a
279 ISFLUSHRX;
\ 000042 75E1E6 MOV 0xe1,#-0x1a
280
281 // Clear the FIFOP interrupt flag
282 CLEAR_FIFOP_INT_BIT();
\ 000045 ; Setup parameters for call to function SET_RFIF
\ 000045 79DF MOV R1,#-0x21
\ 000047 12.... LCALL SET_RFIF
283 CLEAR_RFIF_INT();
\ 00004A 759B00 MOV 0x9b,#0x0
\ 00004D ; Setup parameters for call to function SET_RFIM
\ 00004D A991 MOV R1,0x91
\ 00004F 12.... LCALL SET_RFIM
284 if (mrxInfo.state == MRX_STATE_FCS) ENABLE_FIFOP_INT_BIT();
\ 000052 90.... MOV DPTR,#(mrxInfo + 12)
\ 000055 E0 MOVX A,@DPTR
\ 000056 6402 XRL A,#0x2
\ 000058 7008 JNZ ??mrxResetRxEngine_4
\ 00005A ; Setup parameters for call to function SET_RFIM
\ 00005A 7420 MOV A,#0x20
\ 00005C 4591 ORL A,0x91
\ 00005E F9 MOV R1,A
\ 00005F 12.... LCALL SET_RFIM
285
286 // Reset the RX engine state
287 mrxInfo.state = MRX_STATE_LEN_FCF_SEQ;
\ ??mrxResetRxEngine_4:
\ 000062 E4 CLR A
\ 000063 F0 MOVX @DPTR,A
288
289 ENABLE_GLOBAL_INT();
\ 000064 D2AF SETB 0xa8.7
290
291 } // mrxResetRxEngine
\ 000066 D083 POP DPH
\ 000068 D082 POP DPL
\ 00006A 22 RET
292
293
294
295
296 /*******************************************************************************************************
297 *******************************************************************************************************
298 ************************** PACKET RECEPTION AND PROCESSING **************************
299 *******************************************************************************************************
300 *******************************************************************************************************/
301
302
303
304
305 //-------------------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -