Tak a je tady další díl pokračování seriálu k STM32F4 Discoveru kitu. Minule jsme nakousli pořádně USB a tak budeme rychle pokračovat, aby nám téma nevystydlo. Bohužel USB není taková sranda, jako přijímání zákonů v našem parlamentu, takže tento díl bude ještě o teorii, ale na závěr s perličkou - kompletní analýzou skutečné enumerace na USB sběrnici.



Úvodem

Na začátek shrneme, co už o USB víme. Tušíme něco o konektorech, tušíme že existují Endpointy a k čemu slouží a probrali jsme Descriptory, pomocí kterých Device v průběhu Enumerace řekne Host zařízení jak s ním má zacházet.

Možná si někteří z Vás všimli, že Configuration Descriptoru nebyl popis Endpointu 0. To je proto, že tento Endpoint 0 je u všech zařízení stejný a proto jej netřeba popisovat – na rozdíl od všech ostatních Endpointů, která tam naopak být musí. Domnívám se že většina z nás si obvykle vystačí s jedním přijímacím a jedním vysílacím Endpointem, ale může se stát, že nějaké zařízení bude potřebovat i blokové přenosy (typicky třeba Logický analyzátor spojený s nějakým měřákem může posílat pomocí Endpointu 1 výsledky měření měřáku a přes Endpoint 2 pomocí Bulk transferu posílat celý naměřený blok dat). V praxi platí těžko dosažitelný limit maximálně 16-ti vysílacích a 16-ti přijímacích Endpointů.


Device States

V Descriptoru se také nachází požadavek Device na hodnotu proudu, které bude potřebovat. Doporučil jsem dávat 0xFF, což znamená maximální hodnotu a to 500 mA napájecího napětí 5V (označovaného VBUS). V souvislosti s napájením je třeba vědět, že zařízení se z hlediska napájení nachází v některém z 6-ti stavů (state):
  • Attached State – stav, kdy je zařízení připojeno k Hostu, ale nedostává žádný proud z VBUS pinu. Nejčastěji k tomu dojde, když je na Device zkrat a odběr překročí 500 mA, na což reaguje Host tím, že odebere napájení pro Device
  • Powered – Device zařízení je připojeno a napájeno, ale ještě nedostalo příkaz Reset po fyzickém připojení.
  • Default – Device zařízení už poslalo Device Descriptor, proběhla tedy prvotní komunikace po prvním resetu, ale zařízení stále odpovídá na adrese 0 a neproběhl druhý reset a kompletní Enumerace.
  • Address – Device zařízení je připojeno, pro proběhl druhý reset, zařízení už odpovídá na adrese, kterou mi přidělil Host, ale stále neproběhla kompletní Enumerace.
  • Configured – Device zařízení už na nově přiřazené adrese provedlo poslání všech Descriptorů a Host se zařízení Device přizpůsobil. V této chvíli konečně zařízení může odebírat více než počátečních 100 mA (může odebírat tolik, o kolik požádá v zasleném Device Descriptoru). Zároveň musí platit že zařízení není Suspendováno!
  • Suspended – tento stav nastane, když zařízení neprovede na sběrnici USB žádnou aktivitu po dobu 3 ms.







Třídy USB zařízení

Tím bychom za sebou měli nějaké mantinely pro kostru programového vybavení USB zařízení (teda ty na co jsme si vzpomněl, možná ještě dodatečně něco najdeme a doplníme). A tak můžeme přistoupit k tomu, co do těch mantinelů nalejeme. Tedy podívat se jaké třídy USB zařízení můžeme spáchat. Je jich celkem dost, ale nejdůležitější pro nás jsou 4 základní třídy (Class):
  • Human Interface Device (HID)
  • Mass Storage Device (MSD)
  • Communication Device (CDC)
  • Vendor (tedy v praxi nějaká vlastní implementace)


Pokud by někdo opravdu toužil poznat všechny třídy, tak ať ráčí se podívat na odkaz

Human Interface Device

Jak mě kolega prezek již několikrát upozornil (a já si to už snad zapamatival), HID zařízení existuje celá řada. HID zařízení má tu výhodu že valná většina z nich má driver přímo obsažený v operačních systémech (podobně jako Mass Storage), a tak zařízení jednoduše připojíme k PC (což je z hlediska USB Host) a nemusíme vyrábět žádný driver, operační systém sám správný nalezne a nainstaluje.
Výběr tří, dle mého soudu nejčastěji použitých HID zařízení:
  • Generic Desktop Page (0x01) – myš, joystick, klávesnice, slider, dial, wheel (ovládací kolečko), atd.
  • LED Page (0x08) – tahle část třídy HID nám pomůže při realizaci různých blikátek
  • Alphanumeric Display Page (0x14) – různé LCD zobrazovače, atd.

Tudíž, když budete chtít mít nějaké jednoduché zařízení s jednoduchým interfejsem (třeba USB teploměr), tak jej uděláte jako klávesnici, na PC si otevřete soubor v notepadu a teploměr vám do něj bude zapisovat hodnoty, dokud bude v USB zásuvce. Tímto způsobem jsou řešeny třeba USB čtečky čárového kódu, které se tváří jako klávesnice.
Pochopitelně, že můžeme různé stránky třídy HID znásilnit k jinému účelu, než jsou určeny – např. Alfanumerický zobrazovač (0x14) bude ve skutečnosti třeba řízení motoru, jehož rychlst bud dána tím, na „napíšeme na display“.


Mass Storage Device

Tohle třídu snad ani nemusím podrobněji představovat, tu každý zná z používání různých flash disků a podobně. Jen doplním dvě drobnosti, a to jednak, že je možná za Mass Storage schovat nějaké zařízení (typický příklad ST Link verze 1, který se choval jako Mass Storage) a za druhé, že opět můžeme tuto třídu přizpůsobit našim potřebám. Teploměr zaznamenávající teplotu se může Host jevit jako Mass Storage Disk s jedním souborem, který když otevřeme, tak nalezneme seznam zaznamených teplot. Nebo velkoplošný LED panel, který ovládáme tak, že nový obsah k zobrazení zapíšeme do souboru na Mass Storage USB Disku.


Communication Device

Je šikovná třída USB zařízení, která se Hostu jeví jako sériový port. Obvykle je k zařízení připojen univerzální driver, který vytvoří v operačním systému virtuální sériový port, na který můžeme zapisovat a ze kterého můžeme číst a tím komunikovat s USB zařízením. Obvykle tím můžeme spolehlivě vyřešit otázku jednoduššího USB zařízení, se kterým potřebujeme obousměrně komunikovat. Po mnoha letech své existence je Sériový Port v operačních systémech dobře ošetřen, takže s ním může komunikovat mnoho programů.


Vendor

K této třídě se obvykle obrátíme, buď když máme nějaké komplikované zařízení, které komunikuje neobvyklým způsobem, nebo když chceme vyvinout zařízení do kterého by nám někdo neměl šťourat – protože s daným zařízením se bude moci komunikovat pouze s námi dodaným driverem. Protože nemá cenu znovu objevovat kolo, tak problém driveru nejsnáze to vyřešíme buď s WinUSB nebo LibUSB.


FeatureHIDCDCWinUSBLibUSB
Podpora ve WindowsANOPotřeba .INFPotřeba .INFNE
Podpora 64bitůANOANOANOANO
Podpora Control přenosůANONEANOANO
Podpora Interrupt přenosůANONEANOANO
Podpora Bulk přenosůNEANOANOANO
Podpora Isochronous přenosůNEANONEANO
Max. rychlost (FS)64 KB/s80 KB/s1 MB/s1 MB/s

K uvedenému dodávám upřesnění, že LibUSB není přímo ve Windows podporován, ale jde tam snadno doinstalovat (jak 32 i 64 verze) a to s podepsaným ovladačem.


Praktická ukázka Enumerace na USB

A poslední čím bychom dnešní díl uzavřeli je skutečný záznam komunikace po USB při enumeraci a analýza této komunikace. Pokud Vám připadá, že se toho posílá zbytečně mnoho a opakovaně, tak berte do úvahy, jeden paket proběhne po sběrnici každou 1 ms, takže ve skutečnosti jde o velmi krátkou dobu, která se stráví enumerací. Na konci této komunikace je už zařízení připraveno plně k dispozici, tedy je ve stavu Configured State (viz výše). A jak z praktické ukázky vidíte, výklad o USB je hodně zestručněný a zjednodušený. V reálu je na USB sběrnici docela frmol.














Příště si ukážeme praktické příklady realizace různých demonstračních USB zařízení. Demonstračních proto, že klávesnice s jednou klávesou nebo myš s jedním tlačítkem moc užitku neudělá, ale můžete se na ní poučit, jak věc realizovat aby jste byli schopni sami pak vytvořit i mnohem větší aplikaci.


Odkazy

Materiál k HID naleznete odkaz
Materiál k CDC naleznete odkaz

Začínáme s STM32F4 kitem 1. odkaz (vývojové prostředí, atd.)
Začínáme s STM32F4 kitem 2. odkaz (USB Úvod)