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

📄 tpbulk.lst

📁 51环境下的FAT及FAT32文件系统源码
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V8.02   TPBULK                                                                09/19/2006 15:01:23 PAGE 20  

 612      =2      UINT8 Reserved0 : 1;
 613      =2      UINT8 WrongLenIndicator : 1;
 614      =2      UINT8 EndofMedium : 1;
 615      =2      UINT8 FileMark : 1;
 616      =2  
 617      =2      UINT8 Info_0;
 618      =2      UINT8 Info_1;
 619      =2      UINT8 Info_2;
 620      =2      UINT8 Info_3;
 621      =2  
 622      =2      UINT8 AdditionalSenseLen;
 623      =2  
 624      =2      UINT8 CommandSpecInfo_0;
 625      =2      UINT8 CommandSpecInfo_1;
 626      =2      UINT8 CommandSpecInfo_2;
 627      =2      UINT8 CommandSpecInfo_3;
 628      =2  
 629      =2      UINT8 ASC;
 630      =2      UINT8 ASCQ;
 631      =2      UINT8 FieldReplacableUnitCode;
 632      =2      UINT8 SenseKeySpec_0 : 7;
 633      =2      UINT8 SenseKeySpecValid : 1;
 634      =2      UINT8 SenseKeySpec_1;
 635      =2      UINT8 SenseKeySpec_2;
 636      =2  
 637      =2  } REQUEST_SENSE_DATA, *pREQUEST_SENSE_DATA;
 638      =2  */
 639      =2  /*
 640      =2  // Test Unit Ready
 641      =2  */
 642      =2  typedef struct _TEST_UNIT_SPC {
 643      =2          UINT8 OperationCode;    // 00H
 644      =2          UINT8 Reserved[4];
 645      =2          UINT8 Control;
 646      =2  } TEST_UNIT_SPC, *pTEST_UNIT_SPC;
 647      =2  
 648      =2  /*
 649      =2  // Write Buffer
 650      =2  */
 651      =2  
 652      =2  typedef struct _WRITE_BUFFER_SPC {
 653      =2      UINT8 OperationCode;    
 654      =2      UINT8 Mod:4 ;
 655      =2      UINT8 Reserved0:4 ;
 656      =2          UINT8 BufferID;
 657      =2      UINT8 BufferOff_2;
 658      =2      UINT8 BufferOff_1;
 659      =2      UINT8 BufferOff_0;
 660      =2      UINT8 ParameterLen_2;
 661      =2      UINT8 ParameterLen_1;
 662      =2          UINT8 ParameterLen_0;
 663      =2      UINT8 Control;
 664      =2  } WRITE_BUFFER_SPC, *pWRITE_BUFFER_SPC;   
 665      =2  
 666      =2  typedef union _CDB_RBC {
 667      =2      GENERIC_CDB             Cdb_Generic;
 668      =2    
 669      =2       // RBC commands
 670      =2      GENERIC_RBC             RbcCdb_Generic;
 671      =2  
 672      =2      FORMAT_RBC              RbcCdb_Format;
 673      =2      READ_RBC                RbcCdb_Read;
C51 COMPILER V8.02   TPBULK                                                                09/19/2006 15:01:23 PAGE 21  

 674      =2      READ_CAPACITY_RBC       RbcCdb_ReadCapacity;
 675      =2      START_STOP_RBC          RbcCdb_OnOffUnit;
 676      =2      SYNCHRONIZE_CACHE_RBC   RbcCdb_SyncCache;
 677      =2      VERIFY_RBC              RbcCdb_Verify;
 678      =2      WRITE_RBC               RbcCdb_Write;
 679      =2  
 680      =2     
 681      =2      // SPC-2 commands
 682      =2     
 683      =2      INQUIRY_SPC             SpcCdb_Inquiry;
 684      =2      MODE_SELECT_SPC         SpcCdb_ModeSelect;
 685      =2      MODE_SENSE_SPC          SpcCdb_ModeSense;
 686      =2      MEDIA_REMOVAL_SPC       SpcCdb_Remove;
 687      =2      REQUEST_SENSE_SPC       SpcCdb_RequestSense;
 688      =2      TEST_UNIT_SPC           SpcCdb_TestUnit;
 689      =2      WRITE_BUFFER_SPC        SpcCdb_WriteBuffer;
 690      =2  
 691      =2      // ATAPI Commands
 692      =2      READ_10         CmdRead10;
 693      =2      WRITE_10        CmdWrite10;
 694      =2      MODE_SELECT_10  CmdModeSel10;
 695      =2      MODE_SENSE_10   CmdModeSen10;
 696      =2      //////////////////////////////////////
 697      =2      READ_LONG_CMD       SpcCdb_ReadLong;
 698      =2  
 699      =2  } CDB_RBC, *pCDB_RBC;
 700      =2  
 701      =2  
   2      =1  ///////////////////////////////////
   3      =1  #define CBW_SIGNATURE   0x55534243
   4      =1  #define CSW_SIGNATURE   0x55534253
   5      =1  
   6      =1  #define     TPBulk_CBW                  TPBulk_Block.TPBulk_CommandBlock
   7      =1  #define     CBW_wXferLen                TPBulk_CBW.dCBW_DataXferLen
   8      =1  #define     RBC_CDB                             TPBulk_CBW.cdbRBC
   9      =1  #define     RBC_LUN                             TPBulk_CBW.bCBW_LUN
  10      =1  #define     TPBulk_CSW                  TPBulk_Block.TPBulk_CommandStatus
  11      =1  
  12      =1  typedef struct _COMMAND_BLOCK_WRAPPER{
  13      =1      UINT32   dCBW_Signature;
  14      =1      UINT32   dCBW_Tag;
  15      =1      UINT32   dCBW_DataXferLen;
  16      =1      UINT8    bCBW_Flag;
  17      =1      UINT8    bCBW_LUN;
  18      =1      UINT8    bCBW_CDBLen;
  19      =1      CDB_RBC cdbRBC;
  20      =1  } CBW, *pCBW;
  21      =1  
  22      =1  typedef struct _COMMAND_STATUS_WRAPPER{
  23      =1      UINT32   dCSW_Signature;
  24      =1      UINT32   dCSW_Tag;
  25      =1      UINT32   dCSW_DataResidue;
  26      =1      UINT8    bCSW_Status;
  27      =1  } CSW, *pCSW;
  28      =1  
  29      =1  typedef union _TPBULK_STRUC {
  30      =1      CBW     TPBulk_CommandBlock;
  31      =1      CSW     TPBulk_CommandStatus;
  32      =1  
  33      =1  }TPB_STRUC, *pTPB_STRUC;
  34      =1  ///////////////////////////////////
  35      =1  unsigned char EnumMassDev(void);
C51 COMPILER V8.02   TPBULK                                                                09/19/2006 15:01:23 PAGE 22  

  36      =1  unsigned char TPBulk_GetMaxLUN(void);
  37      =1  unsigned char SPC_Inquiry(void);
  38      =1  unsigned char SPC_READLONG(void);
  39      =1  unsigned char SPC_RequestSense(void);
  40      =1  unsigned char SPC_TestUnit(void);
  41      =1  unsigned char SPC_LockMedia(void);
  42      =1  unsigned char RBC_ReadCapacity(void);
  43      =1  unsigned char RBC_ReadOneSec(unsigned long lba, unsigned char *pBuffer);
  44      =1  unsigned char RBC_Write(unsigned long lba,unsigned char len,unsigned char *pBuffer);
  45      =1  
  46      =1  
   4          
   5          SYS_INFO_BLOCK  DeviceInfo;
   6          //unsigned int FatSectorPointer;
   7          //FILE_INFO xdata ThisFile;
   8          TPB_STRUC data TPBulk_Block;
   9          
  10          extern XXGFLAGS bdata bXXGFlags;        //union XXGFLAGS is defined in common.h
  11          extern UINT8 xdata DBUF[SECT_LEN];
  12          extern XXGPKG usbstack;
  13          extern UINT16 xdata FAT[SECT_LEN/2];
  14          
  15          ///////////////////////////////////////////////////////////////////////////
  16          unsigned char EnumMassDev(void)
  17          {
  18   1              UINT32 FATSz;
  19   1              UINT32 TotSec;
  20   1              UINT32 RootDirSectors;
  21   1              UINT32 DataSec;
  22   1              UINT32 CountofClusters;
  23   1      
  24   1              pMBR_BLOCK pMBR;
  25   1              pBPB_BLOCK pBPB;
  26   1              pBPB_BLOCK32 pBPB32;
  27   1      
  28   1              ////////////////////////////////////////////////////
  29   1              if(!SPC_Inquiry())
  30   1                      return FALSE;
  31   1              DelayUs(2);
  32   1              if(!SPC_RequestSense())
  33   1                      return FALSE;
  34   1              DelayUs(2);
  35   1              if(!SPC_TestUnit())
  36   1                      return FALSE;
  37   1              DelayUs(2);
  38   1              if(!RBC_ReadCapacity())
  39   1                      return FALSE;
  40   1               
  41   1              ////////////////////////////////////////////////////
  42   1              pMBR=(pMBR_BLOCK)DBUF;
  43   1      
  44   1              DeviceInfo.BPB_BytesPerSec=512; //暂假设为512
  45   1              if(!SPC_RequestSense())
  46   1                      return FALSE;
  47   1      //      DelayUs(5);
  48   1      //      if(!SPC_TestUnit())
  49   1      //              return FALSE;
  50   1      
  51   1              DelayUs(5);
  52   1              if(!RBC_ReadCapacity())
  53   1                      return FALSE;
  54   1      
C51 COMPILER V8.02   TPBULK                                                                09/19/2006 15:01:23 PAGE 23  

  55   1              DelayUs(5);
  56   1          // Read sector 0 (MBR)
  57   1              if(!RBC_ReadOneSec(0x0,DBUF))
  58   1                      return FALSE;
  59   1              //////////////////////////////////
  60   1              if(DBUF[0]==0xeb||DBUF[0]==0xe9)
  61   1                      {
  62   2                      DeviceInfo.StartSector=0;
  63   2                      //DeviceInfo.TotalSector=SwapINT32(pMBR->TotalSector);
  64   2                      }
  65   1              else
  66   1                      {
  67   2              //////////////////////////////////
  68   2                      DeviceInfo.StartSector=SwapINT32(pMBR->StartSector);
  69   2                      //DeviceInfo.TotalSector=SwapINT32(pMBR->TotalSector);
  70   2                      }
  71   1              ///////////////////////////////////////////////////////
  72   1              pBPB=(pBPB_BLOCK)DBUF;
  73   1              pBPB32 = (pBPB_BLOCK32)DBUF;
  74   1              DelayUs(5);
  75   1      
  76   1              if(!RBC_ReadOneSec(DeviceInfo.StartSector, DBUF))
  77   1                      return FALSE;
  78   1              DeviceInfo.BPB_BytesPerSec=WordSwap(pBPB->BPB_BytesPerSec);
  79   1              DeviceInfo.BPB_SecPerClus=pBPB->BPB_SecPerClus;
  80   1              DeviceInfo.BPB_NumFATs=pBPB->BPB_NumFATs;
  81   1              DeviceInfo.BPB_RootEntCnt=WordSwap(pBPB->BPB_RootEntCnt);
  82   1              DeviceInfo.BPB_TotSec16=WordSwap(pBPB->BPB_TotSec16);
  83   1              DeviceInfo.BPB_FATSz16=WordSwap(pBPB->BPB_FATSz16);
  84   1              DeviceInfo.BPB_FATSz32=WordSwap(pBPB32->BPB_FATSz32);
  85   1              DeviceInfo.BPB_TotSec32=SwapINT32(pBPB->BPB_TotSec32);
  86   1              DeviceInfo.FatStartSector=DeviceInfo.StartSector+WordSwap(pBPB->BPB_RsvdSecCnt);
  87   1              DeviceInfo.RootStartSector=DeviceInfo.FatStartSector+2*DeviceInfo.BPB_FATSz16;
  88   1              DeviceInfo.FirstDataSector=DeviceInfo.RootStartSector+0x20;
  89   1              ///////////////////////////////////////////////////////
  90   1      //      ThisFile.bFileOpen=0;
  91   1      
  92   1              //Judge the FAT type
  93   1              if(DeviceInfo.BPB_FATSz16 != 0)
  94   1                  FATSz = DeviceInfo.BPB_FATSz16;
  95   1              else
  96   1                  FATSz = DeviceInfo.BPB_FATSz32;  
  97   1              
  98   1              if(DeviceInfo.BPB_TotSec16 != 0)
  99   1                  TotSec = DeviceInfo.BPB_TotSec16;
 100   1              else
 101   1                  TotSec = DeviceInfo.BPB_TotSec32;
 102   1              
 103   1              RootDirSectors = ((DeviceInfo.BPB_RootEntCnt * 32) + (DeviceInfo.BPB_BytesPerSec - 1)) / DeviceInfo.BPB_B
             -ytesPerSec;
 104   1              DataSec = TotSec - (WordSwap(pBPB->BPB_RsvdSecCnt) + (DeviceInfo.BPB_NumFATs * FATSz) + RootDirSectors);
 105   1              CountofClusters = DataSec / DeviceInfo.BPB_SecPerClus;
 106   1      
 107   1              if(CountofClusters < 4085) 
 108   1              {
 109   2                      DeviceInfo.bFatType = 1; //fat12
 110   2              } 
 111   1              else if(CountofClusters < 65525) 
 112   1              {
 113   2                  DeviceInfo.bFatType = 2; //fat16
 114   2      #ifdef FAT32OR16_LIGHT
                              light ( 2, 0, 100, 10 );
C51 COMPILER V8.02   TPBULK                                                                09/19/2006 15:01:23 PAGE 24  

                              light ( 5, 0, 100, 10 );
                              light ( 2, 0, 100, 10 );
              #endif
 119   2              } 
 120   1              else 
 121   1              {
 122   2                  DeviceInfo.bFatType = 3; //fat32
 123   2                      DeviceInfo.TotCluster =
 124   2                      (DeviceInfo.BPB_TotSec32-DeviceInfo.FirstDataSector+1)/DeviceInfo.BPB_SecPerClus+1;
 125   2      #ifdef FAT32OR16_LIGHT
                              light ( 5, 0, 200, 10 );
                              light ( 2, 0, 200, 10 );
                              light ( 5, 0, 200, 10 );
              #endif
 130   2              }
 131   1              //End Judge the FAT type
 132   1      
 133   1              ///////////////////////////////////////////////////////
 134   1              return TRUE;
 135   1      }
 136          
 137          /*unsigned char TPBulk_GetMaxLUN(void)
 138          {
 139                  
 140                  usbstack.setup.bmRequest=0xa1;
 141                  usbstack.setup.bRequest=0xfe;
 142                  usbstack.setup.wValue=0;
 143                  usbstack.setup.wIndex=0;
 144                  usbstack.setup.wLength=1;
 145                  usbstack.buffer=DBUF;
 146                  return ep0Xfer();
 147          
 148          }        
 149          */
 150          
 151          unsigned char SPC_Inquiry(void)
 152          {
 153   1      #define cdbInquirySPC RBC_CDB.SpcCdb_Inquiry
 154   1      
 155   1              //unsigned char len;
 156   1              //unsigned char retStatus=FALSE;
 157   1              TPBulk_CBW.dCBW_Signatu

⌨️ 快捷键说明

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