📄 usb.lst
字号:
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 + -