📄 usbcore.lst
字号:
751 5
752 5 case SET_ADDRESS: //设置地址
753 5 #ifdef DEBUG0
Prints("设置地址。地址为:");
PrintHex(wValue&0xFF); //显示所设置的地址
Prints("\r\n");
#endif
758 5 D12SetAddress(wValue&0xFF); //wValue中的低字节是设置的地址值
759 5 //设置地址没有数据过程,直接进入到状态过程,返回一个0长度的数据包
760 5 SendLength=0;
761 5 NeedZeroPacket=1;
762 5 //将数据通过EP0返回
763 5 UsbEp0SendData();
764 5 break;
765 5
766 5 case SET_CONFIGURATION: //设置配置
767 5 #ifdef DEBUG0
Prints("设置配置。\r\n");
#endif
770 5 //使能非0端点。非0端点只有在设置为非0的配置后才能使能。
771 5 //wValue的低字节为配置的值,如果该值为非0,才能使能非0端点。
772 5 //保存当前配置值
773 5 ConfigValue=wValue&0xFF;
774 5 D12SetEndpointEnable(ConfigValue);
775 5 //返回一个0长度的状态数据包
776 5 SendLength=0;
777 5 NeedZeroPacket=1;
778 5 //将数据通过EP0返回
779 5 UsbEp0SendData();
780 5 break;
781 5
782 5 case SET_DESCRIPTOR: //设置描述符
783 5 #ifdef DEBUG0
Prints("设置描述符。\r\n");
#endif
786 5 break;
787 5
788 5 case SET_FEATURE: //设置特性
789 5 #ifdef DEBUG0
Prints("设置特性。\r\n");
#endif
792 5 break;
793 5
794 5 case SET_INTERFACE: //设置接口
795 5 #ifdef DEBUG0
Prints("设置接口。\r\n");
#endif
798 5 //返回一个0长度的状态数据包
799 5 SendLength=0;
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:19 PAGE 14
800 5 NeedZeroPacket=1;
801 5 //将数据通过EP0返回
802 5 UsbEp0SendData();
803 5 break;
804 5
805 5 default: //未定义的标准请求
806 5 #ifdef DEBUG0
Prints("错误:未定义的标准输出请求。\r\n");
#endif
809 5 break;
810 5 }
811 4 break;
812 4
813 4 case 1: //类请求
814 4 #ifdef DEBUG0
Prints("USB类输出请求:");
#endif
817 4 switch(bRequest)
818 4 {
819 5 case MASS_STORAGE_RESET:
820 5 #ifdef DEBUG0
Prints("大容量存储设备复位。\r\n");
#endif
823 5
824 5 //接下来的数据为命令阶段(CBW)
825 5 TransportStage=COMMAND_STAGE;
826 5 //返回一个0长度的数据包
827 5 SendLength=0;
828 5 NeedZeroPacket=1;
829 5 //将数据通过EP0返回
830 5 UsbEp0SendData();
831 5 break;
832 5
833 5 default:
834 5 #ifdef DEBUG0
Prints("未知请求。\r\n");
#endif
837 5 break;
838 5 }
839 4 break;
840 4
841 4 case 2: //厂商请求
842 4 #ifdef DEBUG0
Prints("USB厂商输出请求:\r\n");
#endif
845 4 break;
846 4
847 4 default: //未定义的请求。这里只显示一个报错信息。
848 4 #ifdef DEBUG0
Prints("错误:未定义的输出请求。\r\n");
#endif
851 4 break;
852 4 }
853 3 }
854 2 }
855 1 //普通数据输出
856 1 else //if(D12ReadEndpointLastStatus(0)&0x20)之else
857 1 {
858 2 D12ReadEndpointBuffer(0,16,Buffer);
859 2 D12ClearBuffer();
860 2 }
861 1 }
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:19 PAGE 15
862 ////////////////////////End of function//////////////////////////////
863
864 /********************************************************************
865 函数功能:端点0输入中断处理函数。
866 入口参数:无。
867 返 回:无。
868 备 注:无。
869 ********************************************************************/
870 void UsbEp0In(void)
871 {
872 1 #ifdef DEBUG0
Prints("USB端点0输入中断。\r\n");
#endif
875 1 //读最后发送状态,这将清除端点0的中断标志位
876 1 D12ReadEndpointLastStatus(1);
877 1 //发送剩余的字节数
878 1 UsbEp0SendData();
879 1 }
880 ////////////////////////End of function//////////////////////////////
881
882 /********************************************************************
883 函数功能:端点1输出中断处理函数。
884 入口参数:无。
885 返 回:无。
886 备 注:无。
887 ********************************************************************/
888 void UsbEp1Out(void)
889 {
890 1 #ifdef DEBUG0
Prints("USB端点1输出中断。\r\n");
#endif
893 1 //读端点最后状态,这将清除端点1输出的中断标志位
894 1 D12ReadEndpointLastStatus(2);
895 1 //清除端点缓冲区
896 1 D12ClearBuffer();
897 1 }
898 ////////////////////////End of function//////////////////////////////
899
900 /********************************************************************
901 函数功能:端点1输入中断处理函数。
902 入口参数:无。
903 返 回:无。
904 备 注:无。
905 ********************************************************************/
906 void UsbEp1In(void)
907 {
908 1 #ifdef DEBUG0
Prints("USB端点1输入中断。\r\n");
#endif
911 1 //读最后发送状态,这将清除端点1输入的中断标志位
912 1 D12ReadEndpointLastStatus(3);
913 1 //端点1输入处于空闲状态
914 1 Ep1InIsBusy=0;
915 1 }
916 ////////////////////////End of function//////////////////////////////
917
918 /********************************************************************
919 函数功能:端点2输出中断处理函数。
920 入口参数:无。
921 返 回:无。
922 备 注:无。
923 ********************************************************************/
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:19 PAGE 16
924 void UsbEp2Out(void)
925 {
926 1 uint8 Len;
927 1
928 1 #ifdef DEBUG0
Prints("USB端点2输出中断。\r\n");
#endif
931 1
932 1 //当双缓冲没有全满时,可以清除中断标志
933 1 if((D12ReadEndpointStatus(4)&0x60)!=0x60)
934 1 {
935 2 //读最后发送状态,这将清除端点2输入的中断标志位
936 2 D12ReadEndpointLastStatus(4);
937 2 }
938 1 if(TransportStage==COMMAND_STAGE)
939 1 {
940 2 //将数据读回到CBW缓冲区中
941 2 Len=D12ReadEndpointBuffer(4,sizeof(CBW),CBW);
942 2 //清除端点缓冲区
943 2 D12ClearBuffer();
944 2 if(Len==31) //如果接收到的数据长度是31字节,则说明是CBW
945 2 {
946 3 //检查CBW的签名是否正确,签名为“USBC”
947 3 if((CBW[0]=='U')&&(CBW[1]=='S')&&(CBW[2]=='B')&&(CBW[3]=='C'))
948 3 {
949 4 //CBW签名正确,处理SCSI命令
950 4 ProcScsiCommand();
951 4 }
952 3 }
953 2 }
954 1 else if(TransportStage==DATA_STAGE)
955 1 {
956 2 ProcScsiOutData(); //处理SCSI输出数据
957 2 }
958 1 else
959 1 {
960 2 D12ReadEndpointBuffer(4,0,0);
961 2 D12ClearBuffer();
962 2 }
963 1 }
964 ////////////////////////End of function//////////////////////////////
965
966 /********************************************************************
967 函数功能:端点2输入中断处理函数。
968 入口参数:无。
969 返 回:无。
970 备 注:无。
971 ********************************************************************/
972 void UsbEp2In(void)
973 {
974 1 #ifdef DEBUG0
Prints("USB端点2输入中断。\r\n");
#endif
977 1 //读最后发送状态,这将清除端点2输入的中断标志位
978 1 D12ReadEndpointLastStatus(5);
979 1 Ep2SendData(); //发送数据
980 1 //如果双缓冲区没有都满,还可以再写
981 1 if((D12ReadEndpointStatus(5)&0x06)!=0x06)
982 1 {
983 2 Ep2SendData(); //再发一次数据,利用双缓冲
984 2 }
985 1 }
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:19 PAGE 17
986 ////////////////////////End of function//////////////////////////////
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 887 ----
CONSTANT SIZE = 191 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 18 1
IDATA SIZE = 60 ----
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 + -