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