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

📄 usb.lst

📁 基于at89c51snd1c的硬盘MP3播放器
💻 LST
📖 第 1 页 / 共 3 页
字号:
 565   3           switch (Control_Data.DeviceRequest.bRequest)
 566   3            {
 567   4                 case     CLEAR_FEATURE: clear_feature(0);break;
 568   4                 case       SET_FEATURE: set_feature(0);break;
 569   4                 case       SET_ADDRESS: set_usb_address();break;                  //set_address                 
 570   4                 case    SET_DESCRIPTOR: set_descriptor();break;                //set_descriptor
 571   4                 case SET_CONFIGURATION: set_configuration(); break;         //set_configurat                           
 572   4                 default: break;
 573   4                }break;
 574   3               case 1:
 575   3            switch (Control_Data.DeviceRequest.bRequest)
 576   3                 {
 577   4                  case CLEAR_FEATURE:  clear_feature(1);break;
 578   4                  case   SET_FEATURE:  set_feature(1); break;
 579   4              case SET_INTERFACE: set_interface();break;
 580   4                  default: break;
 581   4              }break;
 582   3               case 2:
 583   3                switch (Control_Data.DeviceRequest.bRequest)
 584   3                 {
 585   4                  case CLEAR_FEATURE: clear_feature(2);break;
 586   4                  case   SET_FEATURE: set_feature(2);break;
 587   4              default: break;      
 588   4                 }break;
 589   3               default: break;
 590   3          }
 591   2        }
 592   1      }
 593          
 594          
 595          void Return_CSW(unsigned long int DataResidue,unsigned char status)          //返回CSW数据包
 596          { 
 597   1       csw.dCSWTag=cbw.dCBWTag;
 598   1       csw.dCSWDataResidue=DataResidue;
 599   1       csw.bCSWStatus=status;
 600   1       write_endpoint_buff(1,sizeof(CSW),(unsigned char *)(&csw));
 601   1       USB_usb_endp1_in=0;
 602   1       USB_usb_endp2_out=0;
 603   1       SCSI_Command=1;
 604   1       SCSI_Data=0;
 605   1      }
 606          
C51 COMPILER V8.02   USB                                                                   08/03/2008 09:58:47 PAGE 11  

 607          
 608          void write_10(void)                                                         //SCSI写操作
 609          {
 610   1       unsigned long int LBA,Byte_Count;
 611   1       unsigned char i;
 612   1       if(SCSI_Data)
 613   1        {
 614   2         ((unsigned char*)&LBA)[0]=cbw.CBWCB[2];
 615   2         ((unsigned char*)&LBA)[1]=cbw.CBWCB[3];
 616   2         ((unsigned char*)&LBA)[2]=cbw.CBWCB[4];
 617   2         ((unsigned char*)&LBA)[3]=cbw.CBWCB[5];
 618   2         ((unsigned char*)&Byte_Count)[0]=0;
 619   2         ((unsigned char*)&Byte_Count)[1]=cbw.CBWCB[7];
 620   2         ((unsigned char*)&Byte_Count)[2]=cbw.CBWCB[8];
 621   2         ((unsigned char*)&Byte_Count)[3]=0;
 622   2         Byte_Count<<=1;
 623   2         pData=buffer;
 624   2         while(USB_usb_endp2_out)
 625   2          {
 626   3           if((((unsigned char *)&Byte_Count)[3]==0)&&((((unsigned char *)&Byte_Count)[2]&0x01)==0))
 627   3            {
 628   4             wait_IDE_busy();
 629   4             write_IDE_LBA(LBA);
 630   4             write_IDE_sector_count(1);
 631   4             write_IDE_command(IDE_Write_Sectors);
 632   4             IDE_Address=IDE_Data;
 633   4             set_IDE_address();
 634   4             LBA++;
 635   4            }
 636   3           while(!(RXOUTB0||RXOUTB1));
 637   3           if(Byte_Count>MAX_BULK_DATA_SIZE)
 638   3                {
 639   4             UEPNUM=2;               //选择端点
 640   4             for(i=0;i<MAX_BULK_DATA_SIZE;i++)
 641   4              {
 642   5               while(!IDE_IORDY);
 643   5               IDE_DIOW=0;
 644   5               IDE_DATA_L=UEPDATX;
 645   5               i++;
 646   5               IDE_DATA_H=UEPDATX;
 647   5               IDE_DIOW=1;
 648   5              }
 649   4             UEPSTAX=UEPSTAX & (~0x42);//清除RXOUTB 位
 650   4                 Byte_Count-=MAX_BULK_DATA_SIZE;
 651   4                }
 652   3           else 
 653   3                {
 654   4             UEPNUM=2;               //选择端点
 655   4             for(i=0;i<Byte_Count;i++)
 656   4              {
 657   5               while(!IDE_IORDY);
 658   5               IDE_DIOW=0;
 659   5               IDE_DATA_L=UEPDATX;
 660   5               i++;
 661   5               IDE_DATA_H=UEPDATX;
 662   5               IDE_DIOW=1;
 663   5              }
 664   4             UEPSTAX=UEPSTAX & (~0x42);//清除RXOUTB 位             
 665   4             Return_CSW(0x00,SUCCESS);
 666   4             wait_IDE_busy();
 667   4             IDE_Address=IDE_Bus_Not_Use;
 668   4             set_IDE_address();
C51 COMPILER V8.02   USB                                                                   08/03/2008 09:58:47 PAGE 12  

 669   4                }
 670   3          }
 671   2        }
 672   1       else
 673   1        {
 674   2         error(3);
 675   2        }
 676   1      }
 677          
 678          void endp2_out(void)                                                     //主端点输出处理
 679          {
 680   1       if(SCSI_Command)
 681   1        {
 682   2         if(read_endpoint_buff(2,sizeof(CBW),(unsigned char *)(&cbw))!=sizeof(CBW)){error(2);return;}
 683   2         if(cbw.dCBWSignature!=0x55534243){error(3);return;}
 684   2         SCSI_Command=0;
 685   2         SCSI_Data=1;
 686   2         if(cbw.bmCBWFlags&0x80)
 687   2          {
 688   3               USB_usb_endp1_in=1;
 689   3               USB_usb_endp2_out=0;
 690   3              }
 691   2         else
 692   2          {
 693   3               USB_usb_endp1_in=0;
 694   3               USB_usb_endp2_out=1;
 695   3           switch(cbw.CBWCB[0])
 696   3            {
 697   4             case        Write_10: USB_LED=!USB_LED;write_10();break;
 698   4             case Test_Unit_Ready: Return_CSW(0x00,SUCCESS);break; 
 699   4             case          Verify: Return_CSW(0x00,SUCCESS);break;
 700   4                 default             : Return_CSW(cbw.dCBWDataTransgerLength,FAIL);break;
 701   4                }
 702   3              }
 703   2        }
 704   1       else
 705   1        {
 706   2         read_endpoint_buff(2,0,0);
 707   2        }
 708   1      }
 709          
 710          
 711          void read_10(void)                                                              //SCSI读处理
 712          {
 713   1       unsigned long int LBA=0,Byte_Count;
 714   1       unsigned char i;
 715   1       if(SCSI_Data)
 716   1        {
 717   2         ((unsigned char*)&LBA)[0]=cbw.CBWCB[2];
 718   2         ((unsigned char*)&LBA)[1]=cbw.CBWCB[3];
 719   2         ((unsigned char*)&LBA)[2]=cbw.CBWCB[4];
 720   2         ((unsigned char*)&LBA)[3]=cbw.CBWCB[5];
 721   2         ((unsigned char*)&Byte_Count)[0]=0;
 722   2         ((unsigned char*)&Byte_Count)[1]=cbw.CBWCB[7];
 723   2         ((unsigned char*)&Byte_Count)[2]=cbw.CBWCB[8];
 724   2         ((unsigned char*)&Byte_Count)[3]=0;
 725   2         Byte_Count<<=1;
 726   2         pData=buffer;
 727   2         while(USB_usb_endp1_in)
 728   2          {
 729   3           if((((unsigned char *)&Byte_Count)[3]==0)&&((((unsigned char *)&Byte_Count)[2]&0x01)==0))
 730   3            {
C51 COMPILER V8.02   USB                                                                   08/03/2008 09:58:47 PAGE 13  

 731   4             write_IDE_LBA(LBA);
 732   4             write_IDE_sector_count(1);
 733   4             write_IDE_command(IDE_Read_Sectors);
 734   4             IDE_Address=IDE_Data;
 735   4             set_IDE_address();
 736   4             IDE_DATA_H=0xFF;
 737   4             IDE_DATA_L=0xFF;
 738   4             LBA++;
 739   4            }
 740   3           if(Byte_Count>MAX_BULK_DATA_SIZE)
 741   3           {
 742   4            UEPNUM=1;                                 //选择端点
 743   4            for(i=0;i<MAX_BULK_DATA_SIZE;i++)         //填数据寄存器
 744   4             {
 745   5              while(!IDE_IORDY);                      //等待IDE IO口忙
 746   5              IDE_DIOR=0;                             //发读信号
 747   5              UEPDATX=IDE_DATA_L;                     //读低字节
 748   5              i++;
 749   5              UEPDATX=IDE_DATA_H;                     //读高字节
 750   5              IDE_DIOR=1;                             //
 751   5             }
 752   4            UEPSTAX=UEPSTAX | 0x10;                   //设置TXRDY位
 753   4            while(!( UEPSTAX & 0x01 ));                               //等待TXCMP
 754   4            UEPSTAX=UEPSTAX & (~0x01);                                //清除TXCMP
 755   4            Byte_Count-=MAX_BULK_DATA_SIZE;
 756   4           }
 757   3          else
 758   3           {
 759   4            UEPNUM=1;                          //选择端点
 760   4            for(i=0;i<Byte_Count;i++)         //填数据寄存器
 761   4             {
 762   5              while(!IDE_IORDY);
 763   5              IDE_DIOR=0;
 764   5              UEPDATX=IDE_DATA_L;
 765   5              i++;
 766   5              UEPDATX=IDE_DATA_H;
 767   5              IDE_DIOR=1;
 768   5             }
 769   4            UEPSTAX=UEPSTAX | 0x10;              //设置TXRDY位
 770   4            while(!( UEPSTAX & 0x01 ));                               //等待TXCMP
 771   4            UEPSTAX=UEPSTAX & (~0x01);                                        //清除TXCMP
 772   4            Return_CSW(0x00,SUCCESS);
 773   4            
 774   4            IDE_Address=IDE_Bus_Not_Use;
 775   4            set_IDE_address();
 776   4            IDE_DATA_L=0xFF;
 777   4           }
 778   3         }
 779   2       }
 780   1       else error(2);return;
 781   1      }
 782          
 783          void endp1_in(void)                                      //主端点输入处理
 784          {
 785   1          switch(cbw.CBWCB[0])
 786   1          {
 787   2           case              Read_10: USB_LED=!USB_LED;read_10();break;
 788   2           case              Inquiry: write_endpoint_buff(1,0x24,DISK_INF);Return_CSW(0x00,SUCCESS); break;
 789   2           case        Read_Capacity: write_endpoint_buff(1,0x08,DISK_CAPACITY);Return_CSW(0x00,SUCCESS);break;
 790   2           case Read_Format_capacity: write_endpoint_buff(1,0x00,0x00);Return_CSW(cbw.dCBWDataTransgerLength,FAI
             -L);break;
 791   2           case        Request_Sense: write_endpoint_buff(1,0x12,SENSE);Return_CSW(0x00,SUCCESS);break;
C51 COMPILER V8.02   USB                                                                   08/03/2008 09:58:47 PAGE 14  

 792   2               case       Medium_Removal: Return_CSW(0x00,SUCCESS);break;
 793   2               case                 0x1a: write_endpoint_buff(1,0x00,0x00);Return_CSW(cbw.dCBWDataTransgerLength,FAIL);
             -break;
 794   2           default                  : write_endpoint_buff(1,0x00,0x00);Return_CSW(cbw.dCBWDataTransgerLength,FAI
             -L);break;
 795   2              }
 796   1      }
 797          
 798          void usb(void)
 799          {
 800   1       LCD_go_home();
 801   1       prints("移动硬盘模式 ");
 802   1       LCD_line_feed();
 803   1       prints("             ");
 804   1       disconnect_usb();
 805   1       init_usb();
 806   1       connect_usb();
 807   1       while(1)
 808   1        { 
 809   2         read_usb_status();
 810   2         if(status_bus_reset){usb_bus_reset();continue;}
 811   2         if(status_suspend_change){usb_bus_suspend();continue;}
 812   2         if(status_control_out_port){endp0_out();continue;}
 813   2         if(status_control_in_port&&USB_usb_endp0_in){endp0_in();continue;}
 814   2         if(status_main_out_port){endp2_out();continue;}
 815   2         if(status_main_in_port&&USB_usb_endp1_in){endp1_in();continue;}
 816   2         if(key)
 817   2          {
 818   3           if(remove_enable)
 819   3            {
 820   4             if(key==KEY_OK)
 821   4              {
 822   5               key=0;
 823   5               status=STOP;
 824   5               USBCON=0x40;
 825   5               disconnect_usb();
 826   5               return;
 827   5              }
 828   4            }
 829   3           else
 830   3            {
 831   4             key=0;
 832   4            }
 833   3          }
 834   2        }
 835   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2493    ----
   CONSTANT SIZE    =    235    ----
   XDATA SIZE       =     91    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9      36
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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