Jste zde

USB OTG v 32bit. mikrokontrolérech a mikroprocesorech ColdFire - 3. díl

Zatímco v prvním a druhém díle byla popsána hardwarová stránka (provedení a připojení) USB OTG rozhraní, ve 3. díle se na řadu dostává logický přenos dat a softwarová část celé komunikace. Tento 3. díl stručně popisuje strukturu a princip USB komunikace, například co je endpoint, k čemu je descriptor, co ještě provede sám USB modul MCU (řadič USB SIE) a co je nutné již řešit softwarově programem (stackem) apod.

Než se začneme věnovat přímo tomu, jak je uvnitř MCU provedeno USB OTG, jak pracuje a co ten či onen blok dělá, je dobré si nejdříve ozřejmit, jak vůbec pracuje a chová se běžná Host - Device USB komunikace z pohledu přenosu dat a jak vypadá uvnitř běžného USB Device modulu 8bitového mikrokontroléru Freescale řady MC68HC908. Pokud vás zajímá funkce USB OTG komunikace na fyzické signálové úrovni, realizace USB rozhraní na desce plošných spojů a fyzické připojení vývodů MCU a vodičů USB kabelu a nečetli jste předchozí dva díly tohoto seriálu, můžete tak učinit na odkazech art2390-usb-otg-v-32bit-mikrokontrolerech-a-mikroprocesorech-coldfire-1-dil a art2412-usb-otg-v-32bit-mikrokontrolerech-a-mikroprocesorech-coldfire-2-dil.

Realizace USB komunikačního modelu

Fyzické vrstva (Physical Layer) zahrnuje signalizaci dat jako jsou J a K signály, začátek paketu SOF (Start Of Frame packet) a obnovovací resume signál. Fyzické vrstvě v MCU obvykle odpovídá blok USB PHY tvořený transceiverem, který generuje reálný průběh obdélníkového napěťového signálu, který lze například nasnímat paměťovým osciloskopem na datových vodičích USB kabelu.

Nad fyzickou vrstvou je pak protokolová vrstva (Protocol Layer), kterou jsou řízeny transakce různých přenosových typů, stejně tak jako je zde i zpracováván paket v nízkoúrovňovém USB protokolu. To znamená, že se zde prakticky realizuje komunikace prostřednictvím tzv. koncových bodů (endpoints) jako jedinečně identifikovatelná část USB zařízení označující komunikaci mezi Host a Device zařízením a USB kanály (USB Pipes), což je pak asociace mezi koncovým bodem Device zařízení a softwarem USB Host zařízení z pohledu protokolové vrstvy. Z toho logicky vyplývá, že například 7 koncových bodů může vytvořit 7 kanálů mezi USB Host a Device. V MCU úkoly protokolové vrstvy obvykle provádí blok SIE.

Třetí nejvyšší vrstva, správce příkazového procesoru a správy dat (Command Processor and Data Report Handler layer), leží mezi protokolovou a aplikační vrstvou. Odpovídá přitom USB firmwaru běžícímu v MCU (USB Stack), zpracovává nastavení a výpočet USB, žádosti standardní třídy (standard class requests) a přizpůsobuje USB komunikaci dané aplikaci. Nejvyšší aplikační hladina (Application Layer) pak realizuje již samotnou zákaznickou aplikaci.

 

Vrstvový model USB komunikace

Koncové body a kanály (Endpoints and Pipes)

Každá USB komunikace je založena na logických kanálech (pipes), které vytváří datové propojení mezi USB Host zařízením a tzv. koncovými body (endpoints) USB Device zařízení. Kanály mohou být typu OUT (od Host k Device zařízení) nebo IN (od Device k Host zařízení). Takže kanál OUT vždy přenáší data z Host a kanál IN vždy data do Host. Každý USB modul mikrokontroléru obsahuje několik koncových bodů obvykle se označují jako EPx (např. MCU MC68HC908JW32 má 5 koncových bodů, tak EP0, EP1, EP2, EP3 a EP4). Ty tvoří zdroje a příjemce dat na konci logického komunikačního USB kanálu, tzn. že zařízení s USB tak může vysílat nebo přijímat data právě prostřednictvím koncových bodů a jejich bufferů definované délky. Každé USB zařízení obsahuje řídící kanál (control pipe), obvykle realizovaný obousměrným koncovým bodem 0 = EP0 (bidirectional endpoint zero), který obstarává řídící přenos v příchozím i odchozím směru (IN/OUT) a má 8bajtový obousměrný buffer o velikosti délky paketu umístěného na k tomu určeném bloku RAM paměti. EP0 není potřeba nastavovat, protože nastavení je vždy stejné a vytváří řídící kanál. Například v rámci použití USB stacku se EP0 nastaví funkcí USB_Enable(). Také přerušení přenosu dat je v MCU nastaveno defaultně.

Koncové body a jimi vytvořené kanály mají sadu parametrů, které se musí definovat před zaháním samotné komunikace USB modulu. Většina z nich je nastavena v USB endpoint řídícím a stavovém registru. Nastavené parametry pak po uvolnění (zapnutí) USB modulu již nelze měnit. Deklarace koncových bodů je jeden z nejdůležitějších kroků v nastavení USB aplikace.

Ukázka připojení dvou různých USB Device zařízení (USB Device 0 - Virtuální sériový port a USB Device 1 - Myš) k USB Host modulu (např. PC) a zobrazení jejich logických kanálů připojených na koncové body (EP0 až EP3 u Device 0 a EP0 a EP1 u Device 1).

USB descriptory (USB Descriptors)

Jak bylo uvedeno výše, každý koncový bod používaný v USB Device nebo OTG zařízení je tak logicky připojen k Host zařízení kanálem (pipe). Logický komunikační kanál, resp. koncový bod, má asociovanou sadu parametrů, jakými je transakční typ (IN, OUT, Setup), přenosový typ (isochronous, interrupt, bulk, control) nebo maximální velikost paketu. Ty se nacházejí ve speciálních popiscích tzv. USB descriptorech (USB Descriptors).

Všechny USB zařízení mají hierarchii descriptorů, které popisují zařízení USB Device zařízení následujícími typy informací:

  • Co je to za zařízení
  • Kdo ho vyrobil
  • Jakou verzi USB podporuje
  • Kolik kanálů může být konfigurováno
  • Počet koncových bodů a jejich typ
  • apod.

Nejběžnější USB descriptory jsou:

  • Device descriptor (Popisek zařízení)
  • Configuration descriptor (Popisek nastavení)
  • String descriptor (Popisek řetězce)
  • Endpoint descriptor (Popisek koncového bodu)
  • Interface descriptor (Popisek rozhraní)
 

Větvící se strom descriptorů (popisků) USB rozhraní zařízení

Každý z descriptorů poskytuje krátký popis chování zařízení. Všechny descriptory se musí nastavit podle aplikace, pro kterou se USB využívá. Informace o všech koncových bodech, tedy jejich descriptory, jsou uloženy na k tomuto účelu implementované nebo vyhrazené RAM paměti sdílené USB modulem/řadičem i jádrem MCU, kde je USB RAM namapována do jeho adresového prostoru. Tak například adresa 0x1860 pro CPU jádro, odpovídá u USB řadiče adrese 0x00. Jednotlivé paměťové bloky obsahující descriptory pro konkrétní koncový bod se nazývají BD registry (Buffer Descriptors). Proces nastavení koncových bodů zahrnuje zapsání všech koncových bodů pro aplikaci v této paměti.

V USB paměti (USB RAM) se nacházejí tzv. BD registry (Buffer Descriptor registers), což není nic jiného než paměťové bloky obsahující zapsané informace o koncových bodech, tedy jejich descriptory.

Buffer Descriptor Table (BDT)

K efektivnímu ovládání, řízení a indikaci stavů USB komunikace koncových bodů slouží BDT tabulka descriptorů (Buffer descriptor table). Tabulka obsahuje buffer descriptory BD a to vždy jeden descriptor pro jeden jednosměrný koncový bod nebo dva pro obousměrné nebo dvojitě bufferované jednosměrné koncové body. Napříkladu u MCU MC9S08JM60 se 7 koncovými body EP0 až EP6, kde EP0 je obousměrný a EP5 a EP6 jsou dvojitě buferované, je potřeba 10 descriptorů. Pokud USB modul má 16 obousměrných koncových bodů (jako například 32bitové MCU ColdFire) je potřeba mít 32 descriptorů. Každý descriptor je pak bez výjimky dále složen z 3 bajtů popisující umístění datového bufferu, jeho délku, řídící logiku a stavové informace. V našem příkladu MCU se 7 koncovými body to pak je celkem 30 bajtů v USB RAM paměťovém prostoru, které jsou potřeba pro vytvoření BDT tabulky.

První bajt descriptoru tvoří stavový a řídící registr (status and control register), který zahrnuje čtyři bity, které CPU čte a zapisuje pro řízení USB komunikace. U MCU Freescale jsou to bity OWN, DATA0/1, DTS a BDTSTALL. USB Software/firmware/stack musí přepsat všechny tyto bity pro zajištění nastavení USB modulu pro další přenos (provedení další transakce).

Druhý bajt descriptoru je tzv. BC registr, který udává délku vysílaného nebo přijímaného datového paketu. V některých případech může být nastaven na hodnotu 0, tedy délku datového paketu 0 bajtů, pokud je například transakce v stavové fázi řídícího přenosu. Maximální délka je pak dána typem MCU, například u MC9S08JM60 MCU je 64.

Třetí bajt je pak EPADD registr, který definuje počáteční adresu datového bufferu příslušného koncového bodu v bloku USB RAM paměti.

Stránkovací tabulka v USB RAM (Buffer Description Table) přiřazuje příslušnému koncovému bodu příslušné místo v USB RAM, kde je uložen buffer descriptor registry (popisky koncového bodu). Ty obsahují nastavení koncového bodu (Status&Control Registr), délku paketu (BC) a odkaz do paměti na umístění odkládacího datového prostoru, tedy bufferu aktuálně přijatých nebo vysílaných dat (EPADR).

Rámec, Přenos a Transakce

K tomuto tématu jen krátce. Přenos dat přes USB je založen na 3 úrovňovému zapouzdření. Pakety jsou seskupeny dohromady do transakcí. Každá transakce je složená ze tří fází (částí) v pořadí pešek (token), data, handshake. Ve fázi pešku vysílá USB Host zařízení token paket, který říká co bude následovat. V závislosti na v něm uloženém typu transakce (Data (IN/OUT), Status (IN/OUT) nebo Setup) se přikládají data, která je potřeba přenést a handshake, který slouží k potvrzení přijetí transakce. Data a handshake však nemusí být přítomny. Skupina jedné nebo více transakcí se pak nazývá přenos (Transfer) jejichž skupina pak tvoří rámec jako hlavní komunikační jednotku délky 1 ms. Existují 4 typy přenosů, které jsou podporovány koncovými body USB modulů, a které jsou definovány softwarově v řídícím registru EPCTLn:

  • řídící přenos (control transfer) - podporuje transakce IN, OUT i Setup
  • bulk transfer - podporuje transakce IN, OUT
  • isochronous transfer - podporuje transakce IN, OUT
  • interrupt transfer - podporuje transakce IN, OUT

Každý rámec pak vždy začíná SOF paketem, který se tak vysílá v intervalech 1 ms synchronizačním zařízením nebo USB HUBem. Prakticky se tak taktuje komunikace. Protože však každá transakce je uvozená token paketem, který vysílá Host zařízení, SOF paket může být Device zařízením ignorován. SOF paket se tak také využívá jako systém udržení USB komunikace "naživu" (keep-alive), protože dokud se vysílá nelze přejít do spícího režimu.

Bloková struktura USB rámce (Frame) složeného z několika přenosových bloků (Transfers), které jsou dále složené z transkací (Transactions). Transakce pak obsahují pakety. Celková délka rámce je max. 1 ms.

Struktura některých paketů (od shora Token Paket, startovací palet rámce = SOF paket, datový paket = Data Packet a potvrzovací paket = Handshake Packet). Uvnitř paketů se nachází identifikátor paketů (PID), číslování rámců (Frame number), data a kontrolní součet CRC

Funkce USB modulu uvnitř MCU Freescale

Mezi nejdůležitější části USB modulu či USB řadiče patří USB transceiver a SIE. Transceiver přísluší do fyzické vrstvy standardního USB protokolu a generuje příslušný fyzický rozdílový diferenční signál USB komunikace na vývodech USBDP a USBDN. Z pohledu programátorského je však nejdůležitějším blokem modul sériového USB rozhraní označovaný zkratkou SIE, který implementuje vysílací a přijímací logiku. Pro SIE přenosovou logiku firmware konfiguruje tři BD registry a naplní je daty do bufferu koncových bodů a pak předává řízení na SIE. SIE vyšle data automaticky k Host poté co Host inicializuje operaci IN. Veškerá práce požadovaná USB specifikací, jako je kódování (NRZI), vkládání bitů (bit stuffing), CRC, SYNC apod. jsou implementovány SIE bez intervence firmwaru. SIE předává řízení CPU po ukončení přenosu. Díky přijímací logice pak SIE i automaticky přijímá datové pakety. Zpracování přijímací logiky zahrnuje dekódování, synchronizování, detekci, vyjmutí vložených bitů, EOP detekci, ověření CRC, kontrolu PID (Packet IDentifier) apod.

Blokové schéma typického USB modulu / řadiče (USB Controller) obsaženého v MCU Freescale, složeného z fyzického rozhraní USB PHY (transceiver XCVR + regulátor USB napětí VREG), sériového rozhraní SEI, USB paměti (USB RAM), řídící logiky BD (Buffer Managment + RAM Arbitration) a komunikačního rozhraní s jádrem MCU (SkyBlue Gasket)

 

Datové pakety jsou naplněny do bufferů koncových bodů (endpoint buffer) a updatují se BD registry. Pak SIE dává řízení CPU pro vyčtení dat a obnovují se stavové a příznakové bity USB registrů (INSTAT, STAT, ERRSTAT a EPCTLn) provedené transakce. Před a až do ukončení příjmu dat pak BD i endpoint buffer řídí blok SIE. SIE potvrzení ACK (ACKnowledge) a nepotvrzovací NAK (non-acknowledge) handshake signály k Host zařízení. Signálem ACK SIE modul Device zařízení indikuje Host zařízení, že transakce byla v pořádku přijata. Signál NAK naopak SIE vysílá, když OWN bit ve stavovém registru a řídícím registru BD je 0. SIE blok tak svojí čiností velmi zjednodušuje realizaci softwaru / firmwaru / stacku. Použití handshaku blokem SIE se však povoluje nebo zakazuje bitem v řídícím registru (EPCTLn).

Podle počtu koncových bodů je pro USB modul u každého mikrokontroléru vytvořený určitý blok RAM paměti (například pro 5 koncových bodů 256 bajtů), ke které má přístup jak CPU tak SIE blok a je vyhrazena buď napevno nebo častěji jako alokovaná paměť v celkové RAM, která při nevyužití USB modulu, lze využít jinak. Tato paměť slouží jako výměnná datová "schránka" mezi SIE a CPU a jsou v ní umístěny všechny řídící a stavové registry USB modulu (BD registry) a USB datový buffer. Obvykle jsou koncové body pouze jednoduše bufferované (jednosměrný bod = jeden buffer, obousměrný = dva buffery), ale některé koncové body můžou být tzv. dvojitě bufferované, které jsou taky někdy nazývány ping-pong buffery. Každý takový koncový bod má dvojnásobný počet bufferů (u jednosměrného bodu dva buffery místo jednoho), kde jeden buffer může být provozován CPU, zatímco je druhý řízen SIE blokem během komunikace s Host. Tyto dva buffery si pak vymění svoje role poté, co aktuální transakce proběhla. CPU má tak vždy kontrolu střídavě nad jedním z obou bufferů. Díky tomu lze zkrátit čekací dobu CPU a tím zvýšit účinnost komunikace. Každý koncový bod lze uvolnit nebo zablokovat v k tomu určeném registru (u MCU Freescale je to registr EPCTLn).

Závěr 3.dílu

I když se tento díl přímo nezabýval USB OTG, myslím, že stručně připomněl strukturu a základní princip USB komunikace a provedení USB modulu Device zařízení, tedy běžného USB modulu dnes převážně používaného v 8bitových MCU a nejen zde uváděných mikrokontrolérů Freescale. Ona totiž funkce a provedení komunikace USB OTG, včetně provedení USB OTG modulu se od něho zase tolik neliší, protože pokud pracuje v režimu Device, nesmí se od něho z vnějšího pohledu odlišovat. Prakticky je navíc doplněn jen řídícím blokem realizujícím funkci v režimu Host a přepínáním. O tom však v příštím díle.

Antonín Vojáček

DOWNLOAD & Odkazy

Hodnocení článku: