📄 usbd_udp.lst
字号:
\ 00000020 1CC0A0E3 MOV R12,#+28
\ 00000024 ........ LDR LR,??DataTable68 ;; endpoints
\ 00000028 9CE323E0 MLA R3,R12,R3,LR
\ 0000002C 0300B0E1 MOVS R0,R3
368 transfer = &(endpoint->transfer);
\ 00000030 043090E2 ADDS R3,R0,#+4
\ 00000034 0310B0E1 MOVS R1,R3
369
370 // Reset endpoint transfer descriptor
371 transfer->data = 0;
\ 00000038 0030A0E3 MOV R3,#+0
\ 0000003C 003081E5 STR R3,[R1, #+0]
372 transfer->transferred = -1;
\ 00000040 0030E0E3 MVN R3,#+0
\ 00000044 083081E5 STR R3,[R1, #+8]
373 transfer->buffered = -1;
\ 00000048 0030E0E3 MVN R3,#+0
\ 0000004C 043081E5 STR R3,[R1, #+4]
374 transfer->remaining = -1;
\ 00000050 0030E0E3 MVN R3,#+0
\ 00000054 0C3081E5 STR R3,[R1, #+12]
375 transfer->callback = 0;
\ 00000058 0030A0E3 MOV R3,#+0
\ 0000005C 103081E5 STR R3,[R1, #+16]
376 transfer->argument = 0;
\ 00000060 0030A0E3 MOV R3,#+0
\ 00000064 143081E5 STR R3,[R1, #+20]
377
378 // Reset endpoint state
379 endpoint->bank = 0;
\ 00000068 0030A0E3 MOV R3,#+0
\ 0000006C 0130C0E5 STRB R3,[R0, #+1]
380 endpoint->state = UDP_ENDPOINT_DISABLED;
\ 00000070 0030A0E3 MOV R3,#+0
\ 00000074 0030C0E5 STRB R3,[R0, #+0]
381 }
\ 00000078 012092E2 ADDS R2,R2,#+1
\ 0000007C E2FFFFEA B ??UDP_ResetEndpoints_0
382 }
\ ??UDP_ResetEndpoints_1:
\ 00000080 0050BDE8 POP {R12,LR}
\ 00000084 1EFF2FE1 BX LR ;; return
383
384 /*
385 Function: UDP_DisableEndpoints
386 Disables all endpoints of the UDP peripheral except Control endpoint 0.
387 */
\ In section .text, align 4, keep-with-next
388 static void UDP_DisableEndpoints()
389 {
\ UDP_DisableEndpoints:
\ 00000000 10402DE9 PUSH {R4,LR}
390 unsigned char eptnum;
391
392 // Disable each endpoint, terminating any pending transfer
393 for (eptnum = 1; eptnum < BOARD_USB_NUMENDPOINTS; eptnum++) {
\ 00000004 0100A0E3 MOV R0,#+1
\ 00000008 0040B0E1 MOVS R4,R0
\ ??UDP_DisableEndpoints_0:
\ 0000000C FF4014E2 ANDS R4,R4,#0xFF ;; Zero extend
\ 00000010 080054E3 CMP R4,#+8
\ 00000014 0C00002A BCS ??UDP_DisableEndpoints_1
394
395 UDP_EndOfTransfer(eptnum, USBD_STATUS_ABORTED);
\ 00000018 0210A0E3 MOV R1,#+2
\ 0000001C 0400B0E1 MOVS R0,R4
\ 00000020 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 00000024 ........ BL UDP_EndOfTransfer
396 endpoints[eptnum].state = UDP_ENDPOINT_DISABLED;
\ 00000028 0400B0E1 MOVS R0,R4
\ 0000002C FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 00000030 1C10A0E3 MOV R1,#+28
\ 00000034 ........ LDR R2,??DataTable68 ;; endpoints
\ 00000038 912020E0 MLA R0,R1,R0,R2
\ 0000003C 0010A0E3 MOV R1,#+0
\ 00000040 0010C0E5 STRB R1,[R0, #+0]
397 }
\ 00000044 014094E2 ADDS R4,R4,#+1
\ 00000048 EFFFFFEA B ??UDP_DisableEndpoints_0
398 }
\ ??UDP_DisableEndpoints_1:
\ 0000004C 1040BDE8 POP {R4,LR}
\ 00000050 1EFF2FE1 BX LR ;; return
399
400 /*
401 Function: UDP_IsTransferFinished
402 Checks if an ongoing transfer on an endpoint has been completed.
403
404 Parameters:
405 eptnum - Endpoint number.
406
407 Returns:
408 1 if the current transfer on the given endpoint is complete; otherwise
409 0.
410 */
\ In section .text, align 4, keep-with-next
411 static unsigned char UDP_IsTransferFinished(unsigned char eptnum)
412 {
\ UDP_IsTransferFinished:
\ 00000000 01402DE9 PUSH {R0,LR}
413 Endpoint *endpoint = &(endpoints[eptnum]);
\ 00000004 0030B0E1 MOVS R3,R0
\ 00000008 FF3013E2 ANDS R3,R3,#0xFF ;; Zero extend
\ 0000000C 1CC0A0E3 MOV R12,#+28
\ 00000010 ........ LDR LR,??DataTable68 ;; endpoints
\ 00000014 9CE323E0 MLA R3,R12,R3,LR
\ 00000018 0320B0E1 MOVS R2,R3
414 Transfer *transfer = &(endpoint->transfer);
\ 0000001C 043092E2 ADDS R3,R2,#+4
\ 00000020 0310B0E1 MOVS R1,R3
415
416 // Check if it is a Control endpoint
417 // -> Control endpoint must always finish their transfer with a zero-length
418 // packet
419 if ((AT91C_BASE_UDP->UDP_CSR[eptnum] & AT91C_UDP_EPTYPE)
420 == AT91C_UDP_EPTYPE_CTRL) {
\ 00000024 0030B0E1 MOVS R3,R0
\ 00000028 FF3013E2 ANDS R3,R3,#0xFF ;; Zero extend
\ 0000002C 04C0A0E3 MOV R12,#+4
\ 00000030 ........ LDR LR,??DataTable70 ;; 0xfffb0030
\ 00000034 9CE323E0 MLA R3,R12,R3,LR
\ 00000038 003093E5 LDR R3,[R3, #+0]
\ 0000003C 700E13E3 TST R3,#0x700
\ 00000040 0800001A BNE ??UDP_IsTransferFinished_0
421
422 return (transfer->buffered < endpoint->size);
\ 00000044 041091E5 LDR R1,[R1, #+4]
\ 00000048 B220D2E1 LDRH R2,[R2, #+2]
\ 0000004C 020051E1 CMP R1,R2
\ 00000050 010000AA BGE ??UDP_IsTransferFinished_1
\ 00000054 0100A0E3 MOV R0,#+1
\ 00000058 000000EA B ??UDP_IsTransferFinished_2
\ ??UDP_IsTransferFinished_1:
\ 0000005C 0000A0E3 MOV R0,#+0
\ ??UDP_IsTransferFinished_2:
\ 00000060 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 00000064 0A0000EA B ??UDP_IsTransferFinished_3
423 }
424 // Other endpoints only need to transfer all the data
425 else {
426
427 return (transfer->buffered <= endpoint->size)
428 && (transfer->remaining == 0);
\ ??UDP_IsTransferFinished_0:
\ 00000068 B220D2E1 LDRH R2,[R2, #+2]
\ 0000006C 043091E5 LDR R3,[R1, #+4]
\ 00000070 030052E1 CMP R2,R3
\ 00000074 040000BA BLT ??UDP_IsTransferFinished_4
\ 00000078 0C0091E5 LDR R0,[R1, #+12]
\ 0000007C 000050E3 CMP R0,#+0
\ 00000080 0100001A BNE ??UDP_IsTransferFinished_4
\ 00000084 0100A0E3 MOV R0,#+1
\ 00000088 000000EA B ??UDP_IsTransferFinished_5
\ ??UDP_IsTransferFinished_4:
\ 0000008C 0000A0E3 MOV R0,#+0
\ ??UDP_IsTransferFinished_5:
\ 00000090 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ ??UDP_IsTransferFinished_3:
\ 00000094 0050BDE8 POP {R12,LR}
\ 00000098 1EFF2FE1 BX LR ;; return
429 }
430 }
431
432 /*
433 Function: UDP_EndpointHandler
434 Endpoint interrupt handler. Manages IN, OUT & SETUP transaction, as well
435 as the STALL condition.
436
437 Parameters:
438 eptnum - Number of the endpoint to handle interrupt for.
439 */
\ In section .text, align 4, keep-with-next
440 static void UDP_EndpointHandler(unsigned char eptnum)
441 {
\ UDP_EndpointHandler:
\ 00000000 F3412DE9 PUSH {R0,R1,R4-R8,LR}
\ 00000004 0040B0E1 MOVS R4,R0
442 Endpoint *endpoint = &(endpoints[eptnum]);
\ 00000008 0400B0E1 MOVS R0,R4
\ 0000000C FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 00000010 1C10A0E3 MOV R1,#+28
\ 00000014 ........ LDR R2,??DataTable68 ;; endpoints
\ 00000018 912020E0 MLA R0,R1,R0,R2
\ 0000001C 0050B0E1 MOVS R5,R0
443 Transfer *transfer = &(endpoint->transfer);
\ 00000020 040095E2 ADDS R0,R5,#+4
\ 00000024 0060B0E1 MOVS R6,R0
444 unsigned int status = AT91C_BASE_UDP->UDP_CSR[eptnum];
\ 00000028 0400B0E1 MOVS R0,R4
\ 0000002C FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 00000030 0410A0E3 MOV R1,#+4
\ 00000034 ........ LDR R2,??DataTable70 ;; 0xfffb0030
\ 00000038 912020E0 MLA R0,R1,R0,R2
\ 0000003C 000090E5 LDR R0,[R0, #+0]
\ 00000040 0070B0E1 MOVS R7,R0
445
446 trace_LOG(trace_INFO, "Ept%d ", eptnum);
\ 00000044 0410B0E1 MOVS R1,R4
\ 00000048 FF1011E2 ANDS R1,R1,#0xFF ;; Zero extend
\ 0000004C 14049FE5 LDR R0,??UDP_EndpointHandler_0+0x8 ;; `?<Constant "Ept%d ">`
\ 00000050 ........ BL printf
447
448 // Handle interrupts
449 // IN packet sent
450 if ((status & AT91C_UDP_TXCOMP) != 0) {
\ 00000054 010017E3 TST R7,#0x1
\ 00000058 6300000A BEQ ??UDP_EndpointHandler_1
451
452 trace_LOG(trace_INFO, "Wr ");
\ 0000005C 870F8FE2 ADR R0,??UDP_EndpointHandler_2 ;; "Wr "
\ 00000060 ........ BL printf
453
454 // Check that endpoint was in Sending state
455 if (endpoint->state == UDP_ENDPOINT_SENDING) {
\ 00000064 0000D5E5 LDRB R0,[R5, #+0]
\ 00000068 030050E3 CMP R0,#+3
\ 0000006C 5100001A BNE ??UDP_EndpointHandler_3
456
457 // End of transfer ?
458 if (UDP_IsTransferFinished(eptnum)) {
\ 00000070 0400B0E1 MOVS R0,R4
\ 00000074 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 00000078 ........ BL UDP_IsTransferFinished
\ 0000007C 000050E3 CMP R0,#+0
\ 00000080 1500000A BEQ ??UDP_EndpointHandler_4
459
460 trace_LOG(trace_INFO, "%d ", transfer->buffered);
\ 00000084 041096E5 LDR R1,[R6, #+4]
\ 00000088 F40F8FE2 ADR R0,??UDP_EndpointHandler_0 ;; "%d "
\ 0000008C ........ BL printf
461
462 transfer->transferred += transfer->buffered;
\ 00000090 080096E5 LDR R0,[R6, #+8]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -