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

📄 usb.lst

📁 关于 at89c51snd1c 的海量存储mass storge的基于keil c的源代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 156          
 157          void Get_Descriptor(unsigned char DesType,unsigned char nLength)     //????      //得到描述符
 158          {
 159   1              if(DesType==0x01)                                                                                                          //取设备描述符
 160   1                      WriteEp(0,18,Device_Descriptor);
 161   1      
 162   1              if((DesType==0x02)&&(nLength==0x09))                                                   //取端口描述符
 163   1                      WriteEp(0,9,Configuration_Descriptor_All);
 164   1      
 165   1              if((DesType==0x02)&&(nLength==0xff))                                                   //取端点描述符
 166   1              {
 167   2                  WriteEp(0,32,Configuration_Descriptor_All);
 168   2                  WriteEp(0,2,&Device_Descriptor[4]);
 169   2              }
 170   1      
 171   1              if((DesType==0x02)&&(nLength==0x20)) 
 172   1                      WriteEp(0,32,Configuration_Descriptor_All);                            //取配置描述符
 173   1      }
 174          
 175          void Set_Configuration(unsigned char wValue)            //设置配置
 176          {
 177   1        if(wValue == 0)
 178   1        {
 179   2                      UEPNUM=0x00;    UEPCONX=0x80;
C51 COMPILER V7.50   USB                                                                   03/19/2006 13:41:49 PAGE 4   

 180   2                      UEPNUM=0x01;    UEPCONX=0x86;
 181   2                      UEPNUM=0x02;    UEPCONX=0x82;
 182   2                      USBCON&=(~CONFG);
 183   2                      WriteEp(0,0,0);                                                         //状态传送阶段之前完成指定操作
 184   2        }
 185   1        else if(wValue == 1) 
 186   1        {
 187   2                      UEPNUM=0x00;    UEPCONX=0x80;
 188   2                      UEPNUM=0x01;    UEPCONX=0x86;
 189   2                      UEPNUM=0x02;    UEPCONX=0x82;
 190   2                      USBCON|=CONFG;
 191   2                      WriteEp(0,0,0);                                                         //状态传送阶段之前完成指定操作
 192   2        }
 193   1      }
 194          
 195          void Ep0()            //?????????                              //---端点0处理主函数
 196          {
 197   1        unsigned char data DT[32]={0,};
 198   1        unsigned char data i;
 199   1        i = ReadEp(0,DT);
 200   1        if (((DT[0] & 0x60)==0) && i)
 201   1        {
 202   2          switch (DT[1])
 203   2          {
 204   3            case set_address                          :Set_Address(DT[2]);                    break;  //设置地址
 205   3            case get_descriptor                       :Get_Descriptor(DT[3],DT[6]);   break;  //取描述符
 206   3            case set_configuration        :Set_Configuration(DT[2]);          break;  //设置配置
 207   3            default                                           :;                                                  break;
 208   3              }
 209   2        }
 210   1        else if(DT[0]==0xa1)                                                          //非标准USB请求
 211   1              {
 212   2                      WriteEp(0,0,0);
 213   2              }                                                                                                       
 214   1      }
 215          
 216          /******************************************************************************/
 217          /**                   以下为利用Bulk_Only传输协议的函数部分                  **/
 218          /******************************************************************************/
 219          unsigned char data bulk_CSW[]={0x55,0x53,0x42,0x53,     // bytes 4 dCSWSignature
 220                                                        0x00,0x00,0x00,0x00,          //bytes 4  dCSWTag
 221                                                        0x00,0x00,0x00,0x00,              //bytes 4 dDataResiduce
 222                                                        0x00};                            //bCSWStatus  00=good state.
 223          
 224          typedef struct _STRUCT_CBW
 225          {
 226                  unsigned char CBWCB[12];                        //for UFI Command all have 12bit
 227          
 228          } struct_CBW;
 229          
 230          struct_CBW data bulk_CBW;
 231          
 232          void WriteEpBulk(unsigned char EpNum,unsigned char nLength,unsigned char *Data)
 233          {
 234   1              unsigned char data i;
 235   1              UEPNUM=EpNum;                                           //---设置端点号
 236   1              UEPSTAX|=DIR;                                           //...设置为In模式
 237   1              for(i=0;i<nLength;i++) UEPDATX=Data[i];         //---填缓冲区
 238   1              UEPSTAX|=TXRDY;                                     //---发送数据
 239   1      }
 240          
 241          void TransmitCSW()                                                                      //向Host返回CSW
C51 COMPILER V7.50   USB                                                                   03/19/2006 13:41:49 PAGE 5   

 242          {
 243   1        WriteEpBulk(1, sizeof(bulk_CSW), bulk_CSW);
 244   1        while(!(UEPSTAX&TXCMP)) ;
 245   1        UEPSTAX&=(~(TXCMP));                                          //清除TXCMP
 246   1        UEPINT = 0;
 247   1      }
 248          
 249          void main_txdone()                                                       //数据发送完毕给出回复
 250          {
 251   1        UEPSTAX&=(~(TXCMP));                                           //清除TXCMP
 252   1        TransmitCSW();
 253   1      }
 254          
 255          //////////////////////////////////有关输出端点的调用//////////////////////////////////////////////
 256          #define Inquiry                                                 0x12
 257          #define Mode_Sense                                              0x1A
 258          #define Read10                                                  0x28
 259          #define Read_Capacity                                   0x25 
 260          #define Read_Format_Capacities          0x23 
 261          #define Test_Unit_Ready                                 0x00 
 262          #define Verify                                                  0x2F 
 263          #define Write10                                                 0x2A 
 264          #define Medium_Removal                                  0x1E
 265          
 266          #define SCSI_MSPGCD_TPP                     0x1C
 267          #define SCSI_MSPGCD_RETALL                          0x3F
 268          
 269          //SCSI-Inquiry命令的返回数据  
 270          code unsigned char B_InquiryData[] = {
 271                                                                  0x00,                          //Direct Access Device
 272                                                                  0x80,                          //RMB
 273                                                                  0x00,                          //ISO/ECMA/ANSI
 274                                                                  0x01,                          //Response Data Format
 275                                                                  0x1f,                          //Additional Length
 276                                                                  0x00,                          //Reserved
 277                                                                  0x00,                          //Reserved
 278                                                                  0x00,                          //Reserved 
 279                                                                  'U', 'E', 'S', 'T', 'C', '-', 'Z', 'H',        //Vendor Information
 280                                                                  'a', 'n', 'g', ' ', 'T', 'i', 'a', 'n', ' ', 'y', 'i',' ', 'V', '1', '.', '0', //Product Identifica
             -tion
 281                                                                  0, 0, 0, 0};                   //Product Revision Level n.nn
 282          
 283          //SCSI-Read_Format_capacities命令的返回数据      
 284          code unsigned char B_Read_Format_capacities[] = {0x00, 0x00, 0x00, 0x10,                //capacity list header
 285                                                                                  0x00, 0x00, 0x07, 0xf5, 0x01, 0x00, 0x02, 0x00, //capacity descriptor
 286                                                                              //Number of Blocks =2037,unformatted media,blocklength = 512Bytes
 287                                                                                  0x00, 0x00, 0x07, 0xfd, 0x00, 0x00, 0x02, 0x00  //Formattable Capacity Descriptors
 288                                                                                  };
 289          //SCSI-Read_Capacity命令的返回数据
 290          code unsigned char B_Read_Capacity[] = {
 291                                                                          0x00, 0x00, 0xfe, 0xa0,    //Last  Logical Block Address for 32MB 
 292                                                                          0x00, 0x00, 0x02, 0x00     //block length in bytes
 293                                                                          };
 294          //SCSI-Mode_Sense命令的返回数据                         
 295          code unsigned char B_Mode_Sense_ALL[] = {0x0b, 0x00,       //Mode Data Length
 296                                                                  0x00, 0x08, 0x00, 0x00,
 297                                                                  0x7d, 0, 0, 0, 0x02, 0x00
 298                                                                  };
 299          //SCSI-Mode_Sense命令的返回数据                 
 300          code unsigned char B_Mode_Sense_TPP[] = {0xf0, 0x00,       //Mode Data Length
 301                                                                  05, 00, 00, 00, 00, 0x0b, 00, 00, 00, 00, 0x24, 00, 00, 00, 00, 00
 302                                                                  };
C51 COMPILER V7.50   USB                                                                   03/19/2006 13:41:49 PAGE 6   

 303          //SCSI-Mode_Sense命令的返回数据                 
 304          code unsigned char B_Mode_Sense_ZERO[] = {0x00, 0x06,      //Mode Data Length
 305                                                                  0x00,                          //Medium Type Code
 306                                                                  0,                             //write enabled
 307                                                                  0, 0, 0, 0                     //reserved       
 308          };
 309          
 310          
 311          void SCSI_Mode_Sense()
 312          {
 313   1        if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_TPP)                 //Page Code=Timer and Potect Page
 314   1          {WriteEpBulk(1, sizeof(B_Mode_Sense_TPP), B_Mode_Sense_TPP);}
 315   1        else if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_RETALL)                 //Page Code=All
 316   1          {WriteEpBulk(1, sizeof(B_Mode_Sense_ALL), B_Mode_Sense_ALL);}

⌨️ 快捷键说明

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