. : New eShop! - Mobilní verze - Pandatron.cz - Pandatron.sk - Diskuzní fórum - Zakázkový vývoj : .
 
Vinculum: ovládání USB zařízení
19. července 2008 | Aleš Povalač | Vinculum: ovládání USB zařízení | Komentářů: 3  
Vinculum: ovládání USB zařízení

Vinculum: ovládání USB zařízení

Použít obvod Vinculum spolu s flash diskem či USB klávesnicí je snadné. K obvodu je však možné připojit i libovolné jiné USB zařízení, například měřícího přístroje či webkamery. V tomto článku je popsán postup jak na to.

V rámci jednoho z projektů na UREL FEKT VUT v Brně jsem byl postaven před řešení problému, jak ovládat signálový generátor Rohde&Schwarz SM300. Požadavkem bylo řízení z autonomního systému (tedy bez PC jako prostředníka). Jako USB Host byl vybrán poměrně rozšířený a známý obvod Vinculum VNC1L firmy FTDI. Zapojení tohoto obvodu a zprovoznění není nijak extra záludné, pěkná série článků vyšla i v češtině na Pandatronu. Problémy se začnou objevovat ve chvíli, kdy chceme připojit zařízení, které není standardně podporováno, tj. nespadá mezi různé flashdisky, HID, tiskárny apod. Takovým zařízením je samozřejmě i zmíněný vektorový generátor.

Dalším problémem pak může být nezveřejněný/utajený komunikační protokol mezi USB periferií a počítačem. V tomto příspěvku bych rád nastínil vhodný software a postupy pro odhalení komunikačního protokolu neznámého zařízení a jeho implementaci do mikroprocesoru řídicího Vinculum. Nepředpokládám, že by někdo řešil komunikace konkrétně se SM300, stejně tak se rozhodně nesnažím o podrobný návod - spíš se jedná o náznaky, jaké postupy při tvorbě ovladačů realizujících komunikaci přes Vinculum použít.

Co bude potřeba: vhodný počítač, ke kterému lze požadované USB zařízení připojit, s nainstalovanými ovladači a aplikací k řízení tohoto zařízení, dále s programem UsbSnoop; bastldesku s Vinculem, připojeným přes RS232 k počítači; samotné USB zařízení a nějakou tu kabeláž. Z dokumentace pak rozhodně datasheet k VNC1L a k firmwaru VDAP, dále specifikaci USB 2.0 (ano, je to bible, ale občas se to toho člověk musí nakouknout) a samozřejmě Google. Mně zpočátku třeba velice pomohl dokument Reverse engineering Windows USB device drivers for the purpose of creating compatible device drivers for Linux.

Vinculum definuje ve firmwaru VDAP pro práci s obecným USB zařízením sadu příkazů, z nichž o komunikaci se starají Send/Read Data (DSD, DRD) a Send Setup Data (SSU). V první fázi je tedy nutné zjistit, jakým způsobem zařízení komunikuje. To lze vyčíst z logu programu UsbSnoop, ten je však extrémně rozsáhlý a nepřehledný. Pro první nástřel je lepší využít omezené demo některé z komerčních aplikací, např. SysNucleus USBTrace. Po vyfiltrování mnoha nepodstatných paketů se dostaneme k paketům, které odpovídají příkazům zadávaným z počítače. Pro zmíněný generátor SM300 jsou to pakety typu URB_FUNCTION_VENDOR_DEVICE, což představuje Setup pakety (SSU) s Request identifikátorem, který není definovaný standardem, viz USB 2.0 specifikace kap. 9.3 a Vinculum firmware manuál kap. 6.6.6. Ostatní pakety nejsou pro přenos podstatné, což se ovšem liší přístroj od přístroje - např. v ukázce komunikace s klávesnicí na Pandatronu se využívá klasického datového přenosu (DRD). Setup pakety představují vlastně "příkaz" (identifikátor Value), který může obsahovat další data, resp. o ně žádat.

Komunikaci pro jednotlivé příkazy lze zachytit programem UsbSnoop. Pro SM300 pak dojdeme např. při nastavení frekvence 300MHz k záznamu:

[1920707 ms] >>> URB 1618
going down >>>
-- URB_FUNCTION_VENDOR_DEVICE:
TransferFlags = 00000002 (USBD_TRANSFER_DIRECTION_OUT,
USBD_SHORT_TRANSFER_OK)
TransferBufferLength = 00000008
TransferBuffer = 00000000
TransferBufferMDL = 85c951f0
00000000: 00 00 00 00 a3 e1 b1 41
UrbLink = 00000000
RequestTypeReservedBits = 00000000
Request = 00000035
Value = 00002010
Index = 00000000
[1920711 ms] <<< URB 1618
coming back <<<
-- URB_FUNCTION_CONTROL_TRANSFER:
PipeHandle = 85e64748
TransferFlags = 0000000a (USBD_TRANSFER_DIRECTION_OUT,
USBD_SHORT_TRANSFER_OK)
TransferBufferLength = 00000008
TransferBuffer = 00000000
TransferBufferMDL = 85c951f0
UrbLink = 00000000
SetupPacket =
00000000: 40 35 10 20 00 00 08 00

Z paketu je patrné, že nastavení frekvence je identifikováno pomocí vendor request 0x0035, value 0x2010, následované daty 00 00 00 00 a3 e1 b1 41, což je double reprezentace hodnoty 300 ve tvaru LSB first. Položka SetupPacket pak obsahuje celý zaslaný paket bez dat, odpovídající požadavek k nastavení frekvence, posílaný po USB, tedy bude: 40 35 10 20 00 00 08 00 00 00 00 00 a3 e1 b1 41. Tohle je jen jeden příklad z mnoha, pro SM300 dále musí následovat příkaz pro provedení nastavení (value 0x37ff).

Poslední částí realizace je pak komunikace pomocí samotného Vincula. Po připojení VNC1L k počítači, napájení a USB zařízení ve vhodném terminálu zkontrolujeme uvítací hlášku Vincula (Ver něco On-Line) a pomocí příkazů
IPH a SCS nastavíme binární zkrácený režim příkazů (viz kap. 6.6 manuálu k firmware Vincula). Dále přes 2c 0d (QP2 / Query Port 2) ověříme připojení "neznámého zařízení" na portu 2 a provedeme listing připojených zařízení přes 85 20 nn 0d (QD / Query Device), kde nn je index od 0 do 15. Vinculum vrací stavovou strukturu, obsahující VID a PID daného zařízení, při nalezení správného zařízení jej vybereme ke komunikaci pomocí 86 20 nn 0d (SC / Set Device). Vyhledání dle VID/PID je důležité zejména u komplexních zařízení, jako je zmíněný generátor SM300, které na USB sběrnici obsahují hub a více zařízení rozlišených podle PID.

Nyní již je možné komunikovat se samotným zařízením pomocí příkazů SSU, pro příklad zmíněný výše (nastavení frekvence) bude tedy příkaz vypadat:
9a 20 40 35 10 20 00 00 08 00 0d 00 00 00 00 a3 e1 b1 41. Červeně je značený příkaz Vinculu (SSU + CR), modře setup paket, zeleně zasílaná data. Při úspěšném provedení odpoví Vinculum promptem ('>' + CR), podobným tvarem lze také používat setup pakety na čtení z USB zařízení, potom před promptem vrátí Vinculum data přečtená z USB zařízení.

Jak bylo už řečeno na začátku, nejedná se o žádný návod ani konkrétní postup, vše je to o "hraní si" se zkoumaným zařízením, o jeho hackování v původním významu tohoto slova. Takže pokud budete tvořit vlastní ovladače do jednočipu, který přes Vinculum bude spolupracovat s USB zařízením, přeji hodně úspěchů!

Autor: Aleš Povalač - http://blog.alpov.net

Odkazy & Download:
Vinculum VNC1L -
http://www.vinculum.com
UsbSnoop - http://www.pcausa.com/Utilities/UsbSnoop/default.htm
datasheety k VNC1L a k firmwaru VDAP - http://www.vinculum.com/documents.html
specifikace USB 2.0 - http://www.usb.org/developers/docs
Reverse engineering Windows USB device drivers for the purpose of creating compatible device drivers for Linux - http://www.reactivated.net/weblog-content/20050806-reverse-0.2.txt
SysNucleus USBTrace - http://www.sysnucleus.com/usbtrace_download.html
Bray Terminal - http://braypp.googlepages.com/terminal







GooglePlus1 FaceBook Twitter del.icio.us DiGG Google StumbleUpon Google Buzz Email RSS PDF Tisk

Komentáře (4):

Zobrazit starší 30 dnů (4)...



Název příspěvku: Vaše jméno: host
                 
  Zakázat formátování [Zakáže kódování a nahrazování smajlíky.]
Připojit soubory
reklama:
Elektronické časové relé
Programovatelné časové relé - TIMREL přináší univerzální použití v oblasti časového a sekvenčního spínání.
Skladem od 420 Kč

Informace uvedené v článcích jsou platné v době jejich vydání a samotné články jsou určeny pouze jako zdroj informací. Autor článku ani správce webu nenesou žádnou zodpovědnost za případné újmy na majetku a zdraví. Názvy společností a výrobků, loga a další multimediální materiál mohou být ochrannými známkami příslušných společností.
RSS kanály: | |
+420 723 846 377
info@pandatron.cz
Všechna práva vyhrazena | mobilní verze | © Copyright 2000 - 2016 ISSN 1803-6007