Stap 5: Maak de HID-descriptor voor uw nieuwe apparaat
Nu heb je de instellingen van uw prototype die u beginnen kunt met het zetten van je Arduino in een HID-compatibel apparaatgetest. De Arduino omgeving is al ingesteld om te kunnen functioneren als een toetsenbord en een muis, maar wij moeten toevoegen een ander type van apparaat in de mix.
De HID-specificaties zijn ontworpen om iedereen te maken van een apparaat uit USB-geheugenklasse of toepassing zonder de noodzaak om het maken van aangepaste drivers. Dit is erg handig, maar betekent wel dat de specificatie vrij complex, is zoals zij wil alle dingen zijn aan alle mensen. In wezen u het type apparaat dat u samenstelt - toetsenbord, Joystick, muis, Gamepad, stuurwiel, enz - en geef vervolgens een of meer collecties van de ingangen van verschillende typen. Deze instellingen en het type en de grootte van de invoergegevens worden aangeduid met een lange reeks van geheimzinnige codes en maak niet gemakkelijk te lezen. Gelukkig zijn de meeste descriptoren die ik heb gevonden zwemmen met platte-tekst commentaar waardoor het leven een beetje makkelijker. Er zijn ook een paar goede gidsen en gebruik tabellen op het web. Ze zijn een beetje droog, maar ze zullen helpen u om te vinden wat je nodig hebt. Hier zijn een paar vond ik handig:
HID Tutorial: http://developer.mbed.org/media/uploads/wim/hid_usb_intro_an249.pdf
HID tabel gebruik: http://www.freebsddiary.org/APC/usb_hid_usages.php
Ook vindt u meer gedetailleerde info en een (vrij onhandig) HID descriptor tool op http://www.usb.org/developers/hidpage#HID Descriptor-hulpprogramma
Hier is de HID "descriptor" die ik gebruik voor mijn setup:
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x05, // USAGE (Game Pad) 0xa1, 0x01, // COLLECTION (Application) 0x85, 0x03, // REPORT_ID (3) (This is important when HID_SendReport() is called) 0xA1, 0x00, // COLLECTION (Physical) // 8 buttons 0x05, 0x09, // USAGE_PAGE (Button) 0x19, 0x01, // USAGE_MINIMUM (Button 1) 0x29, 0x08, // USAGE_MAXIMUM (Button 8) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x95, 0x08, // REPORT_COUNT (8) 0x75, 0x01, // REPORT_SIZE (1) 0x81, 0x02, // INPUT (Data,Var,Abs) <br> // 1 Hat Switch 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x39, // USAGE (Hat switch) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x07, // LOGICAL_MAXIMUM (7) 0x35, 0x00, // PHYSICAL_MINIMUM (0) 0x46, 0x3B, 0x01, // PHYSICAL_MAXIMUM (315) 0x65, 0x14, // UNIT (Eng Rot:Angular Pos) 0x75, 0x04, // REPORT_SIZE (4) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x02, // INPUT (Data,Var,Abs) <br> // Padding (4 bytes) 0x75, 0x04, // REPORT_SIZE (4) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x03, // INPUT (Cnst,Var,Abs) // 1 D-pads - Dummy so Elite:Dangerous recognises it 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x25, 0x7f, // LOGICAL_MAXIMUM (127) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xC0, //END COLLECTION 0xC0, //END COLLECTION
Om hier te komen ik keek over de USAGE_PAGE en gebruik specificaties en besloot dat Game Pad de beste omschrijving om te gebruiken is als een Joystick technisch ten minste 2 analoge assen plus ten minste twee knoppen heeft. De gamepad kunt laten analoge X / Y of een digitale 4-wegschakelaar plus ten minste twee knoppen, dus ik mijn extensie in deze categorie passen kon. Na dat we een collectie voor de toepassing opgeven en geef het een verslag-ID. Dit helpt ons de gegevens later te herkennen.
Nu geven we een fysieke collectie. Dit houdt onze knoppen. U kunt collecties, geneste of side-by-side, maar ik heb niet het gevoel de noodzaak. Binnen de fysieke collectie geeft u nu de ingangen. Om te beginnen met ik de knop gebruik lijstpagina en geef de minimale en maximale waarden, in dit geval 1 en 8, zoals ik heb 8 knoppen. Ik geef vervolgens logische minimum en maximum voor elk van deze knoppen. Zoals ze eenvoudige schakelaars zijn heb ik alleen 1 en 0 voor gedrukt en niet ingedrukt. Ik geef het aantal items in het rapport en het aantal meldingen voor deze pagina gebruik. Tot slot geef ik het invoertype voor deze waarde - gegevens, die is variabel, en bestaat uit absolute waarden, in plaats van waarden die ten opzichte van de laatste gerapporteerde waarden.
De hat-switch is iets anders. Een hat-switch vereist een waarde tussen 0 en 7, waarmee de richting van de hoed in stappen van 45 graden - 0 = omhoog, 1 = omhoog/naar rechts, 2 = gelijk, 3 = omlaag/naar rechts enz. Dit betekent dat we de logische min/max als 0 en 7 en de fysieke min/max als 0 en 315 opgeeft. We hoeven niet te gaan om het even welk verder als 360 graden is gelijk aan 0 graden. Wij geeft u ook de eenheid als een hoekige rotatie-positie. 0-7 kunnen worden ondergebracht in vier stukjes is ditmaal de grootte van het verslag 4.
Zo, 8 knoppen en een hoed, we zijn klaar? Niet helemaal. U wilt een geheel aantal bytes voor elk rapport overbrengen met de USB-host, dus moeten we enkele opvulling toevoegen. Je kan dit doen door toevoeging van een andere phantom hoed die nooit wordt gebruikt, maar het is gewoon toevoegen van een ander verslag van 4 bits en instellen van het invoertype aan constante schoner. Zodra dit gebeurd kunt u afsluiten van zowel de fysieke en application-collecties en je bent klaar.
Helaas, terwijl Windows het apparaat prima erkent vindt u dat enkele games die zullen niet zoals ze verwachten te vinden een X / Y-as dus zoals je kunt zien uit het bovenstaande bestand dat ik heb toegevoegd dummy X / Y-as. Deze worden weergegeven in de gegevens overgedragen, maar als we nooit de waarden van 0 veranderen dan de dummy stick zal nooit lijken te bewegen.