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

📄 bulk_only.lst

📁 用89C51SND1C实现MP3播放器的源代码.用KEIL c51编写.
💻 LST
字号:
C51 COMPILER V6.23a  BULK_ONLY                                                             12/02/2003 11:01:15 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE BULK_ONLY
OBJECT MODULE PLACED IN bulk_only.OBJ
COMPILER INVOKED BY: d:\SoftDev\Keil\C51\BIN\C51.EXE bulk_only.c LARGE BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /****************************************************************/
   2          /*                                      UP-MP3DIY100                                                            */
   3          /*              Beijing Universal Pioneering Technology Co., LTD                */
   4          /*              CopyRighted,All right Reserved  www.up-tech.com                 */
   5          /*                                              July,2003                                                               */
   6          /*                              010-62387873  62381842                                                  */
   7          /****************************************************************/
   8          
   9          //this file to process the request about bulk_only
  10          #include <string.h>
  11          
  12          #include "bulk_only.h"
  13          #include "fat16.h"
  14          #include "usbdisk.h"
  15          #include "uart.h"
  16          #include "flash.h"
  17          
  18          //extern unsigned char  EpBuf[];
  19          
  20          long unsigned int dDataResiduce=0;//USB传输过程中,未传完的剩余数据
  21          unsigned char bulk_state=0;             //当前传送状态
  22          unsigned char *pCurrentBuf;             //数据传送指针
  23          long int nBufCount=0;           //传送数据当前位置
  24          
  25          
  26          //unsigned char MSC_dCBWSignature[]={0x55,0x53,0x42,0x43};
  27          //unsigned char MSC_dCSWSignature[]={0x55,0x53,0x42,0x53};
  28          
  29          //以下是SCSI命令的命令字与其代码的对应表
  30          #define Format_Unit                             0x04
  31          #define Inquiry                                         0x12 
  32          #define Mode_Select                             0x55 
  33          #define Mode_Sense                              0x1A 
  34          #define Medium_Removal                  0x1E
  35          #define Read10                                  0x28 
  36          #define Read12                                  0xA8 
  37          #define Read_Capacity                   0x25 
  38          #define Read_Format_Capacities  0x23 
  39          #define Request_Sense                   0x03 
  40          #define Rezero                                  0x01 
  41          #define Seek10                                  0x2B 
  42          #define Send_Diag                               0x1D 
  43          #define Start_Stop_Unit                         0x1B 
  44          #define Test_Unit_Ready                         0x00 
  45          #define Verify                                  0x2F 
  46          #define Write10                                         0x2A 
  47          #define Write12                                         0xAA 
  48          #define Write_And_Verify                        0x2E 
  49          /****************************************/
  50          
  51          
  52          
  53          #define SCSI_MSPGCD_TPP                 0x1c
  54          #define SCSI_MSPGCD_RETALL              0x3f
  55          
C51 COMPILER V6.23a  BULK_ONLY                                                             12/02/2003 11:01:15 PAGE 2   

  56          unsigned char Bulk_Out_Buf[64]; //64字节的端点缓存
  57          unsigned char Page_Buf[512];    //512字节的页缓存
  58          
  59          
  60          short int Transfer_Length;                      //要传送的扁区长度
  61          long int Logical_Block_Address;         //逻辑地址
  62          long int nCurrentPage,nBeginPage;       //当前扇区和超始扇区
  63          long int nCurrentBlock;                         //当前Block
  64          
  65          //SCSI-Inquiry命令的返回数据
  66          code unsigned char B_InquiryData[]={
  67                                                                  0x00,   //Direct Access Device
  68                                                                  0x80,   //RMB
  69                                                                  0x00,   //ISO/ECMA/ANSI
  70                                                                  0x01,   //Response Data Format
  71                                                                  0x1f,   //Additional Length
  72                                                                  0x00,   //Reserved
  73                                                                  0x00,   //Reserved
  74                                                                  0x00,   //Reserved
  75                                                                  'U','P','-','T','E','C','H',' ',        //Vendor Information
  76                                                                  'M','P','3',' ','P','l','a','y','e','r',' ','V','1','.','0','0',//Product Identification
  77                                                                  0,0,0,0};       //Product Revision Level n.nn
  78          
  79          
  80          //code unsigned char CapactiyLstHd[]={0x00,0x00,0x00,0x10};
  81          //code unsigned char bBlockLength[]={0x00,0x02,0x00};           //512 Byte
  82          //code unsigned char nLastLBAddr[]={0x00,0x01,0xf3,0xff};       //Last  Logical Block Address for 64MB
  83          
  84          //SCSI-Read_Format_capacities命令的返回数据
  85          code unsigned char B_Read_Format_capacities[]={0x00,0x00,0x00,0x10,     //capacity list header
  86                                                                                  0x00,0x00,0x04,0x00,    0x01,           0x00,0x02,0x00, //capacity descriptor
  87                                                                          //      Number of Blocks =1024,unformatted media,blocklength = 512Bytes
  88                                                                                  0x00,0x00,0x04,0x00,    0x00,           0x00,0x02,0x00  //Formattable Capacity Descriptors
  89                                                                                  };
  90          //SCSI-Read_Capacity命令的返回数据
  91          code unsigned char B_Read_Capacity[]={
  92                                                                          0x00,0x00,0x7f,0xe0,    //Last  Logical Block Address for 64MB
  93                                                                          0x00,0x00,0x02,0x00     //block length in bytes
  94                                                                          };
  95          
  96          //SCSI-Mode_Sense命令的返回数据                 
  97          code unsigned char B_Mode_Sense_ALL[]={0x0b,0x00,//Mode Data Length
  98                                                                  0x00,0x08,0x00,0x00,
  99                                                                  0x7d,0,0,0,0x02,0x00
 100                                                                  };
 101          
 102          //SCSI-Mode_Sense命令的返回数据                 
 103          code unsigned char B_Mode_Sense_TPP[]={0xf0,0x00,//Mode Data Length
 104                                                                  05,00,00,00,00,0x0b,00,00,00,00,0x24,00,00,00,00,00
 105                                                                  };
 106          //SCSI-Mode_Sense命令的返回数据                 
 107          code unsigned char B_Mode_Sense_ZERO[]={0x00,0x06,//Mode Data Length
 108                                                                  0x00,   //Medium Type Code
 109                                                                  0,//write enabled
 110                                                                  0,0,0,0//reserved
 111          };
 112          
 113          //CSW数据内容,默认都为Good Status
 114          unsigned char bulk_CSW[]={0x55,0x53,0x42,0x53,  // bytes 4 dCSWSignature
 115                                                  0x00,0x00,0x00,0x00,    //bytes 4  dCSWTag
 116                                                  0,0,0,0,                //bytes 4 dDataResiduce
 117                                                  0x00};                  //bCSWStatus  00=good state.
C51 COMPILER V6.23a  BULK_ONLY                                                             12/02/2003 11:01:15 PAGE 3   

 118                                                  
 119          
 120          typedef struct _STRUCT_CBW
 121          {
 122                  unsigned char dCBWSignature[4];
 123                  unsigned char dCBWTag[4];       //dCBWTag of CBW
 124                  long unsigned int dCBWDataTransferLength;//dCBWDataTransferLength of CBW
 125                  unsigned char bmCBWFlags;
 126                  unsigned char bCBWLUN;
 127                  unsigned char bCBWCBLength;
 128                  unsigned char CBWCB[12];//for UFI Command all have 12bit
 129          } struct_CBW;
 130          
 131          struct_CBW bulk_CBW;
 132          
 133          //解析CBW块的数据内容
 134          void InterpretCBW()
 135          {
 136   1              int i;
 137   1      //      printu("InterpretCBW");
 138   1      
 139   1              //保存dCSWTag   
 140   1              bulk_CSW[4]                             =       Bulk_Out_Buf[4];
 141   1              bulk_CSW[5]                             =       Bulk_Out_Buf[5];
 142   1              bulk_CSW[6]                             =       Bulk_Out_Buf[6];
 143   1              bulk_CSW[7]                             =       Bulk_Out_Buf[7];
 144   1              
 145   1              //读取CBWCB
 146   1              for(i=0;i<12;i++)
 147   1              bulk_CBW.CBWCB  [i]                             =       Bulk_Out_Buf[i+15];
 148   1      
 149   1              switch(bulk_CBW.CBWCB[0]){//根据各个不同的命令字,处理相应的命令
 150   2      //              case 0x04                                               :UFI_Reserved();break;
 151   2                      case Inquiry                                    :UFI_Inquiry();break;
 152   2      //              case 0x55                                               :UFI_Reserved();break;
 153   2                      case Mode_Sense                                 :UFI_Mode_Sense();break;
 154   2                      case Read10                                             :UFI_Read10();break;
 155   2      //              case 0xA8                                               :UFI_Reserved();break;
 156   2                      case Read_Capacity                              :UFI_Read_Capacity();break;
 157   2                      case Read_Format_Capacities             :UFI_Read_Format_Capacities();break;
 158   2      //              case 0x03                                               :UFI_Reserved();break;
 159   2      //              case 0x01                                               :UFI_Reserved();break;
 160   2      //              case 0x2B                                               :UFI_Reserved();break;
 161   2      //              case 0x1D                                               :UFI_Reserved();break;
 162   2      //              case 0x1B                                               :UFI_Reserved();break;
 163   2                      case Test_Unit_Ready                    :UFI_Test_Unit_Ready();break;
 164   2                      case Verify                                             :UFI_Verify();break;
 165   2                      case Write10                                    :UFI_Write10();break;
 166   2      //              case 0xAA                                               :UFI_Reserved();break;
 167   2      //              case 0x2E                                               :UFI_Reserved();break;
 168   2                      case Medium_Removal                             :UFI_Medium_Removal();break;
 169   2                      default                                                 :UFI_Reserved();break;
 170   2              }
 171   1                      
 172   1      }
 173          
 174          
 175          void UFI_Inquiry()
 176          {
 177   1              if(bulk_CBW.CBWCB[4]==0)
 178   1                      return;
 179   1                      bulk_state = BULK_DATA_END;//置传输状态为Bulk_Data_End,当这个阶段完成后,程序会接着传送CSW,符合USB协议要

⌨️ 快捷键说明

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