usbd_udp.lst

来自「ATmel的AT91sam7SE芯片 USB固件开发源代码」· LST 代码 · 共 1,176 行 · 第 1/5 页

LST
1,176
字号
   \   000000AC   4020D2E3           BICS     R2,R2,#0x40
   \   000000B0   0030B0E1           MOVS     R3,R0
   \   000000B4   FF3013E2           ANDS     R3,R3,#0xFF      ;; Zero extend
   \   000000B8   04C0A0E3           MOV      R12,#+4
   \   000000BC   ........           LDR      LR,??DataTable70  ;; 0xfffb0030
   \   000000C0   9CE323E0           MLA      R3,R12,R3,LR
   \   000000C4   002083E5           STR      R2,[R3, #+0]
    266                  endpoint->bank = 0;
   \   000000C8   0020A0E3           MOV      R2,#+0
   \   000000CC   0120C1E5           STRB     R2,[R1, #+1]
    267              }
    268          }
   \                     ??UDP_ClearRxFlag_4:
   \   000000D0   0050BDE8           POP      {R12,LR}
   \   000000D4   1EFF2FE1           BX       LR               ;; return
    269          
    270          /*
    271              Function: UDP_WritePayload
    272                  Writes a data payload into the current FIFO buffer of the UDP.
    273          
    274              Parameters:
    275                  eptnum - Number of the endpoint which is sending data.
    276          */

   \                                 In section .text, align 4, keep-with-next
    277          static void UDP_WritePayload(unsigned char eptnum)
    278          {
   \                     UDP_WritePayload:
   \   00000000   10402DE9           PUSH     {R4,LR}
    279              Endpoint *endpoint = &(endpoints[eptnum]);
   \   00000004   00C0B0E1           MOVS     R12,R0
   \   00000008   FFC01CE2           ANDS     R12,R12,#0xFF    ;; Zero extend
   \   0000000C   1CE0A0E3           MOV      LR,#+28
   \   00000010   ........           LDR      R4,??DataTable68  ;; endpoints
   \   00000014   9E4C2CE0           MLA      R12,LR,R12,R4
   \   00000018   0C10B0E1           MOVS     R1,R12
    280              Transfer *transfer = &(endpoint->transfer);
   \   0000001C   04C091E2           ADDS     R12,R1,#+4
   \   00000020   0C20B0E1           MOVS     R2,R12
    281              signed int size;
    282          
    283              // Get the number of bytes to send
    284              size = endpoint->size;
   \   00000024   B2C0D1E1           LDRH     R12,[R1, #+2]
   \   00000028   0C30B0E1           MOVS     R3,R12
    285              if (size > transfer->remaining) {
   \   0000002C   0CC092E5           LDR      R12,[R2, #+12]
   \   00000030   03005CE1           CMP      R12,R3
   \   00000034   010000AA           BGE      ??UDP_WritePayload_0
    286          
    287                  size = transfer->remaining;
   \   00000038   0CC092E5           LDR      R12,[R2, #+12]
   \   0000003C   0C30B0E1           MOVS     R3,R12
    288              }
    289          
    290              // Update transfer descriptor information
    291              transfer->buffered += size;
   \                     ??UDP_WritePayload_0:
   \   00000040   04C092E5           LDR      R12,[R2, #+4]
   \   00000044   0CC093E0           ADDS     R12,R3,R12
   \   00000048   04C082E5           STR      R12,[R2, #+4]
    292              transfer->remaining -= size;
   \   0000004C   0CC092E5           LDR      R12,[R2, #+12]
   \   00000050   03C05CE0           SUBS     R12,R12,R3
   \   00000054   0CC082E5           STR      R12,[R2, #+12]
    293          
    294              // Write packet in the FIFO buffer
    295              while (size > 0) {
   \                     ??UDP_WritePayload_1:
   \   00000058   010053E3           CMP      R3,#+1
   \   0000005C   0C0000BA           BLT      ??UDP_WritePayload_2
    296          
    297                  AT91C_BASE_UDP->UDP_FDR[eptnum] = *(transfer->data);
   \   00000060   00C0B0E1           MOVS     R12,R0
   \   00000064   FFC01CE2           ANDS     R12,R12,#0xFF    ;; Zero extend
   \   00000068   04E0A0E3           MOV      LR,#+4
   \   0000006C   ........           LDR      R4,??DataTable14  ;; 0xfffb0050
   \   00000070   9E4C2CE0           MLA      R12,LR,R12,R4
   \   00000074   00E092E5           LDR      LR,[R2, #+0]
   \   00000078   00E0DEE5           LDRB     LR,[LR, #+0]
   \   0000007C   00E08CE5           STR      LR,[R12, #+0]
    298                  transfer->data++;
   \   00000080   00C092E5           LDR      R12,[R2, #+0]
   \   00000084   01C09CE2           ADDS     R12,R12,#+1
   \   00000088   00C082E5           STR      R12,[R2, #+0]
    299                  size--;
   \   0000008C   013053E2           SUBS     R3,R3,#+1
   \   00000090   F0FFFFEA           B        ??UDP_WritePayload_1
    300              }
    301          }
   \                     ??UDP_WritePayload_2:
   \   00000094   1040BDE8           POP      {R4,LR}
   \   00000098   1EFF2FE1           BX       LR               ;; return
    302          
    303          /*
    304              Function: UDP_ReadPayload
    305                  Reads a data payload from the current FIFO buffer of an endpoint.
    306          
    307              Parameters:
    308                  eptnum - Endpoint number.
    309                  size - Size of the data to read.
    310          */

   \                                 In section .text, align 4, keep-with-next
    311          static void UDP_ReadPayload(unsigned char eptnum, int size)
    312          {
   \                     UDP_ReadPayload:
   \   00000000   10402DE9           PUSH     {R4,LR}
    313              Endpoint *endpoint = &(endpoints[eptnum]);
   \   00000004   00C0B0E1           MOVS     R12,R0
   \   00000008   FFC01CE2           ANDS     R12,R12,#0xFF    ;; Zero extend
   \   0000000C   1CE0A0E3           MOV      LR,#+28
   \   00000010   ........           LDR      R4,??DataTable68  ;; endpoints
   \   00000014   9E4C2CE0           MLA      R12,LR,R12,R4
   \   00000018   0C20B0E1           MOVS     R2,R12
    314              Transfer *transfer = &(endpoint->transfer);
   \   0000001C   04C092E2           ADDS     R12,R2,#+4
   \   00000020   0C30B0E1           MOVS     R3,R12
    315          
    316              // Check that the requested size is not bigger than the remaining transfer
    317              if (size > transfer->remaining) {
   \   00000024   0CC093E5           LDR      R12,[R3, #+12]
   \   00000028   01005CE1           CMP      R12,R1
   \   0000002C   060000AA           BGE      ??UDP_ReadPayload_0
    318          
    319                  transfer->buffered += size - transfer->remaining;
   \   00000030   04C093E5           LDR      R12,[R3, #+4]
   \   00000034   0CC091E0           ADDS     R12,R1,R12
   \   00000038   0CE093E5           LDR      LR,[R3, #+12]
   \   0000003C   0EC05CE0           SUBS     R12,R12,LR
   \   00000040   04C083E5           STR      R12,[R3, #+4]
    320                  size = transfer->remaining;
   \   00000044   0CC093E5           LDR      R12,[R3, #+12]
   \   00000048   0C10B0E1           MOVS     R1,R12
    321              }
    322          
    323              // Update transfer descriptor information
    324              transfer->remaining -= size;
   \                     ??UDP_ReadPayload_0:
   \   0000004C   0CC093E5           LDR      R12,[R3, #+12]
   \   00000050   01C05CE0           SUBS     R12,R12,R1
   \   00000054   0CC083E5           STR      R12,[R3, #+12]
    325              transfer->transferred += size;
   \   00000058   08C093E5           LDR      R12,[R3, #+8]
   \   0000005C   0CC091E0           ADDS     R12,R1,R12
   \   00000060   08C083E5           STR      R12,[R3, #+8]
    326          
    327              // Retrieve packet
    328              while (size > 0) {
   \                     ??UDP_ReadPayload_1:
   \   00000064   010051E3           CMP      R1,#+1
   \   00000068   0C0000BA           BLT      ??UDP_ReadPayload_2
    329          
    330                  *(transfer->data) = (char) AT91C_BASE_UDP->UDP_FDR[eptnum];
   \   0000006C   00C0B0E1           MOVS     R12,R0
   \   00000070   FFC01CE2           ANDS     R12,R12,#0xFF    ;; Zero extend
   \   00000074   04E0A0E3           MOV      LR,#+4
   \   00000078   ........           LDR      R4,??DataTable14  ;; 0xfffb0050
   \   0000007C   9E4C2CE0           MLA      R12,LR,R12,R4
   \   00000080   00C09CE5           LDR      R12,[R12, #+0]
   \   00000084   00E093E5           LDR      LR,[R3, #+0]
   \   00000088   00C0CEE5           STRB     R12,[LR, #+0]
    331                  transfer->data++;
   \   0000008C   00C093E5           LDR      R12,[R3, #+0]
   \   00000090   01C09CE2           ADDS     R12,R12,#+1
   \   00000094   00C083E5           STR      R12,[R3, #+0]
    332                  size--;
   \   00000098   011051E2           SUBS     R1,R1,#+1
   \   0000009C   F0FFFFEA           B        ??UDP_ReadPayload_1
    333              }
    334          }
   \                     ??UDP_ReadPayload_2:
   \   000000A0   1040BDE8           POP      {R4,LR}
   \   000000A4   1EFF2FE1           BX       LR               ;; return
    335          
    336          /*
    337              Function: UDP_ReadRequest
    338                  Reads a SETUP request from the FIFO buffer of Control endpoint 0 and
    339                  stores it into the global <request> variable.
    340          */

   \                                 In section .text, align 4, keep-with-next
    341          static void UDP_ReadRequest(USBGenericRequest *request)
    342          {
    343              unsigned char *data = (unsigned char *) request;
   \                     UDP_ReadRequest:
   \   00000000   0010B0E1           MOVS     R1,R0
    344              unsigned int i;
    345          
    346              // Copy packet
    347              for (i = 0; i < 8; i++) {
   \   00000004   0030A0E3           MOV      R3,#+0
   \   00000008   0320B0E1           MOVS     R2,R3
   \                     ??UDP_ReadRequest_0:
   \   0000000C   080052E3           CMP      R2,#+8
   \   00000010   0500002A           BCS      ??UDP_ReadRequest_1
    348          
    349                  *data = (unsigned char) AT91C_BASE_UDP->UDP_FDR[0];
   \   00000014   ........           LDR      R3,??DataTable14  ;; 0xfffb0050
   \   00000018   003093E5           LDR      R3,[R3, #+0]
   \   0000001C   0030C1E5           STRB     R3,[R1, #+0]
    350                  data++;
   \   00000020   011091E2           ADDS     R1,R1,#+1
    351              }
   \   00000024   012092E2           ADDS     R2,R2,#+1
   \   00000028   F7FFFFEA           B        ??UDP_ReadRequest_0
    352          }
   \                     ??UDP_ReadRequest_1:
   \   0000002C   1EFF2FE1           BX       LR               ;; return
    353          
    354          /*
    355              Function: UDP_ResetEndpoints
    356                  Resets all the endpoints of the UDP peripheral.
    357          */

   \                                 In section .text, align 4, keep-with-next
    358          static void UDP_ResetEndpoints()
    359          {
   \                     UDP_ResetEndpoints:
   \   00000000   01402DE9           PUSH     {R0,LR}
    360              Endpoint *endpoint;
    361              Transfer *transfer;
    362              unsigned char eptnum;
    363          
    364              // Reset the transfer descriptor of every endpoint
    365              for (eptnum = 0; eptnum < BOARD_USB_NUMENDPOINTS; eptnum++) {
   \   00000004   0030A0E3           MOV      R3,#+0
   \   00000008   0320B0E1           MOVS     R2,R3
   \                     ??UDP_ResetEndpoints_0:
   \   0000000C   FF2012E2           ANDS     R2,R2,#0xFF      ;; Zero extend
   \   00000010   080052E3           CMP      R2,#+8
   \   00000014   1900002A           BCS      ??UDP_ResetEndpoints_1
    366          
    367                  endpoint = &(endpoints[eptnum]);
   \   00000018   0230B0E1           MOVS     R3,R2
   \   0000001C   FF3013E2           ANDS     R3,R3,#0xFF      ;; Zero extend

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?