Računalniki Windows Internet

Skrit opis protokola. Uvod v svet USB naprav na primeru mikrokontrolerjev podjetja Silicon Laboratories. Na kratko: kaj je HID in kaj vsebuje?

Danes večina sodobnih računalnikov nima serijskih in vzporednih vrat, ki so se prej uporabljala za igranje iger. Uporaba USB postaja med navdušenci vse bolj priljubljena. Na žalost USB ni najlažji protokol in je pogosto naravnost zastrašujoč. Vendar pa je na trgu več rešitev, ki olajšajo implementacijo naprav USB.

Ta projekt obravnava uporabo mikrokrmilnika PIC, ki podpira USB, in prevajalnika za pretvorbo stare krmilne palice vrat za igre, tako da jo je mogoče uporabljati prek USB-ja. Ena od prednosti prevajalnika mikroC je ustvarjanje knjižnic USB HID, ki olajšajo ustvarjanje naprave USB HID. Pri pisanju USB kode s prevajalnikom mikroC je proizvedena USB naprava prava HID naprava, ki se lahko uporablja za prenos in sprejemanje podatkov iz mikrokontrolerja PIC. Vendar pa je mogoče spremeniti deskriptor USB, ki ga ustvari mikroC, tako da je mogoče pridobiti specifično napravo USB HID, kot je tipkovnica, miška, igralna palica ali tablica za grafične vnose.

Prevajalnik

Ta projekt uporablja prevajalnik mikroC v8. Uporabljene metode so podobne večini drugih prevajalnikov, ki generirajo kodo HID.

Krmilna palica

Ta projekt uporablja staro igralno palico IBM 76H1571, fotografija je prikazana spodaj:

76H1571 je igralna palica s 4 gumbi, kolescem za plin in stikalom za pogled POV hat. Najbolj zanimivo je, da ne morete uporabljati kolesa in stikala hkrati - lahko uporabite enega ali drugega elementa. Dve drsni stikali na sprednji strani krmilne palice se uporabljata za vklop in izklop kolesca in stikala POV, tako da lahko izberete kateri koli element, ki ga želite uporabiti v danem trenutku.

Ker pri vmesniku USB ni omejitev, bo predelana igralna palica lahko hkrati uporabljala kolesce in stikalo za pogled. Potem ti dve stikali ne bosta uporabljeni, zakaj jima torej ne bi dodelili novih funkcij?

Na koncu bi rad poudaril, da ima predelana igralna palica naslednje značilnosti:

  • 2-osna igralna palica
  • Plin kolesa
  • 4-smerno POV stikalo
  • 6 gumbov

Deskriptor poročila HID

Ko prevajalnik ustvari kodo USB HID, ustvari deskriptor, ki se pošlje gostitelju USB in označuje, katera vrsta naprave USB je povezana. Deskriptor naprave HID je nekoliko drugačen, ker ima vgrajen dodaten deskriptor, ki identificira vrsto naprave HID in način njene uporabe. V tem razdelku bomo obravnavali postopek pretvorbe naše naprave v igralno palico.

Ustvarjanje ročaja

Spletno mesto USB IF gosti uporaben program, ki olajša ustvarjanje deskriptorjev poročil HID. Imenuje se HID Deskriptor Tool in ga lahko brezplačno prenesete s strani HID Tools. Po prenosu razpakirajte arhiv in zaženite datoteko Dt.exe.

S tem programom lahko ustvarite lasten deskriptor poročila za krmilno palico (ali katero koli drugo napravo HID), določite število osi in gumbov ter določite druge karakteristike (pedali krmila, kolesa itd.). Program ima tudi predloge deskriptorjev, ki jih lahko takoj uporabite ali spremenite, da ustrezajo vašim potrebam. Nahajajo se v isti mapi kot izvršljiva datoteka in imajo pripono .skril. Pokliče se predloga krmilne palice joystk.hid, to sem uporabil. Ko se naloži, se prikaže naslednji zaslon:

Pomembni razdelki so označeni z rdečim okvirjem. Označujejo naslednje parametre:

  • 1 kolo, opisano z 8-bitno vrednostjo od -127 do 127
  • X in Y osi
  • 1 stikalo za pogled POV, ki ima 4 položaje (0-3) in predstavlja kot 0-270, opisano s 4-bitno vrednostjo
  • 4 gumbi, vsak opisan z 1 bitom

Kot lahko vidite, indikator REPORT_SIZE definira bitno globino podatkov, ki se uporabljajo za predstavitev parametra in eksponenta REPORT_COUNT, ki določa število poslanih poročil, ki predstavljajo parameter.

Sprememba deskriptorja

Dodajanje ročaja vaši kodi

Ko ustvarite ročaj poročila, ga morate izvoziti v kodo C. Če želite to narediti, kliknite Datoteka->Shrani kot v meniju programa HID Deskriptor Tool. V pogovornem oknu, ki se prikaže, spremenite vrsto datoteke v Datoteka glave (*.h).

S tem boste ustvarili datoteko glave C, ki jo lahko pozneje dodate svojemu projektu.

integracija mikroC

Če želite dodati datoteko glave deskriptorju, ki ga ustvari mikroC, boste morali izvesti nekaj korakov. Če pogledate deskriptor mikroC, boste opazili, da vsakemu bajtu sledi znak ‘,0’ (ne upoštevajoč narekovajev, to je vejica-ničla). Spremeniti boste morali deskriptor poročila, ki je bil ustvarjen, vključno s podatki razširitve. Na koncu bi morali dobiti ročaj, ki je videti takole:

0x05, 0, 0x01, 0, // USAGE_PAGE (generično namizje) 0x15, 0, 0x00, 0, // LOGICAL_MINIMUM (0) 0x09, 0, 0x04, 0, // UPORABA (joystick) 0xa1, 0, 0x01, 0 , // ZBIRANJE (Aplikacija) 0x05, 0, 0x02, 0, // USAGE_PAGE (Kontrolniki simulacije) 0x09, 0, 0xbb, 0, // UPORABA (Plin) 0x15, 0, 0x81, 0, // LOGIČNI_MINIMUM (-127 ) 0x25, 0, 0x7f, 0, // LOGICAL_MAXIMUM (127) 0x75, 0, 0x08, 0, // REPORT_SIZE (8) 0x95, 0, 0x01, 0, // REPORT_COUNT (1) 0x81, 0, 0x02, 0 , // INPUT (Podatki, Var, Abs) 0x05, 0, 0x01, 0, // USAGE_PAGE (Generic Desktop) 0x09, 0, 0x01, 0, // UPORABA (Kazalec) 0xa1, 0, 0x00, 0, // ZBIRANJE (fizično) 0x09, 0, 0x30, 0, ////////////////////////////////////// / // // UPORABA (X) 0x09, 0, 0x31, 0, // UPORABA (Y) 0x95, 0, 0x02, 0, // REPORT_COUNT (2) 0x81, 0, 0x02, 0, // INPUT (podatki, Var,Abs) 0xc0, 0, // END_COLLECTION 0x09, 0, //////////////////////////////// // ///////// 0x39, 0, // UPORABA (preklop klobuka) 0x15, 0, 0x00, 0, // LOGICAL_MINIMUM (0) 0x25, 0, 0x03, 0, // LOGICAL_MAXIMUM (3) 0x35, 0, 0x00, 0, // PHYSICAL_MINIMUM (0) 0x46, 0, 0x0e, 0, 0x01, 0, // PHYSICAL_MAXIMUM (270) 0x65, 0, 0x14, 0, // ENOTA (Eng Rot:Angular Pos) 0x75, 0, 0x04, 0, // REPORT_SIZE (4) 0x95, 0, 0x01, 0, // REPORT_COUNT (1) 0x81, 0, 0x02, 0, // VNOS (Podatki, Var, Abs) 0x05, 0, // ////////////////////////////////// 0x09, 0, // USAGE_PAGE (gumb) 0x19, 0, 0x01, 0 , // USAGE_MINIMUM (gumb 1) 0x29, 0, 0x04, 0, // USAGE_MAXIMUM (gumb 4) 0x15, 0, 0x00, 0, // LOGICAL_MINIMUM (0) 0x25, 0, 0x01, 0, / / ​​LOGICAL_MAXIMUM (1 ) 0x75, 0, 0x01, 0, // REPORT_SIZE (1) 0x95, 0, 0x04, 0, // REPORT_COUNT (4) 0x55, 0, 0x00, 0, // UNIT_EXPONENT (0) 0x65, 0, 0x00, 0 , // ENOTA (brez) 0x81, 0, 0x02, 0, // VNOS (Podatki, Var, Abs) 0xc0, 0 // KONEC_ZBIRKE

Po izpolnitvi deskriptorja je naslednji korak, da izbrišete deskriptor poročila, ki ga ustvari mikroC, in ga nadomestite s svojim. Če želite to narediti, najprej ustvarite ročaj mikroC z orodjem mikroC HID, nato pa ga odprite v urejevalniku.

Dejanski podatki ročaja so v celoti shranjeni v matriki DescTables. Spodnjih 50 ali več vnosov v matriki je ročaj poročila (vrstice 109–160). Izbrišite te vrstice in jih nato prilepite v nov deskriptor na tem mestu. Zdaj morate narediti naslednje spremembe v datoteki USBdsc.c:

  • Spremenite vrstico 23, da se ujema prazna velikost deskriptor poročila (tj. velikost deskriptorja, ki ga ustvari orodje HID, brez dodatnih vnosov 0', ki jih je treba dodati za mikroC - 77 bajtov v primeru privzetega deskriptorja za krmilno palčko):
    • unsigned char const HID_ReportDesc_len = 77;
  • Odstrani meje polja za DescTables na vrstici 36:
  • unsigned char const DescTables = (

To je vse. Zdaj je deskriptor spremenjen in lahko deluje kot igralna palica USB. Najlažji način testiranja je, da sestavite kodo za mikrokrmilnik PIC, ga priključite na USB vhod vašega računalnika in se prepričate, da ga računalnik pravilno prepozna. Nato morate iti na nadzorno ploščo in odpreti pogovorno okno Igralne naprave. Vaša igralna palica bi se morala prikazati na seznamu naprav.

Prenos podatkov na osebni računalnik

Če je mikrokrmilnik PIC prepoznan kot krmilna palica USB, je najtežji del projekta končan. Prenos podatkov igralne palice na osebni računalnik se izvede na preprost način. Ko smo predhodno ustvarili ročaj, smo oblikovali priročno obliko podatkov v smislu ročaja. Kot rezultat poskusov smo dobili naslednje parametre:

Vrednosti kolesa, X in Y so 8-bitne vrednosti. Vendar so vrednosti izbirnika pogleda POV in gumbov 4-bitne, zato so zapakirane v en bajt. Format podatkov je podan spodaj:

Zahvaljujoč vnaprej določenemu formatu podatkov je možno enostavno posneti programsko kodo, ki služi kot vmesnik za nekatere gumbe in potenciometre, ter poslati podatke na osebni računalnik, da potrdimo, da programska koda deluje pravilno. Način delovanja igralne palice PIC lahko določite v možnostih Gaming devices v pogovornem oknu nadzorne plošče.

Strojna oprema

Ko preverite kodo, morate izvesti dejansko pretvorbo krmilne palice. Če želite to narediti, morate najprej razstaviti igralno palico in odstraniti obstoječo ploščo in kabel igralnih vrat:

Nastavitev stikal

Nato morate ugotoviti, kako so vsa stikala in potenciometri povezani skupaj. Potenciometre za krmilno palico in osi koles je enostavno prepoznati in povezati skupaj, da zagotovijo napajanje, ozemljitev in napetost za mikrokrmilnik PIC. Stikala je nekoliko težje razumeti, saj so odvisna od vrste igralne palice. S sledenjem sledi na tiskanem vezju smo ugotovili, kako so stikala povezana; glej sliko spodaj:

Najbolj zanimiv element je stikalo za pogled POV. Namesto 4 ločenih stikal je stikalo za pogled POV ožičeno kot analogni sistem, kjer upor skozi zeleno in oranžno žico določa, kateri gumb je pritisnjen. Spodnja tabela prikazuje upornost vsakega stikala:

Zato bodo za določitev smeri stikala pogleda POV njegove žice priključene na vezje delilnika napetosti, kot je prikazano spodaj:

Pri priključitvi žic na vir napajanja 5 V dobimo naslednje napetosti:

Električni diagram

Po določitvi žičnih povezav igralne palice smo oblikovali vezje, ki bi se povezalo z vsemi gumbi in potenciometri ter pošiljalo podatke v osebni računalnik. V ta namen je bil uporabljen mikrokrmilnik PIC18F2550, ki deluje na frekvenci 20 MHz. Stikala so priključena na priključke PORTB, potenciometri in stikalo pogleda POV pa na ADC priključka PORTA. Diagram je prikazan spodaj:

Spodaj je prikazana plošča (obstajajo tri premostitvene žice, kliknite za večjo sliko):

Po izdelavi plošče in testiranju postavite ploščo na dno igralne palice in zamenjajte kabel vrat za igro s kablom USB. Spodaj je prikazana fotografija predelane igralne palice:

Naprava je pripravljena za uporabo! Sestavite igralno palico in jo priključite na prosti USB priključek. Hkrati ga mora OS Windows pravilno zaznati. Lahko ga umerite in začnete uporabljati za igre, ki podpirajo krmilno palčko.

Zaključek

S tem projektom lahko ubijete dve muhi na en mah. Po eni strani projekt prikazuje, kako ustvariti igralno palico USB HID in spremeniti svojo staro igralno palico v sodobno ali ustvariti svojo igralno palico. Po drugi strani pa, če znate ustvariti programsko kodo za igralno palico USB, potem lahko ustvarite kodo za katero koli napravo HID, saj so vse podobne, razlika je le v tem, da boste morali za vsako napravo ustvariti poročilo HID deskriptor in omogoča pošiljanje podatkov v osebni računalnik.

Seznam radioelementov

Imenovanje Vrsta Denominacija Količina OpombaTrgovinaMoja beležka
U1 MK PIC 8-bitni

PIC18F2550

1

Mbed OS je odprtokodni operacijski sistem za platforme, ki uporabljajo mikrokrmilnike Arm, zasnovane posebej za naprave interneta stvari (IoT): naprave z nizko porabo energije, ki se morajo povezati z internetom. Mbed OS zagotavlja abstrakcijsko plast za mikrokontrolerje, na katerih teče, tako da se razvijalci lahko osredotočijo na pisanje aplikacij C/C++, ki kličejo funkcionalnost, ki je na voljo na različnih vrstah strojne opreme. Aplikacije Mbed OS je mogoče ponovno uporabiti na kateri koli platformi, združljivi z Mbed.

Na tej strani

Začetek

Če se želite potopiti naravnost:

  • Izvorna koda je na voljo na GitHubu in na naši strani za izdajo.

Izvorna koda in licenciranje

Mbed OS izdajamo pod licenco Apache 2.0, tako da ga lahko samozavestno uporabljate v komercialnih in osebnih projektih. Za več informacij o licenciranju si oglejte našo dokumentacijo o licenciranju.

Arhitekturni diagram

To je osnovna arhitektura plošče Mbed:

Osnove Mbed OS

Mbed OS uporablja sloj abstrakcije strojne opreme (HAL) za podporo najpogostejših delov mikrokrmilnika, kot so časovniki. Ta osnova olajša pisanje aplikacij glede na skupni nabor aplikacijskih programskih vmesnikov (API-jev); vaša naprava samodejno vključuje potrebne knjižnice in podporo za gonilnike za standardne zunanje naprave MCU, kot so I2C, serijski in SPI.

HAL služi tudi kot izhodišče pri dodajanju podpore za nove cilje ali funkcije obstoječim ciljem. Tesno sodelujemo z našimi silikonskimi partnerji pri prenosu teh novih funkcij na razvojne plošče, ki podpirajo Mbed.

Mbed OS ima jedro RTOS, zato podpira deterministično, večnitno izvajanje programske opreme v realnem času. Primitivni elementi RTOS so vedno na voljo, kar gonilnikom in aplikacijam omogoča, da se zanašajo na niti, semaforje, mutekse in druge funkcije RTOS.

Struktura Mbed OS omogoča ujemanje aplikacij in sistemov za shranjevanje. Z drugimi besedami, kjer se možnosti shranjevanja na ravni blokov razlikujejo in so odvisne od aplikacije, lahko izberete datotečni sistem, ki najbolje ustreza vaši napravi IoT. Datotečni sistem FAT - podprt s kartico SD - zagotavlja združljivost z drugimi operacijskimi sistemi, kot so Windows, Mac OS ali Linux. Kadar sta pomembna visoka zanesljivost in obnovitev po izpadu električne energije, je smiselno uporabiti naš vgrajeni datotečni sistem, podprt z (Q)SPI NOR flash čipom.

Nazadnje, Mbed OS izvaja plast ponovnega ciljanja in integracijo procesa zagona vsake podprte verige orodij namesto vas, tako da se razvoj aplikacij zdi podoben razvoju C ali C++ za kateri koli drug operacijski sistem.

Povezljivost

Arm sodeluje s svojimi partnerji, da omogoči Bluetooth Low Energy, NFC, RFID, LoRa, 6LoWPAN-ND, Thread, Wi-SUN, Ethernet, Wi-Fi, celični in mobilni IoT (LPWA) v napravah in sistemskih arhitekturah, ki uporabljajo Mbed OS. Mbed OS ponuja stabilno jedro obstoječih tehnologij povezljivosti. Hkrati dodaja sodobne v četrtletnih izdajah funkcij, s čimer vas obvešča o industrijskih trendih, tako da lahko preidete na nove, inovativne rešitve, ki ustvarjajo poslovno vrednost.

Omrežni in povezovalni nizi so dovolj prilagodljivi, da izpolnjujejo potrebe najzahtevnejših zasnov naprav IoT, ne glede na to, ali gre za kombinacijo mikrokrmilnika z enim čipom in radia ali več čipov, povezanih prek serijskih vodil. Oblikovalci sistemov lahko zaupajo našim certificiranim skladom za povezljivost, kot je naš certificirani sklad Thread, zaradi njihove zrelosti, interoperabilnosti in preverjenih komponent.

Mbed OS v celoti podpira našo platformo Pelion IoT, tako da lahko upravljate svoje nameščene naprave in njihove podatke. Mbed OS in Pelion skupaj sestavljata skladen ekosistem, ki izpolnjuje potrebe večine projektov, pripravljenih na proizvodnjo.

Varnost

Platforma Pelion IoT ima vgrajeno varnost na vseh ravneh, s poudarkom na zaščiti pred kršitvami in ublažitvi njihovih posledic. Poleg utrjenih storitev v oblaku, robustnih komunikacijskih skladov in varnih posodobitev vdelane programske opreme Mbed ponuja dva vgrajena gradnika, specifična za varnost: Arm Mbed TLS in Secure Partition Manager (SPM), ki ustreza najboljšim industrijskim praksam kot del Armove varnostne arhitekture platforme. Varni komunikacijski kanali Mbed TLS med napravo in prehodom ali strežnikom ter uporaba upravljalnika varnih particij in izoliranih varnostnih domen za zaupanja vredne sistemske storitve zmanjšajo površino napadov. Vse skupaj zagotavlja edinstven varnostni model čip-v-oblaku, ki se opira na zmogljivosti nizke ravni, ki jih nudijo partnerji Arm silicon ecosystem za zaščito podatkov in identitete naprav, povezanih z oblakom.

Naš pristop k varnosti je izkoriščanje najsodobnejših industrijskih standardnih protokolov, šifer in šifrirnih paketov po priporočilih NIST in drugih povezanih organizacij. To nam daje dostop do najnovejšega dela globalne varnostne raziskovalne skupnosti namesto do omejenega internega vira. Rezultate teh prizadevanj redno preverjamo s pregledi kode, vajami prodora in drugimi metodami.

Oddaljena posodobitev vdelane programske opreme

Mbed OS ponuja brezhibno integracijo s Pelion Device Management Update Services, tako da lahko posodobite aplikacijo vaše naprave ali različico Mbed OS. Razvojno orodje Arm Mbed CLI lahko sestavi posodobitvene vsebine, ustvari njihove manifeste in jih pošlje vaši razvojni napravi z dvema ukazoma. Če želite posodobiti skupine naprav, lahko ustvarite in naložite svoj manifest in koristni tovor na portal za upravljanje naprav in od tam zaženete standardno kampanjo. Spletni prevajalnik ponuja tudi hitro integracijo za razvojne tokove.

Strojna oprema

Arm, njegovi partnerji in skupnost razvijalcev Arm Mbed sodelujejo pri razvoju projekta Mbed OS. Ta cvetoč ekosistem pomeni, da Mbed OS vključuje gonilnike za veliko različne strojne opreme, tako da se lahko osredotočite na čisto in prenosljivo aplikacijsko kodo.

V splošnem je strojna oprema, ki jo lahko vidite na našem spletnem mestu, tri vrste:

  • Moduli: vključuje mikrokrmilnik, povezljivost, osredotočeno na IoT, in potreben vgrajen pomnilnik. Idealne so za oblikovanje izdelkov IoT, od izdelave prototipov do množične proizvodnje. Moduli, ki podpirajo Mbed, imajo polno podporo za Mbed OS z vsemi razpoložljivimi gonilniki za povezljivost.
  • Deske: razvojne plošče so poceni način za začetek razvoja z Mbed OS in drugimi komponentami.
  • Komponente: podatkovna zbirka komponent gosti knjižnice za večkratno uporabo za različno strojno opremo, vmesno programsko opremo in storitve interneta stvari, ki jih lahko uporabljate z mikrokontrolerji Arm. Te komponente se lahko uporabljajo kot gradniki za hiter razvoj prototipov in izdelkov.

Orodja

Zbirka izdelkov Mbed vključuje orodja, ki jih potrebujete za delo z Mbed OS, ne glede na vašo raven znanja. Če ste izkušen razvijalec z nastavitvijo namizja, boste morda raje delali brez povezave z Arm Mbed CLI, našim orodjem ukazne vrstice, ki temelji na Pythonu. Mbed CLI lahko uporabljate z eno od treh podprtih orodnih verig: Arm Compiler 6, GCC in IAR. Prav tako lahko izvozite projekte za druge IDE-je, kot je Keil MDK. Mbed OS vključuje integracijsko kodo za vsako podprto verigo orodij, da je nitno varna.

Nadzor

Informacije o napravi USB se imenujejo deskriptorji in so shranjene v njenem ROM-u. Vmesnik deskriptorja lahko definira napravo, ki pripada enemu od končnega števila razredov. Naprava razreda HID uporablja ustrezen gonilnik za pridobivanje in usmerjanje vseh podatkov.

Deskriptor naprave določa, kateri drugi deskriptorji razreda so prisotni. Na primer deskriptor poročila in fizični deskriptor.

Struktura deskriptorjev je naslednja:

Deskriptor naprave in konfiguracije je en na napravo. Obstaja lahko več deskriptorjev vmesnika (na primer, večnamenska naprava ima lahko vmesnik tiskalnika, vmesnik optičnega bralnika itd.).

Deskriptor poročila opisuje vsak podatek, ki ga naprava ustvari, in velikost podatkov, ki se dejansko spremeni. Definirani so na primer elementi, ki opisujejo položaj ali stanja gumba.

Deskriptor poročila naloži in obdela gonilnik razreda HID takoj, ko je naprava zaznana. Protokoli za obstoječe in nove naprave so ustvarjeni z mešanjem podatkov v deskriptorju poročanja.

Naprave HID so razdeljene v razrede (tipkovnica, miška, igralna palica itd.). To vam omogoča poenotenje deskriptorjev poročil. Vendar lahko nekateri razredi vsebujejo podrazrede, na primer podrazred zagonske naprave.

Če je napravo mogoče uporabiti v BIOS-u, je s parametrom označena kot zagonska

bInterfaceSubClass

0 - ni podrazreda (navadna naprava);

1 - zagonska naprava;

2-255 - rezervirano.

Parameter bInterfaceProtocol je smiseln le, če je naprava deklarirana kot zagonska.

1 - tipkovnica;

3-255 - rezervirano.

Spadanje naprave v razred HID je treba določiti ne s parametri bDeviceClass in bDeviceSubClass, temveč s parametri bInterfaceClass in bInterfaceSubClass.

Deskriptorji poročil so sestavljeni iz informacijskih elementov (Item).

Element lahko vključuje dodaten podatkovni element. Velikost podatkovnega bloka določa njegova osnovna vrsta (kratek in dolg). Na kratko, obseg je lahko 0, 1, 2 ali 4 bajtov. Dolgi element ima vrednost bSize = 2.

Gonilnik HID linearno razčleni celotno poročilo gostitelja, išče elemente glede na deskriptor poročila in jih shrani v tabelo elementov.

Uporabe

To so deli deskriptorja poročila, ki določajo, kaj je treba narediti s podatki (npr. vnos x, y, z).

HID usmerjenost

Privzeto je smer gibanja od leve proti desni (X), od zgoraj navzdol (Y) in od daleč bližje (Z).

Možno je prenašati vrednosti zunaj dovoljenih meja, v tem primeru jih bo gostitelj prezrl in trenutne vrednosti ne bodo spremenjene. To so tako imenovane vrednosti NULL. Priporočljivo je, da uporabite 0 kot NULL, tj. Razpon sprejemljivih koordinat se začne od 1.

Deskriptor HID

Določa dolžino in vrsto podrejenih deskriptorjev za napravo. Sestavljen je iz naslednjih delov:

Še enkrat, poročilo je podatkovni paket z vidika HID. Deskriptor poročila je deskriptor strukture danega paketa. Na njegovi podlagi gostitelj obdela poročila iz naprave in analizira vsebino posameznega paketa. Deskriptor poročila je pogojno razdeljen na bloke. Prvi del bloka vsebuje tri polja: tip elementa, oznako elementa in velikost elementa. Ta polja skupaj določajo, katere informacije vsebuje blok.

Tukaj so tri vrste elementov: Maain, Global, Local. Naslednje oznake na primer ustrezajo glavnemu tipu:

Vnos - nanaša se na podatke naprave, kot so položaj kazalca, stanje gumba itd.

Izhod - definira podatke, ki jih gostitelj pošlje v napravo.

Funkcija - opisuje konfiguracijo naprave, ki jo je mogoče poslati v napravo.

Zbirka - pomensko združevanje vhodnih, izhodnih in funkcijskih elementov.

Konec zbirke - označuje konec zbirke elementov.

Glavna oznaka vsakega elementa določa velikost podatkov, ki jih vrne določen kontrolnik, in določa, ali so podatki absolutni ali relativni itd.

Lokalni in globalni tipi določajo najmanjše in največje vrednosti podatkov itd.

Lokalni elementi opisujejo samo podatkovna polja, ki jih definira naslednji glavni element. Globalni elementi postanejo privzeti atributi za vsa naslednja podatkovna polja v tem deskriptorju.

primer:

Število poročil (2)

Število poročil (2)

Report Size(3) podaja velikost elementa v bitih (v tem primeru 3);

Report Count (2) določa število takih elementov.

Če lahko zajamemo in posredujemo podatke o treh hkrati pritisnjenih tipkah, bo poročilo naslednje:

Velikost poročila (8),

Prijavi kovanec (3),

Če poročilo prikazuje stanje 8 gumbov, je videti takole:

Velikost poročila (1),

Poročilo Coint (8),

Deskriptor poročila lahko vsebuje več glavnih elementov. Potreben je vsak od naslednjih elementov opisa kontrolnih podatkov (ostali so neobvezni):

  • Vhod (izhod ali funkcija)
  • Uporaba
  • Stran za uporabo
  • Logični minimum
  • Logični maksimum
  • Velikost poročila
  • Število poročil

Primer na podlagi miške s tremi gumbi:

Stran za uporabo (Generic Desktop), ;stran za splošno uporabo

Uporaba (miška),

Zbirka (Aplikacija), miška odprtega tipa

Uporaba (kazalec),

Zbirka (fizična), ;open index collection

Stran za uporabo (gumbi),

Minimalna uporaba (1),

Največja uporaba (3),

Logični minimum (0),

Logični maksimum (1), polja vrnejo podatke od 0 do 1

Število poročil (3),

Velikost poročila (1), ;ustvari 3 enobitna polja (gumbi 1, 2 in 3)

Vnos (podatki, spremenljivke, absolutno), ;ustvari polje za vnosna poročila

Število poročil (1),

Velikost poročila (5), ;ustvari 5-bitno konstantno polje

Vnos (konstanta), ;dodajte polje v dohodno poročilo

Stran za uporabo (generično namizje),

Uporaba (X),

Uporaba (Y),

Logični minimum (-127),

Logični maksimum (127), polje ; vrne vrednosti od -127 do 127

Velikost poročila (8),

Število poročil (2), ustvarite 2 polji po 8 bitov (X in Y)

Vnos (podatki, spremenljivke, relativni), ;dodajte polja v dohodno poročilo

Končaj zbirko, ;zapri zbirko kazalcev

Končaj zbirko ;zapri zbirko miške

Zbirka odpre nabor podatkov:

  • Fizično 0x00
  • Aplikacija 0x01
  • Logično 0x02
  • Poročilo 0x03
  • Imenovan niz 0x04
  • Stikalo za uporabo 0x05
  • Uporaba 0x06
  • Rezervirano 0x07 - 0x7F - za prihodnjo uporabo
  • Rezervirano 0x80 - 0xFF - za prodajalca

Vsi elementi vsebujejo 1-bajtno predpono, ki identificira osnovno vrsto elementa. HID definira 2 glavna formata elementov:

Kratek 1–5 bajtov skupne dolžine, ki se uporablja za najpogosteje pojavljajoče se elemente.

Dolgo 3–258 bajtov, ki se uporablja za elemente, ki zahtevajo velike količine podatkov.

Kratka in dolga oblika vsebujeta velikost elementa, vrsto in oznako v prvem bajtu.

Kratek format

Dolg format

Logični minimum in logični maksimum

LMin in LMax vežeta vrednosti, ki jih vrne naprava, fizični minimum in fizični maksimum pa dajeta pomen tem mejam, kar omogoča skaliranje vrednosti. Na primer, termometer ima logične stopinje od 0 do 999, fizične stopinje pa od 32 do 212 stopinj.

Poglejmo primer miške z občutljivostjo 400dpi:

Torej bi morala biti formula za izračun razmerja

(127-(-127)) / ((3175-(-3175)) * 10^-4) = 400 dpi

Standardne poizvedbe

Razred HID uporablja standardne zahteve Get_Descriptor. Zahteva Get_Descriptor(Configuration) vrne deskriptor konfiguracije, vse deskriptorje vmesnikov, deskriptorje končne točke in vse deskriptorje HID za vsak vmesnik. Ne sme vrniti ročice niza, prijavite ročico.

Vrstni red naj bo torej naslednji:

1.Get_Descriptor

Strukture:

Tabela, ki definira vrsto deskriptorja (visoki bajt wValue v zahtevi Get_Descriptor):

2. Set_Descriptor

Struktura:

3. Poizvedbe, specifične za razred

Struktura:

Razpoložljive vrednosti bRequest:

4. Get_Report

mValue določa vrsto poročila v visokem bajtu in ID poročila v nizkem bajtu. ID poročila je nastavljen na 0, če se ne uporablja. Vrsta poročila je opredeljena na naslednji način:

5.Set_Report

Pomen polj je podoben zahtevi Get_Report.

6.Get_Idle

Prebere trenutni odstotek nedejavnosti sistema za vsako vhodno poročilo.

7.Set_Idle

Ta zahteva je potrebna za omejitev stopnje anketiranja za prekinitve končne točke. To je tudi razlog za NAK za vse ankete prekinitev na končni točki, medtem ko trenutna vrednost ostane nespremenjena. Če ni sprememb, se bo glasovanje nadaljevalo, dokler ne doseže NAK.

8. Get_Protocol

Poizvedba prebere, kateri protokol je trenutno aktiven.

Podprto z napravami zagonskega razreda.

9.Set_Protocol

Preklaplja med zagonskim protokolom in protokolom poročanja. Ko so inicializirane, vse naprave privzeto uporabljajo protokol poročanja.

V razvoju USB oz Bluetooth perifernih naprav, je pogosto potrebna implementacija vmesnika HID. V tej objavi bomo to storili kot ljudje in ne kot vsi ostali...

Na kratko: kaj je HID in kaj vsebuje?

Kot že ime pove, je zadevni razred vmesnikov zasnovan za izvajanje naprav za interakcijo z uporabniki. Toda zaradi svoje preprostosti in priročnosti pogosto delajo z drugimi vrstami perifernih naprav prek tega vmesnika. S strani naprave je implementacija HID zelo preprosta: ni vam treba razbijati glave s protokoli za izmenjavo podatkov na nizki ravni, opisovati poročila in preprosto obdelati zahteve. In na strani gostitelja lahko naprave HID delujejo v uporabniškem prostoru prek standardnega gonilnika operacijskega sistema. Seveda CDC ACM omogoča tudi izmenjavo podatkov z napravo na podoben način, vendar je ta razred težje implementirati v napravo, je primeren za organizacijo neprekinjene interakcije z nitmi in je manj primeren za delo v sistemu zahteva-odziv. način.

Preberite več: od kod rastejo noge in kako pravzaprav deluje

HID je univerzalna stvar: izmenjava podatkov poteka s pošiljanjem in prejemanjem tako imenovanih poročil (HID Reports), od katerih moramo vsako opisati na poseben način, da lahko gonilnik operacijskega sistema, odgovoren za delo s HID, pravilno razume notranje strukturo naših podatkov. Če uporabimo standardno vnosno napravo, kot je tipkovnica, miška ali igralna palica, bo voznik z analizo vsebine deskriptorjev poročil naše naprave razumel, kako pridobiti podatke, ki ga zanimajo, pa naj bodo to pritisnjeni gumbi ali informacije. o gibanju kazalca. Tudi če uporabljamo HID za neke svoje namene in izmenjujemo poročila iz lastnega programa, moramo poročila še vedno ustrezno opisati v skladu s specifikacijo.

Deskriptorji poročil

Torej je oblikovanje teh istih deskriptorjev poročil najtežji del pri implementaciji perifernih naprav HID. Karkoli naredijo razvijalci, gre vse narobe. Nekateri uporabljajo posebne programe (na primer uradni Orodje za opisovanje HID), ki vam omogočajo, da ustvarite deskriptorje v grafičnem vmesniku in izpišete že pripravljen niz bajtov. Drugi uporabljajo pretvornike, ki pretvorijo besedilne opise v kodo in obratno (na primer hidrd). Vse bi bilo v redu, vendar bo nadaljnja podpora takšne kode, ki jo ustvarijo orodja tretjih oseb, precej zapletena: z vsakim popravkom bo treba znova uporabiti ustrezen program. Spet drugi neumno vzamejo že pripravljen deskriptor iz primerov, prilagodijo velikost in količino podatkov svoji nalogi ter si izmenjujejo pakete v svojem formatu, ki ne ustreza dejanski vsebini deskriptorja. Toda ta pristop je poln tudi številnih slabih trenutkov, ki niso vedno očitni, kot na splošno vsako drugo odstopanje od črke specifikacije.

Ubrali bomo neposredno pot: deskriptor bomo oblikovali na jasen, berljiv način z uporabo makrov iz predprocesorja C, na način, ki je znan in primeren za nas, strokovnjake za CSE. Ta pristop ne nadomesti potrebe po seznanitvi s specifikacijo HID 1.11 da bi razumeli osnovna načela generiranja deskriptorjev poročanja, vendar vas osvobodi potrebe po poznavanju podrobnosti binarnega formata. Z drugimi besedami, deskriptorje bomo opisali približno tako, kot so opisani v primerih zgoraj omenjene specifikacije.

Osnovna načela

Tisti, ki ste preleni, da bi se zdaj poglobili v specifikacije in se poglobili v bistvo, preberite moje brezplačno besedilo spodaj.

Opis poročila je sestavljen iz tako imenovanih elementov ali točk, od katerih je vsaka sestavljena iz glave in po izbiri podatkovnega bloka. Na splošno so elementi lahko kratki in dolgi, vendar bomo tukaj opisali samo kratke, ker bomo delali samo z njimi. Glava elementa vključuje polje velikosti podatkov (2 bita), polje tipa (2 bita) in polje oznake (4 biti) za skupno 8 bitov. Polje velikosti določa dolžino podatkov v bajtih: 0, 1, 2 ali 4 bajte. Polje vrste določa vrsto: glavno, globalno, lokalno. Polje oznake določa sam element. Obstaja veliko različnih elementov in tukaj jih ne bomo opisali vseh; osredotočili se bomo le na nekatere glavne na poti.

Primer deskriptorja

Predpostavimo, da razvijamo standardno napravo, kot je miška. Tukaj je primer deskriptorja poročila zanj iz specifikacije:

Stran uporabe (generično namizje), uporaba (miška), zbirka (aplikacija), uporaba (kazalec), zbirka (fizično), stran uporabe (gumbi), najmanjša uporaba (01), največja uporaba (03), logični minimum (0) , logični maksimum (1), število poročil (3), velikost poročila (1), vnos (podatki, spremenljivka, absolutno), število poročil (1), velikost poročila (5), vnos (konstanta), stran uporabe (generično namizje) ), uporaba (X), uporaba (Y), logični minimum (-127), logični maksimum (127), velikost poročila (8), število poročil (2), vnos (podatki, spremenljivka, relativno), konec zbiranja, konec Zbirka

Kaj vidimo tukaj? In vidimo samo svoje elemente, en element na vrstico. Vsak element v tem primeru ima 2 ali 1 bajt. Prvi je globalni element Usage Page, ki opisuje namen naše naprave (Generic Desktop). Sledi lokalni element uporabe, ki določa dejansko vrsto naprave (miška) in s tem namiguje gonilniku OS. Nato se z uporabo glavnega elementa Collection začne opis zbirke tipa Application in spet je tu element Usage Page, vendar tokrat definira namen zbirke kot kazalec (Pointer), s tem pa vsi nadaljnji elementi navzgor. na element na koncu zbirke se bo nanašal na kazalec.

Nato se začne zbirka tipa Physical in znotraj te zbirke je opisan element poročila o gumbih. Lokalna elementa Najmanjša in Največja uporaba sta povezana z določenim primerom uporabe, v tem primeru identificirata prvi in ​​zadnji gumb miške. Nato globalna elementa Logični minimum in Logični maksimum nastavita najmanjšo in največjo vrednost stanja teh gumbov. Naslednja globalna elementa Število poročil in Velikost poročila določata število vrednosti v poročilu in velikost vsake vrednosti v bitih. Glavni vnosni element zaključi opis gumbov in definira opisana polja kot del deskriptorja vnosnega poročila. V oklepajih so podane naslednje zastavice: Data - pomeni, da je treba opisana polja obravnavati kot podatke in ne kot konstante, Variable - opisana je spremenljivka in ne matrika, Absolute - vrednosti je treba obravnavati kot absolutne.

Pogosto je priročno poravnati podatke po bajtih ali besedah, vendar so v opisih poročil velikosti podane v bitih, zato je za poravnavo dodano tako imenovano polnjenje. Naslednje tri vrstice samo razglasijo tak zamik za bitmi stanja treh gumbov v poročilu s številko 1 in velikostjo 5 bitov, in da gonilnik te bite prezre, se v Vnosni element namesto podatkov.

V nadaljevanju so koordinatna polja kazalca opisana na podoben način. Ker miška za razliko od digitalizatorja običajno generira relativne koordinate, je v elementu Input namesto Absolute določeno Relative. In ker so te relativne koordinate lahko tako pozitivne kot negativne, so ustrezne mejne vrednosti navedene v logičnem minimumu in logičnem maksimumu od -127 do 127. Za vsako vrednost (velikost poročila) je dodeljenih do 8 bitov in skupno 2 vrednosti (štetje poročil). Namig gonilniku o vrstnem redu polj z vrednostmi koordinat je podan tukaj z uporabo elementov uporabe.

Opis deskriptorja v C

Naša naloga je torej, da isti opis predstavimo z uporabo jezika C, pri čemer nam bo pomagal predprocesor C. Tako bi izgledal isti primer zdaj:

#vključi /* Definicije makrov za naš deskriptor poročil HID DSL */ #include "hid_def.h" static const uint8_t hid_report_descriptor = ( HID_USAGE_PAGE (GENERIC_DESKTOP), HID_USAGE (MOUSE), HID_COLLECTION (APPLICATION), HID_USAGE (POINTER), HID_COLLECTION (PHYSICAL), HID_USAGE_PAGE (BUTTONS), HID_USAGE_MINIMUM (1, 1), HID_USAGE_MAXIMUM (1, 3), HID_LOGICAL_MINIMUM (1, 0), HID_LOGICAL_MAXIMUM (1, 1), HID_REPORT_COUNT (3), HID_REPORT_SIZE (1), HID_INPUT (DATA, VARIABLE, ABSOLUTE) ), HID_REPORT_COUNT (1), HID_REPORT_SIZE (5), HID_INPUT (CONSTANT), HID_USAGE_PAGE (GENERIC_DESKTOP), HID_USAGE (X), HID_USAGE (Y), HID_LOGICAL_MINIMUM (1, -127), HID_LOGICAL_MAXIMUM (1, 127), HID_REPORT_SIZE (8 ), HID_REPORT_COUNT (2), HID_INPUT (PODATKI, SPREMENLJIVKA, RELATIVNO), HID_END_COLLECTION (FIZIČNO), HID_END_COLLECTION (APLIKACIJA), );

Kot lahko vidite, je opis čim bližje primeru iz specifikacije, vendar je več razlik povezanih z implementacijo predprocesorskih makrov, ki opisujejo elemente. Ker velikost podatkov nekaterih elementov ni fiksna, smo morali to velikost nekako navesti. Zato je prvi parameter za elemente, ki določajo minimalne/maksimalne meje, velikost vrednosti v bajtih, drugi pa sama vrednost. Makri, ki definirajo glavne elemente Input, Output, Feature, so zasnovani tako, da lahko kot vhod sprejmejo poljubno število zastavic, vključno z nobeno, tako da zastavice Data in Absolute dejansko niso potrebne, saj so privzeto nastavljene.

Morda ste opazili, da naš makro HID_END_COLLECTION vzame vrsto zbirke kot argument. Torej, z vidika deskriptorja to nima velikega smisla, to je bilo narejeno preprosto zaradi priročnosti, tako da je takoj jasno, katera zbirka se zaključuje, tehnično pa lahko podate poljubne argumente ali pa brez njih nasploh.

Pridružite se zabavi

Ne bom skrival, definicije makrov za naš domensko specifičen jezik so v datoteki hid_def.h vsebujejo veliko dozo predprocesorske magije, ki je definirana v drugi datoteki glave makro.h.

Ta projekt sem poslal v repozitorij github:katyo/hid_def, zato je zdaj čas, da začnem pisati deskriptorje poročil HID na človeški način.

Naprave iz Silicon Laboratories niso zelo priljubljene v amaterskih krogih, še zdaleč niso tako vodilni, kot je Atmel. Imajo pa tudi navadnim smrtnikom dostopne mikrokontrolerje glavnih linij v paketu TQFP in začetne komplete USB ToolStick (kar je bilo pred kratkim omenjeno na hubu). Sam sem začel spoznavati mikroprocesorsko tehniko z delom s »silabi« in to precej uspešno.
V tem članku vam bom povedal, kako lahko organizirate komunikacijo med računalnikom in MK z vmesnikom USB in kako je Silabs poskušal poenostaviti razvijalcu.
Kot test bomo uporabili ploščo C8051F320DK z mikrokontrolerjem serije F32x, ki podpira strojno opremo USB, in razvojno okolje Keil uVision4.

Preden začnete kopati v smeri implementacije komunikacije USB, se morate odločiti o nekaterih osnovnih vidikih protokola: kakšno mesto zavzema naprava v topologiji (gostiteljska ali podrejena) in kakšna bo narava informacij, ki se prenašajo prek vmesnika.

Arhitektura USB omogoča štiri osnovne vrste prenosa podatkov:

  • Nadzorna sporočila ( kontrolni prenosi) – uporablja se za konfiguracijo naprav med njihovo povezavo in za nadzor naprav med delovanjem. Protokol zagotavlja zajamčeno dostavo podatkov.
  • Prenos podatkovnih nizov ( množični prenosi podatkov) so prenosi brez kakršnih koli obveznosti glede zamud pri dostavi in ​​hitrosti prenosa. Prenosi nizov lahko zasedejo celotno pasovno širino vodila, ki je brez drugih vrst prenosov. Te prestave imajo najnižjo prednost in se lahko prekinejo, ko je avtobus močno obremenjen. Dostava je zagotovljena - v primeru naključne napake se izvede ponovitev. Prenosi nizov so primerni za izmenjavo podatkov s tiskalniki, skenerji, napravami za shranjevanje itd.
  • Prekinitve ( prekiniti prenose) – kratki prenosi, ki so po naravi spontani in se ne smejo servisirati počasneje, kot zahteva naprava.
    Časovna omejitev storitve je nastavljena v območju 10-255 ms za
    nizka, 1-255 ms za polno hitrost, pri visoki hitrosti lahko naročite 125 µs. V primeru naključnih napak pri menjavi se izvede ponovitev. Prekinitve se uporabljajo na primer pri vnosu znakov s tipkovnice ali za prenos sporočila o premikanju miške.
  • Izohroni prenosi ( izohroni prenosi) – neprekinjeni prenosi v realnem času, ki zasedajo vnaprej dogovorjen del zmogljivosti vodila z zagotovljenim časom zakasnitve dostave. Omogočajo organiziranje kanala s pasovno širino 1,023 MB/s (ali dva po 0,5 MB/s) pri polni hitrosti, ki zavzamejo 70 % razpoložljive pasovne širine (preostanek lahko zapolnite z manj zmogljivimi kanali). Pri visoki hitrosti lahko končna točka prejme povezavo do 24 MB/s (192 Mb/s). Če je zaznana napaka, se izohroni podatki ne poskusijo znova – neveljavni paketi so prezrti. Izohroni prenosi so potrebni za pretočne naprave: video kamere, digitalne avdio naprave (USB zvočniki, mikrofon), naprave za predvajanje in snemanje zvoka in videa (CD in DVD).
Če je MK povezan z računalnikom, bo krmilnik očitno podrejena naprava.

Ustvarjanje igralne palice, združljive z USB HID

Najpogostejša in najpreprostejša vrsta naprave USB je HID (Human Interface Devices). Vrsta uporabljenega prenosa, standardna za takšne naprave, so prekinitve. Tipični predstavniki tega razreda so USB tipkovnice, miške, igralne palice, nastavitvene plošče monitorjev, čitalniki črtnih kod, čitalci kartic itd.
Prednosti HID naprav so:
  • enostavnost izvedbe;
  • kompaktna koda;
  • Podpora za Windows (dodatni gonilniki niso potrebni).
Torej, izvedimo najpreprostejše manipulator igralne palice. Za bojni meh (!), ki ga sestavljamo v garaži, bomo na primer potrebovali ročko za plin z dvema (ali več) gumboma. Demo plošča C8051F320DK ima en spremenljivi upor in 2 gumba - to je dovolj za minimum.

Silabovtsy nudi primer vdelane programske opreme mikrokrmilnika, ki posnema miško USB z vmesnikom HID. Ta primer je dovolj za hitro in nebolečo implementacijo večine vmesnikov za človeško interakcijo. Posledično je treba v primeru, vzetem kot osnovo, predelati:

  1. konfiguracija deskriptorja naprave HID;
  2. postopki prenosa podatkov;
  3. Ročaj imena naprave HID.
Začnimo z deskriptorjem naprave
Potrebujemo deskriptor v naslednji obliki:
code const hid_report_descriptor HIDREPORTDESC =
{
0x05, 0x01, // USAGE_PAGE (generično namizje)

0x09, 0x04, // UPORABA (krmilna palica)
0xa1, 0x01, // ZBIRKA (aplikacija)
0x05, 0x02, // USAGE_PAGE (kontrole simulacije)
0x09, 0xbb, // UPORABA (Plin)
0x15, 0x00, // LOGIČNI_MINIMUM (0)
0x26, 0xff, 0x00, // LOGIČNI_MAKSIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)

0x05, 0x09, // USAGE_PAGE (gumb)
0x19, 0x01, // USAGE_MINIMUM (Gumb 1)
0x29, 0x02, // USAGE_MAXIMUM (Gumb 2)
0x15, 0x00, // LOGIČNI_MINIMUM (0)
0x25, 0x01, // LOGIČNI_MAKSIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x55, 0x00, // ENOTA_EKSPONENT (0)
0x65, 0x00, // ENOTA (brez)
0x81, 0x02, // VNOS (Podatki, Var, Abs)
0xc0 // KONEC_ZBIRKE
}
Zdaj pa si poglejmo podrobneje, kaj je kaj. Najpomembnejši del pri opisu bodoče naprave so tipi podatkov. Odsek mora biti opisan Kontrole simulacije(simulacija krmilnega elementa), ki pač ima Plin(plin), za to navedemo:
  • obseg vrednosti, v katerem bo deloval Plin– LOGICAL_MINIMUM(0) in LOGICAL_MAXIMUM(255),
  • nastavite velikost tega obsega (en bajt) – REPORT_SIZE (8) in
  • število kontrol te vrste – REPORT_COUNT (1).
Podobna zgodba je z gumbi (USAGE_PAGE ( Gumb)):
  • obseg vrednosti - LOGICAL_MINIMUM(0) in LOGICAL_MAXIMUM(1);
  • velikost obsega (en bit) - REPORT_SIZE (1);
  • gumbov je več, zato je tukaj potrebno uporabiti polje dolžine bajtov, kar pomeni REPORT_COUNT (8);
Vse to potrebuje operacijski sistem, zdaj bo vedel, kako ravnati z 2 bajti, ki jih bo prejel od krmilnika, z uporabo deskriptorja kot ključa za dešifriranje.
Da, poleg tega pa so v .h te vrstice neposredno pred deklaracijo hid_report_descriptor:
#define HID_REPORT_DESCRIPTOR_SIZE 0x002C
#define HID_REPORT_DESCRIPTOR_SIZE_LE 0x2C00 //LITTLE ENDIAN

Pri tem je pomembno, da je velikost deskriptorja nastavljena po prevedbi samega deskriptorja in jo je treba določiti, da bo računalnik prepoznal krmilnik.

Za poenostavitev naloge ustvarjanja deskriptorja lahko uporabite program na www.usb.org (Orodje za deskriptorje HID). Program vsebuje primere konfiguracij nekaterih naprav HID, ki jih lahko prilagodite svoji nalogi ali ustvarite svojo napravo HID.
S tem se zaključi opis igralne palice in pripraviti morate podatke za prenos v osebni računalnik.

Postopki prenosa podatkov
V primeru najdemo naslednjo kodo:
void IN_Report(void)(

IN_PAKET = VEKTOR;
IN_PAKET = GUMBI;

// usmeri IN_BUFFER kazalec na podatkovni paket in nastavi
// Dolžina IN_BUFFER za prenos pravilne velikosti poročila
IN_BUFFER.Ptr = IN_PAKET;
IN_BUFFER.Dolžina = 2;
}

Ta postopek vključuje sestavljanje poslanega paketa, ki se nato posreduje prek zapletenega kazalca (v resnici gre le za strukturo kazalca in njegovo dolžino) in ga posreduje naša naprava. Glavna stvar je, da skrbno sestavite paket, kot nam namiguje komentar, nato pa bodo z njim naredili vse brez našega sodelovanja.
Zdaj vam bom povedal, kako in kje dobimo spremenljivki VECTOR in BUTTONS (mimogrede, obe sta tipa unsigned char z velikostjo bajtov).
Globalni spremenljivki VECTOR so dodeljene vrednosti iz ADC, ko iz nje pride do prekinitve:
void ADC_Conver_ISR(void) prekinitev 10
{
AD0INT = 0;

// indikacija delovanja ADC
če(VEKTOR != ADC0H)
LED = 1;
drugače
LED = 0;

VEKTOR = ADC0H;
}

Globalna spremenljivka BUTTONS podobno spreminja svojo vrednost glede na pritiske gumbov. Gumbi so vprašani s prekinitvijo časovnika. Nastavite časovnik glede na vaše osebne želje.
void Timer2_ISR (void) prekinitev 5
{
P2 &= ~Led_2;

If ((P2 & Sw1)==0) // Preverite, ali je pritisnjen gumb #1
{
// pritisnjeno
GUMBKI = GUMBKI | (1<<0);
LED2 = 1;
}
drugače
{
//ni stisnjen
GUMB = GUMB & 0xFE;
}

If ((P2 & Sw2)==0) // Preverite, ali je gumb #2 pritisnjen
{
// pritisnjeno
GUMBKI = GUMBKI | (1<<1);
LED2 = 1;
}
drugače
{
//ni stisnjen
GUMB = GUMB & 0xFD;
}
TF2H = 0; // Počisti zastavico prekinitve Timer2
}

Deskriptor imena naprave HID
Končno lahko prilagodimo podatke niza, tako da ima naprava ime, ki ga želimo (v mojem primeru »JOYSTICK-HABR«).
Iščem deskriptor niza String2Desc, prepisati
#define STR2LEN sizeof ("JOYSTICK-HABR") * 2

Koda const unsigned char String2Desc =
{
STR2LEN, 0x03,
"J", 0,
"O", 0,
"Y", 0,
"S", 0,
"T", 0,
"jaz", 0,
"C", 0,
"K", 0,
"-", 0,
"H", 0,
"A", 0,
"B", 0,
"R", 0,
};

Identifikacija naprave HID
Po prevajanju projekta in programiranju mikrokontrolerja lahko napravo priključite na vrata USB. Gostitelj ugotovi, da naprava pripada razredu HID in prenese nadzor nad napravo na ustrezen gonilnik.

Zdaj v sistemu Windows gremo na Control Panel->Game Devices in tam vidimo našega potnika. Ogledamo si lastnosti in preverimo funkcionalnost.

Nizka hitrost prenosa je glavna omejitev možnosti oblikovanja naprave HID. Največja možna hitrost prenosa podatkov pri taki organizaciji izmenjave je 64 Kbit/s. Ta številka je v primerjavi z 12 Mbit/s polne hitrosti vodila USB videti kot pomanjkljivost tehnologije HID pri izbiri določene izvedbe USB. Vendar pa je za številne komunikacijske naloge določena hitrost povsem dovolj in arhitektura HID kot specializirano orodje zavzema svoje pravo mesto med načini organizacije izmenjave podatkov.

Na splošno je HID naprave enostavno namestiti na skoraj vsak MCU, ki podpira USB. Praviloma je dovolj en delovni primer razvijalcev, s prilagoditvijo lahko dobite katero koli zahtevano funkcionalnost.

Ustvarjanje popolne naprave USB z uporabo orodja Silabs USBXpress

Toda pride čas, ko morate uporabiti svoj protokol za delo z napravo na MK. Hkrati bi rad prenesel veliko podatkov z veliko hitrostjo in vse to s svojim prenosnikom, ki ima veliko USB in niti enega COM-a, pa tudi vaša naprava ne sme biti večja od škatlice vžigalic, in biti nameščen na plošči USB-UART na čipu FT232RL ni mogoče.
Takrat so se fantje iz Silabsa odločili olajšati življenje vsem in pokazati "pot v prihodnost", ne da bi si lomili zobe s pisanjem lastnih drv in firmware-a.
Razvojni komplet USBXpress je popolna rešitev za MCU in gostitelja (PC), ki omogoča preprosto delo s protokolom USB z uporabo visokonivojskega API-ja za obe strani. Posebno znanje o samem protokolu USB ali pisanju gonilnikov ni potrebno. Tako pišejo Silabovci v svojem vodniku.


Ko smo že pri Vodiču za programerja: obsega samo 30 strani, je izredno preprost in razumljiv. Meni osebno niso všeč primeri, pogosto so zelo zvita mesta, programov za PC pa je bolje, da sploh ne gledate, so zelo neberljivi .
USBXpress DK je na voljo za mikrokontrolerje linij C8051F32x, C8051F34x in CP210x (USB-to-UART Bridge Controller). Knjižnica USBXpress vključuje nizkonivojsko knjižnico, gonilnike USB za osebne računalnike in DLL za razvoj aplikacij na visoki ravni. In seveda nabor dokumentacije in primerov.
Knjižnica izvaja prenos podatkov le v BULK načinu. Pri uporabi vseh funkcij knjižnice bo njihova izvedba zavzela le 3 KB Flash pomnilnika mikrokrmilnika.
Vdelana programska oprema
Poglejmo si en bolj ali manj preprost in razumljiv primer, ki je po funkcionalnosti podoben prejšnjemu primeru HID. Ne bomo vstopili v aplikacijo za osebni računalnik, z njo bo vse kristalno jasno, ko bomo končali vdelano programsko opremo za MK.
Torej, bistvo primera TestPanel: vzamemo odčitke iz mikrokontrolerja ADC (potenciometer) in vgrajenega termometra ( Temperatura), pa tudi od pritiskanja gumbov ( Switch1State in Switch2State), sami pa lahko utripamo z LED diodami ( Led1 in Led2).
Zdaj pa obvezni koraki in subtilne točke, ki jih bomo upoštevali:
  1. Pisanje deskriptorja USB;
  2. Inicializacija naprave in USB na krovu;
  3. Obdelava dohodnih podatkov in generiranje odhodnega paketa;
  4. Obravnava prekinitev.
Toda najprej, ko ustvarjate projekt, ne pozabite vanj vključiti datoteke glave USB_API.h in knjižnica sama USBX_F320_1.lib.
Pisanje deskriptorja USB
Za razliko od HID-a s svojo pametno formalizirano strukturo je tukaj vse preprosto
koda const UINT USB_VID = 0x10C4;
koda const UINT USB_PID = 0xEA61;
koda const BYTE USB_MfrStr = (0x1A,0x03,"S",0,"i",0,"l",0,"a,0,"b,0,"s,0);
koda const BYTE USB_ProductStr = (0x10,0x03,"U",0,"S",0,"B",0,"X",0,"_",0,"A",0,"P", 0);
koda const BYTE USB_SerialStr = (0x0A,0x03,"H",0,"A",0,"B",0,"R",0);
koda const BYTE USB_MaxPower = 15;
koda const BYTE USB_PwAttributes = 0x80;
koda const UINT USB_bcdDevice = 0x0100;

Mislim, da je vse jasno z VID, PID in imeni, poleg tega pa lahko nastavite največji tok s parametrom MaxPower (max.current = _MaxPower*2), PwAttributes - parameter, ki je odgovoren za oddaljeno bujenje gostitelja in bcdDevice - številka izdaje naprave.

Niansa inicializacije naprave in USB na krovu
Zdaj pa začnimo s samo glavno funkcijo, v kateri bo MK neumorno sprejemal in prenašal podatke.
void main(void)
{
PCA0MD &= ~0x40; // Onemogoči nadzorni časovnik
USB_Clock_Start(); // Zaženi uro USB *pred* klicem USB_Init
USB_Init(USB_VID,USB_PID,USB_MfrStr,USB_ProductStr,USB_SerialStr,USB_MaxPower,USB_PwAttributes,USB_bcdDevice);

Inicializiraj();
USB_Int_Enable();
...

Tukaj je, kot zahteva komentar, najprej potrebno inicializirati taktni generator za USB pred samo inicializacijo in šele nato izvesti preostale zagonske operacije za MK - Initialize(); - ki konfigurira vrata, časovnik in ADC; potem omogočimo USB prekinitve.

Obdelava dohodnih podatkov in generiranje odhodnega paketa
Tu smo prišli do najpomembnejše stvari
//... nadaljevanje glavnega
medtem ko (1)
{
if (Out_Packet == 1) Led1 = 1;
drugače Led1 = 0;
if (Out_Packet == 1) Led2 = 1;
drugače Led2 = 0;

In_Packet = Switch1State;
In_Packet = Switch2State;
In_Packet = potenciometer;
In_Packet = Temperatura;
}
// konec glavnega
}

Out_Packet – paket, prejet od gostitelja;
In_Packet - paket, poslan gostitelju;
Stvar je jasna, MK nenehno posodablja poslani paket in bere status prejetega.

Obravnava prekinitev
Zdaj v nekaj besedah ​​o tem, kje dobimo vrednosti v poslanem paketu. Tako kot v primeru s HID so stanja gumbov pridobljena iz prekinitev iz časovnika, vrednosti ADC in termometra pa iz prekinitev iz ADC.
Tukaj je ena subtilna točka - ko inicializiramo ADC, ga konfiguriramo tako, da se pretvorba vrednosti zgodi, ko se časovnik preliva (isti tisti, ki ga uporabljamo za gumbe), sama prekinitev iz ADC pa se pojavi, ko je pretvorba končana . In tukaj, poleg prejemanja vrednosti pretvornika na koncu postopka, pokličemo funkcijo API
Block_Write(In_Packet, 8)
ki zbrane podatke pošlje v računalnik.
Prejemanje ukazov iz računalnika poteka v postopku obdelave prekinitve USB:
void USB_API_TEST_ISR(void) prekinitev 16
{
BYTE INTVAL = Get_Interrupt_Source();

Če (INTVAL & RX_COMPLETE)
{
Block_Read(Out_Packet, 8);
}

Če (INTVAL & DEV_SUSPEND)
{
Prekinitev_naprave();
}

Če (INTVAL & DEV_CONFIGURED)
{
Inicializiraj();
}
}

Ta točka je podrobno opisana v Navodilih za programiranje. Bistvo je, da se pokliče funkcija API-ja Get_Interrupt_Source(), ki vrne kodo za razlog za prekinitev API-ja. Nato se koda analizira in izvede potrebno dejanje.

Programi na PC-ju
Ne bom razstavljal računalniškega programa. Ekipa Silab je zagotovila primere v Visual Basicu in C, vendar ne da bi sploh pogledali izvorno kodo, povezovanje knjižnice v razvojnem okolju, ki ga uporabljate, in branje nekaj strani o funkcijah ne bi smelo povzročiti nobene zapletenosti.
Zato bom uporabil že preveden primer programa.

Torej, sestavimo projekt za MK, ga utripamo, namestimo univerzalne gonilnike za USBXpress in povežemo ploščo za odpravljanje napak. Sistem bo zaznal novo napravo in namestil gonilnike zanjo.
Po namestitvi poglejmo, kaj se dogaja v upravitelju naprav Windows:


Zdaj pa zaženimo program:


Vidimo, da je napravo pravilno našla.


To je to, zdaj lahko pritisnete gumbe, utripate diode, ogrejete MK z rokami in vidite, kako se temperatura dvigne.

Zaključek

Na splošno se je izkazalo, da je ustvarjanje naprave USB z uporabo knjižnic USBXpress hitrejši in preglednejši postopek kot uporaba arhitekture HID. In hitrost bo zagotovo večja. Najšibkejša točka je, da je knjižnica zaprta in je nemogoče ugotoviti, kako zanesljiva je ta rešitev, poleg tega je na voljo samo način prenosa BULK podatkov.
Uporabljeni in uporabni viri:
  1. Guk M., PC strojni vmesniki. Enciklopedija. - Sankt Peterburg: Peter, 2002. - 528 str.
  2. Kurilin A.I. Silicon Labs mikrokontrolerji z vmesnikom USB. Revija "Elektronske komponente" št. 5, 2007