📄 usbcore.lst
字号:
#endif
886 5 SendLength=0;
887 5 NeedZeroPacket=1;
888 5 break;
889 5
890 5 default:
891 5 #ifdef DEBUG0
Prints("未知类请求。\r\n");
#endif
894 5 SendLength=0;
895 5 NeedZeroPacket=1;
896 5 break;
897 5 }
898 4 //判断请求的字节数是否比实际需要发送的字节数多
899 4 //如果请求的比实际的长,那么只返回实际长度的数据
900 4 if(wLength>SendLength)
901 4 {
902 5 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
903 5 {
904 6 NeedZeroPacket=1; //需要返回0长度的数据包
905 6 }
906 5 }
907 4 else
908 4 {
909 5 SendLength=wLength;
910 5 }
911 4 //将数据通过EP0返回
912 4 UsbEp0SendData();
913 4 break;
914 4
915 4 case 2: //厂商请求
916 4 #ifdef DEBUG0
Prints("USB厂商输入请求:\r\n");
#endif
919 4 break;
920 4
921 4 default: //未定义的请求。这里只显示一个报错信息。
922 4 #ifdef DEBUG0
Prints("错误:未定义的输入请求。\r\n");
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 PAGE 16
#endif
925 4 break;
926 4 }
927 3 }
928 2 //否则说明是输出请求
929 2 else //if(bmRequestType&0x80==0x80)之else
930 2 {
931 3 //根据bmRequestType的D6~5位散转,D6~5位表示请求的类型
932 3 //0为标准请求,1为类请求,2为厂商请求。
933 3 switch((bmRequestType>>5)&0x03)
934 3 {
935 4 case 0: //标准请求
936 4 #ifdef DEBUG0
Prints("USB标准输出请求:");
#endif
939 4 //USB协议定义了几个标准输出请求,我们实现这些标准请求即可
940 4 //请求的代码在bRequest中,对不同的请求代码进行散转
941 4 switch(bRequest)
942 4 {
943 5 case CLEAR_FEATURE: //清除特性
944 5 #ifdef DEBUG0
Prints("清除特性。\r\n");
#endif
947 5 break;
948 5
949 5 case SET_ADDRESS: //设置地址
950 5 #ifdef DEBUG0
Prints("设置地址。地址为:");
PrintHex(wValue&0xFF); //显示所设置的地址
Prints("\r\n");
#endif
955 5 D12SetAddress(wValue&0xFF); //wValue中的低字节是设置的地址值
956 5 //设置地址没有数据过程,直接进入到状态过程,返回一个0长度的数据包
957 5 SendLength=0;
958 5 NeedZeroPacket=1;
959 5 //将数据通过EP0返回
960 5 UsbEp0SendData();
961 5 break;
962 5
963 5 case SET_CONFIGURATION: //设置配置
964 5 #ifdef DEBUG0
Prints("设置配置。\r\n");
#endif
967 5 //使能非0端点。非0端点只有在设置为非0的配置后才能使能。
968 5 //wValue的低字节为配置的值,如果该值为非0,才能使能非0端点。
969 5 //保存当前配置值
970 5 ConfigValue=wValue&0xFF;
971 5 D12SetEndpointEnable(ConfigValue);
972 5 //返回一个0长度的状态数据包
973 5 SendLength=0;
974 5 NeedZeroPacket=1;
975 5 //将数据通过EP0返回
976 5 UsbEp0SendData();
977 5 break;
978 5
979 5 case SET_DESCRIPTOR: //设置描述符
980 5 #ifdef DEBUG0
Prints("设置描述符。\r\n");
#endif
983 5 break;
984 5
985 5 case SET_FEATURE: //设置特性
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 PAGE 17
986 5 #ifdef DEBUG0
Prints("设置特性。\r\n");
#endif
989 5 break;
990 5
991 5 case SET_INTERFACE: //设置接口
992 5 #ifdef DEBUG0
Prints("设置接口。\r\n");
#endif
995 5 break;
996 5
997 5 default: //未定义的标准请求
998 5 #ifdef DEBUG0
Prints("错误:未定义的标准输出请求。\r\n");
#endif
1001 5 break;
1002 5 }
1003 4 break;
1004 4
1005 4 case 1: //类请求
1006 4 #ifdef DEBUG0
Prints("USB类输出请求:");
#endif
1009 4 switch(bRequest)
1010 4 {
1011 5 case SET_CONTROL_LINE_STATE:
1012 5 #ifdef DEBUG0
Prints("SET_CONTROL_LINE_STATE。\r\n");
#endif
1015 5 //该请求没有数据输出阶段,其中wValue字段的D0位表示DTR,
1016 5 //D1位表示RTS。但是我们的板上的串口并没有这两引脚,因而
1017 5 //对该请求我们仅是简单地返回一个0长度的状态过程数据包即可
1018 5 SendLength=0;
1019 5 NeedZeroPacket=1;
1020 5 //将数据通过EP0返回
1021 5 UsbEp0SendData();
1022 5 break;
1023 5
1024 5 case SET_LINE_CODING:
1025 5 //该请求设置串口的属性,但是实际的数据并不在设置过程发出,
1026 5 //而是在之后的数据过程发出。这里不用做任何处理,在数据过程
1027 5 //完成后返回0长度的状态包。
1028 5 #ifdef DEBUG0
Prints("SET_LINE_CODING。\r\n");
#endif
1031 5 break;
1032 5
1033 5 default:
1034 5 #ifdef DEBUG0
Prints("未知请求。\r\n");
#endif
1037 5 break;
1038 5 }
1039 4 break;
1040 4
1041 4 case 2: //厂商请求
1042 4 #ifdef DEBUG0
Prints("USB厂商输出请求:\r\n");
#endif
1045 4 break;
1046 4
1047 4 default: //未定义的请求。这里只显示一个报错信息。
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 PAGE 18
1048 4 #ifdef DEBUG0
Prints("错误:未定义的输出请求。\r\n");
#endif
1051 4 break;
1052 4 }
1053 3 }
1054 2 }
1055 1 //普通数据输出
1056 1 else //if(D12ReadEndpointLastStatus(0)&0x20)之else
1057 1 {
1058 2 UsbEp0DataOut();
1059 2 }
1060 1 }
1061 ////////////////////////End of function//////////////////////////////
1062
1063 /********************************************************************
1064 函数功能:端点0输入中断处理函数。
1065 入口参数:无。
1066 返 回:无。
1067 备 注:无。
1068 ********************************************************************/
1069 void UsbEp0In(void)
1070 {
1071 1 #ifdef DEBUG0
Prints("USB端点0输入中断。\r\n");
#endif
1074 1 //读最后发送状态,这将清除端点0的中断标志位
1075 1 D12ReadEndpointLastStatus(1);
1076 1 //发送剩余的字节数
1077 1 UsbEp0SendData();
1078 1 }
1079 ////////////////////////End of function//////////////////////////////
1080
1081 /********************************************************************
1082 函数功能:端点1输出中断处理函数。
1083 入口参数:无。
1084 返 回:无。
1085 备 注:无。
1086 ********************************************************************/
1087 void UsbEp1Out(void)
1088 {
1089 1 #ifdef DEBUG0
Prints("USB端点1输出中断。\r\n");
#endif
1092 1 //读端点最后状态,这将清除端点1输出的中断标志位
1093 1 D12ReadEndpointLastStatus(2);
1094 1 //清除端点缓冲区
1095 1 D12ClearBuffer();
1096 1 }
1097 ////////////////////////End of function//////////////////////////////
1098
1099 /********************************************************************
1100 函数功能:端点1输入中断处理函数。
1101 入口参数:无。
1102 返 回:无。
1103 备 注:无。
1104 ********************************************************************/
1105 void UsbEp1In(void)
1106 {
1107 1 #ifdef DEBUG0
Prints("USB端点1输入中断。\r\n");
#endif
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 PAGE 19
1110 1 //读最后发送状态,这将清除端点1输入的中断标志位
1111 1 D12ReadEndpointLastStatus(3);
1112 1 //端点1输入处于空闲状态
1113 1 Ep1InIsBusy=0;
1114 1 }
1115 ////////////////////////End of function//////////////////////////////
1116
1117 /********************************************************************
1118 函数功能:端点2输出中断处理函数。
1119 入口参数:无。
1120 返 回:无。
1121 备 注:无。
1122 ********************************************************************/
1123 void UsbEp2Out(void)
1124 {
1125 1 #ifdef DEBUG0
Prints("USB端点2输出中断。\r\n");
#endif
1128 1 //如果缓冲区中的数据还未通过串口发送完毕,则暂时不处理该中断,直接返回。
1129 1 if(UsbEp2ByteCount!=0) return;
1130 1
1131 1 //读最后接收状态,这将清除端点2输出的中断标志位。
1132 1 //注意端点2有个双缓冲机制,在清除中断之前,先检查是否两个缓冲区
1133 1 //是否全满了,如果两个缓冲区全满的话,就不用清除中断标志。只有当
1134 1 //两个缓冲区不全满的时候才需要清除中断标志。
1135 1 if((D12ReadEndpointStatus(4)&0x60)!=0x60)
1136 1 {
1137 2 D12ReadEndpointLastStatus(4);
1138 2 }
1139 1
1140 1 //读取端点2的数据。返回值为实际读到的数据字节数
1141 1 UsbEp2ByteCount=D12ReadEndpointBuffer(4,BUF_LEN,UsbEp2Buffer);
1142 1 //清除端点缓冲区
1143 1 D12ClearBuffer();
1144 1
1145 1 //输出位置设为0
1146 1 UsbEp2BufferOutputPoint=0;
1147 1 }
1148 ////////////////////////End of function//////////////////////////////
1149
1150 /********************************************************************
1151 函数功能:端点2输入中断处理函数。
1152 入口参数:无。
1153 返 回:无。
1154 备 注:无。
1155 ********************************************************************/
1156 void UsbEp2In(void)
1157 {
1158 1 #ifdef DEBUG0
Prints("USB端点2输入中断。\r\n");
#endif
1161 1 //读最后发送状态,这将清除端点2输入的中断标志位
1162 1 D12ReadEndpointLastStatus(5);
1163 1 //端点2输入处于空闲状态
1164 1 Ep2InIsBusy=0;
1165 1 }
1166 ////////////////////////End of function//////////////////////////////
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1107 ----
CONSTANT SIZE = 231 ----
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 PAGE 20
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 24 5
IDATA SIZE = 16 ----
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 + -