USB-Wii Classic Controller (6 / 18 steg)
Steg 5: USB-HID-rapporter och rapport beskrivare
Ta en titt på din Wii Classic Controller. Den har 15 knappar (runda upp till 16 för enkelhet) och två joysticks. Detta innebär att vi måste skicka 15 bitar data för knapparna och 4 siffror, en för varje axel av joystick data. Vi definierar våra dataformat se ut så här:
Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | |
Byte 0 | Knappen | Knappen | Knappen | Knappen | Knappen | Knappen | Knappen | Knappen |
Byte 1 | Knappen | Knappen | Knappen | Knappen | Knappen | Knappen | Knappen | Knappen |
Byte 2 | Vänster styrspak X Axis som signerade Char heltal | |||||||
Byte 3 | Vänster styrspak Y axeln som signerade Char heltal | |||||||
Byte 4 | Rätt pinne X Axis som signerade Char heltal | |||||||
Byte 5 | Rätt pinne Y axeln som signerade Char heltal |
Och vi kan sedan definiera en datastruktur i C/C++
struct gamepad_report_t
{
uint16_t knappar.
int8_t left_x;
int8_t left_y;
int8_t right_x;
int8_t right_y;
}
Skriva en rapport deskriptor innebär som beskriver ett användning sammanhang först, och sedan beskriva innebörden av data i förhållande till ramen för användning, och sedan beskriva data i form av dess utbredning och storlek.
Se först datorn förstår att enheten är en gamepad
USAGE_PAGE (generiska skrivbordet)
ANVÄNDNING (spelkontroll)
SAMLING (ansökan)
SAMLING (fysiska)
...
SLUTET SAMLING
SLUTET SAMLING
Sedan Beskriv knappen data (16 bitar)
USAGE_PAGE (knapp)
USAGE_MINIMUM (knappen 1)
USAGE_MAXIMUM (knappen 16)
LOGICAL_MINIMUM (0)
LOGICAL_MAXIMUM (1)
REPORT_COUNT (16)
REPORT_SIZE (1)
INPUT (Data, Varians, Abs)
Sedan Beskriv 4 axel data som signerad 8-bitars heltal
USAGE_PAGE (generiska skrivbordet)
ANVÄNDNING (X)
ANVÄNDNING (Y)
ANVÄNDNING (Z)
ANVÄNDNING (Rx)
LOGICAL_MINIMUM (-127)
LOGICAL_MAXIMUM (127)
REPORT_SIZE (8)
REPORT_COUNT (4)
INPUT (Data, Varians, Abs)
- Obs: Z används för att representera den rätt pinnen X-axeln, Rx används för att representera den rätt pinne Y-axeln. Detta är obegripligt men detta är hur de flesta befintliga USB-spel kuddar fungerar. Jag har testat detta med Battlefield Bad Company 2, det fungerar.
- Obs: Använd "absoluta" för något som joysticks, men "relativa" för saker som mus.
Slutligen, rapport deskriptorn ser ut:
USAGE_PAGE (generiska skrivbordet)
ANVÄNDNING (spelkontroll)
SAMLING (ansökan)
SAMLING (fysiska)
USAGE_PAGE (knapp)
USAGE_MINIMUM (knappen 1)
USAGE_MAXIMUM (knappen 16)
LOGICAL_MINIMUM (0)
LOGICAL_MAXIMUM (1)
REPORT_COUNT (16)
REPORT_SIZE (1)
INPUT (Data, Varians, Abs)
USAGE_PAGE (generiska skrivbordet)
ANVÄNDNING (X)
ANVÄNDNING (Y)
ANVÄNDNING (Z)
ANVÄNDNING (Rx)
LOGICAL_MINIMUM (-127)
LOGICAL_MAXIMUM (127)
REPORT_SIZE (8)
REPORT_COUNT (4)
INPUT (Data, Varians, Abs)
SLUTET SAMLING
SLUTET SAMLING
Nu när vi har en rapport deskriptor, hur gör vi våra AVR berätta det här till datorn? Gå Hämta officiella "gömde deskriptor Tool" från http://www.usb.org/developers/hidpage/ . Använda den för att sätta det här i och verktyget kommer att generera korrekt binära matrisen för dig.
När du sparar ditt resultat, gå till "File" -> "Spara som" och sedan se till att du väljer "Header-fil (* .h)" Spara i dialogrutan. Öppna sedan filen, det ska se ut
char ReportDescriptor [vissa nummer här (storlek array)] {
en hel del byte här
};
Stor, storleken på matrisen måste kopieras in i V-USB "usbconfig.h" där det står "USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH", och "char ReportDescriptor" måste döpas om till "PROGMEM char usbHidReportDescriptor" så att den lagras i AVR: s blixt minne. Du sluta med något liknande:
PROGMEM char usbHidReportDescriptor [46] = {
0x05, 0x01, / / USAGE_PAGE (generiska skrivbordet)
0x09, 0x05, / / användning (spelkontroll)
0xa1, 0x01, / / samling (ansökan)
0xa1, 0x00, / / samling (fysiska)
0x05, 0x09, / / USAGE_PAGE (knapp)
0x19, 0x01, / / USAGE_MINIMUM (knappen 1)
0x29, 0x10, / / USAGE_MAXIMUM (knappen 16)
0X15, 0X00, / / LOGICAL_MINIMUM (0)
0X25, 0X01, / / LOGICAL_MAXIMUM (1)
0X95, 0X10, / / REPORT_COUNT (16)
0X75, 0X01, / / REPORT_SIZE (1)
0x81, 0x02, / / ingång (Data, Var, Abs)
0x05, 0x01, / / USAGE_PAGE (generiska skrivbordet)
0X09, 0X30, / / ANVÄNDNING (X)
0X09, 0X31, / / ANVÄNDNING (Y)
0X09, 0X32, / / ANVÄNDNING (Z)
0x09, 0x33, / / användning (Rx)
0X15, 0X81, / / LOGICAL_MINIMUM (-127)
0X25, 0X7F, / / LOGICAL_MAXIMUM (127)
0X75, 0X08, / / REPORT_SIZE (8)
0X95, 0X04, / / REPORT_COUNT (4)
0x81, 0x02, / / ingång (Data, Var, Abs)
0XC0, / / END_COLLECTION
0XC0 / / END_COLLECTION
};
Denna del av koden, plus struct typedef vi gjorde tidigare, ingår i vår projekt källkod (se hela källkoden) senare.
Mer läsning: