📄 usbcore.lst
字号:
742 3 //不够最大包长,可以直接发送
743 3 D12WriteEndpointBuffer(1,SendLength,pSendData);
744 3 //发送完毕后,SendLength长度变为0
745 3 SendLength=0;
746 3 }
747 2 else //如果要发送的数据包长度为0
748 2 {
749 3 if(NeedZeroPacket==1) //如果需要发送0长度数据
750 3 {
751 4 D12WriteEndpointBuffer(1,0,pSendData); //发送0长度数据包
752 4 NeedZeroPacket=0; //清需要发送0长度数据包标志
753 4 }
754 3 }
755 2 }
756 1 }
757 ////////////////////////End of function//////////////////////////////
758
759 /********************************************************************
760 函数功能:端点0输出中断处理函数。
761 入口参数:无。
762 返 回:无。
763 备 注:无。
764 ********************************************************************/
765 void UsbEp0Out(void)
766 {
767 1 #ifdef DEBUG0
768 1 Prints("USB端点0输出中断。\r\n");
769 1 #endif
770 1 //读取端点0输出最后传输状态,该操作清除中断标志
771 1 //并判断第5位是否为1,如果是,则说明是建立包
772 1 if(D12ReadEndpointLastStatus(0)&0x20)
773 1 {
774 2 D12ReadEndpointBuffer(0,16,Buffer); //读建立过程数据
775 2 D12AcknowledgeSetup(); //应答建立包
776 2 D12ClearBuffer(); //清缓冲区
777 2 //将缓冲数据填到设备请求的各字段中
778 2 bmRequestType=Buffer[0];
779 2 bRequest=Buffer[1];
780 2 wValue=Buffer[2]+(((uint16)Buffer[3])<<8);
781 2 wIndex=Buffer[4]+(((uint16)Buffer[5])<<8);
782 2 wLength=Buffer[6]+(((uint16)Buffer[7])<<8);
783 2 //下面的代码判断具体的请求,并根据不同的请求进行相关操作
784 2 //如果D7位为1,则说明是输入请求
785 2 if((bmRequestType&0x80)==0x80)
786 2 {
787 3 //根据bmRequestType的D6~5位散转,D6~5位表示请求的类型
788 3 //0为标准请求,1为类请求,2为厂商请求。
789 3 switch((bmRequestType>>5)&0x03)
790 3 {
791 4 case 0: //标准请求
792 4 #ifdef DEBUG0
793 4 Prints("USB标准输入请求:");
794 4 #endif
795 4 //USB协议定义了几个标准输入请求,我们实现这些标准请求即可
796 4 //请求的代码在bRequest中,对不同的请求代码进行散转
797 4 //事实上,我们还需要对接收者进行散转,因为不同的请求接收者
798 4 //是不一样的。接收者在bmRequestType的D4~D0位中定义。
799 4 //我们这里为了简化操作,有些就省略了对接收者的判断。
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:01 PAGE 14
800 4 //例如获取描述符的请求,只根据描述符的类型来区别。
801 4 switch(bRequest)
802 4 {
803 5 case GET_CONFIGURATION: //获取配置
804 5 #ifdef DEBUG0
805 5 Prints("获取配置。\r\n");
806 5 #endif
807 5 break;
808 5
809 5 case GET_DESCRIPTOR: //获取描述符
810 5 #ifdef DEBUG0
811 5 Prints("获取描述符——");
812 5 #endif
813 5 //对描述符类型进行散转,对于全速设备,
814 5 //标准请求只支持发送到设备的设备、配置、字符串三种描述符
815 5 switch((wValue>>8)&0xFF)
816 5 {
817 6 case DEVICE_DESCRIPTOR: //设备描述符
818 6 #ifdef DEBUG0
819 6 Prints("设备描述符。\r\n");
820 6 #endif
821 6 pSendData=DeviceDescriptor; //需要发送的数据
822 6 //判断请求的字节数是否比实际需要发送的字节数多
823 6 //这里请求的是设备描述符,因此数据长度就是
824 6 //DeviceDescriptor[0]。如果请求的比实际的长,
825 6 //那么只返回实际长度的数据
826 6 if(wLength>DeviceDescriptor[0])
827 6 {
828 7 SendLength=DeviceDescriptor[0];
829 7 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
830 7 {
831 8 NeedZeroPacket=1; //需要返回0长度的数据包
832 8 }
833 7 }
834 6 else
835 6 {
836 7 SendLength=wLength;
837 7 }
838 6 //将数据通过EP0返回
839 6 UsbEp0SendData();
840 6 break;
841 6
842 6 case CONFIGURATION_DESCRIPTOR: //配置描述符
843 6 #ifdef DEBUG0
844 6 Prints("配置描述符。\r\n");
845 6 #endif
846 6 pSendData=ConfigurationDescriptor; //需要发送的数据为配置描述符
847 6 //判断请求的字节数是否比实际需要发送的字节数多
848 6 //这里请求的是配置描述符集合,因此数据长度就是
849 6 //ConfigurationDescriptor[3]*256+ConfigurationDescriptor[2]。
850 6 //如果请求的比实际的长,那么只返回实际长度的数据
851 6 SendLength=ConfigurationDescriptor[3];
852 6 SendLength=SendLength*256+ConfigurationDescriptor[2];
853 6 if(wLength>SendLength)
854 6 {
855 7 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
856 7 {
857 8 NeedZeroPacket=1; //需要返回0长度的数据包
858 8 }
859 7 }
860 6 else
861 6 {
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:01 PAGE 15
862 7 SendLength=wLength;
863 7 }
864 6 //将数据通过EP0返回
865 6 UsbEp0SendData();
866 6 break;
867 6
868 6 case STRING_DESCRIPTOR: //字符串描述符
869 6 #ifdef DEBUG0
870 6 Prints("字符串描述符");
871 6 #endif
872 6 switch(wValue&0xFF) //根据wValue的低字节(索引值)散转
873 6 {
874 7 case 0: //获取语言ID
875 7 #ifdef DEBUG0
876 7 Prints("(语言ID)。\r\n");
877 7 #endif
878 7 pSendData=LanguageId;
879 7 SendLength=LanguageId[0];
880 7 break;
881 7
882 7 case 1: //厂商字符串的索引值为1,所以这里为厂商字符串
883 7 #ifdef DEBUG0
884 7 Prints("(厂商描述)。\r\n");
885 7 #endif
886 7 pSendData=ManufacturerStringDescriptor;
887 7 SendLength=ManufacturerStringDescriptor[0];
888 7 break;
889 7
890 7 case 2: //产品字符串的索引值为2,所以这里为产品字符串
891 7 #ifdef DEBUG0
892 7 Prints("(产品描述)。\r\n");
893 7 #endif
894 7 pSendData=ProductStringDescriptor;
895 7 SendLength=ProductStringDescriptor[0];
896 7 break;
897 7
898 7 case 3: //产品序列号的索引值为3,所以这里为序列号
899 7 #ifdef DEBUG0
900 7 Prints("(产品序列号)。\r\n");
901 7 #endif
902 7 pSendData=SerialNumberStringDescriptor;
903 7 SendLength=SerialNumberStringDescriptor[0];
904 7 break;
905 7
906 7 default :
907 7 #ifdef DEBUG0
908 7 Prints("(未知的索引值)。\r\n");
909 7 #endif
910 7 //对于未知索引值的请求,返回一个0长度的包
911 7 SendLength=0;
912 7 NeedZeroPacket=1;
913 7 break;
914 7 }
915 6 //判断请求的字节数是否比实际需要发送的字节数多
916 6 //如果请求的比实际的长,那么只返回实际长度的数据
917 6 if(wLength>SendLength)
918 6 {
919 7 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
920 7 {
921 8 NeedZeroPacket=1; //需要返回0长度的数据包
922 8 }
923 7 }
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:01 PAGE 16
924 6 else
925 6 {
926 7 SendLength=wLength;
927 7 }
928 6 //将数据通过EP0返回
929 6 UsbEp0SendData();
930 6 break;
931 6
932 6 case REPORT_DESCRIPTOR: //报告描述符
933 6 #ifdef DEBUG0
934 6 Prints("报告描述符。\r\n");
935 6 #endif
936 6 pSendData=ReportDescriptor; //需要发送的数据为报告描述符
937 6 SendLength=sizeof(ReportDescriptor); //需要返回的数据长度
938 6 //判断请求的字节数是否比实际需要发送的字节数多
939 6 //如果请求的比实际的长,那么只返回实际长度的数据
940 6 if(wLength>SendLength)
941 6 {
942 7 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
943 7 {
944 8 NeedZeroPacket=1; //需要返回0长度的数据包
945 8 }
946 7 }
947 6 else
948 6 {
949 7 SendLength=wLength;
950 7 }
951 6 //将数据通过EP0返回
952 6 UsbEp0SendData();
953 6 break;
954 6
955 6 default: //其它描述符
956 6 #ifdef DEBUG0
957 6 Prints("其他描述符,描述符代码:");
958 6 PrintHex((wValue>>8)&0xFF);
959 6 Prints("\r\n");
960 6 #endif
961 6 break;
962 6 }
963 5 break;
964 5
965 5 case GET_INTERFACE: //获取接口
966 5 #ifdef DEBUG0
967 5 Prints("获取接口。\r\n");
968 5 #endif
969 5 break;
970 5
971 5 case GET_STATUS: //获取状态
972 5 #ifdef DEBUG0
973 5 Prints("获取状态。\r\n");
974 5 #endif
975 5 break;
976 5
977 5 case SYNCH_FRAME: //同步帧
978 5 #ifdef DEBUG0
979 5 Prints("同步帧。\r\n");
980 5 #endif
981 5 break;
982 5
983 5 default: //未定义的标准请求
984 5 #ifdef DEBUG0
985 5 Prints("错误:未定义的标准输入请求。\r\n");
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:01 PAGE 17
986 5 #endif
987 5 break;
988 5 }
989 4 break;
990 4
991 4 case 1: //类请求
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -