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

📄 bulk_only.lst

📁 这个是一个完整的MP3项目
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.20   BULK_ONLY                                                             03/21/2007 13:33:19 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE BULK_ONLY
OBJECT MODULE PLACED IN bulk_only.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE bulk_only.c LARGE BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*
   2          * Copyright (c) 2004,北京博创兴业科技有限公司
   3          * All rights reserved.
   4          * 
   5          * 文件名称:bulk_only.c
   6          * 文件标识:bulk_only
   7          * 摘    要:批量传输函数定义
   8          * 
   9          * 当前版本:2.0
  10          * 作    者:Kent
  11          * 完成日期:2004年5月20日
  12          *
  13          * 取代版本:1.1 
  14          * 原作者  :Frank
  15          * 完成日期:2003年8月10日
  16          */
  17          
  18          //this file to process the request about bulk_only
  19          #include <string.h>
  20          
  21          #include "bulk_only.h"
  22          #include "fat16.h"
  23          #include "usbdisk.h"
  24          #include "uart.h"
  25          #include "flash.h"
  26          #include "atmelusbci.h"
  27          
  28          //extern unsigned char  EpBuf[];
  29          unsigned char *BulkPoint = 0;
  30          unsigned char *BulkStartPoint = 0;
  31          long unsigned int dDataResiduce = 0;//USB传输过程中,未传完的剩余数据
  32          unsigned char bulk_state = 0;           //当前传送状态
  33          unsigned char *pCurrentBuf;             //数据传送指针
  34          long int nBufCount = 0;         //传送数据当前位置
  35          
  36          
  37          //unsigned char MSC_dCBWSignature[] = {0x55, 0x53, 0x42, 0x43};
  38          //unsigned char MSC_dCSWSignature[] = {0x55, 0x53, 0x42, 0x53};
  39          
  40          //以下是SCSI命令的命令字与其代码的对应表
  41          #define Format_Unit                             0x04
  42          #define Inquiry                                         0x12 
  43          #define Mode_Select                             0x55 
  44          #define Mode_Sense                              0x1A 
  45          #define Medium_Removal                  0x1E
  46          #define Read10                                  0x28 
  47          #define Read12                                  0xA8 
  48          #define Read_Capacity                   0x25 
  49          #define Read_Format_Capacities  0x23 
  50          #define Request_Sense                   0x03 
  51          #define Rezero                                  0x01 
  52          #define Seek10                                  0x2B 
  53          #define Send_Diag                               0x1D 
  54          #define Start_Stop_Unit                         0x1B 
  55          #define Test_Unit_Ready                         0x00 
C51 COMPILER V7.20   BULK_ONLY                                                             03/21/2007 13:33:19 PAGE 2   

  56          #define Verify                                  0x2F 
  57          #define Write10                                         0x2A 
  58          #define Write12                                         0xAA 
  59          #define Write_And_Verify                        0x2E 
  60          /****************************************/
  61          
  62          
  63          
  64          #define SCSI_MSPGCD_TPP                 0x1c
  65          #define SCSI_MSPGCD_RETALL              0x3f
  66          
  67          //unsigned char Bulk_Out_Buf[64];       //64字节的端点缓存
  68          unsigned char Page_Buf[512];    //512字节的页缓存
  69          unsigned int Fat_Buf[544] _at_ 0x320;//1024字节的FAT表缓存
  70          
  71          short int Transfer_Length;                      //要传送的扁区长度
  72          long int Logical_Block_Address;         //逻辑地址
  73          long int nCurrentPage, nBeginPage;      //当前扇区和超始扇区
  74          long int nCurrentBlock;                         //当前Block
  75          
  76          //SCSI-Inquiry命令的返回数据
  77          code unsigned char B_InquiryData[] = {
  78                                                                  0x00,   //Direct Access Device
  79                                                                  0x80,   //RMB
  80                                                                  0x00,   //ISO/ECMA/ANSI
  81                                                                  0x01,   //Response Data Format
  82                                                                  0x1f,   //Additional Length
  83                                                                  0x00,   //Reserved
  84                                                                  0x00,   //Reserved
  85                                                                  0x00,   //Reserved
  86                                                                  'U', 'P', '-', 'T', 'E', 'C', 'H', ' ', //Vendor Information
  87                                                                  'M', 'P', '3', ' ', 'P', 'l', 'a', 'y', 'e', 'r', ' ', 'V', '2', '.', '0', '0',//Product Identifica
             -tion
  88                                                                  0, 0, 0, 0};    //Product Revision Level n.nn
  89          
  90          
  91          //code unsigned char CapactiyLstHd[]={0x00,0x00,0x00,0x10};
  92          //code unsigned char bBlockLength[]={0x00,0x02,0x00};           //512 Byte
  93          //code unsigned char nLastLBAddr[]={0x00,0x01,0xf3,0xff};       //Last  Logical Block Address for 64MB
  94          
  95          //SCSI-Read_Format_capacities命令的返回数据
  96          code unsigned char B_Read_Format_capacities[] = {0x00, 0x00, 0x00, 0x10,        //capacity list header
  97                                                                                  0x00, 0x00, 0x04, 0x00, 0x01,           0x00, 0x02, 0x00,       //capacity descriptor
  98                                                                          //      Number of Blocks =1024,unformatted media,blocklength = 512Bytes
  99                                                                                  0x00, 0x00, 0x04, 0x00, 0x00,           0x00, 0x02, 0x00        //Formattable Capacity Descriptors
 100                                                                                  };
 101          //SCSI-Read_Capacity命令的返回数据
 102          code unsigned char B_Read_Capacity[] = {
 103                                                                          0x00, 0x00, 0xff, 0xe0, //Last  Logical Block Address for 64MB
 104                                                                          0x00, 0x00, 0x02, 0x00  //block length in bytes
 105                                                                          };
 106          
 107          //SCSI-Mode_Sense命令的返回数据                 
 108          code unsigned char B_Mode_Sense_ALL[] = {0x0b, 0x00,//Mode Data Length
 109                                                                  0x00, 0x08, 0x00, 0x00,
 110                                                                  0x7d, 0, 0, 0, 0x02, 0x00
 111                                                                  };
 112          
 113          //SCSI-Mode_Sense命令的返回数据                 
 114          code unsigned char B_Mode_Sense_TPP[] = {0xf0, 0x00,//Mode Data Length
 115                                                                  05, 00, 00, 00, 00, 0x0b, 00, 00, 00, 00, 0x24, 00, 00, 00, 00, 00
 116                                                                  };
C51 COMPILER V7.20   BULK_ONLY                                                             03/21/2007 13:33:19 PAGE 3   

 117          //SCSI-Mode_Sense命令的返回数据                 
 118          code unsigned char B_Mode_Sense_ZERO[] = {0x00, 0x06,//Mode Data Length
 119                                                                  0x00,   //Medium Type Code
 120                                                                  0,//write enabled
 121                                                                  0, 0, 0, 0//reserved
 122          };
 123          
 124          
 125          
 126          typedef struct _STRUCT_CBW
 127          {
 128                  unsigned char dCBWSignature[4];
 129                  unsigned char dCBWTag[4];       //dCBWTag of CBW
 130                  long unsigned int dCBWDataTransferLength;//dCBWDataTransferLength of CBW
 131                  unsigned char bmCBWFlags;
 132                  unsigned char bCBWLUN;
 133                  unsigned char bCBWCBLength;
 134                  unsigned char CBWCB[12];//for UFI Command all have 12bit
 135          } struct_CBW ;
 136          
 137          struct_CBW bulk_CBW;
 138          //CSW数据内容,默认都为Good Status
 139          unsigned char bulk_CSW[13] = {0x55, 0x53, 0x42, 0x53,   // bytes 4 dCSWSignature
 140                                                  0x00, 0x00, 0x00, 0x00, //bytes 4  dCSWTag
 141                                                  0, 0, 0, 0,             //bytes 4 dDataResiduce
 142                                                  0x00};                  //bCSWStatus  00=good state.   
 143                                                  
 144          
 145          //解析CBW块的数据内容
 146          void InterpretCBW()
 147          {
 148   1              int i;
 149   1      //      printu("InterpretCBW");
 150   1      
 151   1              //保存dCSWTag   
 152   1              bulk_CSW[4]                             =       *(BulkStartPoint + 4);
 153   1              bulk_CSW[5]                             =       *(BulkStartPoint + 5);
 154   1              bulk_CSW[6]                             =       *(BulkStartPoint + 6);
 155   1              bulk_CSW[7]                             =       *(BulkStartPoint + 7);
 156   1              
 157   1              //读取CBWCB
 158   1              for (i=0; i<12; i++)
 159   1              {
 160   2                      bulk_CBW.CBWCB[i] =     *(BulkStartPoint + i + 15);
 161   2              }
 162   1      
 163   1              switch (bulk_CBW.CBWCB[0])
 164   1              {//根据各个不同的命令字,处理相应的命令
 165   2      //              case 0x04                                               : UFI_Reserved(); break;
 166   2                      case Inquiry                                    : UFI_Inquiry(); break;
 167   2      //              case 0x55                                               : UFI_Reserved(); break;
 168   2                      case Mode_Sense                                 : UFI_Mode_Sense(); break;
 169   2                      case Read10                                             : UFI_Read10(); break;
 170   2      //              case 0xA8                                               : UFI_Reserved(); break;
 171   2                      case Read_Capacity                              : UFI_Read_Capacity(); break;
 172   2                      case Read_Format_Capacities             : UFI_Read_Format_Capacities(); break;
 173   2      //              case 0x03                                               : UFI_Reserved(); break;
 174   2      //              case 0x01                                               : UFI_Reserved(); break;
 175   2      //              case 0x2B                                               : UFI_Reserved(); break;
 176   2      //              case 0x1D                                               : UFI_Reserved(); break;
 177   2      //              case 0x1B                                               : UFI_Reserved(); break;
 178   2                      case Test_Unit_Ready                    : UFI_Test_Unit_Ready(); break;
C51 COMPILER V7.20   BULK_ONLY                                                             03/21/2007 13:33:19 PAGE 4   

 179   2                      case Verify                                             : UFI_Verify(); break;
 180   2                      case Write10                                    : UFI_Write10(); break;
 181   2      //              case 0xAA                                               : UFI_Reserved(); break;
 182   2      //              case 0x2E                                               : UFI_Reserved(); break;
 183   2                      case Medium_Removal                             : UFI_Medium_Removal(); break;
 184   2                      default                                                 : UFI_Reserved(); break;
 185   2              }
 186   1                      
 187   1      }
 188          
 189          
 190          void UFI_Inquiry()
 191          {
 192   1              if (bulk_CBW.CBWCB[4] == 0)
 193   1              return;
 194   1      
 195   1              bulk_state = BULK_DATA_END;//置传输状态为Bulk_Data_End,当这个阶段完成后,程序会接着传送CSW,符合USB协议要求
 196   1              WriteEpBulk(1, sizeof (B_InquiryData), B_InquiryData);//向Bulk-In端点写入数据
 197   1      
 198   1      }
 199          
 200          
 201          void UFI_Read_Format_Capacities()
 202          {
 203   1              if (bulk_CBW.CBWCB[7] == 0 && bulk_CBW.CBWCB[8] == 0)
 204   1              return;
 205   1      
 206   1              bulk_state = BULK_DATA_END;//置传输状态为Bulk_Data_End
 207   1              WriteEpBulk(1, sizeof (B_Read_Format_capacities), B_Read_Format_capacities);//向Bulk-In端点写入数据
 208   1      
 209   1      }
 210          
 211          
 212          void UFI_Read_Capacity()
 213          {
 214   1      
 215   1              bulk_state = BULK_DATA_END;//置传输状态为Bulk_Data_End
 216   1              WriteEpBulk(1, sizeof (B_Read_Capacity), B_Read_Capacity);//向Bulk-In端点写入数据
 217   1      
 218   1      }
 219          
 220          void UFI_Mode_Sense()
 221          {
 222   1              dDataResiduce = bulk_CBW.dCBWDataTransferLength;
 223   1              bulk_state = BULK_DATA_END;//置传输状态为Bulk_Data_End
 224   1      
 225   1              if (bulk_CBW.CBWCB[2] == SCSI_MSPGCD_TPP)
 226   1              {                       //Page Code=Timer and Potect Page
 227   2                      WriteEpBulk(1, sizeof (B_Mode_Sense_TPP), B_Mode_Sense_TPP);
 228   2              }
 229   1              else if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_RETALL)
 230   1              {       //Page Code=All
 231   2                      WriteEpBulk(1, sizeof (B_Mode_Sense_ALL), B_Mode_Sense_ALL);
 232   2              }
 233   1              else 
 234   1              {                                                                                               //Page Code=Zero                
 235   2                      WriteEpBulk(1, sizeof (B_Mode_Sense_ZERO), B_Mode_Sense_ZERO);
 236   2              }
 237   1      }
 238          
 239          void UFI_Read10()
 240          {
C51 COMPILER V7.20   BULK_ONLY                                                             03/21/2007 13:33:19 PAGE 5   

 241   1              int i;
 242   1      //      printu("UFI_Read10__1\n");      
 243   1      
 244   1              for (i=0; i<4; i++) 
 245   1              {
 246   2                      Logical_Block_Address = (Logical_Block_Address << 8) + bulk_CBW.CBWCB[2 + i];   //要传的数据的起始簇
 247   2              }
 248   1      
 249   1              Transfer_Length = bulk_CBW.CBWCB[7] * 256 + bulk_CBW.CBWCB[8];                                          //要传的扇区数
 250   1      

⌨️ 快捷键说明

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