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