📄 usbd_udp.lst
字号:
399
400 // Reset endpoint state
401 pEndpoint->bank = 0;
\ 00000030 0020A0E3 MOV R2,#+0
\ 00000034 0120C1E5 STRB R2,[R1, #+1]
402 pEndpoint->state = UDP_ENDPOINT_DISABLED;
\ 00000038 1C20C1E4 STRB R2,[R1], #+28
403 }
\ 0000003C 010080E2 ADD R0,R0,#+1
\ 00000040 FF2000E2 AND R2,R0,#0xFF
\ 00000044 080052E3 CMP R2,#+8
\ 00000048 EEFFFF3A BCC ??UDP_ResetEndpoints_0
404 }
\ 0000004C 1EFF2FE1 BX LR ;; return
405
406 //------------------------------------------------------------------------------
407 /// Disable all endpoints (except control endpoint 0), aborting current
408 /// transfers if necessary
409 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
410 static void UDP_DisableEndpoints( void )
411
412 {
\ UDP_DisableEndpoints:
\ 00000000 31402DE9 PUSH {R0,R4,R5,LR}
413 unsigned char bEndpoint;
414
415 // Disable each endpoint, terminating any pending transfer
416 // Control endpoint 0 is not disabled
417 for (bEndpoint = 1; bEndpoint < BOARD_USB_NUMENDPOINTS; bEndpoint++) {
\ 00000004 0140A0E3 MOV R4,#+1
\ 00000008 28509FE5 LDR R5,??UDP_DisableEndpoints_0 ;; endpoints + 28
418
419 UDP_EndOfTransfer(bEndpoint, USBD_STATUS_ABORTED);
\ ??UDP_DisableEndpoints_1:
\ 0000000C 0210A0E3 MOV R1,#+2
\ 00000010 FF0004E2 AND R0,R4,#0xFF
\ 00000014 ........ BL UDP_EndOfTransfer
420 endpoints[bEndpoint].state = UDP_ENDPOINT_DISABLED;
\ 00000018 0000A0E3 MOV R0,#+0
\ 0000001C 1C00C5E4 STRB R0,[R5], #+28
421 }
\ 00000020 014084E2 ADD R4,R4,#+1
\ 00000024 FF0004E2 AND R0,R4,#0xFF
\ 00000028 080050E3 CMP R0,#+8
\ 0000002C F6FFFF3A BCC ??UDP_DisableEndpoints_1
422 }
\ 00000030 3840BDE8 POP {R3-R5,LR}
\ 00000034 1EFF2FE1 BX LR ;; return
\ ??UDP_DisableEndpoints_0:
\ 00000038 ........ DC32 endpoints + 28
423
424 //------------------------------------------------------------------------------
425 /// Checks if an ongoing transfer on an endpoint has been completed.
426 /// \param bEndpoint Endpoint number.
427 /// \return 1 if the current transfer on the given endpoint is complete;
428 /// otherwise 0.
429 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
430 static unsigned char UDP_IsTransferFinished(unsigned char bEndpoint)
431 {
432 Endpoint *pEndpoint = &(endpoints[bEndpoint]);
\ UDP_IsTransferFinished:
\ 00000000 0010A0E1 MOV R1,R0
\ 00000004 1C20A0E3 MOV R2,#+28
\ 00000008 ........ LDR R3,??DataTable60 ;; endpoints
\ 0000000C 923121E0 MLA R1,R2,R1,R3
433 Transfer *pTransfer = &(pEndpoint->transfer);
\ 00000010 042081E2 ADD R2,R1,#+4
434
435 // Check if it is a Control endpoint
436 // -> Control endpoint must always finish their transfer with a zero-length
437 // packet
438 if ((AT91C_BASE_UDP->UDP_CSR[bEndpoint] & AT91C_UDP_EPTYPE)
439 == AT91C_UDP_EPTYPE_CTRL) {
\ 00000014 ........ LDR R3,??DataTable61 ;; 0xfffb0030
\ 00000018 000193E7 LDR R0,[R3, +R0, LSL #+2]
\ 0000001C 700E10E3 TST R0,#0x700
\ 00000020 0500001A BNE ??UDP_IsTransferFinished_0
440
441 return (pTransfer->buffered < pEndpoint->size);
^
Warning[Pa082]: undefined behavior: the order of volatile accesses is
undefined in this statement
\ 00000024 040092E5 LDR R0,[R2, #+4]
\ 00000028 B210D1E1 LDRH R1,[R1, #+2]
\ 0000002C 010050E1 CMP R0,R1
\ 00000030 0A0000AA BGE ??UDP_IsTransferFinished_1
\ 00000034 0100A0E3 MOV R0,#+1
\ 00000038 1EFF2FE1 BX LR
442 }
443 // Other endpoints only need to transfer all the data
444 else {
445
446 return (pTransfer->buffered <= pEndpoint->size)
447 && (pTransfer->remaining == 0);
^
Warning[Pa082]: undefined behavior: the order of volatile accesses is
undefined in this statement
\ ??UDP_IsTransferFinished_0:
\ 0000003C B200D1E1 LDRH R0,[R1, #+2]
\ 00000040 041092E5 LDR R1,[R2, #+4]
\ 00000044 010050E1 CMP R0,R1
\ 00000048 040000BA BLT ??UDP_IsTransferFinished_1
\ 0000004C 0C0092E5 LDR R0,[R2, #+12]
\ 00000050 000050E3 CMP R0,#+0
\ 00000054 0000A013 MOVNE R0,#+0
\ 00000058 0100A003 MOVEQ R0,#+1
\ 0000005C 1EFF2FE1 BX LR
\ ??UDP_IsTransferFinished_1:
\ 00000060 0000A0E3 MOV R0,#+0
\ 00000064 1EFF2FE1 BX LR ;; return
448 }
449 }
450
451 //------------------------------------------------------------------------------
452 /// Endpoint interrupt handler.
453 /// Handle IN/OUT transfers, received SETUP packets and STALLing
454 /// \param bEndpoint Index of endpoint
455 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
456 static void UDP_EndpointHandler(unsigned char bEndpoint)
457 {
\ UDP_EndpointHandler:
\ 00000000 FF412DE9 PUSH {R0-R8,LR}
\ 00000004 0040A0E1 MOV R4,R0
458 Endpoint *pEndpoint = &(endpoints[bEndpoint]);
\ 00000008 1C10A0E3 MOV R1,#+28
\ 0000000C ........ LDR R2,??DataTable60 ;; endpoints
\ 00000010 912025E0 MLA R5,R1,R0,R2
459 Transfer *pTransfer = &(pEndpoint->transfer);
\ 00000014 046085E2 ADD R6,R5,#+4
460 unsigned int status = AT91C_BASE_UDP->UDP_CSR[bEndpoint];
\ 00000018 ........ LDR R1,??DataTable61 ;; 0xfffb0030
\ 0000001C 007191E7 LDR R7,[R1, +R0, LSL #+2]
461 unsigned short wPacketSize;
462 USBGenericRequest request;
463
464 TRACE_DEBUG_WP("E%d ", bEndpoint);
465 TRACE_DEBUG_WP("st:0x%X ", status);
466
467 // Handle interrupts
468 // IN packet sent
469 if ((status & AT91C_UDP_TXCOMP) != 0) {
\ 00000020 010017E3 TST R7,#0x1
\ 00000024 7C00000A BEQ ??UDP_EndpointHandler_0
470
471 TRACE_DEBUG_WP("Wr ");
472
473 // Check that endpoint was in Sending state
474 if (pEndpoint->state == UDP_ENDPOINT_SENDING) {
\ 00000028 0000D5E5 LDRB R0,[R5, #+0]
\ 0000002C 030050E3 CMP R0,#+3
\ 00000030 6600001A BNE ??UDP_EndpointHandler_1
475
476 // End of transfer ?
477 if (UDP_IsTransferFinished(bEndpoint)) {
\ 00000034 0400A0E1 MOV R0,R4
\ 00000038 ........ BL UDP_IsTransferFinished
\ 0000003C 000050E3 CMP R0,#+0
\ 00000040 080096E5 LDR R0,[R6, #+8]
\ 00000044 1E00000A BEQ ??UDP_EndpointHandler_2
478
479 pTransfer->transferred += pTransfer->buffered;
^
Warning[Pa082]: undefined behavior: the order of volatile accesses is
undefined in this statement
\ 00000048 041096E5 LDR R1,[R6, #+4]
\ 0000004C 000081E0 ADD R0,R1,R0
\ 00000050 080086E5 STR R0,[R6, #+8]
480 pTransfer->buffered = 0;
\ 00000054 0000A0E3 MOV R0,#+0
\ 00000058 040086E5 STR R0,[R6, #+4]
481
482 // Disable interrupt if this is not a control endpoint
483 if ((status & AT91C_UDP_EPTYPE) != AT91C_UDP_EPTYPE_CTRL) {
\ 0000005C 700E17E3 TST R7,#0x700
484
485 AT91C_BASE_UDP->UDP_IDR = 1 << bEndpoint;
\ 00000060 0100A013 MOVNE R0,#+1
\ 00000064 1004A011 LSLNE R0,R0,R4
\ 00000068 ........ LDRNE R1,??DataTable22 ;; 0xfffb0014
\ 0000006C 00008115 STRNE R0,[R1, #+0]
486 }
487
488 UDP_EndOfTransfer(bEndpoint, USBD_STATUS_SUCCESS);
\ 00000070 0010A0E3 MOV R1,#+0
\ 00000074 0400A0E1 MOV R0,R4
\ 00000078 ........ BL UDP_EndOfTransfer
489 CLEAR_CSR(bEndpoint, AT91C_UDP_TXCOMP);
\ 0000007C 0400A0E1 MOV R0,R4
\ 00000080 ........ LDR R1,??DataTable61 ;; 0xfffb0030
\ ??UDP_EndpointHandler_3:
\ 00000084 000191E7 LDR R0,[R1, +R0, LSL #+2]
\ 00000088 00008DE5 STR R0,[SP, #+0]
\ 0000008C 00009DE5 LDR R0,[SP, #+0]
\ 00000090 4F0080E3 ORR R0,R0,#0x4F
\ 00000094 00008DE5 STR R0,[SP, #+0]
\ 00000098 00009DE5 LDR R0,[SP, #+0]
\ 0000009C 0100C0E3 BIC R0,R0,#0x1
\ 000000A0 00008DE5 STR R0,[SP, #+0]
\ 000000A4 0400A0E1 MOV R0,R4
\ 000000A8 00209DE5 LDR R2,[SP, #+0]
\ 000000AC 002181E7 STR R2,[R1, +R0, LSL #+2]
\ ??UDP_EndpointHandler_4:
\ 000000B0 0400A0E1 MOV R0,R4
\ 000000B4 000191E7 LDR R0,[R1, +R0, LSL #+2]
\ 000000B8 010010E3 TST R0,#0x1
\ 000000BC FBFFFF1A BNE ??UDP_EndpointHandler_4
\ 000000C0 550000EA B ??UDP_EndpointHandler_0
490 }
491 else {
492
493 // Transfer remaining data
494 TRACE_DEBUG_WP(" %d ", pEndpoint->size);
495
496 pTransfer->transferred += pEndpoint->size;
^
Warning[Pa082]: undefined behavior: the order of volatile accesses is
undefined in this statement
\ ??UDP_EndpointHandler_2:
\ 000000C4 B210D5E1 LDRH R1,[R5, #+2]
\ 000000C8 000081E0 ADD R0,R1,R0
\ 000000CC 080086E5 STR R0,[R6, #+8]
497 pTransfer->buffered -= pEndpoint->size;
^
Warning[Pa082]: undefined behavior: the order of volatile accesses is
undefined in this statement
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -