Stap 6: Behandeling van USB standaard verzoeken
Elke aanvraag wordt geleverd in een standaardformaat, die kan worden toegewezen aan een gegevensstructuur die het verzoek qua grootte, betekenis, en inhoud beschrijft. Het kijkt als:
typedef struct usbRequest{ uchar bmRequestType; uchar bRequest; usbWord_t wValue; usbWord_t wIndex; usbWord_t wLength; }usbRequest_t;
V-USB API vereist dat u te maken een functie genaamd "usbFunctionSetup", waarin 8 bytes in. Deze 8 bytes worden gegoten met het type "usbRequest_t". Vervolgens is de aanvraag gedecodeerd en vervuld. Er zijn drie dingen die we moeten behandelen:
- Verzoek om het verslag
- Verzoek om het verslag-descriptor
- Verzoek om instelling van het stationair tarief
Dus het stukje code ziet er als:
static unsigned char idleRate; unsigned char usbFunctionSetup(unsigned char data[8]) { usbRequest_t *rq = (void *)data; if ((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) /* class request type */ { if (rq->bRequest == USBRQ_HID_GET_REPORT) /* wValue: ReportType (highbyte), ReportID (lowbyte) */ { usbMsgPtr = &gamepad_report; return sizeof(gamepad_report); } else if (rq->bRequest == USBRQ_HID_GET_IDLE) { usbMsgPtr = &idleRate; return 1; } else if (rq->bRequest == USBRQ_HID_SET_IDLE) { idleRate = rq->wValue.bytes[1]; } } else { // no vendor specific requests implemented } return 0; }
Dit stukje code gaat in de hele broncode.
Meer lezen: