USB Enumerácia
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Enumerace je proces počátečního vyjednávání, kdy hostitel a host komunikují za účelem vzájemného poznávání a nastavování. Během enumerace posílá zařízení informace o svých hardwarových a softwarových prostředcích hostiteli, zatímco hostitel poskytuje zařízení adresu a mění vnitřní stavy zařízení. Pokud budeme chápat komunikaci mezi hostitelem a zařízením jako obousměrnou rouru, po které proudí užitečná data, nutně dojdeme k potřebě odlišit data, která jsou předmětem enumerace a ostatní data, která jsou závislá na funkci zařízení, kvůli které bylo sestrojeno. USB specifikace řeší potřebu více komunikačních kanálů zavedením tzv. endpointů. Endpoint je funkční celek, který má k dispozici obousměrnou rouru, po níž komunikuje s hostitelem. Endpoint může být jak konzument, tak producent datového toku. Jedno zařízení může mít až 7 endpointů (rour). Nultý endpoint je určen pro vyřizování enumerace a má vlastnosti pevně dané specifikací. Vlastnosti ostatních endpointů jsou předány hostiteli během enumerace ve speciálních datových strukturách. Pokud by se komunikace po rouře skládala pouze z užitečných dat (například výsledků měření), neměl by hostitel k dispozici žádný nástroj, kterým by měnil vnitřní stavy zařízení a nemohl by ovlivňovat jeho chování. Aby mohl hostitel posílat kromě dat také příkazy, zavádí USB specifikace zvláštní druh paketů (setup packet), které říkají, že data předaná v následné transakci nejsou určena pro funkčnost zařízení, ale pro řízení stavů zařízení. Endpoint 0 musí reagovat na setup pakety a odesílat informace, které jsou po zařízení požadovány. Abychom mohli navrhnout program, který bude požadavky vyřizovat, musíme si uvědomit, z jakých atomických operací se komunikace po USB skládá. TransakceJak již bylo uvedeno v rozboru USB, přenosovou jednotkou na sběrnici je paket. Paket může obsahovat sdělení různé povahy:
Transakce je předpis, který stanoví posloupnost různých druhů paketů za účelem přenesení zprávy libovolné délky. Transakce budeme dělit na tři druhy:
Výstupní transakceHostitel nejprve uvědomí zařízení, do kterého chce zapisovat, vysláním OUT packetu. Data, která chce hostitel odeslat, si rozdělí na bloky pevné délky (poslední blok může být kratší). Hostitel bez čekání odešle první blok dat v paketu typu DATA0. Zařízení odpovídá handshakovým paketem (ACK nebo NAK). V případě, že zařízení pošle ACK, hostitel vysílá OUT packet následovaný bez prodlení paketem DATA1 s dalším blokem dat a znovu čeká na handshakovou odpověď zařízení. Střídavě se tak přenášejí OUT+DATA0 a OUT+DATA1, dokud nejsou přeneseny všechny části zprávy. Pokud zařízení odpoví na nějaký paket negativně (NAK), zopakuje hostitel své předchozí vysílání (v paketu stejného typu). Když hostitel odešle vše, co potřeboval, nastává posloupnost paketů ukončující celou transakci. Hostitel vyšle IN packet a očekává, že zařízení pošle paket DATA0 s nulovou délkou obsahu (prázdný paket). Hostitel takový paket potvrdí vysláním ACK paketu. Tím se ukončuje transakce a zpráva, která byla předmětem transakce, je považována za platnou. Pokud není dodržena posloupnost paketů jednou ze stran, transakce se ruší a dosud přenesená data se musí zahodit.Vstupní transakceHostitel vyšle do endpointu, ze kterého chce číst zprávu, IN paket. Zařízení odpovídá první částí zprávy v paketu DATA0. Hostitel handshakuje (ACK nebo NAK). Hostitel opakuje IN packet a předpokládá, že zařízení mu nyní odpoví v paketu DATA1 (střídavě). Hostitel přijatá data opět potvrzuje a podle potřeby opakuje vysílání paketu tolikrát, dokud neobdrží buď prázdný paket nebo paket s menším počtem bytů, než je maximum. Tím se hostitel dozví, že zařízení již poslalo celou zprávu a nastane okamžik pro potvrzení platnosti celé transakce. Hostitel vysílá OUT packet a bez čekání pošle i DATA0 packet bez obsahu (prázdný DATA0 packet). Zařízení musí odpovědět ACK packetem.U obou transakcí se vyskytuje potvrzení transakce, které je realizováno posláním prázdného datového paketu v opačném směru, než ve kterém probíhal přenos zprávy. Řídící transakceŘídící transakce začíná okamžikem, kdy hostitel pošle SETUP packet do endpointu. Poté pošle DATA0 packet o délce 8 bytů (rozumí se 8 bytů obsahu). Hostitel očekává ACK od zařízení. Obsah paketu DATA0 má přesně specifikovanou strukturu a zařízení se z ní dozví, zda bude následovat vstupní či výstupní transakce. Zařízení si buď připraví data k odeslání nebo uvolní vstupní buffer pro přijímání a pak provede standardní transakci podle toho, jak bylo uvedeno výše. Řídící transakce je tedy stejná jako vstupní či výstupní transakce s tím rozdílem, že užitečná data, která by byla normálně přenášena, jsou nahrazena daty, o které hostitel požádal v posloupnosti SETUP+DATA0 paketech.Transakce je nejkomplexnějším útvarem při USB komunikaci. Transakce přenáší zprávy, které jsou připraveny ve vstupně/výstupních bufferech zařízení i hostitele a jejich obsah může být libovolný. Pouze při příchodu SETUP+DATA0 paketu do zařízení jsou tyto buffery nahrazeny odpovědí s přesně specifikovaným významem a strukturou. SETUP paket lze tedy chápat jako přepnutí vnitřního stavu zařízení. Stavy zařízeníProgram, který bude rozebírat přišlé pakety, rozhodovat se o jejich sdělení a odesílat zpět odpověď, bude pracovat podle schématu přijmi-vyhodnoť-odpověz. Rutiny tohoto analyzátoru (parseru) se zavolají jednou po příchodu paketu, provedou se a uvolní procesorový čas. Rutiny nebudou obsahovat žádné čekání. Vzhledem k omezeným možnostem procesorů AVR nebude nikde uložena celá zpráva, která je předmětem transakce. Každý blok (max. 8 bytů) bude do bufferu vložen těsně před odesláním a přijatá data budou ihned po přijetí zpracována. Parser bude tedy pracovat obdobně jako stavový automat, jehož vstupem je příchozí paket a výstupem odchozí paket a změna vnitřního stavu.Požadavky, které musí zařízení plnit:
PožadavkyZařízení musí na požádání zasílat dvě datové struktury (dvě zprávy). První je popisovač zařízení (Device Descriptor) a druhý je popisovač nastavení (Configuration Descriptor). Obě datové struktury mají více než 8 bytů a proto se rozpadají na více paketů. Dalším požadavkem, který je posílán hositelem je nastavení adresy, ale odpověď je zařízením signalizována tak, že úspěšně ukončí transakci (prázdný paket, zero DATA) a takovou odpověď zařídí stavový automat sám od sebe.Device Descriptor
Configuration Descriptor (spojení Configuration, Interface a Endpoint descriptoru)
Deskriptory budou odeslány v následujících paketech: Device Descriptor:
Configuration Descriptors:
|