• 1
  • 2

USB - Módy detekcie

. .

USB ako také ponúka možnosti takzvaných USB Device Class. Aby nebolo potrebné
ku každému zariadeniu dodávať vlastný ovládač, sú zariadenia rozdelené do jednotlivých
tried. Host disponuje jedným ovládačom pre jednu triedu a tudíž jedným ovládačom pre
všetky zariadenia v triede. USB Device Class obsahujú podtriedy v ktorých sú zavedené
komunikačné protokoly. Pri adresovaní zariadenia systém zvolí taký režim prenosu, aké má
dané zariadenie nakonfigurované. Konfigurácia zariadenia je nastavená v jeho descriptore

Pri starších typoch procesoroch, ktoré nepodporujú USB rozhranie, sa hardwarovo vytvorí
takzvaný USB - RS-232 bridge.

Ide o prevodník rozhraní [HOST USB ⇐⇒ RS-232 MCU].

USB bridge sa dá riešiť aj prostredníctvom SW. Novšie typy MCU Unit, ktoré podporujú USB interface umožňujú implementovať firmware, ktorý programovo vytvorí premostenie komunikácie priamo v procesorovej jednotke.
Jednou z USB device class je trieda Communications and CDC Control, tabuľka 1. Firmaware nastaví MCU Unit do módu CDC. Pri adresovaní host CDC zariadenie zavedie do režimu CDC. Zariadenie pripojené k hostu ako CDC je pripojené cez USB rozhranie, ale v počítači sa tvári ako virtuálny COM Port, teda ako rozhranie RS-232.




Podtriedy triedy CDC (Communications and CDC Control)

Koncové body ako zariadenia nakonfigurované do triedy, Communications and CDC Control„sú rozšírené o
Communications Interface Class - CIC a využívajú podtriedu Abstract Control Model - ACM triedy CDC,
tabuľka 2. Ako nadstavbu komunikačného protokolu využíva V.250 - (kód triedy: 01h), čo je sada
štandardov pre modemy.

Podtrieda ACM implementuje 5 rozhraní pre zabezpečenie komunikácie:
SendEncapsulatedCommand, GetEncapsulatedResponse, SetLineCoding, GetLineCoding, SetControlLineState.

SendEncapsulatedCommand - slúži na vyslanie príkazu vo formáte, ktorý podporuje kontrolný protokol
triedy communications class - V.250.

GetEncapsulatedResponse - používa sa pri požadovaní odpovedi na formát kontrolného protokolu - triedy
comunications class.

SetLineCoding - používa sa na kódovanie dát na linke. Umožňuje hostovi špecifikovať formát vlastnosti znakov.
Pri emulácii RS-232 je táto funkcionalita dôležitá. Host a terminál si musia byť vedomé akou rýchlosťou sa
dáta prenášajú, aký počet stop bitov bol prenesený a o paritnom bite.

GetLineCoding - umožňuje hostovi zistiť aktuálne nakonfigurovanú linku a prevziať si kódované parametre.

SetControlLineState - generuje riadiaci tok signálov RS-232. Kontrola linky signálu (Control Line Signal) CLS.

SetLineCoding, GetLineCoding - pri kódovaní je použité známkovanie dát. Dáta sa známkujú bitmi za sekundu.
Pri prenose sa používajú stop-bity, ktoré sa môžu zabaľovať po: 0 - 1, 1 - 1.5, 2-2. Paritný byt môže
nadobúdať hodnoty od 0-4 : 0 = None, 1 = Odd, 2 = Even, 3 = Mark, 4 = Space. Dáta sa môžu odosielať v 5, 6, 7, 8 alebo 16 bitových rámcoch.




Grafická schéma na obrázku 3 (prevzatý z webu http://www.lpcware.com).

Jednotlivé triedy zariadení USB Device Class sa nachádzajú v triednej vrstve (Class Layer), ktorá je medzi aplikačnou a fyzickou vrstvou procesora. Komunikácia Class Layer je obojsmerná pre obe vrstvy. Fyzická a aplikačná vrstva navzájom komunikujú a sú riadené pomocou firmware MCU.


Obrázok 3




Implementácia vrstiev pri logickej komunikácií, obrázok 4 (prevzatý z webu http://www.hw.cz), sa rozdeľuje na funkčnú vrstvu, vrstvu zariadenia a fyzickú vrstvu. Implementácia na jednotlivých vrstvách sa v hostu a v zariadení líši.
Funkčná vrstva je u hosta tvorená klientskym, obslužným softwarom, zatiaľ čo u MCU je
tvorená metódami (funkciami). Logický komunikačný tok sa odohráva medzi jednotlivými vrstvami zariadení, pričom logicky komunikujú len rovnaké vrstvy oboch zariadení. Reálny komunikačný tok prebieha len na fyzickej vrstve, cez
ktorú sú obe zariadenia prepojené. Device layer je u hosta implementovaná systémovým softwarom (driverom) USB, pri MCU jetvorená logickým zariadením. Na fyzickej vrstve má host zavedený radič, pri MCU je zavedené USB rozhranie.
Odosielané dáta hosta sa spracujú od aplikačnej vrstvy, cez vrstvu zariadenia a po fyzickej vrstve sa v podobe
binárneho kódu odošlú po zbernici do koncového bodu, v ktorom sa od fyzickej vrstvy, cez vrstvu zariadenia,
spracovávajú až k aplikačnej vrstve.


Obrázok 4




Descriptor zariadenia

Descriptory sú dátové štruktúry v ktorých je konfigurácia zariadenia. Poznáme descriptory rozhrania, zariadenia, koncového bodu, nastavení, ladiace (debug) a podobne. Všeobecne, jeden descriptor rozhrania môže špecifikovať
ďalšie descriptory koncových bodov. Descriptory ďalej definujú počet rozhraní a konfiguráciu zbernice. V prípade
descriptora zariadenia, po zapojení zariadenia do USB zbernice je host schopný zistiť informácie o zariadení ako názov,
verziu, triedu USB Device Class,... Každé zariadenie ma univerzálne PID - identifikačné číslo, podľa ktorého host
vie s akým zariadením má komunikovať v prípade, že je na zbernici viacej koncových bodov. Pri komunikácií s hostom,
koncový bod odosiela svoj descriptor.

Descriptor zariadenia je v tomto prípade nakonfigurovaný:

descriptor.c


ROM USB_DEVICE_DESCRIPTOR device_dsc=
  {
    0x12, // velkost descriptora (v bytoch)
    USB_DESCRIPTOR_DEVICE, // typ descriptora zariadenia
    0x0200, // verzia specifikacie USB v BCD formate
    CDC_DEVICE, // kod triedy
    0x00, // kod podtriedy
    0x00, // kod pouziteho protokolu
    USB_EP0_BUFF_SIZE, // maximalny pocet paketov pre koncoy bod 0)
    0x04D8, // Id vyrobcu 
    0x000A, // Id Produktu CDC RS−232 Emulation Demo
    0x0100, // cislo verzie prouktu v BCD formate
    0x01, // index stringu vyrobca
    0x02, // index stringu produktu
    0x00, // index stringu serioveho cisla zariadenia
    0x01 // pocet moznyh konfiguracii
  };




Descriptor konfigurácie

Descriptor nastavenia sa ako descriptor zariadenia taktiež nachádza priamo v koncovom bode. Obe konfigurácie sú
zavedené v pamäti Flash MCU. Descriptor nastavení rozširuje konfiguráciu ďalších descriptorov a definuje navyše
descriptor rozhraní, descriptor špecifikácie CDC triedy a descriptor koncového bodu. Pri firmware ako pri univerzálnom
celku, descriptor nastavenia rozširuje viacero koncových bodov z dôvodu možnosti použitia rôznych typov prenosov.



Ukážka descriptoru konfigurácie:

descriptor.c


ROM BYTE configDescriptor1[]=
  {
    0x09, // velkost descriptora (v bytoch)
    USB_DESCRIPTOR_CONFIGURATION, // typ descriptora nastavenia
    67,0, // celkova dlzka dat pre descriptor
    2, // cislo rozhrania
    1, // Index hodnoty tejto konfiguracie
    0, // Index stringu konfiguracie
    _DEFAULT | _SELF, // atributy ( pri inite zbernice )
    50, // maximalna spotreba energie (2X mA)
    9, // velkost descriptora rozhrania (v bytoch)
    USB_DESCRIPTOR_INTERFACE, // typ descriptora rozhrania
    0, // cislo rozhrania
    0, // alternativne nastavenie
    1, // pocet koncovych bodov v tomto interface
    COMM_INTF, // kod triedy
    ABSTRACT_CONTROL_MODEL, // kod podtriedy
    V25TER, // kod pouziteho protokolu
    0, // Index stringu rozhrania
    0x07, // velkost descriptora koncoveho bodu (v bytoch)
    USB_DESCRIPTOR_ENDPOINT, // typ descriptora nastavenia
    _EP01_IN, // adresa koncoveho bodu
    _INTERRUPT, // druh prenosu
    0x08,0x00, // velkost
    0x02, // tnterval prenosu
  };