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

📄 bulkcmd.lst

📁 SdCard_V2.1TinyFatFs.rar是单片机实现SD卡功能的FAT文件系统
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.02b   BULKCMD                                                              02/27/2008 12:54:50 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE BULKCMD
OBJECT MODULE PLACED IN .\Output\BulkCmd.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE BulkCmd.c LARGE OPTIMIZE(SIZE) BROWSE DEBUG OBJECTEXTEND PRINT(.\Output\Bul
                    -kCmd.lst) OBJECT(.\Output\BulkCmd.obj)

stmt level    source

   1          /*
   2          **********************************************************************************************
   3          * Project:      FS7805 SD CARD READER
   4          * File:         main.c
   5          * Contents: 
   6          *           The main function is SD and MMC card reader.
   7          *
   8          * $Date: 12/15/06    Derek    V1.0  
   9          *  
  10          * Coments: This is the SD/MMC card reader firmware.
  11          *                  When read sector,the 512 pingpong FIFO mechanism
  12          *                  is used to improve performance.But when write sector,
  13          *                  only single FIFO is used.
  14          *
  15          * Copyright (c) 2006 Fameg, Inc. All rights reserved
  16          *
  17          * 
  18          ***********************************************************************************************
  19          */
  20          #include "include\Include.h"
  21          
  22          /*************************************************
  23             Global Variables
  24          *************************************************/
  25          xdata PCMD_BLOCK_WRAPPER BlockWrapper;  
  26          BYTE CmdStatus = COMMAND_PASSED;
  27          BYTE BulkState = CBW_GET_COMPLETED;
  28          bool ScsiCmdSTALLed = false;
  29          BYTE ScsiLun;
  30          xdata UINT32 SectorStart  = 0;
  31          xdata UINT16 SectorCount    = 0;  
  32          xdata UINT32 WrapperTag = 0;
  33          xdata UINT32 UsbDmaTotalLength = 0;
  34          bit FirstWrite = false;
  35          
  36          extern bit BusResetFlag ;
  37          
  38          /*************************************************
  39             Local Variables
  40          *************************************************/
  41          static bit BulkCmdRunning = false;
  42          /*************************************************
  43             For pingpong FIFO control
  44          *************************************************/
  45          volatile BYTE    SW_IN_FIFO_Toggle = 0;
  46          volatile INT16U  FIFO_ADDRESS_IN;
  47          volatile BYTE    SW_OUT_FIFO_Toggle = 0;
  48          volatile INT16U  FIFO_ADDRESS_OUT;
  49          
  50          /*
  51          *********************************************************************************************************
  52          *                                             BulkFreeBuffer()
  53          *
  54          * Description: Clear FIFO_FULL bit that get data,set FIFO_TOG and 
C51 COMPILER V7.02b   BULKCMD                                                              02/27/2008 12:54:50 PAGE 2   

  55          *                               and SW_OUT_FIFO_Toggle value for next OUT transaction.
  56          *
  57          * Arguments  : none
  58          *
  59          * Returns    : none
  60          *********************************************************************************************************
  61          */
  62          void BulkFreeBuffer(void)
  63          {
  64   1              if(FIFO_ADDRESS_OUT    == DMA_FIFOA0)//if data in DMA_FIFOA0
  65   1          {
  66   2                      EPAFIFOCS = (EPAFIFOCS | bmFIFO_TOG_WE) | (bmFIFO_TOG);//set FIFO_TOG
  67   2              EPAFIFOCS = (EPAFIFOCS | bmFIFO0_FULL_WE) & (~bmFIFO0_FULL);//clear FIFO0_FULL bit
  68   2                      SW_OUT_FIFO_Toggle = 1;//set SW_OUT_FIFO_Toggle value
  69   2          }
  70   1          else                // FULL_1 = 1
  71   1          {
  72   2                      EPAFIFOCS = (EPAFIFOCS | bmFIFO_TOG_WE) & (~bmFIFO_TOG);//
  73   2              EPAFIFOCS = (EPAFIFOCS | bmFIFO1_FULL_WE) & (~bmFIFO1_FULL);
  74   2                      SW_OUT_FIFO_Toggle = 0;
  75   2          }
  76   1      
  77   1              BulkSetDmaOut();
  78   1      }
  79          //----------------------------------------------------------------------------
  80          // Wait OUT Packet.
  81          //----------------------------------------------------------------------------
  82          void BulkWaitOutDataReady() //
  83          {
  84   1        while (1)
  85   1        {
  86   2          while ((EPINT & bmEPAINT) == 0);    
  87   2          // Clear OUT IRQ.
  88   2          EPINT&=~bmEPAINT;
  89   2          if (!BulkOutTogErr())
  90   2            break;  
  91   2        }  
  92   1      }       
  93          
  94          //----------------------------------------------------------------------------
  95          void BulkReportHandle()
  96          {
  97   1              if (BulkCmdRunning) 
  98   1              {
  99   2              BulkPrepareCSW(CmdStatus);
 100   2              }
 101   1      }
 102          
 103          #pragma OPTIMIZE(4)
 104          /*
 105          *********************************************************************************************************
 106          *                                     BulkSetDmaIn()
 107          *
 108          * Description: Send data to host.
 109          *
 110          * Arguments  : DmaLen,IN packet length.
 111          *
 112          * Returns    : none
 113          *********************************************************************************************************
 114          */
 115          void BulkSetDmaIn(UINT16 DmaLen)
 116          {        
C51 COMPILER V7.02b   BULKCMD                                                              02/27/2008 12:54:50 PAGE 3   

 117   1          if (FIFO_ADDRESS_IN == DMA_FIFOB0)//If DMA_FIFOB0 is selected.
 118   1          {
 119   2                      EPBFIFOCS   = (EPBFIFOCS | bmFIFO0_FULL_WE) | bmFIFO0_FULL;//2007.01.09
 120   2              EPBCNT0L    = DmaLen & 0xFF;                       // Write count low byte
 121   2              EPBCNTH     = (DmaLen >> 8) | bmCNT0HWEN;          // Write count high byte
 122   2                      SW_IN_FIFO_Toggle = 1;
 123   2          }
 124   1          else
 125   1          {
 126   2                      EPBFIFOCS   = (EPBFIFOCS | bmFIFO1_FULL_WE) | bmFIFO1_FULL;//2007.01.09
 127   2              EPBCNT1L    = DmaLen & 0xFF;                       // Write count low byte
 128   2              EPBCNTH     = ((DmaLen >> 8) << 4) | bmCNT1HWEN;   // Write count high byte
 129   2                      SW_IN_FIFO_Toggle = 0;
 130   2          }
 131   1      
 132   1          EPBCS       = EPBCS | bmEP_RXTXEN;  // Enable RXTX
 133   1      
 134   1      }
 135          //------------------------------------
 136          //
 137          //------------------------------------
 138          void SelectInFifo(void)
 139          {
 140   1          if ((!(EPBFIFOCS & bmFIFO0_FULL)) && (!(EPBFIFOCS & bmFIFO1_FULL)))
 141   1          {
 142   2              if (SW_IN_FIFO_Toggle==0)//根据软件toggle位来判断从哪个FIFO 取数据。
 143   2              {
 144   3                  FIFO_ADDRESS_IN= DMA_FIFOB0;
 145   3              }
 146   2              else
 147   2              {
 148   3                  FIFO_ADDRESS_IN= DMA_FIFOB1;
 149   3              }
 150   2          }
 151   1          else if (!(EPBFIFOCS & bmFIFO0_FULL))
 152   1          {
 153   2              FIFO_ADDRESS_IN= DMA_FIFOB0;
 154   2          }
 155   1          else if (!(EPBFIFOCS & bmFIFO1_FULL))
 156   1          {
 157   2              FIFO_ADDRESS_IN= DMA_FIFOB1;
 158   2          }
 159   1      }
 160          //----------------------------------------------------------------------------
 161          // Description: Select one of PINGPONG FIFOS for IN transaction.
 162          //
 163          //----------------------------------------------------------------------------
 164          void  SetBulkInFull (void)
 165          {
 166   1          while ((EPBFIFOCS & bmFIFO0_FULL) && (EPBFIFOCS & bmFIFO1_FULL));
 167   1              SelectInFifo();//
 168   1      }
 169          
 170          //----------------------------------------------------------------------------
 171          // Description: 专门处理读扇区,对bus reset做了特别处理.
 172          //
 173          //----------------------------------------------------------------------------
 174          void SetBulkInFullForReadSector(void)
 175          {
 176   1          while ((EPBFIFOCS&bmFIFO0_FULL)&&(EPBFIFOCS & bmFIFO1_FULL)&&((STINT&bmUSBRSTINT)==0));
 177   1      //等待至少一个FIFO_FULL为0,或者BUS RESET的发生~!2007.01.22
 178   1              if(STINT&bmUSBRSTINT) {
C51 COMPILER V7.02b   BULKCMD                                                              02/27/2008 12:54:50 PAGE 4   

 179   2                      BusResetDeal();
 180   2                      BusResetFlagCnt = 1;
 181   2                      return;
 182   2              }
 183   1              SelectInFifo();//
 184   1      }
 185          //----------------------------------------------------------------------------
 186          // Description: Check which one of PINGPONG FIFOS the OUT packet is in.
 187          //
 188          //----------------------------------------------------------------------------
 189          void SelectOutFifo(void)
 190          {
 191   1              if ((EPAFIFOCS & bmFIFO0_FULL) && (EPAFIFOCS & bmFIFO1_FULL))
 192   1          {                                        // FULL_0 = 1 and FULL_1 = 1
 193   2              if (SW_OUT_FIFO_Toggle == 0)//如果两个FULL位都是1,根据软件toggle位判断.
 194   2              {
 195   3                  FIFO_ADDRESS_OUT    = DMA_FIFOA0;
 196   3              }
 197   2              else
 198   2              {
 199   3                  FIFO_ADDRESS_OUT    = DMA_FIFOA1;
 200   3              }
 201   2          }
 202   1          else if (EPAFIFOCS & bmFIFO0_FULL)      // FULL_0 = 1
 203   1          {
 204   2              FIFO_ADDRESS_OUT    = DMA_FIFOA0;
 205   2          }
 206   1          else if (EPAFIFOCS & bmFIFO1_FULL)      // FULL_1 = 1
 207   1          {
 208   2              FIFO_ADDRESS_OUT    = DMA_FIFOA1;
 209   2          }
 210   1      
 211   1      }
 212          #pragma OPTIMIZE(4)
 213          //----------------------------------------------------------------------------
 214          // Prepare CSW
 215          //----------------------------------------------------------------------------
 216          void BulkPrepareCSW(BYTE Status)

⌨️ 快捷键说明

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