⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbd_udp.lst

📁 ATmel的AT91sam7SE芯片 USB固件开发源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   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 + -