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

📄 fw_cmd.lst

📁 at91sam7x256 FREERTOS sd卡的读写程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
    140          *****************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    141          long fw_readEndpoint(EPx bEndp, UCHAR * buf)
    142          {
   \                     fw_readEndpoint:
   \   00000000   F0B5               PUSH        {R4-R7,LR}
   \   00000002   061C               MOV         R6,R0
   \   00000004   0024               MOV         R4,#+0
    143            int _NbOctets, _NbOctetsLus = 0;
    144            UCHAR* _Buff = buf;
    145          
    146            if(_Buff != NULL)
   \   00000006   0029               CMP         R1,#+0
   \   00000008   34D0               BEQ         ??fw_readEndpoint_0
    147            {
    148              _NbOctetsLus = ( ( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) >> 16) &0x7F );
   \   0000000A   B000               LSL         R0,R6,#+2
   \   0000000C   ....               LDR         R2,??DataTable10   ;; 0xfffb0000
   \   0000000E   1718               ADD         R7,R2,R0
   \   00000010   386B               LDR         R0,[R7, #+48]
   \   00000012   4402               LSL         R4,R0,#+9
   \   00000014   640E               LSR         R4,R4,#+25
    149              _NbOctets = _NbOctetsLus;
   \   00000016   201C               MOV         R0,R4
   \   00000018   02E0               B           ??fw_readEndpoint_1
    150              while(_NbOctets-- > 0)
    151              {
    152                *_Buff++ = AT91F_UDP_EpRead( USBDEV_BASE_UDP, bEndp );
   \                     ??fw_readEndpoint_2:
   \   0000001A   3A6D               LDR         R2,[R7, #+80]
   \   0000001C   0A70               STRB        R2,[R1, #+0]
   \   0000001E   491C               ADD         R1,R1,#+1
    153              }
   \                     ??fw_readEndpoint_1:
   \   00000020   021C               MOV         R2,R0
   \   00000022   401E               SUB         R0,R0,#+1
   \   00000024   012A               CMP         R2,#+1
   \   00000026   F8DA               BGE         ??fw_readEndpoint_2
    154              if(bEndp == FW_EP_BULK_OUT)
   \   00000028   ....               LDR         R5,??DataTable10   ;; 0xfffb0000
   \   0000002A   022E               CMP         R6,#+2
   \   0000002C   12D1               BNE         ??fw_readEndpoint_3
    155              {
    156                // Read data bank 0
    157                if(fw_databk == 0)
   \   0000002E   134E               LDR         R6,??fw_readEndpoint_4  ;; fw_databk
   \   00000030   3068               LDR         R0,[R6, #+0]
   \   00000032   0028               CMP         R0,#+0
   \   00000034   07D1               BNE         ??fw_readEndpoint_5
    158                {
    159                  // Notify USB peripheral device that data has been read in the FIFO bank 0
    160                  AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, USBDEV_UDP_RX_DATA_BK0 );
   \   00000036   0222               MOV         R2,#+2
   \   00000038   0221               MOV         R1,#+2
   \   0000003A   281C               MOV         R0,R5
   \   0000003C   ........           _BLF        AT91F_UDP_EpClear,??AT91F_UDP_EpClear??rT
    161                  fw_databk = 1;
   \   00000040   0120               MOV         R0,#+1
   \                     ??fw_readEndpoint_6:
   \   00000042   3060               STR         R0,[R6, #+0]
   \   00000044   16E0               B           ??fw_readEndpoint_0
    162                }
    163                else
    164                {
    165                  // Read data bank 1
    166                  // Notify USB peripheral device that data has been read in the FIFO bank 1
    167                  AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, USBDEV_UDP_RX_DATA_BK1 );
   \                     ??fw_readEndpoint_5:
   \   00000046   4022               MOV         R2,#+64
   \   00000048   0221               MOV         R1,#+2
   \   0000004A   281C               MOV         R0,R5
   \   0000004C   ........           _BLF        AT91F_UDP_EpClear,??AT91F_UDP_EpClear??rT
    168                  fw_databk = 0;
   \   00000050   0020               MOV         R0,#+0
   \   00000052   F6E7               B           ??fw_readEndpoint_6
    169                }
    170              }
    171              else
    172              {
    173                if( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) & USBDEV_UDP_RX_DATA_BK0 )
   \                     ??fw_readEndpoint_3:
   \   00000054   386B               LDR         R0,[R7, #+48]
   \   00000056   8007               LSL         R0,R0,#+30
   \   00000058   04D5               BPL         ??fw_readEndpoint_7
    174                {
    175                  AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, USBDEV_UDP_RX_DATA_BK0 );
   \   0000005A   0222               MOV         R2,#+2
   \   0000005C   311C               MOV         R1,R6
   \   0000005E   281C               MOV         R0,R5
   \   00000060   ........           _BLF        AT91F_UDP_EpClear,??AT91F_UDP_EpClear??rT
    176                }
    177                if( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) & USBDEV_UDP_RX_DATA_BK1 )
   \                     ??fw_readEndpoint_7:
   \   00000064   386B               LDR         R0,[R7, #+48]
   \   00000066   4006               LSL         R0,R0,#+25
   \   00000068   04D5               BPL         ??fw_readEndpoint_0
    178                {
    179                  AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, USBDEV_UDP_RX_DATA_BK1 );
   \   0000006A   4022               MOV         R2,#+64
   \   0000006C   311C               MOV         R1,R6
   \   0000006E   281C               MOV         R0,R5
   \   00000070   ........           _BLF        AT91F_UDP_EpClear,??AT91F_UDP_EpClear??rT
    180                }
    181              }
    182            }
    183            return( _NbOctetsLus );
   \                     ??fw_readEndpoint_0:
   \   00000074   201C               MOV         R0,R4
   \   00000076   F0BC               POP         {R4-R7}
   \   00000078   02BC               POP         {R1}
   \   0000007A   0847               BX          R1                 ;; return
   \                     ??fw_readEndpoint_4:
   \   0000007C   ........           DC32        fw_databk
    184          }
    185          
    186          
    187          /*****************************************************************
    188          *
    189          * ROUTINE     fw_writeEndpoint
    190          *
    191          *-----------------------------------------------------------------
    192          *
    193          * Object :
    194          *   send a set address enable command
    195          *
    196          * Input parameters : bEndp : number of the EP
    197          *                    buf   : data buffer
    198          *                    len   : length of the data
    199          *
    200          * Output parameters : length of write data
    201          *
    202          * Global variables :
    203          *****************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    204          long fw_writeEndpoint(EPx bEndp, UCHAR * buf, UCHAR len)
    205          {
   \                     fw_writeEndpoint:
   \   00000000   F4B5               PUSH        {R2,R4-R7,LR}
    206            int    _i;
    207            UCHAR *_pBuffer = buf;
   \   00000002   0C1C               MOV         R4,R1
    208            long   _status;
    209          
    210            if(len == 0)
   \   00000004   8100               LSL         R1,R0,#+2
   \   00000006   ....               LDR         R2,??DataTable10   ;; 0xfffb0000
   \   00000008   5618               ADD         R6,R2,R1
   \   0000000A   1027               MOV         R7,#+16
   \   0000000C   0025               MOV         R5,#+0
   \   0000000E   6946               MOV         R1,SP
   \   00000010   0978               LDRB        R1,[R1, #+0]
   \   00000012   0029               CMP         R1,#+0
   \   00000014   03D1               BNE         ??fw_writeEndpoint_0
    211            {
    212              // validate ED
    213              AT91F_UDP_EpSet( USBDEV_BASE_UDP, bEndp, AT91C_UDP_TXPKTRDY );
   \   00000016   306B               LDR         R0,[R6, #+48]
   \   00000018   0743               ORR         R7,R0
   \   0000001A   3763               STR         R7,[R6, #+48]
   \   0000001C   09E0               B           ??fw_writeEndpoint_1
    214              _status = 0;
    215            }
    216            else
    217            {
    218              if(_pBuffer != NULL)
   \                     ??fw_writeEndpoint_0:
   \   0000001E   002C               CMP         R4,#+0
   \   00000020   16D0               BEQ         ??fw_writeEndpoint_2
    219              {
    220                AT91F_UDP_EpClear( USBDEV_BASE_UDP, bEndp, AT91C_UDP_ISOERROR );
   \   00000022   0822               MOV         R2,#+8
   \   00000024   011C               MOV         R1,R0
   \   00000026   ....               LDR         R0,??DataTable10   ;; 0xfffb0000
   \   00000028   ........           _BLF        AT91F_UDP_EpClear,??AT91F_UDP_EpClear??rT
    221                if( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, bEndp ) & AT91C_UDP_TXPKTRDY)
   \   0000002C   306B               LDR         R0,[R6, #+48]
   \   0000002E   C006               LSL         R0,R0,#+27
   \   00000030   01D5               BPL         ??fw_writeEndpoint_3
    222                {
    223                  _status = 0; /* test if we can write in fifo */
   \                     ??fw_writeEndpoint_1:
   \   00000032   0020               MOV         R0,#+0
   \   00000034   0EE0               B           ??fw_writeEndpoint_4
    224                }
    225                else
    226                {
    227                  for(_i=0; _i<len; _i++)
   \                     ??fw_writeEndpoint_3:
   \   00000036   6846               MOV         R0,SP
   \   00000038   0078               LDRB        R0,[R0, #+0]
   \   0000003A   03E0               B           ??fw_writeEndpoint_5
    228                  {
    229                    AT91F_UDP_EpWrite( USBDEV_BASE_UDP, bEndp, *_pBuffer++);
   \                     ??fw_writeEndpoint_6:
   \   0000003C   2178               LDRB        R1,[R4, #+0]
   \   0000003E   3165               STR         R1,[R6, #+80]
   \   00000040   641C               ADD         R4,R4,#+1
    230                  }
   \   00000042   6D1C               ADD         R5,R5,#+1
   \                     ??fw_writeEndpoint_5:
   \   00000044   8542               CMP         R5,R0
   \   00000046   F9DB               BLT         ??fw_writeEndpoint_6
    231                  // validate ED
    232                  AT91F_UDP_EpSet( USBDEV_BASE_UDP, bEndp, AT91C_UDP_TXPKTRDY );
   \   00000048   316B               LDR         R1,[R6, #+48]
   \   0000004A   0F43               ORR         R7,R1
   \   0000004C   3763               STR         R7,[R6, #+48]
    233                  _status = (long)len;
   \   0000004E   01E0               B           ??fw_writeEndpoint_4
    234                }
    235              }
    236              else
    237              {
    238                _status = -1;
   \                     ??fw_writeEndpoint_2:
   \   00000050   0020               MOV         R0,#+0
   \   00000052   C043               MVN         R0,R0              ;; #-1
    239              }
    240            }
    241            return( _status );
   \                     ??fw_writeEndpoint_4:
   \   00000054   F8BC               POP         {R3-R7}
   \   00000056   02BC               POP         {R1}
   \   00000058   0847               BX          R1                 ;; return
    242          }
    243          
    244          
    245          /*****************************************************************
    246          *
    247          * ROUTINE     fw_changedir
    248          *
    249          *-----------------------------------------------------------------
    250          *
    251          * Object :
    252          *   Change Dir in Control Register for Endpoint Control
    253          *
    254          * Input parameters :
    255          *
    256          * Output parameters :
    257          *
    258          * Global variables :
    259          *****************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    260          void fw_changedir(int dir)
    261          {
   \                     fw_changedir:
   \   00000000   10B5               PUSH        {R4,LR}
    262            if(dir == FW_HOST_TO_DEVICE)
   \   00000002   0A4C               LDR         R4,??fw_changedir_0  ;; 0xfffb0030
   \   00000004   0028               CMP         R0,#+0
   \   00000006   08D1               BNE         ??fw_changedir_1
    263            {
    264              // DIR = 0, OUT
    265              AT91F_UDP_EpClear( USBDEV_BASE_UDP, FW_EP_CTRL, AT91C_UDP_DIR );
   \   00000008   8022               MOV         R2,#+128
   \   0000000A   0021               MOV         R1,#+0
   \   0000000C   ....               LDR         R0,??DataTable10   ;; 0xfffb0000
   \   0000000E   ........           _BLF        AT91F_UDP_EpClear,??AT91F_UDP_EpClear??rT
    266              while ( ( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, FW_EP_CTRL ) & AT91C_UDP_DIR ) );
   \                     ??fw_changedir_2:
   \   00000012   2068               LDR         R0,[R4, #+0]
   \   00000014   0006               LSL         R0,R0,#+24
   \   00000016   FCD4               BMI         ??fw_changedir_2
   \   00000018   06E0               B           ??fw_changedir_3
    267            }
    268            else

⌨️ 快捷键说明

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