USB-Wii Classic Controller (7 / 18 steg)
Steg 6: Hanterar USB Standard begäranden
Varje begäran kommer i en standard format, som kan mappas till en datastruktur som beskriver begäran av dess storlek, mening och innehåll. Det ser ut:
TypeDef struct usbRequest {
uchar bmRequestType;
uchar bRequest;
usbWord_t wValue;
usbWord_t wIndex;
usbWord_t wLength;
} usbRequest_t;
V-USB API kräver dig att göra en funktion som kallas "usbFunctionSetup" som tar 8 byte i. Dessa 8 byte är gjutna till typ "usbRequest_t". Sedan är begäran avkodas och uppfyllda. Det finns tre saker som vi måste hantera:
- Begäran om rapporten
- Begäran om rapporten deskriptorn
- Förfrågan om att ange andelen tomgång
Så bit kod ser ut:
statiska unsigned char idleRate;
unsigned char usbFunctionSetup (unsigned char data[8])
{
usbRequest_t * rq = (void *) data.
om ((rq -> bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) / * klass typ * /
{
om (rq -> bRequest == USBRQ_HID_GET_REPORT) / * wValue: ReportType (highbyte), ReportID (lowbyte) * /
{
usbMsgPtr = & gamepad_report;
återvända sizeof(gamepad_report);
}
annars om (rq -> bRequest == USBRQ_HID_GET_IDLE)
{
usbMsgPtr = & idleRate;
tillbaka 1.
}
annars om (rq -> bRequest == USBRQ_HID_SET_IDLE)
{
idleRate = rq -> wValue.bytes[1];
}
}
annat
{
inga specifika leverantörsförfrågningar som genomfört
}
Return 0;
}
Denna del av koden går in hela källkoden.
Mer läsning: