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

📄 fw_epmg.lst

📁 at91sam7x256 FREERTOS sd卡的读写程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    474          *
    475          * Global data : fw_fifoId      : ID of the IN FIFO
    476          *               fw_deviceState : bit1 = 1 when TX on EP2
    477          *
    478          *****************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    479          void fw_mainTxDone(void)
    480          {
   \                     fw_mainTxDone:
   \   00000000   F0B5               PUSH        {R4-R7,LR}
    481            UCHAR i;
    482          
    483            if(fw_fifoId.NbOctetsLibres != (fw_fifoId.last - fw_fifoId.first))
   \   00000002   ....               LDR         R4,??DataTable9    ;; fw_deviceState
   \   00000004   ....               LDR         R5,??Subroutine7_0  ;; fw_fifoId
   \   00000006   2869               LDR         R0,[R5, #+16]
   \   00000008   E968               LDR         R1,[R5, #+12]
   \   0000000A   2A68               LDR         R2,[R5, #+0]
   \   0000000C   891A               SUB         R1,R1,R2
   \   0000000E   8842               CMP         R0,R1
   \   00000010   22D0               BEQ         ??fw_mainTxDone_0
    484            {
    485              for( i=0; i<FW_MAIN_EP_MAXPACKET_SIZE; i++ )
   \   00000012   0020               MOV         R0,#+0
   \   00000014   ....               LDR         R6,??Subroutine7_0+0x4  ;; TxBuffer
    486              {
    487                TxBuffer[i] = 0;
   \                     ??fw_mainTxDone_1:
   \   00000016   0021               MOV         R1,#+0
   \   00000018   3154               STRB        R1,[R6, R0]
    488              }
   \   0000001A   401C               ADD         R0,R0,#+1
   \   0000001C   0106               LSL         R1,R0,#+24
   \   0000001E   090E               LSR         R1,R1,#+24
   \   00000020   4029               CMP         R1,#+64
   \   00000022   F8D3               BCC         ??fw_mainTxDone_1
    489          
    490              // Get the data out of the fifo and put them in the endpoint buffer
    491              fw_lastTxPacket = po_rngBufGet(&fw_fifoId,(char*)TxBuffer,FW_MAIN_EP_MAXPACKET_SIZE);
   \   00000024   ....               LDR         R7,??Subroutine7_0+0x8  ;; fw_lastTxPacket
   \   00000026   4022               MOV         R2,#+64
   \   00000028   311C               MOV         R1,R6
   \   0000002A   281C               MOV         R0,R5
   \   0000002C   ........           _BLF        po_rngBufGet,??po_rngBufGet??rT
   \   00000030   3870               STRB        R0,[R7, #+0]
    492              fw_lastTxPacket = fw_writeEndpoint(FW_EP_BULK_IN,TxBuffer,fw_lastTxPacket);
   \   00000032   3A78               LDRB        R2,[R7, #+0]
   \   00000034   311C               MOV         R1,R6
   \   00000036   0120               MOV         R0,#+1
   \   00000038   ........           _BLF        fw_writeEndpoint,??fw_writeEndpoint??rT
   \   0000003C   3870               STRB        R0,[R7, #+0]
    493          
    494              // Test if the FIFO is only 20% full
    495              if( (fw_deviceState & FW_DS_FIFO_FULL) && (po_rngNBytes(&fw_fifoId) < FW_IN_FIFO_EMPTY) )
   \   0000003E   2078               LDRB        R0,[R4, #+0]
   \   00000040   4006               LSL         R0,R0,#+25
   \   00000042   10D5               BPL         ??fw_mainTxDone_2
   \   00000044   281C               MOV         R0,R5
   \   00000046   ........           _BLF        po_rngNBytes,??po_rngNBytes??rT
   \   0000004A   6628               CMP         R0,#+102
   \   0000004C   0BDA               BGE         ??fw_mainTxDone_2
    496              {
    497                fw_deviceState &= ~FW_DS_FIFO_FULL;
   \   0000004E   2078               LDRB        R0,[R4, #+0]
   \   00000050   BF21               MOV         R1,#+191
   \   00000052   0140               AND         R1,R0
   \   00000054   2170               STRB        R1,[R4, #+0]
   \   00000056   06E0               B           ??fw_mainTxDone_2
    498              }
    499            }
    500            else
    501            {
    502              // End of the transfer
    503              fw_deviceState &= ~FW_DS_TX;
   \                     ??fw_mainTxDone_0:
   \   00000058   2078               LDRB        R0,[R4, #+0]
   \   0000005A   FD21               MOV         R1,#+253
   \   0000005C   0140               AND         R1,R0
   \   0000005E   2170               STRB        R1,[R4, #+0]
    504              USB_TX = 1;
   \   00000060   ....               LDR         R0,??Subroutine7_0+0xC  ;; USB_TX
   \   00000062   0121               MOV         R1,#+1
   \   00000064   0160               STR         R1,[R0, #+0]
   \                     ??fw_mainTxDone_2:
   \   00000066   C046               NOP         
    505              /* if the last packet is a full packet we must send a zero length packet */
    506              // TODO
    507              //if(fw_fifoId.NbOctetsLibres == 0)
    508              //{
    509              //  fw_singleTransmit(0, 0);
    510              //}
    511            }
    512          }
   \   00000068                      REQUIRE ?Subroutine7
   \   00000068                      ;; // Fall through to label ?Subroutine7
    513          
    514          
    515          /*****************************************************************
    516          *
    517          * ROUTINE         fw_writeRxData
    518          *
    519          *-----------------------------------------------------------------
    520          *
    521          * Purpose :
    522          *         write data in a valid TB
    523          *
    524          * Input parameters  : length     : length of data to write
    525          *                     dataBuffer : data to write
    526          *
    527          * Output parameters : NONE
    528          *
    529          * Global data : fw_TB      : array of the buffer IDs
    530          *               fw_writeTB : TB currently used by the firmware
    531          *
    532          *****************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    533          int fw_writeRxData(int length,UCHAR *dataBuffer)
    534          {
   \                     fw_writeRxData:
   \   00000000   F3B5               PUSH        {R0,R1,R4-R7,LR}
   \   00000002   81B0               SUB         SP,#+4
   \   00000004   ....               LDR         R0,??DataTable17   ;; fw_writeTB
   \   00000006   0068               LDR         R0,[R0, #+0]
   \   00000008   0468               LDR         R4,[R0, #+0]
    535            structTB *_TB;
    536            ULONG _i = 0;
    537            long *_sizeTB,*_indexTB;
    538          
    539            _TB = fw_writeTB[0];
    540            _indexTB =&_TB->index; /* pointer to the current write position */
   \   0000000A   251C               MOV         R5,R4
   \   0000000C   0835               ADD         R5,#+8
    541            _sizeTB = &_TB->length; /* pointer to the size field */
   \   0000000E   261D               ADD         R6,R4,#+4
   \   00000010   2168               LDR         R1,[R4, #+0]
   \   00000012   4906               LSL         R1,R1,#+25
   \   00000014   03D5               BPL         ??fw_writeRxData_0
    542          
    543            /* check if the current TB was Empty */
    544            if(_TB->status & FW_EBIT)
    545            {
    546              _TB->status &= ~FW_EBIT;
   \   00000016   2168               LDR         R1,[R4, #+0]
   \   00000018   4022               MOV         R2,#+64
   \   0000001A   9143               BIC         R1,R2
   \   0000001C   2160               STR         R1,[R4, #+0]
    547            }
    548          
    549            /* if the TB isn't large enough pass to the next TB */
    550            if(length > (FW_TB_SIZE - *_sizeTB) )
   \                     ??fw_writeRxData_0:
   \   0000001E   4021               MOV         R1,#+64
   \   00000020   3268               LDR         R2,[R6, #+0]
   \   00000022   891A               SUB         R1,R1,R2
   \   00000024   384F               LDR         R7,??fw_writeRxData_1  ;; fw_TB + 28
   \   00000026   019A               LDR         R2,[SP, #+4]
   \   00000028   9142               CMP         R1,R2
   \   0000002A   4EDA               BGE         ??fw_writeRxData_2
    551            {
    552              fw_writeTB++;
   \   0000002C   001D               ADD         R0,R0,#+4
    553              if(fw_writeTB > (fw_TB + (FW_TB_NUM - 1)))
   \   0000002E   8742               CMP         R7,R0
   \   00000030   00D2               BCS         ??fw_writeRxData_3
    554              {
    555                fw_writeTB = fw_TB;
   \   00000032   ....               LDR         R0,??DataTable16   ;; fw_TB
   \                     ??fw_writeRxData_3:
   \   00000034   ....               LDR         R2,??DataTable17   ;; fw_writeTB
   \   00000036   1060               STR         R0,[R2, #+0]
    556              }
    557              /* fill the current TB */
    558              _i = FW_TB_SIZE - (*_sizeTB);
   \   00000038   0091               STR         R1,[SP, #+0]
    559              po_memcpy(&_TB->data[(*_indexTB)],dataBuffer,_i);
   \   0000003A   0A1C               MOV         R2,R1
   \   0000003C   0299               LDR         R1,[SP, #+8]
   \   0000003E   2868               LDR         R0,[R5, #+0]
   \   00000040   2018               ADD         R0,R4,R0
   \   00000042   0C30               ADD         R0,#+12
   \   00000044   ........           _BLF        po_memcpy,??po_memcpy??rT
    560          
    561              *_sizeTB = FW_TB_SIZE;
   \   00000048   4020               MOV         R0,#+64
   \   0000004A   3060               STR         R0,[R6, #+0]
    562              *_indexTB = 0;
   \   0000004C   0020               MOV         R0,#+0
   \   0000004E   2860               STR         R0,[R5, #+0]
    563              /* validate the TB */
    564              _TB->status |= FW_VBIT;
   \   00000050   2068               LDR         R0,[R4, #+0]
   \   00000052   8021               MOV         R1,#+128
   \   00000054   0143               ORR         R1,R0
   \   00000056   2160               STR         R1,[R4, #+0]
    565              USB_RX++;
   \   00000058   2C48               LDR         R0,??fw_writeRxData_1+0x4  ;; USB_RX
   \   0000005A   2C49               LDR         R1,??fw_writeRxData_1+0x4  ;; USB_RX
   \   0000005C   0968               LDR         R1,[R1, #+0]
   \   0000005E   491C               ADD         R1,R1,#+1
   \   00000060   0160               STR         R1,[R0, #+0]
    566              /* put the other data in the next TB */
    567              _TB = fw_writeTB[0];
   \   00000062   ....               LDR         R0,??DataTable17   ;; fw_writeTB
   \   00000064   0068               LDR         R0,[R0, #+0]
   \   00000066   0468               LDR         R4,[R0, #+0]
    568              _indexTB =  &_TB->index;
   \   00000068   251C               MOV         R5,R4
   \   0000006A   0835               ADD         R5,#+8
    569              _sizeTB = &_TB->length;
   \   0000006C   261D               ADD         R6,R4,#+4
    570              if(!(_TB->status & FW_VBIT))
   \   0000006E   2168               LDR         R1,[R4, #+0]
   \   00000070   0906               LSL         R1,R1,#+24
   \   00000072   20D4               BMI         ??fw_writeRxData_4
    571              {
    572                fw_writeTB++;
   \   00000074   001D               ADD         R0,R0,#+4
    573                if(fw_writeTB > (fw_TB + (FW_TB_NUM - 1)))
   \   00000076   8742               CMP         R7,R0
   \   00000078   00D2               BCS         ??fw_writeRxData_5
    574                {
    575                  fw_writeTB = fw_TB;
   \   0000007A   ....               LDR         R0,??DataTable16   ;; fw_TB
   \                     ??fw_writeRxData_5:
   \   0000007C   ....               LDR         R1,??DataTable17   ;; fw_writeTB
   \   0000007E   0860               STR         R0,[R1, #+0]
    576                }
    577                po_memcpy(&_TB->data[(*_indexTB)],(char*)(dataBuffer + _i),(length - _i));
   \   00000080   0198               LDR         R0,[SP, #+4]
   \   00000082   0099               LDR         R1,[SP, #+0]
   \   00000084   421A               SUB         R2,R0,R1
   \   00000086   081C               MOV         R0,R1
   \   00000088   0299               LDR         R1,[SP, #+8]
   \   0000008A   0918               ADD         R1,R1,R0
   \   0000008C   2868               LDR         R0,

⌨️ 快捷键说明

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