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