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

📄 usb_disk.lst

📁 32M 优盘源码 AT89C51SND1C K9F5608
💻 LST
📖 第 1 页 / 共 3 页
字号:
 167   2              }       
 168   1              UEPSTAX&=~(RXOUTB0|RXOUTB1|RXSETUP);
 169   1              return(i);
 170   1      }
 171          
 172          void WriteEp(unsigned char EpNum,unsigned char nLength,unsigned char *Data)
 173          {
 174   1              unsigned char data i=0;
 175   1              UEPNUM=EpNum;
 176   1              UEPSTAX|=DIR;
 177   1              while(nLength--) UEPDATX=Data[i++];     
 178   1              UEPSTAX|=TXRDY;
C51 COMPILER V8.02   USB_DISK                                                              08/24/2008 00:08:02 PAGE 4   

 179   1              while(!(UEPSTAX&TXCMP)) ;
 180   1              UEPSTAX&=(~(TXCMP));
 181   1      }
 182          
 183          
 184          
 185          void Set_Address(unsigned char EpNum)
 186          {
 187   1              WriteEp(0,0,0);
 188   1              USBADDR|=EpNum;
 189   1              USBADDR|=FEN;
 190   1              USBCON|=FADDEN;
 191   1      }
 192          
 193          
 194          void Get_Descriptor(unsigned char DesType,unsigned char nLength)
 195          {
 196   1              if(DesType==0x01)
 197   1                      WriteEp(0,18,Device_Descriptor);
 198   1      
 199   1              else if(DesType==0x02)
 200   1              {
 201   2                      if(nLength==0x09)
 202   2                      {
 203   3                              WriteEp(0,9,Configuration_Descriptor_All);
 204   3                      }
 205   2                      else if(nLength==0xff)
 206   2                      {
 207   3                              WriteEp(0,32,Configuration_Descriptor_All);
 208   3                      WriteEp(0,2,&Device_Descriptor[4]);
 209   3                      }
 210   2                      else if(nLength==0x20)
 211   2                      {
 212   3                              WriteEp(0,32,Configuration_Descriptor_All);
 213   3                      }
 214   2              }       
 215   1      }
 216          
 217          void Set_Configuration(unsigned char wValue)
 218          {
 219   1        if(wValue == 0)
 220   1        {
 221   2                      UEPNUM=0x00;    UEPCONX=0x80;
 222   2                      UEPNUM=0x01;    UEPCONX=0x86;
 223   2                      UEPNUM=0x02;    UEPCONX=0x82;
 224   2                      USBCON&=(~CONFG);
 225   2                      WriteEp(0,0,0); 
 226   2        }
 227   1        else if(wValue == 1) 
 228   1        {
 229   2                      UEPNUM=0x00;    UEPCONX=0x80;
 230   2                      UEPNUM=0x01;    UEPCONX=0x86;
 231   2                      UEPNUM=0x02;    UEPCONX=0x82;
 232   2                      USBCON|=CONFG;
 233   2                      WriteEp(0,0,0); 
 234   2        }
 235   1      }
 236          
 237          void Ep0()
 238          {
 239   1        unsigned char data DT[32]={0,};
 240   1        unsigned char data i;
C51 COMPILER V8.02   USB_DISK                                                              08/24/2008 00:08:02 PAGE 5   

 241   1        i = ReadEp(0,DT);
 242   1        if (((DT[0] & 0x60)==0) && i)
 243   1        {
 244   2          switch (DT[1])
 245   2          {
 246   3            case set_address                          :Set_Address(DT[2]);                    break;
 247   3            case get_descriptor                       :Get_Descriptor(DT[3],DT[6]);   break;
 248   3            case set_configuration        :Set_Configuration(DT[2]);          break;
 249   3            default                                           :;                                                  break;
 250   3              }
 251   2        }
 252   1        else if(DT[0]==0xa1)
 253   1              {
 254   2                      WriteEp(0,0,0);
 255   2              }                                                                                                       
 256   1      }
 257          
 258          
 259          void WriteEpBulk(unsigned char EpNum,unsigned char nLength,unsigned char *Data)
 260          {
 261   1              unsigned char data i;
 262   1              UEPNUM=EpNum;
 263   1              UEPSTAX|=DIR;
 264   1              for(i=0;i<nLength;i++) UEPDATX=Data[i];
 265   1              UEPSTAX|=TXRDY;
 266   1      }
 267          
 268          void TransmitCSW()
 269          {
 270   1        WriteEpBulk(1, sizeof(bulk_CSW), bulk_CSW);
 271   1        while(!(UEPSTAX&TXCMP)) ;
 272   1        UEPSTAX&=(~(TXCMP));
 273   1      }
 274          
 275          void main_txdone()
 276          {
 277   1        UEPSTAX&=(~(TXCMP));
 278   1        TransmitCSW();
 279   1      }
 280          
 281           void SCSI_Mode_Sense()
 282          {
 283   1        if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_TPP)                 //Page Code=Timer and Potect Page
 284   1          {WriteEpBulk(1, sizeof(B_Mode_Sense_TPP), B_Mode_Sense_TPP);}
 285   1        else if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_RETALL)                 //Page Code=All
 286   1          {WriteEpBulk(1, sizeof(B_Mode_Sense_ALL), B_Mode_Sense_ALL);}
 287   1        else {WriteEpBulk(1, sizeof(B_Mode_Sense_ZERO), B_Mode_Sense_ZERO);}
 288   1      }
 289          
 290          void SCSI_Read_Format_Capacities()
 291          {
 292   1        if(bulk_CBW.CBWCB[7]==0 && bulk_CBW.CBWCB[8]==0)return;
 293   1        WriteEpBulk(1, sizeof(B_Read_Format_capacities), B_Read_Format_capacities);
 294   1      }
 295          
 296          void SCSI_Read10()
 297          {
 298   1        unsigned char i;
 299   1              union
 300   1              {
 301   1                      unsigned long   Block;
 302   1                      unsigned char   Addr[4];
C51 COMPILER V8.02   USB_DISK                                                              08/24/2008 00:08:02 PAGE 6   

 303   1              }BLK;
 304   1          unsigned char length;
 305   1      
 306   1              BLK.Addr[2] = bulk_CBW.CBWCB[4];
 307   1              BLK.Addr[3] = bulk_CBW.CBWCB[5];
 308   1      
 309   1          length = bulk_CBW.CBWCB[8];
 310   1          while(length>0)
 311   1          {
 312   2                NfWriteCmd(0x00);
 313   2                NfWriteAddr(0);
 314   2                NfWriteAddr(BLK.Addr[3]);
 315   2                NfWriteAddr(BLK.Addr[2]);
 316   2      
 317   2                UEPNUM=0x01;
 318   2                UEPSTAX|=DIR;
 319   2                NfWaitBusy();
 320   2      
 321   2                for(i=0;i<4;i++)
 322   2                {
 323   3                        ReadFlash();
 324   3                        UEPSTAX|=TXRDY;
 325   3                        while(!(UEPSTAX&TXCMP));
 326   3                        UEPSTAX&=(~(TXCMP));
 327   3                }
 328   2                NfWriteCmd(0x01);
 329   2                NfWriteAddr(0);
 330   2                NfWriteAddr(BLK.Addr[3]);
 331   2                NfWriteAddr(BLK.Addr[2]);
 332   2      
 333   2                UEPNUM=0x01;
 334   2                UEPSTAX|=DIR;
 335   2                NfWaitBusy();
 336   2      
 337   2                for(i=0;i<4;i++)
 338   2                {
 339   3                        ReadFlash();
 340   3                        UEPSTAX|=TXRDY;

⌨️ 快捷键说明

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