📄 usbcore.lst
字号:
break;
case HID_REPORT_DESCRIPTOR_TYPE:
if (SetupPacket.wIndex.WB.L != USB_HID_IF_NUM) {
return (FALSE); /* Only Single HID Interface is supported */
}
EP0Data.pData = (BYTE *)HID_ReportDescriptor;
len = HID_ReportDescSize;
break;
case HID_PHYSICAL_DESCRIPTOR_TYPE:
return (FALSE); /* HID Physical Descriptor is not supported */
#endif
288 3 default:
289 3 return (FALSE);
290 3 }
291 2 break;
292 2 default:
293 2 return (FALSE);
294 2 }
295 1
296 1 if (EP0Data.Count > len) {
297 2 EP0Data.Count = len;
298 2 }
299 1 USB_DataInStage();
300 1
301 1 return (TRUE);
302 1 }
303
304
305 /*
306 * Set Configuration USB Request
307 * Parameters: None (global SetupPacket)
308 * Return Value: TRUE - Success, FALSE - Error
309 */
310
311 __inline BOOL USB_SetConfiguration (void) {
312 1 USB_COMMON_DESCRIPTOR *pD;
313 1 DWORD alt, n, m;
314 1
315 1 if (SetupPacket.wValue.WB.L) {
316 2 pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor;
317 2 while (pD->bLength) {
318 3 switch (pD->bDescriptorType) {
319 4 case USB_CONFIGURATION_DESCRIPTOR_TYPE:
320 4 if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue == SetupPacket.wValue.WB.L) {
321 5 USB_Configuration = SetupPacket.wValue.WB.L;
322 5 USB_NumInterfaces = ((USB_CONFIGURATION_DESCRIPTOR *)pD)->bNumInterfaces;
ARM COMPILER V2.42b, usbcore 02/01/06 23:45:15 PAGE 6
323 5 for (n = 0; n < USB_IF_NUM; n++) {
324 6 USB_AltSetting[n] = 0;
325 6 }
326 5 for (n = 1; n < 16; n++) {
327 6 if (USB_EndPointMask & (1 << n)) {
328 7 USB_DisableEP(n);
329 7 }
330 6 if (USB_EndPointMask & ((1 << 16) << n)) {
331 7 USB_DisableEP(n | 0x80);
332 7 }
333 6 }
334 5 USB_EndPointMask = 0x00010001;
335 5 USB_EndPointHalt = 0x00000000;
336 5 USB_Configure(TRUE);
337 5 if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bmAttributes & USB_CONFIG_SELF_POWERED) {
338 6 USB_DeviceStatus |= USB_GETSTATUS_SELF_POWERED;
339 6 } else {
340 6 USB_DeviceStatus &= ~USB_GETSTATUS_SELF_POWERED;
341 6 }
342 5 } else {
343 5 (BYTE *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
344 5 continue;
345 5 }
346 4 break;
347 4 case USB_INTERFACE_DESCRIPTOR_TYPE:
348 4 alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting;
349 4 break;
350 4 case USB_ENDPOINT_DESCRIPTOR_TYPE:
351 4 if (alt == 0) {
352 5 n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F;
353 5 m = (n & 0x80) ? ((1 << 16) << n) : (1 << n);
354 5 USB_EndPointMask |= m;
355 5 USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD);
356 5 USB_EnableEP(n);
357 5 USB_ResetEP(n);
358 5 }
359 4 break;
360 4 }
361 3 (BYTE *)pD += pD->bLength;
362 3 }
363 2 }
364 1 else {
365 2 USB_Configuration = 0;
366 2 for (n = 1; n < 16; n++) {
367 3 if (USB_EndPointMask & (1 << n)) {
368 4 USB_DisableEP(n);
369 4 }
370 3 if (USB_EndPointMask & ((1 << 16) << n)) {
371 4 USB_DisableEP(n | 0x80);
372 4 }
373 3 }
374 2 USB_EndPointMask = 0x00010001;
375 2 USB_EndPointHalt = 0x00000000;
376 2 USB_Configure(FALSE);
377 2 }
378 1
379 1 if (USB_Configuration == SetupPacket.wValue.WB.L) {
380 2 return (TRUE);
381 2 } else {
382 2 return (FALSE);
383 2 }
384 1 }
385
386
387 /*
388 * Set Interface USB Request
ARM COMPILER V2.42b, usbcore 02/01/06 23:45:15 PAGE 7
389 * Parameters: None (global SetupPacket)
390 * Return Value: TRUE - Success, FALSE - Error
391 */
392
393 __inline BOOL USB_SetInterface (void) {
394 1 USB_COMMON_DESCRIPTOR *pD;
395 1 DWORD ifn, alt, old, msk, n, m;
396 1 BOOL set;
397 1
398 1 if (USB_Configuration == 0) return (FALSE);
399 1
400 1 set = FALSE;
401 1 pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor;
402 1 while (pD->bLength) {
403 2 switch (pD->bDescriptorType) {
404 3 case USB_CONFIGURATION_DESCRIPTOR_TYPE:
405 3 if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue != USB_Configuration) {
406 4 (BYTE *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
407 4 continue;
408 4 }
409 3 break;
410 3 case USB_INTERFACE_DESCRIPTOR_TYPE:
411 3 ifn = ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber;
412 3 alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting;
413 3 msk = 0;
414 3 if ((ifn == SetupPacket.wIndex.WB.L) && (alt == SetupPacket.wValue.WB.L)) {
415 4 set = TRUE;
416 4 old = USB_AltSetting[ifn];
417 4 USB_AltSetting[ifn] = (BYTE)alt;
418 4 }
419 3 break;
420 3 case USB_ENDPOINT_DESCRIPTOR_TYPE:
421 3 if (ifn == SetupPacket.wIndex.WB.L) {
422 4 n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F;
423 4 m = (n & 0x80) ? ((1 << 16) << n) : (1 << n);
424 4 if (alt == SetupPacket.wValue.WB.L) {
425 5 USB_EndPointMask |= m;
426 5 USB_EndPointHalt &= ~m;
427 5 USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD);
428 5 USB_EnableEP(n);
429 5 USB_ResetEP(n);
430 5 msk |= m;
431 5 }
432 4 else if ((alt == old) && ((msk & m) == 0)) {
433 5 USB_EndPointMask &= ~m;
434 5 USB_EndPointHalt &= ~m;
435 5 USB_DisableEP(n);
436 5 }
437 4 }
438 3 break;
439 3 }
440 2 (BYTE *)pD += pD->bLength;
441 2 }
442 1 return (set);
443 1 }
444
445
446 /*
447 * USB Endpoint 0 Event Callback
448 * Parameter: event
449 */
450
451 void USB_EndPoint0 (DWORD event) {
452 1
453 1 switch (event) {
454 2
ARM COMPILER V2.42b, usbcore 02/01/06 23:45:15 PAGE 8
455 2 case USB_EVT_SETUP:
456 2 USB_SetupStage();
457 2 USB_DirCtrlEP(SetupPacket.bmRequestType.BM.Dir);
458 2 EP0Data.Count = SetupPacket.wLength;
459 2 switch (SetupPacket.bmRequestType.BM.Type) {
460 3
461 3 case REQUEST_STANDARD:
462 3 switch (SetupPacket.bRequest) {
463 4
464 4 case USB_REQUEST_GET_STATUS:
465 4 if (!USB_GetStatus()) {
466 5 goto stall_i;
467 5 }
468 4 break;
469 4
470 4 case USB_REQUEST_CLEAR_FEATURE:
471 4 if (!USB_SetClrFeature(0)) {
472 5 goto stall_i;
473 5 }
474 4 USB_StatusInStage();
475 4 #if USB_FEATURE_EVENT
USB_Feature_Event();
#endif
478 4 break;
479 4
480 4 case USB_REQUEST_SET_FEATURE:
481 4 if (!USB_SetClrFeature(1)) {
482 5 goto stall_i;
483 5 }
484 4 USB_StatusInStage();
485 4 #if USB_FEATURE_EVENT
USB_Feature_Event();
#endif
488 4 break;
489 4
490 4 case USB_REQUEST_SET_ADDRESS:
491 4 switch (SetupPacket.bmRequestType.BM.Recipient) {
492 5 case REQUEST_TO_DEVICE:
493 5 USB_DeviceAddress = 0x80 | SetupPacket.wValue.WB.L;
494 5 USB_StatusInStage();
495 5 break;
496 5 default:
497 5 goto stall_i;
498 5 }
499 4 break;
500 4
501 4 case USB_REQUEST_GET_DESCRIPTOR:
502 4 if (!USB_GetDescriptor()) {
503 5 goto stall_i;
504 5 }
505 4 break;
506 4
507 4 case USB_REQUEST_SET_DESCRIPTOR:
508 4 /*stall_o:*/ USB_SetStallEP(0x00);
509 4 EP0Data.Count = 0;
510 4 break;
511 4
512 4 case USB_REQUEST_GET_CONFIGURATION:
513 4 switch (SetupPacket.bmRequestType.BM.Recipient) {
514 5 case REQUEST_TO_DEVICE:
515 5 EP0Data.pData = &USB_Configuration;
516 5 USB_DataInStage();
517 5 break;
518 5 default:
519 5 goto stall_i;
520 5 }
ARM COMPILER V2.42b, usbcore 02/01/06 23:45:15 PAGE 9
521 4 break;
522 4
523 4 case USB_REQUEST_SET_CONFIGURATION:
524 4 switch (SetupPacket.bmRequestType.BM.Recipient) {
525 5 case REQUEST_TO_DEVICE:
526 5 if (!USB_SetConfiguration()) {
527 6 goto stall_i;
528 6 }
529 5 USB_StatusInStage();
530 5 #if USB_CONFIGURE_EVENT
531 5 USB_Configure_Event();
532 5 #endif
533 5 break;
534 5 default:
535 5 goto stall_i;
536 5 }
537 4 break;
538 4
539 4 case USB_REQUEST_GET_INTERFACE:
540 4 switch (SetupPacket.bmRequestType.BM.Recipient) {
541 5 case REQUEST_TO_INTERFACE:
542 5 if ((USB_Configuration != 0) &&
543 5 (SetupPacket.wIndex.WB.L < USB_NumInterfaces)) {
544 6 EP0Data.pData = USB_AltSetting + SetupPacket.wIndex.WB.L;
545 6 USB_DataInStage();
546 6 } else {
547 6 goto stall_i;
548 6 }
549 5 break;
550 5 default:
551 5 goto stall_i;
552 5 }
553 4 break;
554 4
555 4 case USB_REQUEST_SET_INTERFACE:
556 4 switch (SetupPacket.bmRequestType.BM.Recipient) {
557 5 case REQUEST_TO_INTERFACE:
558 5 if (!USB_SetInterface()) {
559 6 goto stall_i;
560 6 }
561 5 USB_StatusInStage();
562 5 #if USB_INTERFACE_EVENT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -