📄 fw_epmg.lst
字号:
\ 00000038 ........ _BLF fw_writeEndpoint,??fw_writeEndpoint??rT
237 fw_controlData.wCount += _i;
\ 0000003C 6089 LDRH R0,[R4, #+10]
\ 0000003E 4019 ADD R0,R0,R5
\ 00000040 6081 STRH R0,[R4, #+10]
238 fw_controlData.state = FW_STATE_END;
\ 00000042 04E0 B ??fw_ep0TxDone_3
239 fw_controlData.pData = NULL;
240 }
241 else
242 {
243 fw_writeEndpoint(FW_EP_CTRL, 0, 0); /* Send zero packet at the end */
\ ??fw_ep0TxDone_2:
\ 00000044 0022 MOV R2,#+0
\ 00000046 311C MOV R1,R6
\ 00000048 301C MOV R0,R6
\ 0000004A ........ _BLF fw_writeEndpoint,??fw_writeEndpoint??rT
244 fw_controlData.state = FW_STATE_END;
\ ??fw_ep0TxDone_3:
\ 0000004E 2673 STRB R6,[R4, #+12]
245 fw_controlData.pData = NULL;
\ 00000050 2661 STR R6,[R4, #+16]
246 }
247 }
248 }
249 }
\ ??fw_ep0TxDone_0:
\ 00000052 70BC POP {R4-R6}
\ 00000054 01BC POP {R0}
\ 00000056 0047 BX R0 ;; return
250
251
252 /*****************************************************************
253 *
254 * ROUTINE fw_ep0RxTxDone
255 *
256 *-----------------------------------------------------------------
257 *
258 * Purpose :
259 * called when something must be handled on EP0
260 *
261 * Input parameters : NONE
262 *
263 * Output parameters : NONE
264 *
265 * Global data : fw_controlData : request to be processed
266 *
267 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
268 void fw_ep0RxTxDone(void)
269 {
\ fw_ep0RxTxDone:
\ 00000000 F3B5 PUSH {R0,R1,R4-R7,LR}
270 USHORT _i = fw_controlData.wLength - fw_controlData.wCount;
\ 00000002 .... LDR R4,??DataTable4 ;; fw_controlData
\ 00000004 2089 LDRH R0,[R4, #+8]
\ 00000006 6189 LDRH R1,[R4, #+10]
\ 00000008 471A SUB R7,R0,R1
\ 0000000A 3F04 LSL R7,R7,#+16
\ 0000000C 3F0C LSR R7,R7,#+16
271
272 UCHAR _buff[8];
273
274 if(fw_IsSetupPacket(FW_EP_CTRL) != 0)
\ 0000000E 0020 MOV R0,#+0
\ 00000010 ........ _BLF fw_IsSetupPacket,??fw_IsSetupPacket??rT
\ 00000014 0028 CMP R0,#+0
\ 00000016 2AD0 BEQ ??fw_ep0RxTxDone_0
275 {
276 fw_controlData.wLength = 0;
\ 00000018 0020 MOV R0,#+0
\ 0000001A A060 STR R0,[R4, #+8]
277 fw_controlData.wCount = 0;
278
279 _i = fw_readEndpoint(FW_EP_CTRL,(UCHAR *)(&(fw_controlData.DeviceRequest)));
\ 0000001C 211C MOV R1,R4
\ 0000001E ........ _BLF fw_readEndpoint,??fw_readEndpoint??rT
\ 00000022 0704 LSL R7,R0,#+16
\ 00000024 3F0C LSR R7,R7,#+16
280 // if the data are not valid
281 if(_i == 0)
\ 00000026 05D1 BNE ??fw_ep0RxTxDone_1
282 {
283 _i = fw_readEndpoint(FW_EP_CTRL,(UCHAR *)(&(fw_controlData.DeviceRequest)));
\ 00000028 211C MOV R1,R4
\ 0000002A 0020 MOV R0,#+0
\ 0000002C ........ _BLF fw_readEndpoint,??fw_readEndpoint??rT
\ 00000030 0704 LSL R7,R0,#+16
\ 00000032 3F0C LSR R7,R7,#+16
284 }
285
286 if(_i != sizeof(FW_DEVICE_REQUEST))
\ ??fw_ep0RxTxDone_1:
\ 00000034 082F CMP R7,#+8
\ 00000036 03D0 BEQ ??fw_ep0RxTxDone_2
287 {
288 fw_acknowledgeSetup(FW_EP_CTRL);
\ 00000038 0020 MOV R0,#+0
\ 0000003A ........ _BLF fw_acknowledgeSetup,??fw_acknowledgeSetup??rT
289 return;
\ 0000003E 60E0 B ??fw_ep0RxTxDone_3
290 }
291
292 /* Acknowledge setup here to unlock in/out endp */
293 if(fw_controlData.DeviceRequest.bmRequestType & 0x80)
\ ??fw_ep0RxTxDone_2:
\ 00000040 2078 LDRB R0,[R4, #+0]
\ 00000042 0006 LSL R0,R0,#+24
\ 00000044 01D5 BPL ??fw_ep0RxTxDone_4
294 {
295 fw_changedir(FW_DEVICE_TO_HOST);
\ 00000046 0120 MOV R0,#+1
\ 00000048 00E0 B ??fw_ep0RxTxDone_5
296 }
297 else
298 {
299 fw_changedir(FW_HOST_TO_DEVICE);
\ ??fw_ep0RxTxDone_4:
\ 0000004A 0020 MOV R0,#+0
\ ??fw_ep0RxTxDone_5:
\ 0000004C ........ _BLF fw_changedir,??fw_changedir??rT
300 }
301 fw_acknowledgeSetup(FW_EP_CTRL);
\ 00000050 0020 MOV R0,#+0
\ 00000052 ........ _BLF fw_acknowledgeSetup,??fw_acknowledgeSetup??rT
302
303 fw_controlData.wLength = fw_controlData.DeviceRequest.wLength;
\ 00000056 E088 LDRH R0,[R4, #+6]
\ 00000058 2081 STRH R0,[R4, #+8]
304 fw_controlData.wCount = 0;
\ 0000005A 0020 MOV R0,#+0
\ 0000005C 6081 STRH R0,[R4, #+10]
305 fw_controlData.state = FW_STATE_START;
\ 0000005E 0120 MOV R0,#+1
\ 00000060 2073 STRB R0,[R4, #+12]
306 fw_deviceState |= FW_DS_SETUP;
\ 00000062 .... LDR R0,??DataTable8 ;; fw_deviceState
\ 00000064 0178 LDRB R1,[R0, #+0]
\ 00000066 0422 MOV R2,#+4
\ 00000068 0A43 ORR R2,R1
\ 0000006A 0270 STRB R2,[R0, #+0]
\ 0000006C 49E0 B ??fw_ep0RxTxDone_3
307
308 }
309 else
310 {
311 // Data or Status phase
312 if(fw_controlData.state == FW_STATE_START)
\ ??fw_ep0RxTxDone_0:
\ 0000006E 0225 MOV R5,#+2
\ 00000070 254E LDR R6,??fw_ep0RxTxDone_6 ;; 0xfffb0030
\ 00000072 207B LDRB R0,[R4, #+12]
\ 00000074 0128 CMP R0,#+1
\ 00000076 3068 LDR R0,[R6, #+0]
\ 00000078 3DD1 BNE ??fw_ep0RxTxDone_7
313 {
314 if( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, FW_EP_CTRL ) & USBDEV_UDP_TXCOMP ) // Data sent to host
\ 0000007A C007 LSL R0,R0,#+31
\ 0000007C 20D5 BPL ??fw_ep0RxTxDone_8
315 {
316 // Send the next packet
317 _i = fw_writeEndpoint(FW_EP_CTRL, fw_controlData.pData + fw_controlData.wCount,
318 min(FW_EP0_MAXPACKET_SIZE,(fw_controlData.wLength - fw_controlData.wCount)));
\ 0000007E 6189 LDRH R1,[R4, #+10]
\ 00000080 081C MOV R0,R1
\ 00000082 2289 LDRH R2,[R4, #+8]
\ 00000084 531A SUB R3,R2,R1
\ 00000086 092B CMP R3,#+9
\ 00000088 01DB BLT ??fw_ep0RxTxDone_9
\ 0000008A 0822 MOV R2,#+8
\ 0000008C 00E0 B ??fw_ep0RxTxDone_10
\ ??fw_ep0RxTxDone_9:
\ 0000008E 521A SUB R2,R2,R1
\ ??fw_ep0RxTxDone_10:
\ 00000090 1206 LSL R2,R2,#+24
\ 00000092 120E LSR R2,R2,#+24
\ 00000094 2169 LDR R1,[R4, #+16]
\ 00000096 0918 ADD R1,R1,R0
\ 00000098 0020 MOV R0,#+0
\ 0000009A ........ _BLF fw_writeEndpoint,??fw_writeEndpoint??rT
\ 0000009E 0704 LSL R7,R0,#+16
\ 000000A0 3F0C LSR R7,R7,#+16
319 if((_i == 0) && (fw_controlData.wLength - fw_controlData.wCount != 0))
\ 000000A2 03D1 BNE ??fw_ep0RxTxDone_11
\ 000000A4 2089 LDRH R0,[R4, #+8]
\ 000000A6 6189 LDRH R1,[R4, #+10]
\ 000000A8 401A SUB R0,R0,R1
\ 000000AA 09D1 BNE ??fw_ep0RxTxDone_8
320 {
321 }
322 else
323 {
324 if((fw_controlData.wLength - fw_controlData.wCount) < FW_EP0_MAXPACKET_SIZE) /* No more Data to transmit */
\ ??fw_ep0RxTxDone_11:
\ 000000AC 6089 LDRH R0,[R4, #+10]
\ 000000AE 2189 LDRH R1,[R4, #+8]
\ 000000B0 091A SUB R1,R1,R0
\ 000000B2 0829 CMP R1,#+8
\ 000000B4 02DA BGE ??fw_ep0RxTxDone_12
325 {
326 fw_controlData.state = FW_STATE_END;
\ 000000B6 0021 MOV R1,#+0
\ 000000B8 2173 STRB R1,[R4, #+12]
327 fw_controlData.pData = NULL;
\ 000000BA 2161 STR R1,[R4, #+16]
328 }
329 fw_controlData.wCount += _i;
\ ??fw_ep0RxTxDone_12:
\ 000000BC C019 ADD R0,R0,R7
\ 000000BE 6081 STRH R0,[R4, #+10]
330 }
331 }
332
333 if( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, FW_EP_CTRL ) & USBDEV_UDP_RX_DATA_BK0 ) // Data received
\ ??fw_ep0RxTxDone_8:
\ 000000C0 3068 LDR R0,[R6, #+0]
\ 000000C2 2842 TST R0,R5
\ 000000C4 1DD0 BEQ ??fw_ep0RxTxDone_3
334 {
335 USHORT _Read = 0;
336
337 /* if the size of the transfer is longer than the max packet */
338 if( _i >= FW_EP0_MAXPACKET_SIZE)
\ 000000C6 6089 LDRH R0,[R4, #+10]
\ 000000C8 2169 LDR R1,[R4, #+16]
\ 000000CA 0918 ADD R1,R1,R0
\ 000000CC 082F CMP R7,#+8
\ 000000CE 08D3 BCC ??fw_ep0RxTxDone_13
339 {
340 _Read = fw_readEndpoint(FW_EP_CTRL, fw_controlData.pData + fw_controlData.wCount);
\ 000000D0 0020 MOV R0,#+0
\ 000000D2 ........ _BLF fw_readEndpoint,??fw_readEndpoint??rT
341
342 if (_Read == 0)
\ 000000D6 0004 LSL R0,R0,#+16
\ 000000D8 08D0 BEQ ??fw_ep0RxTxDone_14
343 {
344 // End of SetupPhase
345 goto EOSP;
346 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -