📄 host_811.lst
字号:
481 1 {
482 2 if (setup->bmRequest & 0x80) // host-to-device : IN token
483 2 {
484 3 pid = PID_OUT;
485 3 if(!usbXfer(usbaddr, ep0, PID_IN, 0, payload, wLen, pData))
486 3 return FALSE;
487 3 payload = 0;
488 3 }
C51 COMPILER V7.50 HOST_811 10/27/2005 20:00:37 PAGE 9
489 2 else // device-to-host : OUT token
490 2 {
491 3 if(!usbXfer(usbaddr, ep0, PID_OUT, 0, payload, wLen, pData))
492 3 return FALSE;
493 3 }
494 2 }
495 1
496 1 //----------------------------------------------------
497 1 // Status stage IN or OUT zero-length data packet
498 1 //----------------------------------------------------
499 1 if(!usbXfer(usbaddr, ep0, pid, 0, payload, 0, NULL))
500 1 return FALSE;
501 1
502 1 return TRUE;
503 1 }
504
505 //*****************************************************************************************
506 // Control endpoint
507 //*****************************************************************************************
508 int VendorCmd(BYTE usbaddr,BYTE bReq,BYTE bCmd,WORD wValue,WORD wIndex,WORD wLen,BYTE *pData)
509 {
510 1 xdata SetupPKG setup;
511 1
512 1 setup.bmRequest = bReq;
513 1 setup.bRequest = bCmd;
514 1 setup.wValue = wValue;
515 1 setup.wIndex = wIndex;
516 1 setup.wLength = WordSwap(wLen);
517 1
518 1 return ep0Xfer(usbaddr, uDev[usbaddr].wPayLoad[0], &setup, pData);
519 1 }
520
521 //*****************************************************************************************
522 // Set Device Address :
523 //*****************************************************************************************
524 int SetAddress(WORD addr)
525 {
526 1 return VendorCmd(0,0,SET_ADDRESS, WordSwap(addr), 0, 0, NULL);
527 1 }
528
529 //*****************************************************************************************
530 // Set Device Configuration :
531 //*****************************************************************************************
532 int Set_Configuration(BYTE usbaddr, WORD wVal)
533 {
534 1 return VendorCmd(usbaddr, 0, SET_CONFIG, WordSwap(wVal), 0, 0, NULL);
535 1 }
536
537 //*****************************************************************************************
538 // Get Device Descriptor : Device, Configuration, String
539 //*****************************************************************************************
540 int GetDesc(BYTE usbaddr, WORD wValue, WORD wIndex, WORD wLen, BYTE *desc)
541 {
542 1 return VendorCmd(usbaddr, 0x80, GET_DESCRIPTOR, wValue, wIndex, wLen, desc);
543 1 }
544
545 //*****************************************************************************************
546 // HID Get_Desc :
547 //*****************************************************************************************
548 int GetHid_Desc(BYTE usbaddr, WORD wValue, WORD wLen, BYTE *desc)
549 {
550 1 return VendorCmd(usbaddr, 0x81, GET_DESCRIPTOR, wValue, 0, wLen, desc);
C51 COMPILER V7.50 HOST_811 10/27/2005 20:00:37 PAGE 10
551 1 }
552
553 //*****************************************************************************************
554 // GetHUBDesc :
555 //*****************************************************************************************
556 int GetHubDesc(BYTE usbaddr, WORD wValue, WORD wLen, BYTE *desc)
557 {
558 1 return VendorCmd(usbaddr, 0xA0, GET_DESCRIPTOR, wValue, 0, wLen, desc);
559 1 }
560
561 //*****************************************************************************************
562 // Get Status : (HUB)
563 //*****************************************************************************************
564 int GetStatus(BYTE usbaddr, BYTE *desc)
565 {
566 1 return VendorCmd(usbaddr, 0x80, GET_STATUS, 0, 0, 2, desc);
567 1 }
568
569 //*****************************************************************************************
570 // PortFeature : (SET_FEATURE, CLEAR_FEATURE)
571 //*****************************************************************************************
572 int PortFeature(BYTE usbaddr, BYTE bReq, WORD wValue, BYTE cPort)
573 {
574 1 return VendorCmd(usbaddr, 0x23, bReq, WordSwap(wValue), WordSwap((WORD)cPort), 0, NULL);
575 1 }
576
577 //*****************************************************************************************
578 // GetPortStatus :
579 //*****************************************************************************************
580 int GetPortStatus(BYTE usbaddr, BYTE cPort, BYTE *desc)
581 {
582 1 return VendorCmd(usbaddr, 0xA3, GET_STATUS, 0, WordSwap((WORD)cPort), 0x04, desc);
583 1 }
584
585 //*****************************************************************************************
586 // GetDevInfo :
587 //*****************************************************************************************
588 WORD GetDevInfo(BYTE *DevInfo)
589 {
590 1 BYTE EpAddr;
591 1 int i;
592 1 BYTE DescBufLen = 0;
593 1
594 1 for(EpAddr = 1; (EpAddr < MAX_DEV); EpAddr++)
595 1 {
596 2 if(uHub.bPortPresent[EpAddr])
597 2 {
598 3 DevInfo[DescBufLen++] = EpAddr; // USB Address
599 3 DevInfo[DescBufLen++] = uHub.bPortNumber[EpAddr]; // Port Number
600 3 DevInfo[DescBufLen++] = uHub.bPortSpeed[EpAddr]; // Device Speed (from enum)
601 3 DevInfo[DescBufLen++] = uDev[EpAddr].bClass; // Class Type (from enum)
602 3 (WORD)DevInfo[DescBufLen++] = uDev[EpAddr].wVID; // VID
603 3 DescBufLen++;
604 3 (WORD)DevInfo[DescBufLen++] = uDev[EpAddr].wPID; // PID
605 3 DescBufLen++;
606 3 DevInfo[DescBufLen++] = (BYTE)uDev[EpAddr].wPayLoad[0]; // Ep0 MaxPktSize (max 64 bytes)
607 3 DevInfo[DescBufLen++] = uDev[EpAddr].bNumOfEPs; // Number of data endpoints
608 3 for(i=0;i<uDev[EpAddr].bNumOfEPs;i++) // save all data endpoints info
609 3 {
610 4 DevInfo[DescBufLen++] = uDev[EpAddr].bEPAddr[i+1]; // ep address/direction
611 4 DevInfo[DescBufLen++] = uDev[EpAddr].bAttr[i+1]; // transfer type
612 4 (WORD)DevInfo[DescBufLen++] = uDev[EpAddr].wPayLoad[i+1]; // max data payload
C51 COMPILER V7.50 HOST_811 10/27/2005 20:00:37 PAGE 11
613 4 DescBufLen++; // 2 byte payload
614 4 DevInfo[DescBufLen++] = uDev[EpAddr].bInterval[i+1]; // polling interval
615 4 }
616 3 }
617 2 }
618 1 return(DescBufLen);
619 1 }
620
621 //*****************************************************************************************
622 // USB Data Endpoint Read/Write
623 // wLen is in low byte first format
624 //*****************************************************************************************
625 int DataRW(BYTE usbaddr, BYTE epaddr, WORD wPayload, WORD wLen, BYTE *pData)
626 {
627 1 xdata BYTE pid = PID_OUT;
628 1
629 1 if(epaddr & 0x80) // get direction of transfer
630 1 pid = PID_IN;
631 1
632 1 if(usbXfer(usbaddr,epaddr&0x0F,pid,0,wPayload,wLen,pData))
633 1 return TRUE;
634 1
635 1 return FALSE;
636 1 }
637
638 //*****************************************************************************************
639 // USB Device Enumeration Process
640 // Support 1 confguration and interface #0 and alternate setting #0 only
641 // Support up to 1 control endpoint + 4 data endpoint only
642 //*****************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -