📄 usbcore.lst
字号:
996 7 SendLength=SerialNumberStringDescriptor[0];
997 7 break;
998 7
999 7 default :
1000 7 #ifdef DEBUG0
1001 7 Prints("(未知的索引值)。\r\n");
1002 7 #endif
1003 7 //对于未知索引值的请求,返回一个0长度的包
1004 7 SendLength=0;
1005 7 NeedZeroPacket=1;
1006 7 break;
1007 7 }
1008 6 //判断请求的字节数是否比实际需要发送的字节数多
1009 6 //如果请求的比实际的长,那么只返回实际长度的数据
1010 6 if(wLength>SendLength)
1011 6 {
1012 7 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
1013 7 {
1014 8 NeedZeroPacket=1; //需要返回0长度的数据包
1015 8 }
1016 7 }
1017 6 else
1018 6 {
1019 7 SendLength=wLength;
1020 7 }
1021 6 //将数据通过EP0返回
1022 6 UsbEp0SendData();
1023 6 break;
1024 6
1025 6 case REPORT_DESCRIPTOR: //报告描述符
1026 6 #ifdef DEBUG0
1027 6 Prints("报告描述符。\r\n");
1028 6 #endif
1029 6 //获取报告描述符时,wIndex中保存的是请求的接口号。
1030 6 //我们这里有两个接口,接口0用来实现键盘,接口1实现鼠标。
1031 6 switch(wIndex)
1032 6 {
1033 7 case 0: //发送到接口0的请求
1034 7 pSendData=KeyboardReportDescriptor; //需要发送的数据为报告描述符
1035 7 SendLength=sizeof(KeyboardReportDescriptor); //需要返回的数据长度
1036 7 break;
1037 7
1038 7 case 1: //发送到接口1的请求
1039 7 pSendData=MouseReportDescriptor; //需要发送的数据为报告描述符
1040 7 SendLength=sizeof(MouseReportDescriptor); //需要返回的数据长度
1041 7 break;
1042 7
1043 7 default : //其它为未定义的接口,返回0长度数据包
1044 7 SendLength=0;
1045 7 NeedZeroPacket=1;
1046 7 break;
1047 7 }
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:36 PAGE 18
1048 6 //判断请求的字节数是否比实际需要发送的字节数多
1049 6 //如果请求的比实际的长,那么只返回实际长度的数据
1050 6 if(wLength>SendLength)
1051 6 {
1052 7 if(SendLength%DeviceDescriptor[7]==0) //并且刚好是整数个数据包时
1053 7 {
1054 8 NeedZeroPacket=1; //需要返回0长度的数据包
1055 8 }
1056 7 }
1057 6 else
1058 6 {
1059 7 SendLength=wLength;
1060 7 }
1061 6 //将数据通过EP0返回
1062 6 UsbEp0SendData();
1063 6 break;
1064 6
1065 6 default: //其它描述符
1066 6 #ifdef DEBUG0
1067 6 Prints("其他描述符,描述符代码:");
1068 6 PrintHex((wValue>>8)&0xFF);
1069 6 Prints("\r\n");
1070 6 #endif
1071 6 break;
1072 6 }
1073 5 break;
1074 5
1075 5 case GET_INTERFACE: //获取接口
1076 5 #ifdef DEBUG0
1077 5 Prints("获取接口。\r\n");
1078 5 #endif
1079 5 break;
1080 5
1081 5 case GET_STATUS: //获取状态
1082 5 #ifdef DEBUG0
1083 5 Prints("获取状态。\r\n");
1084 5 #endif
1085 5 break;
1086 5
1087 5 case SYNCH_FRAME: //同步帧
1088 5 #ifdef DEBUG0
1089 5 Prints("同步帧。\r\n");
1090 5 #endif
1091 5 break;
1092 5
1093 5 default: //未定义的标准请求
1094 5 #ifdef DEBUG0
1095 5 Prints("错误:未定义的标准输入请求。\r\n");
1096 5 #endif
1097 5 break;
1098 5 }
1099 4 break;
1100 4
1101 4 case 1: //类请求
1102 4 #ifdef DEBUG0
1103 4 Prints("USB类输入请求:\r\n");
1104 4 #endif
1105 4 break;
1106 4
1107 4 case 2: //厂商请求
1108 4 #ifdef DEBUG0
1109 4 Prints("USB厂商输入请求:\r\n");
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:36 PAGE 19
1110 4 #endif
1111 4 break;
1112 4
1113 4 default: //未定义的请求。这里只显示一个报错信息。
1114 4 #ifdef DEBUG0
1115 4 Prints("错误:未定义的输入请求。\r\n");
1116 4 #endif
1117 4 break;
1118 4 }
1119 3 }
1120 2 //否则说明是输出请求
1121 2 else //if(bmRequestType&0x80==0x80)之else
1122 2 {
1123 3 //根据bmRequestType的D6~5位散转,D6~5位表示请求的类型
1124 3 //0为标准请求,1为类请求,2为厂商请求。
1125 3 switch((bmRequestType>>5)&0x03)
1126 3 {
1127 4 case 0: //标准请求
1128 4 #ifdef DEBUG0
1129 4 Prints("USB标准输出请求:");
1130 4 #endif
1131 4 //USB协议定义了几个标准输出请求,我们实现这些标准请求即可
1132 4 //请求的代码在bRequest中,对不同的请求代码进行散转
1133 4 switch(bRequest)
1134 4 {
1135 5 case CLEAR_FEATURE: //清除特性
1136 5 #ifdef DEBUG0
1137 5 Prints("清除特性。\r\n");
1138 5 #endif
1139 5 break;
1140 5
1141 5 case SET_ADDRESS: //设置地址
1142 5 #ifdef DEBUG0
1143 5 Prints("设置地址。地址为:");
1144 5 PrintHex(wValue&0xFF); //显示所设置的地址
1145 5 Prints("\r\n");
1146 5 #endif
1147 5 D12SetAddress(wValue&0xFF); //wValue中的低字节是设置的地址值
1148 5 //设置地址没有数据过程,直接进入到状态过程,返回一个0长度的数据包
1149 5 SendLength=0;
1150 5 NeedZeroPacket=1;
1151 5 //将数据通过EP0返回
1152 5 UsbEp0SendData();
1153 5 break;
1154 5
1155 5 case SET_CONFIGURATION: //设置配置
1156 5 #ifdef DEBUG0
1157 5 Prints("设置配置。\r\n");
1158 5 #endif
1159 5 //使能非0端点。非0端点只有在设置为非0的配置后才能使能。
1160 5 //wValue的低字节为配置的值,如果该值为非0,才能使能非0端点。
1161 5 //保存当前配置值
1162 5 ConfigValue=wValue&0xFF;
1163 5 D12SetEndpointEnable(ConfigValue);
1164 5 //返回一个0长度的状态数据包
1165 5 SendLength=0;
1166 5 NeedZeroPacket=1;
1167 5 //将数据通过EP0返回
1168 5 UsbEp0SendData();
1169 5 break;
1170 5
1171 5 case SET_DESCRIPTOR: //设置描述符
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:36 PAGE 20
1172 5 #ifdef DEBUG0
1173 5 Prints("设置描述符。\r\n");
1174 5 #endif
1175 5 break;
1176 5
1177 5 case SET_FEATURE: //设置特性
1178 5 #ifdef DEBUG0
1179 5 Prints("设置特性。\r\n");
1180 5 #endif
1181 5 break;
1182 5
1183 5 case SET_INTERFACE: //设置接口
1184 5 #ifdef DEBUG0
1185 5 Prints("设置接口。\r\n");
1186 5 #endif
1187 5 break;
1188 5
1189 5 default: //未定义的标准请求
1190 5 #ifdef DEBUG0
1191 5 Prints("错误:未定义的标准输出请求。\r\n");
1192 5 #endif
1193 5 break;
1194 5 }
1195 4 break;
1196 4
1197 4 case 1: //类请求
1198 4 #ifdef DEBUG0
1199 4 Prints("USB类输出请求:");
1200 4 #endif
1201 4 switch(bRequest)
1202 4 {
1203 5 case SET_IDLE:
1204 5 #ifdef DEBUG0
1205 5 Prints("设置空闲。\r\n");
1206 5 #endif
1207 5 //只需要返回一个0长度的数据包即可
1208 5 SendLength=0;
1209 5 NeedZeroPacket=1;
1210 5 //将数据通过EP0返回
1211 5 UsbEp0SendData();
1212 5 break;
1213 5
1214 5 default:
1215 5 #ifdef DEBUG0
1216 5 Prints("未知请求。\r\n");
1217 5 #endif
1218 5 break;
1219 5 }
1220 4 break;
1221 4
1222 4 case 2: //厂商请求
1223 4 #ifdef DEBUG0
1224 4 Prints("USB厂商输出请求:\r\n");
1225 4 #endif
1226 4 break;
1227 4
1228 4 default: //未定义的请求。这里只显示一个报错信息。
1229 4 #ifdef DEBUG0
1230 4 Prints("错误:未定义的输出请求。\r\n");
1231 4 #endif
1232 4 break;
1233 4 }
C51 COMPILER V7.06 USBCORE 11/16/2008 15:59:36 PAGE 21
1234 3 }
1235 2 }
1236 1 //普通数据输出
1237 1 else //if(D12ReadEndpointLastStatus(0)&0x20)之else
1238 1 {
1239 2 D12ReadEndpointBuffer(0,16,Buffer);
1240 2 D12ClearBuffer();
1241 2 }
1242 1 }
1243 ////////////////////////End of function//////////////////////////////
1244
1245 /********************************************************************
1246
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -