📄 chapter9.lst
字号:
211 1 }
212
213
214 /****************************************
215 ** 函数名称: void clear_feature(void)
216 ** 功能描述: 清除特性
217 *****************************************/
218 void clear_feature(void)
219 {
220 1 uint8 idata endp; //读取请求类型中的接收方
221 1 uint8 idata bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;//读取请求类型
222 1
223 1 if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)/
-/对设备请求
224 1 {
225 2 bEPPflags.bits.remote_wakeup = 0; //清0远程唤醒标志
226 2 single_transmit(0, 0); //返回一个空的数据表示执行完毕
227 2 }
228 1 else if(bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_
-STALL)//对端点请求
229 1 {
230 2 //清除端点禁止特性,恢复其使用
231 2 endp = (uint8)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
232 2 if (ControlData.DeviceRequest.wIndex & (uint8)USB_ENDPOINT_DIRECTION_MASK)
233 2 D12_SetEndpointStatus(endp*2 + 1, 0); //清除控制输入端点STALL特性
234 2 else
235 2 D12_SetEndpointStatus(endp*2, 0); //清除控制输出端点STALL特性
236 2 single_transmit(0, 0); //返回一个空的数据表示执行完毕
237 2 }
C51 COMPILER V7.50 CHAPTER9 03/24/2008 11:06:13 PAGE 5
238 1 else
239 1 stall_ep0(); //没有该请求,返回STALL
240 1 }
241
242
243 /****************************************
244 ** 函数名称: void set_feature(void)
245 ** 功能描述: 设置特性
246 *****************************************/
247 void set_feature(void)
248 {
249 1 uint8 idata endp; //读取请求类型中的接收方
250 1 uint8 idata bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;//读取请求类型
251 1
252 1 if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)/
-/对设备请求
253 1 {
254 2 //设置远程唤醒特性
255 2 bEPPflags.bits.remote_wakeup = 1; //置1远程唤醒标志
256 2 single_transmit(0, 0); //返回一个空的数据表示执行完毕
257 2 }
258 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT
-_STALL) //对端点请求
259 1 {
260 2 //禁止端点
261 2 endp = (uint8)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
262 2 if (ControlData.DeviceRequest.wIndex & (uint8)USB_ENDPOINT_DIRECTION_MASK)
263 2 D12_SetEndpointStatus(endp*2 + 1, 1); //设置输入端点禁止
264 2 else
265 2 D12_SetEndpointStatus(endp*2, 1); //设置输出端点禁止
266 2 single_transmit(0, 0); //返回一个空的数据表示执行完毕
267 2 }
268 1 else
269 1 stall_ep0(); //没有该请求,返回STALL
270 1 }
271
272
273 /****************************************
274 ** 函数名称: void set_address(void)
275 ** 功能描述: 设置地址
276 *****************************************/
277 void set_address(void)
278 {
279 1 D12_SetAddressEnable((uint8)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK), 1);
280 1 single_transmit(0, 0); //发送一个空的数据响应
281 1 }
282
283
284 /****************************************
285 ** 函数名称: void get_descriptor(void)
286 ** 功能描述: 获取描述符
287 *****************************************/
288 void get_descriptor(void)
289 {
290 1 uint8 idata bDescriptor = MSB(ControlData.DeviceRequest.wValue); //读取请求的描述符类型
291 1 uint8 idata bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
292 1 #ifdef debug
PutString0("Get usb descriptors.......\r\n",50);
#endif
295 1 if(bRecipient == USB_RECIPIENT_DEVICE)
296 1 {
297 2 if (bDescriptor == USB_DEVICE_DESCRIPTOR)//获取设备描述符
C51 COMPILER V7.50 CHAPTER9 03/24/2008 11:06:13 PAGE 6
298 2 {
299 3 #ifdef debug
PutString0(" Get usb device descriptor....\r\n",50);
#endif
302 3 code_transmit((uint8 *)&device_descriptor, sizeof(DEVICE_DESCRIPTOR_STRUCT));
303 3 }
304 2 else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR) //获取其它描述符
305 2 {
306 3 if (ControlData.DeviceRequest.wLength > SWAP16(usb_descriptor.configuration_descriptor.wTotalLength))
307 3 {
308 4 ControlData.DeviceRequest.wLength = SWAP16(usb_descriptor.configuration_descriptor.wTotalLength);
309 4 }
310 3 #ifdef debug
PutString0(" Get usb config&interface&HID&endpoints descriptor....\r\n",100);
#endif
313 3 code_transmit((uint8 *)&(usb_descriptor), ControlData.DeviceRequest.wLength);//发送描述符内容
314 3 }
315 2 else if(bDescriptor == USB_STRING_DESCRIPTOR) //字符串描述符
316 2 {
317 3 #ifdef debug
PutString0(" Get usb string descriptor.....\r\n",50);
#endif
320 3 switch(LSB(ControlData.DeviceRequest.wValue))
321 3 {
322 4 case 0:
323 4 //获取语言ID
324 4 #ifdef debug
PutString0(" Get language ID....\r\n",50);
#endif
327 4 if(ControlData.DeviceRequest.wLength > LANGUAGE_ID[0])
328 4 ControlData.DeviceRequest.wLength = LANGUAGE_ID[0];
329 4 code_transmit((uint8 *)LANGUAGE_ID, ControlData.DeviceRequest.wLength);
330 4 break;
331 4
332 4 case 1:
333 4 //获取厂商字符串
334 4 #ifdef debug
PutString0(" Get manufaceture String descriptor....\r\n",50);
#endif
337 4 if(ControlData.DeviceRequest.wLength > ManufacturerString[0])
338 4 ControlData.DeviceRequest.wLength = ManufacturerString[0];
339 4 code_transmit((uint8 *)ManufacturerString, ControlData.DeviceRequest.wLength);
340 4 break;
341 4
342 4 case 2:
343 4 //获取产品字符串
344 4 #ifdef debug
PutString0(" Get Product String descriptor....\r\n",50);
#endif
347 4 if(ControlData.DeviceRequest.wLength > ProducterString[0])
348 4 ControlData.DeviceRequest.wLength = ProducterString[0];
349 4 code_transmit((uint8 *)ProducterString, ControlData.DeviceRequest.wLength);
350 4 break;
351 4
352 4 case 3:
353 4 //获取设备序列号
354 4 #ifdef debug
PutString0(" Get device serial number String descriptor....\r\n",50);
#endif
357 4 if(ControlData.DeviceRequest.wLength > device_serial_number[0])
358 4 ControlData.DeviceRequest.wLength = device_serial_number[0];
359 4 code_transmit((uint8 *)device_serial_number, ControlData.DeviceRequest.wLength);
C51 COMPILER V7.50 CHAPTER9 03/24/2008 11:06:13 PAGE 7
360 4 break;
361 4
362 4 default:
363 4 break;
364 4 }
365 3 }
366 2 else
367 2 stall_ep0(); //没有该请求,返回STALL
368 2 }
369 1 else if(bRecipient == USB_RECIPIENT_INTERFACE) //接口接收
370 1 {
371 2 switch(MSB(ControlData.DeviceRequest.wValue))
372 2 {
373 3 case USB_HID_DESCRIPTOR:
374 3 #ifdef debug
PutString0(" Get USB HID descriptor....\r\n",50);
#endif
377 3 if(ControlData.DeviceRequest.wLength > sizeof(HID_DESCRIPTOR_STRUCT))
378 3 ControlData.DeviceRequest.wLength = sizeof(HID_DESCRIPTOR_STRUCT);
379 3 code_transmit((uint8 *)&(usb_descriptor.hid_descriptor),sizeof(HID_DESCRIPTOR_STRUCT));
380 3 break;
381 3 case USB_REPORT_DESCRIPTOR:
382 3 #ifdef debug
PutString0(" Get USB report descriptor....\r\n",50);
#endif
385 3 if(ControlData.DeviceRequest.wLength > sizeof(HidUseReportDescriptor))
386 3 ControlData.DeviceRequest.wLength = sizeof(HidUseReportDescriptor);
387 3 code_transmit((uint8 *)HidUseReportDescriptor,sizeof(HidUseReportDescriptor));
388 3 break;
389 3 case USB_PHYSICAL_DESCRIPTOR:
390 3 #ifdef debug
PutString0(" Get USB physical descriptor....\r\n",50);
#endif
393 3 break;
394 3 default:
395 3 break;
396 3 }
397 2 }
398 1 else if(bRecipient == USB_RECIPIENT_ENDPOINT)
399 1 {
400 2 //do nothing;
401 2 }
402 1 }
403
404
405 /****************************************
406 ** 函数名称: void get_configuration(void)
407 ** 功能描述: 获取配置
408 *****************************************/
409 void get_configuration(void)
410 {
411 1 uint8 idata c = bEPPflags.bits.configuration; //取出配置值
412 1 single_transmit(&c, 1); //发送配置值
413 1 }
414
415 /****************************************
416 ** 函数名称: void set_configuration(void)
417 ** 功能描述: 设置配置
418 *****************************************/
419 void set_configuration(void)
420 {
421 1 if (ControlData.DeviceRequest.wValue == 0) //配置值不对,设备进入未配置状态
C51 COMPILER V7.50 CHAPTER9 03/24/2008 11:06:13 PAGE 8
422 1 {
423 2 single_transmit(0, 0); //发向一个空包响应
424 2 bEPPflags.bits.configuration = 0; //标记未配置
425 2 init_unconfig(); //进入地址状态,禁止0除外的所有端点
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -