Programiranje jednostavnih USB uređaja u Delphiju. Programiranje USB*uređaja Programiranje usb kontrolera

Počnimo s minimumom:
uključite 18f2455 -- knjižnicu za korišteni MK
--
omogućiti_digitalni_io() -- prebacivanje svih ulaza u digitalni način rada
--
alias Gumb je pin_B7 -- budući da imamo spojen gumb, deklarirajmo ga
pin_B7_smjer = ulaz -- naš gumb radi za ulazak
--
-- jedna linija - i imamo sve što vam je potrebno za rad s USB CDC-om
uključite usb_serial -- knjižnicu za rad s usb
--
usb_serial_init() -- --inicijalizirati USB CDC
vječna petlja-- glavna petlja, koja se izvodi kontinuirano
usb_serial_flush() -- usb ažuriranje. Ovaj postupak obavlja sve potrebne
-- akcije za održavanje veze s računalom
završna petlja

Sastavljanjem ovog koda, pisanjem rezultirajuće HEX datoteke u MK pomoću bootloadera i pokretanjem uređaja, možete promatrati kako je novi uređaj definiran u sustavu: Virtualni com port.

Sad kad uređaj već radi, naučimo ga komunicirati.

Za čitanje primljenog bajta postoji funkcija usb_serial_read( bajt ) :boolean. Ako postoji primljeni bajt, sprema ga u navedenu varijablu i vraća pravi, inače se vraća lažno.

Postoji procedura za slanje bajta usb_serijski_podaci. Prerušen je u varijablu, tako da za slanje bajta samo trebate dodijeliti vrijednost bajta koji se šalje.

Deklarirajmo varijablu veličine bajta prije glavne petlje, u glavnoj petlji ćemo provjeriti prisutnost primljenih bajtova, i ako postoje, poslati ih natrag.

uključuju 18f2455
--
omogućiti_digitalni_io()
--
alias Gumb je pin_B7
pin_B7_smjer = ulaz
--
--
uključi usb_serial
--
usb_serial_init()
var bajt pogl -- deklarirati varijablu
vječna petlja-- glavna petlja
usb_serial_flush()
ako(usb_serial_read(ch)) zatim-- ako je bajt primljen, bit će zapisan u ch
usb_serijski_podaci = pog -- poslati primljeni bajt natrag
kraj ako
završna petlja

Sastavljamo, držimo gumb, mijenjamo napajanje, pokrećemo bootloader, mijenjamo firmware, pokrećemo.
Uređaj je ponovno detektiran u sustavu, sada nam je potreban softver za testiranje rada uređaja.

Iako nemamo svoj, koristimo gotov terminal: koristio sam program RealTerm.
Otvorite port sa željenim brojem i pošaljite podatke.


I dobivamo natrag ono što smo poslali. To znači da sve radi kako treba.

Softver

Dakle, naš mikrokontroler može primiti bajtove i odmah ih poslati natrag. Sada napišimo vlastiti softver za komunikaciju s njim (ja ću koristiti Delphi).

Izrađujemo novi projekt, raspoređujemo potrebne komponente prema obrascu:
SpinEdit1 - za određivanje broja priključka
Button1 - za uspostavljanje veze
Button2 - za prekid veze
SpinEdit2 - za unos bajtova u decimalnom obliku
Button3 - za slanje bajta
Memo1 - za prikaz primljenih informacija.

Kao što je gore spomenuto, morate raditi s com portom na isti način kao i s običnim tekstualna datoteka: Korištenje funkcija CreateFile, WriteFile i ReadFile.

Ne ulazeći u detalje, uzmimo gotovu biblioteku za rad s com priključkom: ComPort.

Svakom gumbu prilažemo potreban zadatak i dobivamo konačni kod:

jedinica Jedinica1;

sučelje

Koristi
Windows, Poruke, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dijalozi, StdCtrl, Spin, ComPort;

Tip
TForm1 = klasa(TForm)
SpinEdit1:TSpinEdit;
Gumb1: TButton;
Gumb2: TButton;
SpinEdit2:TSpinEdit;
Gumb3: TButton;
Bilješka1: TMemo;
procedure OnRead(Sender: TObject; ReadBytes: array of Byte );
procedure Button1Click(Pošiljatelj: TObject);
procedure Button2Click(Pošiljatelj: TObject);
procedure FormDestroy(Pošiljatelj: TObject);
procedure Button3Click(Pošiljatelj: TObject);
privatni
(Privatne izjave)
Priključak: TComPort;
javnost
(Javne izjave)
kraj;

var
Obrazac1: TForm1;
num:cijeli broj;
implementacija

Procedura TForm1.Button1Click(Pošiljatelj: TObject);
početi
Port:= TComPort.Create(SpinEdit1.Value, br115200); //stvoriti vezu
Port.OnRead:= OnRead; //stvoriti tok za čitanje primljenih podataka
Button2.Enabled:= true ; //aktivirajte gumb za prekid veze
kraj;

Procedura TForm1.Button2Click(Pošiljatelj: TObject);
početi
Port.Free; //zatvori vezu
Button2.Enabled:= false ; //onemogući gumb
kraj;

Procedura TForm1.Button3Click(Pošiljatelj: TObject);
početi
ako je Button2.Enabled onda Port.Write();
kraj;

Procedura TForm1.FormDestroy(Sender: TObject);
početi
if Button2.Enabled then
Port.Free;
kraj;

Procedura TForm1.OnRead(Sender: TObject; ReadBytes: array of Byte );
var
i:cijeli broj;
početi
for i:= Low(ReadBytes) do High(ReadBytes) do //prolazi kroz polje primljenih bajtova
početi
Memo1.Text:= Memo1.Text + "." +InttoHex(ReadBytes[i],2); //dodaj njegovu HEX vrijednost u prozor
inc(broj); //broji primljene bajtove
kraj;
ako je broj > 10, počnite
Memo1.Lines.Add("" ); // omotati liniju
broj:= 0;
kraj;
kraj;

Pokrećemo, uspostavljamo vezu, šaljemo bajtove:

Tako je naš najjednostavniji terminal spreman za rad s najjednostavnijim USB uređajem.

Kao što vidite, čitanje i pisanje odvija se u dinamičkim nizovima bajtova.

Obradom primljenih informacija možete stvoriti potrebni protokol razmjene prikladan za trenutni zadatak.

uključuju 18f2455
--
omogućiti_digitalni_io()
--
alias Gumb je pin_B7
pin_B7_smjer = ulaz
--
--
uključi usb_serial
--
usb_serial_init()
var bajt pogl
var bajt ja -- deklarirajte drugu varijablu
vječna petlja-- glavna petlja
usb_serial_flush()
ako(usb_serial_read(ch)) zatim-- ako je bajt primljen, izvršite potrebne radnje
spis ch od -- proći kroz broj bajta
0 : usb_serijski_podaci = 0xff
1 : usb_serial_data = Gumb -- stanje gumba za slanje
INAČE blokirati-- ako se primi nešto drugo
za 16 korištenjem ja petlja-- poslati 10 bajtova podataka
usb_serial_data = ch +i -- od ch do ch+15
završna petlja
krajnji blok
krajnji slučaj
kraj ako
završna petlja

Dodatne značajke

Zaustavimo li se ovdje, dobivamo redoviti članak s detaljnim opisom primjera korištenja knjižnice, kojih na internetu ima dosta. Stoga ću dodati malo više detaljnih informacija.

Olakšavanje slanja podataka

Slanje informacija bajt po bajt nije uvijek zgodno. Knjižnica može vrlo često dobro doći ispisati. Sadrži procedure za slanje podataka svih mogućih duljina u svim mogućim formatima: byte, hex, dec, bin, boolean, što može pojednostaviti ispis podataka u programu.
> uključi ispis
...
var dword podaci
print_dword_hex(usb_serijski_podaci, podaci)

Imena svih naredbi mogu se pronaći u datoteci knjižnice.

Čeka se povezivanje s računalom

Ako je prije pokretanja glavnog ciklusa mikrokontrolera potrebno prvo uspostaviti vezu s računalom, tada možete dodati linije ispred njega
dok(usb_cdc_line_status() == 0x00) petlja
završna petlja

Dodjeljivanje broja porta uređaju

Ako ostavite sve kako jest, sustav će dodijeliti prvi slobodni broj porta za svaku novu vezu. To znači da ćete ga uvijek morati držati na oku.
Kako biste spriječili da se to dogodi, trebate dodijeliti jedinstveni serijski broj uređaju prije spajanja USB knjižnice:
Broj može biti bilo koje duljine i sadržavati različite znakove.
const bajt USB_STRING3 =
{
24 , -- duljina niza
0x03, -- bDescriptorType
"0" , 0x00 ,
"1" , 0x00 ,
"2" , 0x00 ,
"3" , 0x00 ,
"4" , 0x00 ,
"5" , 0x00 ,
"6" , 0x00 ,
"7" , 0x00 ,
"8" , 0x00 ,
"9" , 0x00 ,
"X", 0x00
}

Promijenite naziv uređaja u svoj

Možete promijeniti naziv uređaja koji je vidljiv u sustavu prije instaliranja upravljačkih programa deklariranjem niza s imenom, poput serijskog broja; to morate učiniti prije povezivanja USB knjižnice.
const bajt USB_STRING2 =
{
28 , --
0x03, -- bDescriptorType
"D", 0x00 ,
"e", 0x00 ,
"m", 0x00 ,
"o", 0x00 ,
" " , 0x00 ,
"B", 0x00 ,
"o", 0x00 ,
"a", 0x00 ,
"r", 0x00 ,
"d", 0x00 ,
" " , 0x00 ,
"=" , 0x00 ,
")" , 0x00
}

Ali nažalost, nakon instaliranja upravljačkih programa, uređaj će promijeniti naziv u onaj naveden u .inf datoteci, pa ćemo i tamo promijeniti naziv


DESCRIPTION="Demo CDC"

Organiziramo automatsko spajanje uređaja

Jao, ne postoje izravni načini za dovršetak ovog zadatka, pa ćete morati biti pametni.

Prije svega, svom uređaju trebate dodijeliti jedinstvenu vrijednost proizvođača i proizvoda kako biste ga lako identificirali među stotinama drugih standardnih CDC firmware-ova.
VID i PID se daju za novac, pa slijedimo put Kineza: tiho uzmite očito besplatne vrijednosti.

Firmware:
U firmware-u trebate deklarirati dvije varijable prije povezivanja USB knjižnice

const riječ USB_SERIAL_PRODUCT_ID = 0xFF10
const riječ USB_SERIAL_VENDOR_ID = 0xFF10

Umjesto FF10 možete umetnuti bilo koje dvije riječi (2 bajta). Konačni rezultat nalazi se u priloženoj arhivi.

Vozači:
Budući da upravljački programi nisu dizajnirani za našu kombinaciju VID-a i PID-a, ručno ćemo dodati svoje vrijednosti u .inf datoteku:


%DESCRIPTION%=Instalacija upravljačkog programa, USB\VID_FF10&PID_FF10


%DESCRIPTION%=Instalacija upravljačkog programa, USB\VID_FF10&PID_FF10

Softver:
Kako bismo uhvatili događaje spajanja/prekida veze uređaja, povežimo ComponentUSB knjižnicu. Mislim da nije potrebno objašnjavati svaki redak: sve promjene se mogu vidjeti u priloženom projektu.

Proizlaziti

Teško je vidjeti na snimci zaslona, ​​ali tipka za slanje je aktivna samo kada postoji spojeni uređaj, a svakih 50 ms program šalje zahtjev za primanje stanja tipke (što je, međutim, netočno, jer bi pritisak na tipku trebao biti procesuiran na MK).

Kao što vidite, organiziranje razmjene podataka između MK-a i računala putem USB-a nije najteži zadatak. Rezultirajuća veza može se koristiti ne samo za konačne svrhe: također je prikladna za uklanjanje pogrešaka u programu. Uostalom, slanje rezultata izračuna i trenutnih stanja registara i varijabli na računalo mnogo je jasnije od treptanja para LED dioda u Morseovoj abecedi.

I na kraju: savjetujem vam da pogledate izvorni kod lampe raspoloženja. Tamo možete pronaći prilično dobru opciju za obradu primljenih podataka za organiziranje prikladnog protokola razmjene.

Slika 1

USB sučelje postaje sve popularnije kao sučelje za spajanje perifernih uređaja na računala i moderna računalačesto nemaju uobičajeno RS-232 sučelje. Popularnost USB-a je posljedica mnogih razloga, a evo glavnih:

  • velika brzina razmjene, visoka otpornost na buku
  • kontrola protoka podataka, praćenje integriteta i ispravljanje grešaka
  • mogućnost grananja kroz čvorišta i spajanje velikog broja uređaja.
  • Mogućnost primanja struje iz autobusa
  • svestranost sabirnice - mogućnost povezivanja različitih uređaja (tipkovnica, printer, modem)
  • automatska identifikacija i konfiguracija sustava, Plug and Play

Međutim, postoje (često neutemeljeni) čimbenici koji ometaju široku upotrebu USB-a od strane programera mikrokontrolerskih uređaja:

  • potreba za programiranjem upravljačkih programa za Windows
  • relativno niska zastupljenost mikrokontrolera s ugrađenim USB sučeljem
  • Lekcija 2: Stvaranje HID joysticka kompatibilnog s USB 2.0.

Ova serija članaka ima za cilj pokazati da je te poteškoće vrlo lako prevladati i svatko može svoj uređaj "nadograditi" s uobičajenog RS-232 na USB ili stvoriti novi uređaj s USB sučeljem.

Mikrokontroler korišten u primjerima bit će mikrokontroler proizvođača Microchip PIC18F4550 s USB 2.0 sučeljem (podržava Low Speed ​​​​i Full Speed).

Lekcija 1. USB bez Windows programiranja, virtualni COM port

Jedan od zadataka koji se nameće kod razvoja USB uređaja je prelazak sa RS-232 sučelja na USB, dok ako se modificira “stari” uređaj ili uređaj mora biti kompatibilan s postojećim protokolima i PC softverom, tada je poželjno riješite se bilo kojeg softvera za modificiranje softvera na računalu. Jedno od rješenja ovog problema je korištenje USB sučelja kao virtualnog COM priključka. Korištenje ove metode eliminira potrebu za modificiranjem računalnog softvera, jer USB vezu osobno računalo vidi kao dodatni COM priključak. Još jedna važna prednost je to što se koriste standardni Windows upravljački programi i nema potrebe za izradom prilagođenog upravljačkog programa.

USB specifikacija opisuje klasu komunikacijskih uređaja (CDC), koja definira različite načine povezivanja za telekomunikacijske (modemi, terminali, telefoni) i mrežne uređaje (Ethernet adapteri i čvorišta, ADSL modemi), uključujući emulaciju serijskog porta.

Uzmimo kao primjer uređaj koji prenosi podatke o naponu s potenciometra i temperaturu s digitalnog senzora TC77 putem RS-232, a također prima naredbe za uključivanje/isključivanje dviju LED dioda (radi jednostavnosti, implementiramo ovaj primjer na PICDEM™ FS USB DEMONSTRACIJSKA PLOČA, ali možete sastaviti jednostavniji sklop - vidi dolje).

Razvojna ploča PICDEM FS-USB namijenjena je razvoju i demonstraciji uređaja na mikrokontroleru PIC18F4550 s USB2.0 sabirnicom. Ploča sadrži PIC18F4550 kontroler u paketu TQFP44, koji ima sljedeće karakteristike:

  • Maksimalna radna frekvencija - 48 MHz (12 MIPS);
  • 32 KB Flash programska memorija (Enhanced Flash tehnologija);
  • 2 KB podatkovne memorije (od čega 1 KB dual-port RAM);
  • 256 bajta EEPROM podatkovne memorije;
  • FS USB2.0 sučelje koje podržava brzinu od 12 Mbit/s, s ugrađenim primopredajnikom i regulatorom napona.

Na ploču su ugrađeni:

  • Kvarc 20 MHz;
  • RS-232 sučelje za demonstraciju mogućnosti prebacivanja s USART na USB;
  • Priključak za unutarnje programiranje i otklanjanje pogrešaka
  • Stabilizator napona napajanja s mogućnošću prebacivanja na napajanje s USB sabirnice;
  • PICtail™ konektor za proširenje;
  • Senzor temperature TC77, spojen preko I2C;
  • Promjenjivi otpornik spojen na ADC ulaz;
  • LED diode, tipke.

Ovaj uređaj ima PC program za upravljanje uređajem i prikaz vrijednosti napona i temperature. Dakle, uređaj možemo spojiti na RS-232, odabrati COM port dostupan u sustavu i postaviti tečaj razmjene s našim uređajem, broj podatkovnih bitova, broj stop bitova, kao i parametre paritetnih bitova. i kontrolu protoka u skladu s programom mikrokontrolera (to znači da moramo znati parametre inicijalizacije našeg kontrolera)


Riža. 2

Počnimo spajati naš uređaj na USB.

Microchip Technology Inc. Nudi gotov primjer primjene AN956, koji implementira USB CDC podršku za PIC18F2550, PIC18F2455, PIC18F4455, PIC18F4550 mikrokontrolere. Program je izgrađen na modularnom principu, što omogućuje jednostavnu modernizaciju i integraciju u gotove projekte.

Nakon početne inicijalizacije kontrolera, program može komunicirati s računalom putem USB sučelja koristeći nekoliko gotovih funkcija:

Modificiramo naš program za prijenos i primanje podataka putem USB-a.

Fragment programa pripreme i prijenosa podataka:

Prijem podataka:

if(getsUSBUSART(input_buffer,1)) ( switch (input_buffer) ( case "1" : mLED_3_On(); break; case "2" : mLED_3_Off(); break; case "3" : mLED_4_On(); break; case " 4" : mLED_4_Off(); break; default: break; ) )

Nakon spajanja uređaja na USB, sustav prepoznaje novi uređaj


Riža. 3

I postavlja novu opremu


Riža. 4

Odaberemo instalaciju s navedenog mjesta i označimo put do lokacije datoteke mcpusb.inf iz paketa izvornog koda za program AN956. Nakon toga se novi uređaj instalira u sustav.


Riža. 5

Dakle, novi uređaj je spreman za rad. U sustavu se pojavio novi virtualni COM port.


Riža. 6

Sada u našem programu možemo odabrati virtualni COM port koji se čini da komunicira s uređajem...


Riža. 7

... i vidite da je uređaj zapravo počeo raditi preko COM priključka koji se pojavio u sustavu putem USB veze.

Valja napomenuti da USB omogućuje kontrolu i ispravak podataka, tako da pojmovi poput bit rate, parity i flow control bitovi postaju apstraktni koncepti, au našem slučaju ih može izabrati bilo tko, jedini informacijski parametar je broj virtualnog COM-a. luka.

PICDEM CDC prozor


Riža. 8

Pri korištenju mikrokontrolera PIC18Fxx5x s ugrađenim USB 2.0 modulom, virtualni COM port može osigurati brzine prijenosa podataka do 80 Kbytes u sekundi (640 Kbps), što znatno premašuje moguću brzinu prijenosa putem RS-232, dok, kako smo vidite, nema potrebe za modificiranjem potrebnog računalnog softvera!

Primjeri programa, dokumentacije i dijagrama korištenih u lekciji 1.

  1. PICDEM CDC program + izvorni kodovi za preuzimanje Delphija
  2. Delphi komponenta za rad COM priključak preuzeti
  3. AN956+ izvorni izvorni kodovi
  4. File user_uart.c (sve promjene izvornog programa iz AN956 napravljene su samo u ovoj datoteci. Da biste pokrenuli primjer u lekciji 1, trebate kopirati ovu datoteku u direktorij C:\MCHPFSUSB\fw\Cdc\user\, zamijeniti user.c datoteku u projektu s user_uart .c, kompajlirajte projekt i flashajte mikrokontroler)
  5. Pojednostavljeni dijagram USB uređaja


Riža. 9

Napomena: Izvorni dizajn PICDEM FS USB ploče koristi automatsko otkrivanje izvora napajanja ploče (vanjski izvor ili USB). Stoga, kada koristite pojednostavljenu shemu, trebate komentirati redak #define USE_USB_BUSSENSE_IO u datoteci usbcfg.h

Lekcija 2: Stvaranje HID joysticka kompatibilnog s USB 2.0

Najčešći USB uređaji su Human Interface Devices (HID). Tipični predstavnici ove klase su USB tipkovnice, miševi, joystickovi, ploče s postavkama monitora, čitači barkodova, čitači kartica itd. Prednosti HID uređaja su:

  • jednostavnost implementacije;
  • kompaktni kod;
  • Windows podrška (nisu potrebni dodatni upravljački programi).

Na web stranici Microchipa nalazi se primjer implementacije HID manipulatora mišem. Razmotrimo implementaciju najjednostavnijeg manipulatora igre na temelju ovog primjera. Za ovaj projekt koristit ćemo demo ploču PICDEM FS-USB (DM163025). Razvojna ploča PICDEM FS-USB ima jedan promjenjivi otpornik i 2 gumba, tako da će joystick koji se razvija imati minimalno kontrolnih elemenata (2 gumba i, na primjer, regulator plina).

Prije svega, moramo ponovno napisati deskriptor uređaja za joystick koji se stvara. Kako biste pojednostavili zadatak, možete koristiti program HID Deskriptor Tool koji se može preuzeti s web stranice www.usb.org

Program dolazi s primjerima konfiguracija nekih HID uređaja, koje možete prilagoditi svom zadatku ili izraditi vlastiti HID uređaj.


Riža. 10

Dakle, u našem slučaju koristit će se nekoliko tipova podataka - radi se o simulaciji upravljanja - Simulation Controls, a konkretno to su ručica gasa (pedala) i upravljačke tipke (Button). Kako bi operativni sustav “znao” kako postupati s ovim tipovima podataka, potrebno je opisati maksimalne i minimalne vrijednosti i veličinu podataka. U našem slučaju, “gas” je jedna 8-bitna vrijednost (report_size = 8, report_count = 1), a stanje gumba je definirano kao polje jednobitnih vrijednosti. Primjer koristi samo 2 gumba, ali je potrebno polje uskladiti s vrijednošću bajta (report_size = 1, report_count = 8). Ukupno, kada traži podatke od računala, mikrokontroler mora prenijeti 2 bajta - razinu plina i stanje gumba u skladu s generiranim deskriptorom uređaja (za detaljan opis mogućih deskriptora pogledajte specifikaciju za HID uređaje www.usb.org). Stvoreni opis deskriptora uređaja može se spremiti u različitim formatima, uključujući kao datoteku zaglavlja.h

Dodatno, trebate prilagoditi veličinu primljenog deskriptora uređaja u opisu HID specifične klase i promijeniti veličinu podataka koji se prenose kroz krajnju točku u deskriptoru krajnje točke (u našem slučaju prenosimo 2 bajta, tako da je veličina HID_INT_IN_EP_SIZE=2).

Navedene promjene dovoljne su da Windows prepozna povezani uređaj kao joystick. Sada možemo prilagoditi podatke niza tako da uređaj ima naziv koji želimo (na primjer, "PIC18F4550 Joystick"). Da biste dodijelili naziv uređaju na ruskom, morate unijeti deskriptor niza u UNICODE kodiranju. Ovim završavamo opis joysticka i trebate pripremiti podatke za prijenos na računalo.

ReadPOT(); // pokretanje međuspremnika mjerenja napona potenciometra = ADRESH;

Nakon sastavljanja projekta i programiranja mikrokontrolera, uređaj možete spojiti na USB priključak. Ploča je definirana kao HID gaming uređaj, instaliran u sustav i spreman za korištenje.


Riža. 11

Putem upravljačke ploče u sustavu Windows možemo otvoriti dostupne uređaje za igranje, odabrati svoj joystick, kalibrirati ga i testirati njegovu funkcionalnost.


Riža. 12

Prilikom promjene konfiguracije uređaja - dodavanja kontrola ili gumba, potrebno je ne samo promijeniti opis deskriptora uređaja, već i prenijeti podatke strogo u skladu s kreiranim deskriptorom. Dakle, promjenom maksimalnog broja tipki u opisu deskriptora uređaja USAGE_MAXIMUM (BUTTON 2) sa 2 na 8, dobivamo joystick sa 8 tipki.


Riža. 13

Kako deskriptor postaje složeniji, možemo dobiti potpuniju implementaciju joysticka, ali moramo zapamtiti da promijenimo sljedeće parametre: veličinu deskriptora, veličinu krajnje točke, a potrebno je poslati onoliko informacijskih podataka koliko je deklarirano u deskriptoru.


Riža. 14

Primjeri programa, dokumentacije i dijagrama korištenih u lekciji 2.

  1. Izvorni izvorni kodovi za implementaciju HID miša.
  2. Izvorni kodovi za implementaciju HID joysticka.

Lekcija 3. Kompozitni USB uređaj

Svaki USB uređaj može imati nekoliko konfiguracija, a svaka konfiguracija ima nekoliko sučelja. Ovo USB svojstvo omogućuje da stvoreni uređaj bude prepoznat od strane računala kao nekoliko USB uređaja s različitim sučeljima. Miš, na primjer, može imati ugrađeni čitač kartica i komunicirati s računalom kao dva neovisna uređaja.

Struktura deskriptora uređaja:


Riža. 15

Na temelju standardnog primjera miša i izrađenog joysticka izradit ćemo kompozitni USB uređaj koji će računalo detektirati kao dva neovisna HID uređaja.

1. Napravite deskriptor.

Promijenimo strukturu deskriptora (datoteka usbdsc.h)

Uređaj će imati 2 sučelja, svako s jednom krajnjom točkom.

#define CFG01 rom struct \ ( USB_CFG_DSC cd01; \ USB_INTF_DSC i00a00; \ USB_HID_DSC hid_i00a00; \ USB_EP_DSC ep01i_i00a00; \ USB_INTF_DSC i01a00; \ USB_HID_DSC hid_i01a00; \ USB_EP _DSC ep02i_i01a00; \ ) cfg01
  1. Sukladno promijenjenoj strukturi potrebno je promijeniti deskriptor u datoteci usbdsc.c.
  2. U datoteci usbcfg.h definirajte identifikatore sučelja, korištene krajnje točke i veličine deskriptora izvješća.
  3. U hid.c datoteci morate inicijalizirati dodatne krajnje točke (u funkciji HIDInitEP) i promijeniti funkciju za rukovanje HID zahtjevima (funkcija USBCheckHIDRequest).
  4. Svaki uređaj, miš i joystick, svaki mora slati podatke na svoju krajnju točku. Stoga moramo dodati funkcije za prijenos podataka na određene krajnje točke i provjeriti je li željena krajnja točka slobodna (dodajte funkcije slične mHIDTxIsBusy i HIDTxReport u hid.c datoteci).

Tada će izgledati prijenos podataka za miš

Nakon kompajliranja projekta, flashiranja firmvera kontrolera i povezivanja uređaja na USB, računalo će otkriti novi složeni uređaj i dodati miš i joystick.


Riža. 16


Riža. 17

Izvorni kodovi kompozitnog HID uređaja.

Komentar. Ne zaboravite promijeniti PID kada stvarate novi uređaj ili uklanjate prethodni uređaj s istim PID-om iz sustava.

Lekcija 4. Eksperimenti s PICkit2 programatorom

Microchip Technology Inc. izdaje jeftin razvojni programer PICkit2, koji se prvenstveno koristi za programiranje Flash kontrolera. Izrazita značajka ovog programatora je dostupnost potpune dokumentacije i izvornih kodova za firmware za mikrokontroler i program ljuske za računalo. PICkit2 prima napajanje s USB-a, generira podesive napone za programiranje i napajanje, a također ima 3 ulazno-izlazna voda za spajanje na programabilni uređaj. Kako bi se omogućilo ažuriranje firmvera programatora, PICkit2 ima program za pokretanje sustava.


Riža. 18

CDC uređaj temeljen na PICkit2

Korištenjem svih ovih značajki, temeljenih na programatoru PICkit2, moguće je kreirati i otkloniti pogreške vlastitog USB uređaja s mogućnošću vraćanja na funkcije programatora u bilo kojem trenutku. Koristeći bootloader koji je flashiran u programatoru, možete flashati druge programe u PICkit2, na primjer, virtualni program za podršku COM porta. Da biste to učinili, uzmite primjer CDC-a, preimenujte projekt i učinite sljedeće

  1. u datoteci main.c mijenjamo adresu lokacije firmvera (PICkit2 bootloader prenosi kontrolu korisničkom programu na adresu 0x002000.
    #pragma kod _RESET_INTERRUPT_VECTOR = 0x002000
  2. u datoteci io_cfg.h uklanjamo sve o portu D (možete namjestiti LED da trepće na PORTC0).

    Budući da se PICKIT2 uvijek napaja s USB-a, postavili smo

    #define usb_bus_sense 1 // uređaj je uvijek priključen #define self_power 0 // uređaj se napaja s USB-a

  3. u datoteku usbcfg.h stavljamo komentare u 2 retka
    //#define USE_SELF_POWER_SENSE_IO //#define USE_USB_BUS_SENSE_IO
  4. U datoteci user.c ispisujemo podatke koji su nam potrebni na USB
  5. povežite datoteku povezivača pickit2.lkr

Nakon toga možete prevesti projekt i učitati novi firmware kroz PICkit2 ljusku.

Nakon reprogramiranja PICkit2, računalo detektira pojavu novog COM porta, te preko hiperterminala vidimo da PICkit2 šalje podatke kroz virtualni COM port.

Izvorni kod za ovaj primjer dostupan je na link.

Na temelju ovog primjera i pomoću vanjskih pinova PICkit2 programatora, možete primati podatke s vanjskih uređaja i prenositi ih na računalo putem USB-a. Dakle, koristeći PICkit2, možete poslati podatke na COG LCD indikatore, čitače I2C, SPI i 1-wire uređaja, kao što su temperaturni senzori i drugi uređaji.

Radio HID tipkovnica temeljena na PICkit2


Riža. 19

Pogledajmo još jedan primjer "neprimjerene" uporabe PICkit2 programatora - emulatora tipkovnice s radijskim sučeljem. Takav uređaj može se koristiti, primjerice, za prezentacije - za listanje slajdova daleko od računala.

Za implementaciju takvog uređaja trebat će nam:

  • PICkit2
  • demo ploča iz PICkit2 (DV164120)
  • radio prijemnik (rfRXD0420) i radio odašiljač (rfPIC12F675) iz rfPICkita.

Spojimo radio prijemnik na demo ploču. Mikrokontroler na ploči će primati podatke od prijemnika, obrađivati ​​ih i, detektirajući pritisak na jednu od dvije tipke na radio privjesku, postaviti log.1 razinu na jedan od 2 pina spojena na PICkit2.

PICkit2 će obavljati sljedeće funkcije:

  • kada se poveže s računalom putem USB-a, detektira se kao HID tipkovnica
  • generirajte +5V napon napajanja za demo ploču s prijemnikom
  • poll 2 vanjska izlaza kontrolera prijemnika i, ako postoji log. 1 pošaljite kodove za pritiskanje gumba PageUp ili PageDown na računalo.

Dva virtualna COM porta (FTDI2232 emulacija čipa) temeljena na PICKit2

Ovaj primjer služi samo za učenje kako USB radi. Prije uporabe pregledajte zahtjeve za FTDI vozačku dozvolu!

Primjer pokazuje kako napraviti 2 virtualna COM porta bazirana na mikrokontroleru s USB portom Prvo morate instalirati upravljačke programe za FTDI2232 čip. Zatim, za učitavanje u PICkit2, trebate odabrati stavku ažuriranja firmvera u PICkit2 ljusci i pokazati na datoteku TestVCP2.hex iz arhiva. Nakon reprogramiranja PICkit2, imat ćete 2 neovisna serijska COM porta u vašem sustavu.

Primjer preuzet sa stranice http://forum.microchip.com/tm.aspx?m=261649

Da vratite PICkit2 natrag kao programator, trebate odspojiti PICkit2 s USB-a i, dok držite tipku, ponovno spojiti USB kabel, a zatim odabrati učitavanje standardnog firmvera programatora.

Svi gornji primjeri temelje se na MCHPFSUSB okviru v1.3. Pojavom PIC24 i PIC32 kontrolera s USB OTG-om, Microchip je izdao novu verziju stoga - USB stack v. 2.x.

U novoj verziji USB stack v. 2.3, uz hrpe USB uređaja, koji implementiraju funkcionalnost USB klijenta, USB Embedded host, koji implementiraju funkcionalnost hosta, proizveden je i USB stog s dvostrukom ulogom, koji implementira funkcije i hosta i klijent; i USB OTG, podržava Host Negotiation Protocol (HNP), Session Request Protocol (SRP) i potpuno je usklađen s USB OTG specifikacijom. Implementirano u primjerima aplikacija:

  • Ugrađeni host
    • Printer Class host - podrška za ESC/POS, PostScript® i PCL5 pisače
    • CDC Class host - podrška za ACM (apstraktni model upravljanja) uređaje
    • HID tipkovnica
  • Uređaj
    • HID bootloader - dodana podrška za obitelji PIC32MX460F512L i PIC18F14K50
    • HID tipkovnica, miš
    • MSD interni flash demo - korištenje internog flasha za pohranu datoteka
    • MSD + HID kompozitni primjer - primjer kompozitnog MSD i HID uređaja
    • CDC - emulacija COM porta
    • Podrška obitelji PIC32MX460F512L za sve PC demo projekte
    • Primjeri HID, MCHPUSB i WinUSB sada podržavaju značajku Microsoft Plug-and-Play (PnP) za automatsko otkrivanje.
  • Dokumentacija
    • potpuni opis svih API-ja nalazi se u mapi "\Microchip\Help".

Microchip nudi besplatne upravljačke programe za najpopularnije USB klase:

  1. Korisničko sučelje (HID). Ovaj način razmjene koristi se u gotovo svim tipkovnicama, miševima i drugim ulazno/izlaznim uređajima
  2. Komunikacijski uređaj (CDC). Ovaj način je najlakši za prebacivanje sa RS-232 serijskog sučelja na USB. Na računalima s WinXP/2K, virtualni COM port se stvara i emulira kada se spoji mikrokontroler. Programi koji rade s portovima COM1.. 4 radit će nepromijenjeno s virtualnim portom, ali većom brzinom (oko 1 Mbit/s)
  3. Uređaji za masovnu pohranu (MSD). To su uređaji koji rade kao uređaji za pohranu informacija - flash diskovi, SD/MMC kartice, diskovi itd.
  4. Printer Class uređaji. Ovaj način rada dizajniran je za korištenje USB pisača, što krajnjem uređaju na PIC mikrokontroleru s USB modulom omogućuje izlaz potrebnih informacija izravno na USB pisač
  5. Microchip rezidentni bootloader. Najjednostavniji način rada, koji se koristi samo za ažuriranje softvera mikrokontrolera putem USB-a. Na PC strani je instaliran mali program, sličan drajveru
  6. Vlastiti vozač (Custom). Najcjelovitije korištenje resursa USB2.0 za napredne korisnike: mogućnost odabira načina rada sabirnice (izokroni, vođeni prekidima, volumetrijski, kontrolni), velika brzina prijenosa. Zahtijeva detaljno poznavanje rada sabirnice i vještine razvoja softvera za Windows

Bootloader s USB Flash pogonom

Ažuriranje firmvera s običnog flash pogona.

Za ažuriranje firmvera mikrokontrolera s USB-OTG modulom (PIC24 ili PIC32) nije potrebno koristiti poseban softver. Prisutnost načina Host omogućuje vam povezivanje konvencionalnih USB uređaja za pohranu podataka (Flash Drive) na mikrokontroler. Primjer je objavljen na web stranici Microchipa ( beta verzija), koja vam omogućuje ažuriranje softvera mikrokontrolera s povezanog USB pogona.

Da biste pokrenuli primjer, trebate učitati firmware pokretačkog programa u PIC32 USB ploču ili Explorer 16 (s instaliranim PIC32 USB PIM procesorskim modulom i USB PICtail Plus pločom kćeri). Ako priključite napajanje na ploču dok je gumb pritisnut, kontroler će prijeći u način rada ažuriranja firmvera. Ako sada spojite Flash pogon sa snimljenom datotekom ažuriranja firmvera, mikrokontroler će pročitati ovu datoteku i ponovno je prepisati u svoju programsku memoriju.

USB razvojne ploče i razvojni alati

Programer-debugger PICkit2 (narudžbeni broj PG164120)

Prisutnost bootloadera omogućuje vam učitavanje vlastitog softvera kako biste svladali USB vještine


Riža. 20

PICDEM FS-USB razvojna ploča (broj narudžbe DM163025)

Dizajniran za razvoj i demonstraciju uređaja temeljenih na mikrokontroleru PIC18F4550 s USB2.0 sabirnicom. Ploča sadrži PIC18F4550 kontroler u TQFP44 paketu.


Riža. 21

USB razvojni komplet s niskim brojem pinova (broj narudžbe DM164127)

USB razvojni komplet s niskim brojem pinova pruža jednostavan način za procjenu mogućnosti mikrokontrolera Microchip PIC18F14K50 i PIC18F13K50 20-pinskih USB mikrokontrolera. Komplet uključuje sve što vam je potrebno za početak rada s USB kontrolerima (softver, primjeri izvornih datoteka, dokumentacija).


Riža. 22

PIC18F87J50 Full Speed ​​​​USB PIC18F87J50 FS USB demo ploča (narudžbeni broj MA180021)

Demo ploča PIC18F87J50 FS USB koristi se za otklanjanje pogrešaka Full Speed ​​​​USB 2.0 mikrokontrolera obitelji PIC18F87J50. Osim autonomnog rada, ploča se može koristiti i kao procesorski modul za PIC18 Explorer ploču.


Riža. 23

PIC24 početni komplet (broj narudžbe DM240011)

PIC24F Starter Kit sadrži sve što vam je potrebno za početak rada s obitelji PIC24F kontrolera visokih performansi. Ovaj jeftini komplet sadrži integrirani in-circuit debugger i programator, PIC24F kontroler s USB sučeljem (funkcije Host i Device mogu se implementirati na ploči), trobojni LED, kapacitivni dodirni panel i grafički OLED zaslon. Demo program kroz grafički izbornik omogućuje vam snimanje podataka na vanjski USB Flash Drive, konfiguriranje dodirne ploče i pokretanje grafičkih zadataka.


Riža. 24

PIC32 USB ploča (broj narudžbe DM320003)

Omogućuje vam svladavanje USB-OTG modula u PIC32 kontrolerima


Riža. 25

Razvojna ploča "Explorer 16 Development Board" (broj narudžbe DM240001)

Ovo je jeftin alat za otklanjanje pogrešaka koji će vas pokrenuti s PIC24 obitelji visokih performansi 16-bitnih mikrokontrolera i dsPIC33F kontrolera za digitalnu obradu signala.


Riža. 26

Ploča kćer "USB PICtali Plus" (broj narudžbe AC164131)

Zajedno s USB procesorskim Plug-In modulima, omogućuje vam razvoj i uklanjanje pogrešaka USB uređaja Host, Device, USB-OTG.


Riža. 27

Ilja Afanasjev,
Tvrtka


Slika 1. Prikaz rada Android uređaja u načinima USB Host i Accessory (slika sa stranice http://developer.android.com)

Imajte na umu da korištenje USB-a nije jedini način komunikacije s istim kućnim uređajem. Android također omogućuje korištenje NFC-a, Wi-Fi P2P, SIP-a, kao i standardne mrežne veze. Dakle, programer ima dovoljno mogućnosti u svom arsenalu da realizira svoje najluđe ideje.

Druga uobičajena komunikacijska opcija je razne uređaje do sada je korištenje USB-COM adaptera. Na internetu postoji materijal o korištenju USB-COM adaptera u Androidu - pogledajte, na primjer,. Popularnost ove veze je zbog prisutnosti velikog broja uređaja koji su već razvijeni korištenjem različitih mikrokontrolera, komunikacija s kojima se provodi pomoću COM porta (serijski port), koji je bio prije gotovo 10 godina na standardan način prijenos podataka s računala na kućni komad hardvera.

U usporedbi s COM priključkom, korištenje USB-a može značajno povećati brzine prijenosa podataka i učiniti ovaj proces lakšim za korištenje. Brzina prijenosa, koja čak i u slučaju uređaja niske brzine (tipkovnice, miševi, joystickovi), iznosi 10-1500 Kbps, jednostavnost i niska cijena kabelski sustav i veze, samoidentifikacija uređaja s automatskom konfiguracijom, skrivanje detalja električnog priključka od krajnjeg korisnika (plus mogućnost odspajanja kabela bez gašenja uređaja), kontrola grešaka i njihov oporavak na razini protokola - to su neporecive prednosti ove tehnologije (vidi str. 12).

Općenito, govoreći o korištenju USB-a za prijenos podataka, bilo bi korisno spomenuti knjigu P. Agurova “USB sučelje”. Iako je često kritizirana na internetu, a zadnji put je objavljena 2006. godine, više je puta pomogla u pronalaženju pravog rješenja pri traženju informacija o raznim aspektima primjene ove tehnologije. Knjiga pokriva problematiku od odabira mikrosklopa i dizajna sklopa za kontroler do pisanja programa za mikrokontroler i primjere programiranja prijenosa podataka putem USB protokola s računala. Nemoguće je ne navesti "primarni izvor" podataka o ovom pitanju - web mjesto neprofitne organizacije USB IF (USB Implementers Forum), koja razvija specifikacije za ovo sučelje -, međutim, ovaj materijal je na engleski. Međutim, tamo ćete pronaći sveobuhvatne informacije o USB sučelju. Postoji dobar prijevod dijelova specifikacije - . Zainteresirani za programska rješenja s mikrokontrolerske strane također mogu pogledati poveznicu.

Ovaj je članak prvenstveno namijenjen onima koji ih imaju elektronički uređaj(razvio sam ili netko drugi), protokol za razmjenu podataka s kojim je dobro poznat (npr. već postoji program koji radi s ovim uređajem u sustavu Windows/Linux) i želio bih imati program koji radi s njim u Android.

Malo o klasama USB uređaja

Treba napomenuti da razvoj softver komunikacija s određenim uređajem uvelike ovisi o njegovoj implementaciji na razini mikrokontrolera. Iz očitih razloga nemoguće je u jednom članku dati primjere komunikacijskih programa za sve vrste USB uređaja (početne informacije o programiranju razne vrste uređaji se mogu pronaći u). Međutim, ograničit ćemo se na predstavljanje koda koji implementira pretraživanje uređaja i pristup njegovim kontrolnim točkama za razmjenu informacija. Također ćemo analizirati slanje podataka na primjeru jedne od vrsta USB uređaja, odnosno HID (human interface device) klase uređaja. U ovu klasu spadaju “spori” uređaji poput tipkovnice, miša, joysticka, a primjera njezine implementacije pomoću raznih mikrokontrolera na mreži (ima ih npr. u) ima dosta.

Zašto je klasa HID toliko popularna među proizvođačima raznih kućnih uređaja? Da citiram Wikipediju: “Osim detaljnih specifikacija klasičnih ulaznih uređaja (kao što su tipkovnice i miševi), HID standard definira posebnu klasu uređaja bez detaljnih specifikacija. Ova se klasa naziva USB HID Consumer Control i u biti je neregulirani komunikacijski kanal s uređajem. U ovom slučaju uređaj koristi isti standard operativni sustav upravljački programi za miš i tipkovnicu. Tako je moguće izraditi USB uređaj koji ne zahtijeva izradu i instalaciju posebnih upravljačkih programa u većini uobičajenih računalnih operativnih sustava." Ostaje samo dodati da ova specifikacija također radi u Android OS-u (ne isključujući CyanogenMod firmware).

Jedna od mogućnosti razmjene podataka s HID uređajem je prekidni prijenos koji se koristi kada je potrebno prenijeti male pakete podataka (maksimalna veličina paketa ovisi o brzini prijenosa i kreće se od 64 do 1024 bajta) nakon određenog vremenskog intervala. . Paket za prijenos naziva se izvještaj (engleski - report, vidi str. 71, 95). Ova duljina izvješća obično je sasvim dovoljna za razmjenu informacija s kućnim uređajem; 64 bajta informacija u jednom paketu, na primjer, dosta je za kontroler, jer je 1 bit informacije dovoljan za prijenos stanja LED-a. ili jednostavnog senzora.

Potrebni alati

Dakle, trebat će nam tablet ili telefon s verzijom Androida ne nižom od 3.1. Ovdje treba napomenuti da gornji USB Host API nije u potpunosti implementiran na svim mobilnim uređajima (ovo je također spomenuto na web stranici developer.android.com, pogledajte vezu). Na nekim tabletima/telefonima, USB priključak se koristi samo za punjenje i komunikaciju osobno računalo. Još jednom ću uputiti čitatelja na popis mobilnih uređaja prikladnih ili neprikladnih za naše eksperimente (vidi).

Trebat će vam i neka vrsta USB uređaja (za prve pokuse dovoljan je obični USB flash pogon), OTG adapter (On-The-Go - vidi sl. 2) i/ili USB kabel za komunikaciju s uređaj. Wikipedia kaže o OTG-u: „Pri povezivanju putem USB OTG-a, rang uređaja (master ili slave) određen je prisutnošću ili odsutnošću kratkospojnika između pinova 4 i 5 u utikaču spojnog kabela. U USB OTG kabelu, takav kratkospojnik je instaliran samo u jednom od dva konektora (vidi). Sukladno tome, potreban nam je takav skakač na bočnoj strani mobilnog uređaja.


Slika 2. Razlike u strujnom krugu običnog USB kabela i OTG kabela (slika s http://tech.firstpost.com)

Takav OTG kabel za svoj uređaj možete sami zalemiti. Da biste to učinili, trebate kupiti odgovarajući konektor u radio trgovini, a autor je, na primjer, upotrijebio stari kabel iz prijenosni tvrdi disk:

Također će vam biti dobra pomoć u radu USB program Informacije o uređaju instalirane iz Google spremišta Play tržište. Program može otkriti uređaje spojene na USB konektor tableta/telefona koristeći Java API i Linux kernel. To jest, ako vaš uređaj nije otkriven pomoću Java USB Host API-ja u informacijama o USB uređaju, tada će najvjerojatnije biti uzalud koristiti bilo koji (uključujući i vaš vlastiti) Android program napisan pomoću Jave za ovaj mobilni uređaj i USB host API.

Ponekad je vrlo koristan i izlaz informacija operativnom naredbom lsusb. Linux sustavi. S prekidačima -v i -d, lsusb prikazuje sve, ili gotovo sve, o USB uređaju što programer softvera treba za uređaje ove klase (vidi sliku 3).


Slika 3 Primjer izlaza naredbi lsusb i lsusb -v -d

Zatim, trebate računalo s instaliranim Android SDK-om i Eclipse integrirano razvojno okruženje (IDE) s ADT dodatkom (iako možete proći i samo s SDK-om). Možete vidjeti kako izraditi i instalirati aplikaciju za Android, na primjer, na ili na internetu.

I, naravno, potrebna vam je barem želja za postizanjem rezultata, bez nje ne možete! Napominjem da neke razjasnim tehnička pitanja Autorova upotreba USB-a u Androidu zahtijevala je tjedne mukotrpne potrage za informacijama.

Java klase za rad s USB-om u Android API-ju

Dakle, kako kažu na web stranici programera USB Host API-ja za Android (vidi) - "prije nego počnete, važno je razumjeti koje ćete klase koristiti u svom radu." Tablica 1 daje opis najvažnijih klasa za rad s USB Host API-jem (pokušaj prevođenja informacija s http://developer.android.com).

Tablica 1. Opis klasa za rad s USB-om u Androidu

Naziv klase Opis
USBManager Omogućuje vam nabrajanje i komunikaciju s povezanim osobama USB uređaj s.
Omogućuje otkrivanje povezanog USB uređaja i razmjenu podataka s njim.
USB uređaj Predstavlja spojeni USB uređaj i sadrži metode za pristup svojim identifikacijskim informacijama, sučeljima i krajnjim točkama.
Predstavlja povezani USB uređaj i sadrži metode za pristup njegovom identitetu, sučeljima i krajnjim točkama.
USB sučelje Predstavlja sučelje USB uređaja, koje definira skup funkcionalnosti za uređaj. Uređaj može imati jedno ili više sučelja na kojima komunicira.
Predstavlja "sučelje" USB uređaja, koje definira skup funkcija za taj uređaj. Jedan uređaj može imati jedno ili više sučelja za razmjenu informacija.
USB krajnja točka Predstavlja krajnju točku sučelja, koja je komunikacijski kanal za ovo sučelje. Sučelje može imati jednu ili više krajnjih točaka, a obično ima ulazne i izlazne krajnje točke za dvosmjernu komunikaciju s uređajem.
Predstavlja "krajnju točku" sučelja, što je komunikacijski kanal za to sučelje. Sučelje može imati jednu ili više krajnjih točaka i obično ima krajnje točke za primanje informacija i za njihov prijenos.
USB DeviceConnection Predstavlja vezu s uređajem, koja prenosi podatke na krajnje točke. Ova vam klasa omogućuje slanje podataka naprijed i natrag sinkrono ili asinkrono.
Predstavlja "vezu" s određenim uređajem. Potreban za prijenos podataka do krajnje točke. Ova vam klasa omogućuje primanje ili prijenos podataka sinkrono ili asinkrono.
USBRequest Predstavlja asinkroni zahtjev za komunikaciju s uređajem putem UsbDeviceConnection.
Predstavlja asinkroni zahtjev za komunikaciju s uređajem putem UsbDeviceConnection.
USBKonstante Definira USB konstante koje odgovaraju definicijama u linux/usb/ch9.h Linux kernela..
Definira konstante koje odgovaraju definicijama u linux/usb/ch9.h Linux kernela.

U gotovo svim slučajevima korištenja USB Host API-ja, programer koristi ove klase u svom radu. Algoritam za njihovu upotrebu izgleda otprilike ovako: definiramo uređaje (cilj je programski pristup u klasu UsbDevice) spojen na host ( mobilni uređaj), koristeći USBManager. Kada se dobije softverski pristup uređaju, potrebno je odrediti odgovarajuće UsbInterface i UsbEndpoint za komunikaciju s njim. Nakon što imate krajnju točku u svom posjedu, otvorite UsbDeviceConnection za komunikaciju s USB uređajem. Ako krajnja točka radi u asinkronom načinu prijenosa, koristimo klasu UsbRequest.

Pokušajmo sve to shvatiti stvaranjem jednostavne aplikacije koja će pomoću ovog API-ja odrediti što je povezano s hostom s OS-om Android uređaj i prikazat će neke informacije o tome na zaslonu vašeg telefona ili tableta.

Napravite projekt

U Eclipseu se projekt stvara korištenjem stavki izbornika File->New->Android Application Project. Također imajte na umu da je kod u nastavku preuzet iz primjera aplikacija koje dolaze s Android SDK-om ( folder android sdk samples/android-N(API Level)/USB) govorimo o programu za upravljanje USB igračkom Missile Launcher (pogledajte sliku 4). ). U popisima u nastavku, primjeri koda dani su s komentarima koji objašnjavaju što se događa.


Sl.4 Zabavna igračka "Raketni bacač"

Prilikom izrade projekta ne zaboravite provjeriti potrebnu razinu API-ja u opciji Minimum Requared SDK (API razina 12, odgovarajuća Android verzije 3.1 /Honeycomb/ ili noviji). Projekt će imati vrlo jednostavno korisničko sučelje – glavni prozor (Activity) i TextView za prikaz informacija. Sličan projekt je detaljno razmotren u.

U automatski kreiranoj klasi za Activity našeg projekta potrebno je definirati sljedeće instance klasa za rad s USB-om:

privatni TextView lgView;
privatni UsbManager mUsbManager;
privatni UsbDevice mDevice;
privatni UsbDeviceConnection mConnection;
privatna UsbEndpoint mEndpointIntr;

LgView = (TextView) findViewById(R.id .logTextView) ;

i dobiti pristup klasi UsbManager

MUsbManager = (UsbManager) getSystemService(Kontekst .USB_SERVICE ) ;

Kreirajmo i rukovatelj događajem onResume(). Postignimo cilj - da se informacije o povezanim uređajima ažuriraju kada se aktivira prozor naše aplikacije (vidi listing 1).

Ispis 1. Rukovatelj događajem OnResume().

javni void onResume() (
super.onResume();

//ispunite spremnik popisom uređaja
HashMap< String , UsbDevice>deviceList = mUsbManager.getDeviceList();
Iterator< UsbDevice>deviceIterator = deviceList.values().iterator();

lgView.setText("Broj uređaja:" + deviceList.size());

dok (deviceIterator.hasNext()) (
UsbDevice uređaj = (UsbDevice) deviceIterator.next () ;

//primjer određivanja ProductID-a uređaja
\n"+ "ID proizvoda uređaja: " + device.getProductId());
}
//definirajte namjeru opisanu u filtru
// namjera AndroidManifest.xml
Namjera namjere = getIntent() ;
lgView.setText(lgView.getText()+" \n"+ "namjera: " + namjera);
Radnja niza = intent.getAction();

//ako je uređaj povezan, proslijedite vezu na
//na funkciju setDevice().
UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE) ;
if (UsbManager.ACTION_USB_DEVICE_ATTACHED .equals (action) ) (
postaviUređaj(uređaj);
lgView.setText(lgView.getText()+" \n" + "UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action) je TRUE") ;
) else if (UsbManager.ACTION_USB_DEVICE_DETACHED .equals (action) ) (
if (mDevice != null && mDevice.equals (uređaj) ) (
setDevice(null) ;
lgView.setText(lgView.getText()+" \n" + "UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action) je TRUE") ;
}
}

Zatim ćemo stvoriti funkciju setDevice() za Activity, koja je neophodna za rad s našim uređajem (pogledajte ispis 2). U rukovatelju onResume() i u funkciji setDevice() točno smo slijedili algoritam za korištenje USB Host API-ja opisanog u prethodnom odjeljku.

Ispis 2. funkcija setDevice().

privatni void setDevice(UsbDevice uređaj) (
lgView.setText(lgView.getText()+" \n"+ "setDevice " + uređaj);

//određivanje dostupnih sučelja uređaja
if (device.getInterfaceCount() != 1 ) (

LgView.setText(lgView.getText()+" \n"+ "nije moguće pronaći sučelje" );
povratak ;
}
UsbInterface intf = device.getInterface(0);

//definirajte krajnje točke uređaja
if (intf.getEndpointCount() == 0 ) (

LgView.setText(lgView.getText()+" \n"+ "nije moguće pronaći krajnju točku" );
povratak ;
) inače (
lgView.setText(lgView.getText()+" \n"+ "Broj krajnjih točaka: " + intf.getEndpointCount () ) ;
}

UsbEndpoint epIN = null;
UsbEndpoint epOUT = null;

//tražite krajnje točke za prijenos putem prekida
za (int i = 0; i< intf.getEndpointCount () ; i++ ) {
if (intf.getEndpoint(i).getType() == UsbConstants.USB_ENDPOINT_XFER_INT) (
if (intf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN) (
epIN = intf.getEndpoint(i) ;
lgView.setText(lgView.getText()+" \n"+ "IN krajnja točka: " + intf.getEndpoint (i) ) ;
}
drugo(
epOUT = intf.getEndpoint(i) ;
lgView.setText(lgView.getText()+" \n"+ "OUT endpoint: " + intf.getEndpoint (i) ) ;
}
) else ( lgView.setText ( lgView.getText() + " \n" + "nema krajnjih točaka za INTERRUPT_TRANSFER") ; }
}

MDevice = uređaj;
mEndpointIntr = epOUT;

//otvorite uređaj za prijenos podataka
if (uređaj != null) (
UsbDeviceConnection veza = mUsbManager.openDevice (uređaj) ;
if (connection != null && connection.claimInterface (intf, true) ) (

LgView.setText(lgView.getText()+" \n"+ "otvori uređaj USPJEH!" ) ;
mConnection = veza;

) inače (

LgView.setText(lgView.getText()+" \n"+ "otvori uređaj FAIL!" ) ;
mVeza = null;
}
}
}
}

Uz zadani kod, koji, kao što je pažljivi čitatelj vjerojatno pogodio, otvara uređaj za primanje i prijenos podataka, preostaje samo koristiti protokol za razmjenu podataka, koji bi, ponavljam, programer trebao biti dobro poznat. Predstavit ćemo samo, kao što smo obećali, kod koji će poslati određeni paket podataka poruke na HID uređaj korištenjem prekida prijenosa, klasu UsbRequest i odgovarajuću krajnju točku - vidi Listing 3.

Ispis 3. Primjer koda za slanje podataka na uređaj

//određivanje veličine međuspremnika za slanje
//na temelju maksimalne veličine paketa
int bufferDataLength = mEndpointIntr.getMaxPacketSize () ;

lgView.setText(lgView.getText()+" \n"+ mEndpointIntr.getMaxPacketSize());

ByteBuffer međuspremnik = ByteBuffer.allocate (bufferDataLength + 1) ;

UsbRequest zahtjev = novi UsbRequest() ;

međuspremnik.put(poruka);

request.initialize(mConnection, mEndpointIntr) ;

request.queue(buffer, bufferDataLength) ;

if (request.equals(mConnection.requestWait()) )

//slanje je uspješno
//lgView.setText(lgView.getText() + "\n" + "slanje CLEAR!!!");

hvatanje (iznimka ex)

//nešto nije u redu...
//lgView.setText(lgView.getText() + "\n" + "slanje nije jasno...");

Filtriranje uređaja u AndroidManifest.xml

Iako naša aplikacija ne treba tražiti određeni uređaj s poznatim VID-om (Vendor-ID) i PID-om (Product-ID), Googleovi inženjeri ne daju primjere aplikacija bez odjeljka filtra namjere u datoteci manifesta, a autor nije uspio natjerati program da radi bez filtriranja uređaja u AndroidManifest.xml.

Dopustite mi da vas podsjetim da su Vendor-ID i Product-ID jedinstveni identifikatori USB uređaja. Odnosno, korištenjem filtriranja možete stvoriti aplikaciju koja komunicira samo s određenim uređajem ili nekom klasom uređaja. Imajte na umu da proizvođači uređaja moraju dogovoriti ove brojeve s organizacijom USB IF.

Primjerice, aplikacija čija je datoteka manifesta prikazana u Ispisu 4, a datoteka uvjeta filtra u Ispisu 5, uspješno prepoznaje USB flash pogone spojene na mobilni uređaj, ali ne prepoznaje tipkovnicu i miša koje ima autor. Ovu aplikaciju zajedno s izvornim kodom možete preuzeti s poveznice.

Ispis 4. Datoteka AndroidManifest.xml


" > http://schemas.android.com/apk/res/android"
> paket="ru.learn2prog.usbhostexample"
android:versionCode="1"
android:versionName="1.0" >


android:minSdkVersion="12"
android:targetSdkVersion="14" />


android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/naziv_aplikacije"
android:theme="@style/AppTheme" >

android:ime = "ru.learn2prog.usbhostexample.MainActivity"
android:label="@string/app_name" >
>

"android.intent.category.DEFAULT" />

"android.intent.category.LAUNCHER" />

>

>

>
"android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
>
>

>

Ispis 5. Datoteka filtera device_filter.xml (/res/xml direktorij)

>

>

Operacije sastavljanja i instaliranja naše aplikacije ne razlikuju se od uobičajenih (pogledajte primjere u,). Želio bih vam skrenuti pozornost na radnje filtra namjera - kada je uređaj spojen na host, OS traži od korisnika da pokrene našu aplikaciju.

Literatura/Reference: 11.
12.
13. http://developer.android.com/guide/topics/connectivity/usb/host.html - pregled klasa potrebnih za rad s USB-om u Androidu
14. link na izvore aplikacije

Ali nije dovoljno samo fizički povezati uređaj s računalom, potrebno je uspostaviti i razmjenu podataka između njih. Kako odabrati priključak i organizirati vezu? Prije nekoliko godina standardno rješenje bilo je korištenje COM priključka. Usput, razni stručnjaci još uvijek instaliraju 8, 16 ili čak 32 COM porta na industrijska računala (postoji cijela kategorija različitih PCI kartica za proširenje za serijske portove, kontrolere itd.). Tako, ako trebate spojiti nekoliko vanjskih uređaja s RS-232 sučeljem, možda će vam trebati skupi adapteri i egzotične kartice za proširenje, koje po starom običaju tjednima putuju brodovima do Rusije. Usput, naziv uobičajenog adaptera je "DB9m/DB25f adapter" od upravitelja trgovina računalima Može samo izazvati iritaciju.

Što je HID uređaj

Danas se gotovo svi uređaji na računalo spajaju preko USB sučelja. Stoga mnoga nova računala uopće nemaju COM priključak.

USB sučelje - standardno rješenje na sparivanju novog vanjski uređaj s računalom, točnije radi se o HID sučelju baziranom na USB 1.1 protokolu.

Iako mnogi misle da je HID (Human Interface Device) sučelje namijenjeno isključivo za tipkovnicu, miš i joystick, ono je pogodno za mnoga rješenja vezana uz uparivanje vanjskih uređaja s računalom.

Ako korisnik treba izvršiti razmjenu podataka male brzine (do 64 kbit/s) i istovremeno želi smanjiti vrijeme potrošeno na naporan razvoj vlastitih upravljačkih programa, tada je HID sasvim prikladan za njega. Krajnji rezultat bit će jednostavno i potpuno moderno rješenje temeljeno na standardnom USB softverskom sučelju s garantiranom podrškom na svim uobičajenim softverskim platformama.

Svojstva HID uređaja

Sa stajališta organiziranja programske podrške za HID uređaj, sve izgleda prilično privlačno: za rad Windows kontrola možete brzo stvoriti razumljiv, kompaktan kod temeljen na gotovim, provjerenim algoritmima. Istodobno, programer će imati puno vremena za implementaciju vlastitog protokola za razmjenu podataka vrhunska razina, budući da je potrebna razina apstrakcije već organizirana kroz HID protokol (vidi tablicu). Osim toga, programeru je lako debugirati pisani protokol razmjene (naravno, ako postoji ispravan HID uređaj) - zbog relativne krutosti samog protokola, dovoljno je jednostavno razviti program računalne podrške za uređaj. Naravno! Tvorac HID uređaja već je preuzeo puno posla.

Organizacija razmjene podataka između HID uređaja i računala

Kako bismo opisali interakciju HID uređaja s računalom, koristit ćemo termin "host". U ovom slučaju, on se shvaća kao upravljački uređaj u općoj fizičkoj arhitekturi interakcije putem USB protokola. Dakle, svi portovi na računalu su hostovi. Možete spojiti razne USB uređaje (flash diskove, miševe, web kamere, kamere itd.) koji nemaju host na sebe. Host omogućuje otkrivanje uređaja, povezivanje, isključivanje, konfiguraciju, kao i prikupljanje statistike i upravljanje energijom.

HID uređaj može postaviti vlastitu frekvenciju prozivanja kako bi utvrdio sadrži li nove podatke. To znači da čak i na tako niskoj razini programer može vjerovati sustavu, budući da frekvencija prozivanja i drugi komunikacijski parametri moraju biti unaprijed postavljeni u programu kontrolera HID uređaja. Ovo razlikuje HID protokol od općeg opisa USB 1.1 ili USB 2.0, koji nema stroge zahtjeve za organizaciju protokola. Međutim, za specifične zadatke koji zahtijevaju povećanu razinu sigurnosti, može biti prilično teško riješiti se cikličkog prozivanja, kada se stalno prenose gotovo isti blokovi podataka.

Značajke programiranja HID uređaja

HID uređaji imaju posebne deskriptore. Kada glavno računalo utvrdi da uređaj pripada klasi HID, prenosi kontrolu nad njim odgovarajućem upravljačkom programu. Pretpostavlja se da se daljnja razmjena podataka odvija pod njegovim vodstvom.

U sustavu Windows, usluga sustava HidServ odgovorna je za pristup HID uređajima. Više detalja o funkcijama zahtjeva za HID uređaje i drugim značajkama rada s HID upravljačkim programom opisano je u radu P. V. Agurova „USB sučelje. Praksa korištenja i programiranja" (Sankt Peterburg: BHV-Petersburg, 2005).

Programiranje HID uređaja na “najvišoj razini”

Težak život "aplikacijskih" programera koji rade u Pascalu olakšava dokazani HID modul. PAS, shell softver za hid. dll (Skrivena korisnička biblioteka - kako je navedeno u svojstvima datoteke). Komentari na datoteku pokazuju da se temelji na Microsoftovim modulima hidsdi.h i hidpi.h. I sama HID datoteka. PAS je dio paketa JEDI().

Za rad s HID uređajem u Delphi for win32 okruženju koristi se komponenta TJvHidDeviceController, koja je praktičan globalni upravitelj za pristup HID uređajima. I već na njegovoj osnovi možete dobiti instancu objekta za rad s određenim uređajem.

Osnovna svojstva i događaji komponente TJvHidDeviceController

Pogledajmo detaljnije komponentu TJvHidDeviceController. Događaj OnArrival pokreće se kada HID uređaj uđe (spoji se) na sustav; pristup uređaju omogućen je u rukovatelju ovog događaja putem instance klase TJvHidDevice. Jednostavan događaj OnDeviceChange reagira na promjene u stanju uređaja; on samo signalizira promjene u sustavu. Događaj OnDeviceData pokreće se kada podaci stignu s jednog od HID uređaja i prosljeđuju sljedeće rukovatelju: HidDev: TJvHidDevice; – uređaj s kojeg su podaci primljeni;

Događaj OnDeviceDataError obavještava o pogrešci prijenosa podataka prosljeđivanjem parametara HidDev proceduri obrade: TJvHidDevice; - HID uređaj i pogreška: DWORD; - kod greške. Događaj OnDeviceUnplug obavještava da je uređaj uklonjen s popisa instaliranih na sustavu. Tipovi rukovatelja događajima na Plug i Unplug su isti (u izvornom tekstu: TJvHidUnplugEvent = TJvHidPlugEvent). Objekt klase TJvHidDevice koji odgovara HID uređaju prosljeđuje se rukovatelju.

Za sekvencijalno nabrajanje HID uređaja dostupnih u sustavu pozivom metode Enumerate namijenjen je događaj OnEnumerate, tj. u rukovatelju događajima pronađeni uređaji se sekvencijalno prenose kao objekti. Ovaj događaj forsira metoda Enumerate, koja se koristi za "propuštanje" postojećih HID uređaja kroz rukovatelj, na primjer, kada se revidira stanje HID uređaja na inicijativu glavnog računala.

Događaj OnRemoval pokreće se kada se uređaj fizički ukloni iz sustava i ima istu vrstu rukovatelja TJvHidUnplugEvent kao za OnDeviceUnplug. Funkcija CountByProductName vraća broj uređaja koji odgovaraju nazivu proizvoda navedenom u argumentu, a CountByVendorName vraća naziv proizvođača naveden u argumentu.

Glavna svojstva i događaji klase TJvHidDevice

Klasa TJvHidDevice je virtualni prikaz jednog HID uređaja. Novi objekt ove klase može se dobiti, kao što je već spomenuto, iz događaja OnArrival ili OnEnumerate. Funkcionalnost klasa TJvHidDeviceController i TJvHidDevice je djelomično duplicirana, jer prva od njih integrira zajedničke alate za rad sa skupom HID uređaja dostupnih u sustavu i mehanizam za pristup jednom od njih. Uređaj se može jedinstveno identificirati svojim svojstvima SerialNumber, ProductName i VendorName. Da biste dobili informacije o pristizanju podataka pomoću takvog objekta, možete koristiti događaj OnData. Podaci se šalju metodom WriteFile (u strogom smislu - kroz funkciju). WriteFile je omotač sistemske funkcije WriteFile (kernel32).

Da biste kontrolirali je li uređaj uklonjen, trebali biste dodijeliti vlastiti rukovatelj događaju OnUnplug. Prije nego počnete razmjenjivati ​​podatke s HID uređajem, morate se uvjeriti da je takva razmjena moguća pomoću HasReadWriteAccess. Ova klasa čak ima zaseban događaj OnDataError kada dođe do pogreške u razmjeni podataka.

Sada pogledajmo fragmente koda iz "živog" projekta koji implementira testnu klijentsku aplikaciju za organiziranje razmjene podataka s nestandardnim uređajem - plastičnim karticama s čipom temeljenim na HID-u. U borbi za realizmom, autor si je uzeo slobodu da iz popisa ne izbaci “dodatne” veze tehnološkog koda.

Metoda ScanDevices (Listing 1) namijenjena je pokretanju procesa traženja potrebnog HID uređaja u sustavu. Većina koda, s iznimkom poziva metode Enumerate, nije obavezna i daje fleksibilnost aplikaciji, na primjer, tako da se mogućnost rada na ne-HID sučelju može dodati istom testnom programu. Metoda AddError prikazuje informacije o otklanjanju pogrešaka u prozoru dok je program pokrenut.

Ispis 2 prikazuje rukovatelja događajima OnEnumerate za pronalaženje potrebnog vanjskog uređaja. Radi jednostavnosti, pretpostavit ćemo da program može raditi samo s jednim uređajem one vrste koja mu je potrebna.

Prije razmatranja daljnje implementacije projekta, trebalo bi malo popričati o usvojenom formatu razmjene podataka najviše razine, odnosno o strukturi koja je osmišljena kao posrednik između načina primanja i prijenosa podataka i konkretnog aplikacijskog problema koji se rješava. Činjenica je da programer ovdje ima priliku ostvariti svoje kreativne sposobnosti. Odnosno programeri, jer je proces kreiranja novog protokola vrlo često dvosmjeran, a prvu violinu igra onaj kome je teže implementirati algoritam razmjene. Općenito, bez obzira koji je protokol razmjene, uvijek je lijepo svaki softverski entitet učiniti što vizualnijim i samodostatnijim, čak i nauštrb nekih općeprihvaćenih tradicija. Jer najbolje rješenje je ono koje će se implementirati u kratkom vremenu uz minimalno povezivanje na softversko okruženje i s velikim mogućnostima za daljnji razvoj. Na temelju ovih načela kreiran je protokol razmjene najviše razine, gdje je glavni koncept "naredba". Ispis 3 pokazuje koliko autor voli string podatke, koji su ga više puta spasili prilikom otklanjanja pogrešaka programskih modula. Kako je divno što čak imamo tip String! Sve naredbe protokola podijeljene su u kategorije (klase), unutar kojih postoji šifra naredbe koja jedinstveno karakterizira njezinu svrhu. Parametar edParam služi za slanje podataka na uređaj, a parametar edAnswerData sadrži podatke primljene s uređaja. Vrsta niza opisanih članova zapisa omogućuje vam slobodno i jasno manipuliranje podacima u HEX formatu niza. A ono što je najbolje jest da format opisanog zapisa ideološki stoji negdje na sredini između njegove izravne namjene i raznih oblika njegova prezentiranja (INI, HEX, XML itd.)

Izvršenje naredbe, odnosno slanje podataka na uređaj, realizirano je slanjem paketa podataka duljine 8 bajtova (Listing 4). Ova duljina nije jedino rješenje; izbor je diktiran zahtjevima protokola više razine i može biti drugačiji u svakom konkretnom slučaju. Ovo je, kako kažu, stvar ukusa. Čudna zastavica IsUSBMode u metodi ExecuteCommand (Listing 5 u PC Worldu) ostavljena je kao podsjetnik da ćemo možda morati koristiti COM port ili neko drugo sučelje umjesto rada s USB-om. Na početku poslane grupe podataka, na uređaj se šalje sinkroniz nasumično odabranog formata (npr. 3E3E3E2B), koji obavještava uređaj da ima potpuno legalne podatke na ulazu. Podsjećam da u ovom slučaju ne govorimo toliko o HID-u, koliko o specifičnom protokolu gornje razine, ideološki odvojenom od hardvera i namijenjenom rješavanju posebnih aplikacijskih problema.

Rukovatelj GetDataExecutor za podatke primljene s uređaja (paket od 8 bajtova) koristi posebno kreirani događaj OnNewInputData za prijenos inicijalno obrađenih podataka za daljnju obradu, označavajući njihove stare i nove vrijednosti (Listing 6 na “World of PC Disk ”). Na ovaj način, događaji pristizanja neobrađenih podataka i indikacija za daljnju obradu su razdvojeni, dopuštajući da se neki specifični algoritam doda u ranoj fazi kako bi se upozorilo na pogrešne, duplicirane ili nepotrebne ulazne informacije.

Ovdje predstavljeni primjeri rada s HID uređajem ilustriraju opću ideju članka - relativnu jednostavnost programiranja nestandardnih HID uređaja pomoću Delphija.

Dobra knjiga, mnogo toga objašnjava. Bit će korisno onima koji žele razumjeti kako se podaci prenose preko USB sabirnice.

Uvod 1
Za koga je ova knjiga: 2
Što ćete naći u knjizi 2
Softverski zahtjevi 3
Hardverski zahtjevi 4
OKO programski kod 4
Kratak opis poglavlja 4
Bilješka 6
hvala 7
DIO I. UVOD U USB 9
Poglavlje 1. Što je USB 11
1.1. Povijest USB-a 11
1.2. Usporedba USB-a s drugim sučeljima 14
1.3. USB 16 Koncepti
1.3.1. Opća arhitektura autobusa 16
1.3.2. Fizička i logička arhitektura autobusa 16
1.3.3. Komponente USB-a 18
1.3.4. Svojstva USB uređaja 18
1.3.5. Svojstva glavčine 19
1.3.6. Svojstva domaćina 20
1.4. 20 primjera USB uređaja
1.4.1. Miš i tipkovnica, 21
1.4.2. Monitori 21
1.4.3. USB-na-COM i USB-na-LPT adapteri 22
1.4.4. Skeneri 23
1.4.5. Modemi 23
1.4.6. Govornici 24
1.4.7. Flash diskovi 25
1.4.8. Čvorišta 28
1.4.9. Mjerna tehnika 28
1.4.10. Egzotični uređaji 29
1.5. Mrežni priključak preko USB 30
1.5.1. USB-Ethernet pretvarač 31
1.5.2. Izravna veza putem USB priključka 31
1.6. Prijenos podataka 31
1.6.1. Načela prijenosa podataka 32
1.6.2. Mehanizam prekida 32
1.6.3. Sučelja host adaptera 32
1.6.4. DMA sposobnost 34
1.6.5. Načini prijenosa podataka 34
1.7. Instaliranje i konfiguriranje USB uređaja 35
1.7.1. BIOS postavke za USB 38
1.7.2. Rješavanje problema 41
1.8. USB 45 ograničenja
1.9. Ako kupite računalo 46
1.9.1. HS i USB 2.0 nisu isto! 46
1.9.2. Matična ploča 47
1.9.3. Zgrada 48
1.9.4. USB za “stare” modele računala 48
1.10. Mrežni resursi za ovo poglavlje 49
Poglavlje 2. Hardver USB 51
2.1. Kablovi i konektori 51
2.1.1. Vrste kabela 52
2.1.2. Duljina kabela 53
2.1.3. Priključci 53
2.2. Fizičko sučelje 55
2.2.1. Kodiranje podataka 57
2.2.2. Identifikacija uređaja 58
2.3. Prehrana 59
2.3.1. Vrste USB napajanja 59
2.3.2. Upravljanje energijom 60
2.3.3. Ulazak u način rada niske potrošnje energije 61
2.4. Mrežni resursi za ovo poglavlje 61
DIO II. UNUTARNJA ORGANIZACIJA USB 63
Poglavlje 3. Unutarnja organizacija autobusa 65
3.1. Razine logičke komunikacije 65
3.1.1. Razina softvera klijenta 66
3.1.2. Razina sustava USB upravljački programi 67
3.1.3. Sučelje Host Controller Layer 68
3.1.4. Periferna sabirnica razine 68
3.1.5. USB logički uređaj razine 69
3.1.6. Funkcionalna razina USB uređaja 69
3.2. Prijenos podataka preko 69 razina
3.3. Vrste prijenosa podataka 71
3.4. Sinkronizacija s izokronim prijenosom 73
3.5. Osoblje 77
3.6. Krajnje točke 78
3.7. Kanali 79
3.8. Paketi 81
3.8.1. Format paketa markera IN, OUT, SETUP i PING 83
3.8.2. SOF 83 format paketa
3.8.3. Format paketa podataka 84
3.8.4. Format paketa potvrde< 84
3.8.5. Format paketa SPLIT * 84
3.9. Kontrolni zbroj 85
3.9.1. Algoritam za izračunavanje CRC 86
3.9.2. Softverski izračun CRC 87
3.10. Transakcije 90
3.10.1. Vrste transakcija 91
3.10.2. Potvrda transakcije i kontrola toka 92
3.10.3. Transakcijski protokoli 93
Poglavlje 4. Unutarnja organizacija uređaja 96
4.1. Zahtjevi prema USB uređajima 96
4.1.1. Konfiguracijski paket 96
4.1.2. Standardni zahtjevi prema uređajima 99
4.1.3. Deskriptori uređaja 105
Poglavlje 5. Unutarnja organizacija hosta i čvorišta 123
5.1. Čvorišta 123
5.1.1. Interakcija glavnog kontrolera s hubom 126
5.1.2. Deskriptor čvorišta 127
5.1.3. Zahtjevi čvorišta 129
5.1.4. Zahtjev CLEAR_HUB_FEATURE 130
5.1.5. Zahtjev CLEAR PORT_FEATURE 130
5.1.6. Zatražite GET_BUS_STA TE 131
5.1.7. Zahtjev GET_HUB_DESCRfPTOR 131
5.1.8. Zahtjev GET_HUB_STATUS 131
5.1.9. Zahtjev GET_PORT_STA TUS 132
5.1.10. Zahtjev SET_HUB_DESCRIPTOR 134
5.1.11. Zahtjev SET_HUB_FEATURE 134
5.1.12. SET PORT FEATURE zahtjev. 134
5.2. Suradnja uređaja sa različitim brzinama 135
Poglavlje 6. USB bez računala 137
6.1. OTG 138 konektori
6.2. Vrste OTG uređaja 138
6.3. Deskriptor OTG uređaja 139
6.4. Mrežni resursi za ovo poglavlje 140
DIO III. PRAKSA PROGRAMIRANJA 141
Poglavlje 7. USB podrška u sustavu Windows 143
7.1. Model WDM 144
7.2. Interakcija s USB drajverom 146
Poglavlje 8. HID uređaji * 149
8.1. Svojstva HID uređaja 149
8.2. Kako komunicirati s HID uređajem 151
8.3. Instaliranje HID uređaja 152
8.4. Identifikacija HID uređaja 152
8.4.1. Identifikacija uređaja za pokretanje 153
8.4.2. Deskriptor konfiguracije HID uređaja 153
8.4.3. HID deskriptor 154
8.4.4. Deskriptor izvješća 156
8.5. Struktura deskriptora izvješća 156
8.5.1. Struktura elemenata izvješća 156
8.5.2. Vrste elemenata izvješća 157
8.5.3. Primjeri deskriptora 165
8.6. Upiti HID uređaja 168
8.6.1. GET_REPORT zahtjev. 169
8.6.2. Zahtjev SET_REPORT 169
8.6.3. GETJDLE zahtjev. 170
8.6.4. Upit SETJDLE 170
8.6.5. Zahtjev GET_PROTOCOL 171
8.6.6. Zahtjev SET_PROTOCOL 171
8.7. Alati 171
8.8. Interakcija s HID drajverom 172
Poglavlje 9. Uvod u WDM 181
9.1. Slojevi pokretača 183
9.2. Simbolični nazivi uređaja 184
9.3. Osnovne procedure WDM upravljačkog programa 189
9.3.1. Procedura DriverEntry 190
9.3.2. Procedura AddDevice 192
9.3.3. Postupak istovara 194
9.3.4. Operativni postupci vozača 196
9.3.5. Posluživanje IOCTL 203 zahtjeva
9.4. Učitavanje upravljačkog programa i pristup postupcima upravljačkog programa 209
9.4.1. Procedura za rad s vozačem 209
9.4.2. Registracija vozača 210
9.4.3. Pozivajući se na Operativne procedure 217
9.4.4. Pohranjivanje upravljačkog programa unutar izvršne datoteke 218
9.5. Alati za izradu upravljačkih programa 220
9.5.1. NuMega Driver Studio 220
9.5.2. Jungo WinDriver 220
9.5.3. Jungo Kernel Driver 220
Poglavlje 10. USB PnP specifikacija 221
10.1. Opće informacije o Plug and Play 221
10.1.1. Plug and Play zadaci i funkcije 221
10.1.2. Pokretanje PnP procedure 222
10.1.3. PnP 224 softverske komponente
10.2. Plug and Play za USB 225
10.2.1. Konfiguracija USB uređaji 226
10.2.2. USB uređaj broj 226
10.2.3. PnP USB identifikatori uređaja 228
10.3. Dobivanje popisa USB uređaja 229
10.4. INF datoteka 234
10.4.1. INF struktura datoteke 234
10.4.2. Verzija odjeljka 235
10.4.3. Proizvođač odjeljka 237
10.4.4. Odredište DestinationDirs 239
10.4.5. Opis modela Odjeljak 241
10.4.6. Odjeljak xxx.AddReg i xxx.DelReg. 242
10.4.7. Odjeljak xxx.LogConfig 244
10.4.8. Odjeljak xxx.CopyFiles 244
10.4.9. Nizovi odjeljka 245
10.4.10. Priključci sekcija 246
10.4.11. Kreiranje i testiranje INF datoteka 247
10.4.12. Instaliranje uređaja pomoću INF datoteke 248
10.5. Ogranci registra za USB 249
Poglavlje 11. BIOS značajke 251
11.1. Servisni BIOS 1AN 251
11.1.1. Funkcija B101H - određivanje prisutnosti PCI BIOS 252
11.1.2. Funkcija V102N - traženje PCI uređaja prema identifikatorima
uređaj i proizvođač 253
11.1.3. Funkcija V103N - traži PCI uređaj prema šifri klase 254
11.1.4. Funkcija B108N - čitanje registra konfiguracije (bajt) 255
11.1.5. Funkcija VYu9N - čitanje konfiguracijskog registra (Word) 256
11.1.6. Funkcija B10AN - čitanje registra konfiguracije (DWord) 256
11.1.7. Funkcija V10VN - zapis konfiguracijskog registra (Byte) 257
11.1.8. Funkcija B10CH - pisanje konfiguracijskog registra (Word) 257
11.1.9. Funkcija B10DH - Pisanje registra konfiguracije (DWord) 258
11.2. Primjer upotrebe 259
DIO IV. STVARANJE USB UREĐAJA 283
Poglavlje 12. USB periferni uređaji 285
12.1. Atmel 286 čipovi
12.1.1. Mikrokontroleri s MSC-51 286 arhitekturom
12.1.2. Kontroleri glavčine 289
12.1.3. Hub mikroprocesori s AVR 289 jezgrom
12.1.4. Ostali Atmel 290 čipovi
12.2. Cygnal 291 čipovi
12.2.1. Mikroprocesori C8051F320 i C8051F321 291
12.2.2. Ostali Cygnal 293 čipovi
12.3. FTDI 296 čipovi
12.3.1. Čipovi FT232AM i FT232BM 297
12.3.2. Čipovi FT245AM i FT245BM 298
12.3.3. Čip FT2232BM 299
12.3.4. Čip FT8U100AX 300
12.3.5. Kompleti i moduli za uklanjanje pogrešaka 301
12.3.6. Vozači 302
12.3.7. Dodatne usluge 303
12.3.8. Ostala 304 modula
12.4. Intel 304 čipovi
12.5. Microchip 308 čipova
12.6. Motorola 308 čipovi
12.7. Philips 309 čipovi
12.7.1. USB 310 čipovi
12.7.2. Čvorišta 311
12.7.3. Ostali Philips 313 čipovi
12.8. Texas Instruments 314 čipova
12.9. Trans Dimension 317 čipovi
12.10. 318 čipova za zaštitu napajanja
12.11. Mrežni resursi za ovo poglavlje 319
Poglavlje 13. HID uređaj temeljen na Atmel AT89C5131 322
13.1. Blok dijagram AT89S5131 322
13.2. USB registri AT89S5131 324
13.2.1. USBCON registar 324
13.2.2. USBADDR registar 326
13.2.3. USBINT registar 327
13.2.4. USBIEN 328 registar
13.2.5. UEPNUM registar. 329
13.2.6. Registrirajte UEPCONX 330
13.2.7. UEPSTAX registar. 331
13.2.8. Registrirajte UEPRST. 334
13.2.9. UEPINT registar. 335
13.2.10. Registrirajte UEPIEN 336
13.2.11. Registrirajte UEPDATX 337
13.2.12. Registrirajte UBYCTLX 337
13.2.13. UFNUML registar 338
13.2.14. UFNUMH registar. 338
13.3. Strujni krug AT89S5131 338
13.4. Alati za programiranje 339
13.4.1. Prevodilac 341
13.4.2. Programer 342
13.5. Program za mikroprocesor 349
13.5.1. Prva verzija programa za AT89S5131 349
13.5.2. Dodavanje deskriptora niza 369
13.5.3. Dodavanje krajnjih točaka 374
13.5.4. Stvaranje HID uređaja 377
13.5.5. Komunikacija s HID uređajem 381
13.6. Čitanje izvješća u sustavu Windows 388
13.7. Dodatne značajke Windows XP 396
13.8. Uređaj s više izvješća 397
Poglavlje 14. Kreiranje USB uređaja temeljenog na ATMEL AT89C5131 402
14.1. Ne-HID uređaj 402
14.2. Stvaranje upravljačkog programa pomoću Driver Studio 405
14.2.1. Nekoliko riječi o biblioteci Driver Studio 407
14.2.2. Ostale klase Driver Studio 411
14.2.3. Stvaranje predloška upravljačkog programa pomoću programa Driver Studio 412
14.2.4. Poboljšanje predloška upravljačkog programa 422
14.2.5. Osnovne metode klase uređaja 423
14.2.6. Implementacija čitanja podataka 426
14.2.7. Instalacija 428 drajvera
14.2.8. Čitač podataka 429
14.2.9. Čitanje podataka s drugih vrsta krajnjih točaka 438
14.2.10. “Čisti” USB drajver 439
Poglavlje 15: Korištenje FTDI 457 čipova
15.1. Funkcionalni dijagram FT232BM 457
15.2. Dizajn sklopa FT232BM 460
15.3. Funkcije D2XX 460
15.4. Prijelaz s COM na USB 465
15.4.1. Opis kruga pretvarača 465
15.4.2. Postavljanje brzine prijenosa podataka 467
DIO V. PRIRUČNIK 469
Poglavlje 16: Osnovne značajke sustava Windows 471
16.1. Funkcije CreateFile i CloseHandle: otvaranje i zatvaranje objekta.471
16.1.1. Dodatne informacije 472
16.1.2. Povratna vrijednost 472
16.1.3. Primjer poziva 472
16.2. Funkcija Read File: čitanje podataka 473
16.2.1. Dodatne informacije 474
16.2.2. Povratna vrijednost 474
16.2.3. Primjer poziva 474
16.3. Funkcija WriteFile: prijenos podataka 475
16.3.1. Dodatne informacije 476
16.3.2. Povratna vrijednost 476
16.3.3. Primjer poziva 476
16.4. Funkcija ReadFileEx. APC očitavanje podataka 477
16.4.1. Povratna vrijednost 479
16.4.2. Dodatne informacije 479
16.4.3. Primjer poziva 479
16.5. Funkcija WriteFileEx: APC prijenos podataka 480
16.5.1. Povratna vrijednost 481
16.5.2. Primjer poziva 481
16.6. Funkcija WaitForSingleObject čeka signal
stanje objekta 482
16.6.1. Povratna vrijednost 482
16.7. Funkcija WaitForMultipleObjects: čeka se signal
stanje objekta 483
16.7.1. Povratna vrijednost 484
16.8. Rezultat funkcije GetOverlappedResult asinkrone operacije 484
16.8.1. Povratna vrijednost 485
16.9. DeviceIoControl funkcija: Izravna kontrola vozača 485
16.9.1. Povratna vrijednost 487
16.10. Funkcija QueryDosDevice: dobivanje naziva uređaja
pod njegovim DOS imenom 487
16.10.1. Povratna vrijednost 488
16.10.2. Primjer poziva 488
16.11: Definirajte funkciju Dos uređaja: operacije s nazivom DOS uređaja 489
16.11.1. Povratna vrijednost 490
16.11.2. Primjer poziva 490
Poglavlje 17. HID API funkcije. 492
17.1. Funkcija HidD_Hello: provjera knjižnice 492
17.2. Funkcija HidD_GetHidGuid: dobivanje GUID-a 492
17.3. Funkcija HidD_GetPreparsedData: stvaranje deskriptora uređaja 493
17.4. Funkcija HidD_FreePreparsedData: oslobađanje držača uređaja 493
17.5. Funkcija HidD_GetFeature: primanje izvješća FEATURE 494
17.6. Funkcija HidD_SetFeature: slanje izvješća FEATURE 494
17.7. Funkcija HidD_GetNumInputBuffers: dobivanje broja međuspremnika 495
17.8. Funkcija HidD_SetNumInputBuffers: postavljanje broja međuspremnika na 495
17.9. Funkcija HidD_GetAttribntes: dobivanje atributa uređaja 495
17.10. Funkcija HidD_GetMamifactnrerStnng. dobivanje niza proizvođača 496
17.11. Funkcija HidD_GetProductString. dobivanje linije proizvoda 497
17.12. Funkcija HidD_ Get Serial MumberString. dobivanje niza
redni broj 497
17.13. Funkcija HidD_GetIndexedString. dobivanje reda na indeksu 498
17.14. Funkcija HidDjGetlnputReporr. primanje INPUT izvješća 498
17.15. Funkcija HidD_SetOutputReport. slanje OUTPUT izvješća 499
17.16. Funkcija HidP_GetCaps: dobivanje svojstava uređaja 499
17.17. Funkcija HidP_MaxDataListLength: dobivanje veličina izvješća 500
Poglavlje 18. Glavni upravljač UCH 502
18.1. Kontrolni registri host kontrolera 502
18.1.1. USB registar naredbi (USBCMD) ..504
18.1.2. USB registar statusa (USBSTS) 506
18.1.3. Registar kontrole prekida (USBINTR) 506
18.1.4. Registar brojeva okvira (FRNUM) 507
18.1.5. Registar adrese baze okvira (FLBASEADD) 508
18.1.6. Početak registra modifikatora okvira (SOFMOD) 508
18.1.7. Registar statusa i kontrole porta (PORTSC) 509
18.2. Strukture podataka glavnog upravljača UCH 510
18.2.1. Popis okvira 510
18.2.2. Deskriptor prijenosa i 511
18.2.3. Zaglavlje reda 514
18.3. Obrada popisa deskriptora UCH 516
Poglavlje 19. Alati 518
19.1. Alati Microsoft Visual Studio 518
19.1.1. Ovisi 518
19.1.2. Traženje pogreške 518
19.1.3. GuidGen 518
19.2. Alati Microsoft DDK 520
19.2.1. DeviceTree 520
19.2.2. DevCon.-521
19.2.3. Chklnf i Genlnf. 526
19.3. Alati tvrtke CompuWare Corporation 527
19.3.1. Monitor 527
19.3.2. SymLink 527
19.3.3. EzDriverlnstaller 527
19.3.4. WdmSniff 527
19.4. Znači Syslntemals 528
19.4.1. Winobj 528
19.5. Forum USB alata 531
19.5.1. Alat za HID deskriptor 531
19.6. HDD softver 533
19.7. Sourceforge alati 533
PRIMJENE 535
Dodatak 1. Dodatne funkcije 537
Dodatak 2. Tablica jezičnih identifikatora (LangID) 539
Dodatak 3. Tablica kodova proizvođača (Vendor ID, Device ID) 543
Dodatak 4. Opis CD-a 546
Književnost 548
Indeks predmeta 549