ýeské vysoké uþení technické v Praze Fakulta elektrotechnická
BakaláĜská práce
Rychlý pĜenos obrazu a dat s využitím EZ-USB JiĜí Zima
Vedoucí práce: Ing. Jan Fischer, CSc.
Studijní program: Elektrotechnika a informatika Obor: Kybernetika a mČĜení Leden 2009
Akademický rok 2007-2008
ZADÁNÍ BAKALÁěSKÉ PRÁCE Student:
JiĜí Zima
Obor:
Kybernetika a mČĜení
Název tématu þesky:
Rychlý pĜenos obrazu a dat s využitím EZ-USB
Název tématu anglicky:
High Speed Image and Data Transfer Using EZ-USB
Zásady pro vypracování: Pro Ĝadiþ EZ-USB – CY7C68013A pracující v synchronním módu þtení navrhnČte a realizujte metodu rychlého pĜenosu výstupních dat z optoelektronického plošného obrazového senzoru CMOS, pĜípadnČ videodekodéru do nadĜazeného PC. Výsledné Ĝešení zajistí snímání obrazu a jeho pĜenos v reálném þasu. Pro vlastní Ĝadiþ i nadĜazené PC využijte, tvoĜte potĜebné programové vybavení. Posućte také možnost použití Ĝadiþe CY7C68013A ve funkci rychlého záznamníku dat jako jednoduchého logického analyzátoru využitelného v laboratoĜích.
Seznam odborné literatury: [1]
Souþek P.: BakaláĜská práce ýVUT – FEL. Praha 2007
[2]
Cypress: EZ-USB FX2LP USB Microcontroller. 2006
[3]
Skalický P.: Mikroprocesory Ĝady 8051. BEN, Praha 2005
Vedoucí bakaláĜské práce:
Ing. Jan Fischer, CSc.
Datum zadání bakaláĜské práce:
14. prosinec 2007
1
Platnost zadání do :
24. leden 2009
L.S.
Prof. Ing. Vladimír Haasz, CSc. vedoucí katedry
Doc. Ing. Boris Šimák, CSc. dČkan V Praze dne 14. 12. 2007
_______________________________ 1
Platnost zadání je omezena na dobu dvou následujících semestrĤ.
Prohlášeni: Prohlašuji, že jsem svou bakaláĜskou práci vypracoval samostatnČ a použil jsem pouze podklady uvedené v pĜiloženém seznamu. Nemám závažný dĤvod proti užití tohoto školního díla ve smyslu § 60 zákona þ.121/2000 sb., o právu autorském, o právech souvisejících s právem autorským a o zmČnČ nČkterých zákonĤ (autorský zákon).
V Praze dne . . . . . . . . . . . 2009
.................... JiĜí Zima
Abstrakt Tato bakaláĜská práce je zamČĜena na realizaci metody rychlého pĜenosu obrazu z CMOS senzoru v reálném þase za pomoci USB Ĝadiþe Cypress EZ-USB (CY7C68013A) a možnosti jeho užití v mČĜicích zaĜízeních. V práci jsou postupnČ rozebrány základy použití USB rozhraní, vlastní programování Ĝadiþe Cypress EZ-USB, programování PC aplikace pro obecný pĜenos dat, využití Ĝadiþe pro potĜeby jednoduchého logického analyzátoru a použití pro snímání obrazu z CMOS senzoru modulu SPART3KAM. V závČru je diskutována využitelnost pro videometrii a možnost užití Ĝadiþe i pro jiné aplikace týkající se mČĜení.
Abstract This bachelor thesis is aimed to create method of fast image transfer from the CMOS sensor in real time using USB controller Cypress EZ-USB (CY7C68013A). The thesis analyze basic use of USB interface, programming of the Cypress EZ-SUB controller, programming of the PC application for universal data transfer, the use of controller for simple logical analyzer and it's use for the image capturing from the CMOS sensor SPART3KAM. The conclusion of thesis discusses the use for video metrics and other application in measurements.
1
PodČkování Touto cestou bych chtČl podČkovat všem, kteĜí pĜispČli k vzniku této bakaláĜská práce. JmenovitČ jde o Ing. Jana Fischera, CSc. za odborné vedení a pomoc pĜi psaní, Ing. Jaroslava TĜeštíka za poskytnutý pĜípravek s CMOS senzorem a cenné rady, Bc. Pavla Souþka za struþné uvedení do problematiky USB pĜenosĤ, Ladislava Zimu za zasvČcení do nČkterých tajĤ programovacího jazyka C++ a vedení serveru NOTEBOOK.cz za zapĤjþení technického vybavení pro testování implementací hostitelských USB ĜadiþĤ.
2
Obsah 1
2
3
Úvod ............................................................................................................................... 6 1.1
Motivace ................................................................................................................. 6
1.2
Cíl práce ................................................................................................................. 6
Popis USB rozhraní ...................................................................................................... 7 2.1
Seznámení, kompatibilita a rychlost ...................................................................... 7
2.2
PĜenosová cesta ...................................................................................................... 9
2.3
Protokol pĜenosu .................................................................................................. 11
2.4
Endpointy ............................................................................................................. 12
2.5
Roury .................................................................................................................... 12
2.6
ěídící pĜenosy ...................................................................................................... 13
2.7
PĜerušovací pĜenosy ............................................................................................. 14
2.8
Izochronní pĜenosy ............................................................................................... 14
2.9
Hromadné pĜenosy (Bulk) .................................................................................... 15
Programování EZ-USB pro rychlý pĜenos dat ........................................................ 15 3.1
Zavedení programu .............................................................................................. 16
3.2
Nastavení deskriptorĤ ........................................................................................... 17
3.3
Nastavení endpointĤ a jejich prostoru ve FIFO ................................................... 18
3.4
Registr IFCONFIG a nastavení þítaþe .................................................................. 20
3.5
PĜiĜazení FIFO k endpointu .................................................................................. 23
3
3.6 4
5
6
FIFO Flag pĜíznaky .............................................................................................. 24
Programování PC aplikace pro rychlý pĜenos dat .................................................. 24 4.1
Univerzální ovladaþ CyUSB a CyAPI ................................................................. 25
4.2
Inicializace USB zaĜízení ..................................................................................... 25
4.3
Nastavení pĜenosĤ a zátČž procesoru ................................................................... 26
4.4
PĜenos dat s využitím funkce XferData................................................................ 27
4.5
Výsledky, dosažené rychlosti pĜenosu ................................................................. 28
Využití EZ-USB jako logického analyzátoru ........................................................... 29 5.1
Možnosti zapojení obvodu a úpravy firmware ..................................................... 29
5.2
Zpracování dat v reálném þase ............................................................................. 31
5.3
Zpracování dat po ukonþení mČĜení ..................................................................... 31
5.4
RozdČlení zátČže na více jader procesoru............................................................. 33
5.5
Výsledky a možnosti nasazení ............................................................................. 35
PĜenos videa ze senzoru SPART3KAM ................................................................... 36 6.1
CMOS senzor KODAK KAC-9618 ..................................................................... 37
6.2
Zapojení hradlového pole Xilinx SPARTAN XCS200........................................ 39
6.3
DĤležité zmČny ve firmware ................................................................................ 39
6.4
Nastavení endpointu pro pĜenos obrazu ............................................................... 41
6.5
PĜenos snímkĤ ...................................................................................................... 42
6.6
Vykreslení snímku................................................................................................ 43
4
6.7
Akcelerace vykreslování grafickou kartou ........................................................... 44
6.8
Výsledky............................................................................................................... 45
6.9
Zapojení Ĝadiþe bez hradového pole SPARTAN ................................................. 46
7
ZávČr ............................................................................................................................ 47
8
Zdroje a literatura ...................................................................................................... 49
9
Obsah CD .................................................................................................................... 49
5
1 Úvod 1.1 Motivace V posledních letech z poþítaþĤ postupnČ mizí všechna dĜíve používaná rozhraní, která s nimi byla pomalu od vzniku standardu osobních poþítaþĤ. PĜed 10 lety bylo navrženo rozhraní USB, které mČlo za cíl nahradit všechna ostatní a nabídnout vyšší rychlosti, možnost osazení témČĜ libovolným poþtem portĤ a vytvoĜení inteligentní správy prostĜedkĤ, která oprostí vývojáĜe od nutnosti spravovat nízkoúrovĖové funkce komunikace mezi zaĜízeními. V oblasti komerþní sféry se bČhem nČkolika let USB ujalo a nyní je situace taková, že ze stolních poþítaþĤ prakticky vymizela pĤvodní paralelní a sériová rozhraní. Jsem pĜesvČdþen, že rozhraní USB je nejvhodnČjším levným Ĝešením pro pĜenos obrazu v reálném þase nejen z CMOS senzoru, ale také z video kodekĤ a dalších zdrojĤ obecných dat. Bylo by proto vhodné mít navržené takové Ĝešení, které bude možné dále snadno implementovat v rĤzných mČĜicích zaĜízeních, neboĢ lze pĜedpokládat, že USB rozhraní bude díky svému návrhu s ohledem na maximální kompatibilitu dlouhodobČ podporované na osobních poþítaþích i prĤmyslových systémech.
1.2 Cíl práce Mým hlavním cílem je nabídnout Ĝešení rychlého pĜenosu obrazu, potažmo dat z mČĜicích zaĜízení (CMOS senzoru) v reálném þase. Nyní se pĜípravky s optickými senzory v laboratoĜi þasto vybavují vnitĜní pamČtí, která celý snímek uchovává, aby jej následnČ bylo možné postupnČ pĜenést do poþítaþe. Na vinČ je nízká rychlost pĜenosu, která trvá ĜádovČ delší dobu než samotné snímání. V této práci hodlám rozebrat postupy, jak využít Ĝadiþ Cypress EZ-USB pro pĜenášení obrazu (dat) v reálném þase, a tím zjednodušit návrh nČkterých laboratorních pĜípravkĤ a rozšíĜit jejich funkcionalitu.
6
Snímání
CMOS senzor
Obraz
Uložení do FIFO
Hi-Speed USB pĜenos
USB Ĝadiþ
PC
Obr. 1 - ZnázornČní pĜenosu obrazu do PC
Dále
bych
rád
hloubČji
pronikl
do
problémĤ
spojených
s pĜenosem
dat
s využitím synchronního zápisu do FIFO pamČti Ĝadiþe a nalezl pĜíþiny nízké dosažené rychlosti v práci [1], na kterou navazuji. Hodlám se zabývat nejen praktickým Ĝešením implementace rychlého pĜenosu dat s maximální frekvencí datové sbČrnice (48 MHz), Ĝešením pĜenosu obrazu v reálném þase a užitím Ĝadiþe pro potĜeby jednoduchého logického analyzátoru, ale také teorií nutnou k obecnému pochopení hlavních problémĤ spojených s užitím USB. Tato práce by mČla být zároveĖ jednoduchým, uceleným návodem pro všechny další studenty a akademické pracovníky, kteĜí se rozhodnou použít Ĝadiþ Cypress EZ-USB v jeho libovolné formČ pro rychlou komunikaci mezi poþítaþem a vlastním (mČĜicím) zaĜízením.
2 Popis USB rozhraní Bez vysvČtlení základĤ USB rozhraní by nebylo možné pochopit vše potĜebné k vlastnímu pĜenosu. Popsat celé rozhraní by vyžadovalo podstatnČ více prostoru, než kolik se oþekává od bakaláĜské práce. V této kapitole se proto budu vČnovat pĜedevším tČm þástem, které jsou stČžejní pro rychlý pĜenos dat.
2.1 Seznámení, kompatibilita a rychlost USB je zkratkou znamenající Universal Serial Bus – univerzální sériovou sbČrnici. Ta byla navržena jako náhrada pĜedevším rozhraní RS232. Na rozdíl od RS232 je vyžadována pĜítomnost sofistikovaného Ĝadiþe na obou stranách a pĜenos probíhá formou paketĤ. KvĤli tomu je implementace sice složitČjší, ale nabízí mnohem více možností. V zapojení je vždy urþeno, které zaĜízení je hostitel (USB Host). Takové zaĜízení zahajuje veškeré pĜenosy (obČma smČry).
7
V roce 1998 se s Pentium II procesory postupnČ zaþalo rozšiĜovat osazování poþítaþĤ tímto rozhraním. V této dobČ šlo o verzi 1.1, která podporuje dvČ rychlosti. Low Speed (10– 100 kb/s) a Full Speed (500 kb/s – 12 Mb/s). V roce 2003 (Pentium 4) postupnČ všichni výrobci pĜešli na USB verze 2.0, které pĜineslo znatelnČ vyšší rychlosti 25–480 Mb/s v režimu High Speed. V pĜíštím roce se oþekává pĜechod na rozhraní USB 3.0, které nabídne 10x vyšší rychlost proti svému pĜedchĤdci. Všechny verze USB jsou zpČtnČ kompatibilní. Je tedy možné pĜipojit USB 1.1 zaĜízení do USB 2.0 portu. ZároveĖ vhodnČ naprogramované USB 2.0 zaĜízení mĤže fungovat (se sníženou rychlostí) v portu USB 1.1. Tyto reálie zmiĖuji, neboĢ je s nimi nutno od zaþátku poþítat pĜi návrhu vlastního zaĜízení. Ne každá laboratoĜ je nutnČ vybavena nejnovČjšími poþítaþi. Podstatným posunem proti ostatním rozhraním je možnost pĜipojit více zaĜízení. Teoreticky jich je možné na jeden Ĝadiþ pĜipojit až 127 (a ĜadiþĤ mĤže být v jednom poþítaþi více). Toho lze docílit pomocí rozboþovaþĤ (hub). Ty umožĖují pĜipojit fyzicky více zaĜízení, jejich pakety vhodnČ poskládat a poslat nadĜazenému zaĜízení. Strukturu pĜipojených zaĜízení k USB Ĝadiþi lze definovat jako strom (Obr. 2).
Hostitelský Ĝadiþ
HUB
HUB
ZaĜízení
ZaĜízení
ZaĜízení
ZaĜízení
Obr. 2 - Stromová struktura pĜipojených zaĜízení na USB
8
Jedno fyzické zaĜízení mĤže obsahovat nČkolik USB zaĜízení, pokud v sobČ samo implementuje rozboþovaþ. Takovým zaĜízením se Ĝíká složená (composed devices). Možnost složených zaĜízení je velmi praktická a hojnČ se v praxi používá. Zapojení konkrétního zaĜízení je možné snadno zjistit i z pohledu uživatele pomocí standardního nástroje Správce zaĜízení (Obr. 3) ve Windows (2000 a novČjší). PĜipojení, odpojení a konfiguraci jednotlivých zaĜízení zajišĢuje hostitelský Ĝadiþ.
Obr. 3 - Zobrazení složeného zaĜízení ve Správci zaĜízení
2.2 PĜenosová cesta USB kabely v základu používají fyzicky 4 vodiþe. První dvojice slouží pro vlastní pĜenos dat a oznaþují se D+ (zelená) a D- (bílá). Druhá dvojice vodiþĤ se stará o napájení. Vodiþ VCC (þervená) má stálé (stejnosmČrné) napČtí +5V a vodiþ GND (þerná) je zem. Existuje celá Ĝada USB konektorĤ lišících se podle velikosti a hierarchie zaĜízení. Hostitel zpravidla používá konektor typu A, který lze vidČt na všech poþítaþích (u klasického poþítaþe se neoþekává práce v jiném než hostitelském režimu). PĜipojovaná zaĜízení nejþastČji používají standardní konektor typu B (tiskárny, skenery a další vČtší periferie) a mini USB (mobilní telefony a pĜíslušenství k notebooku). Rozdíly tvaru konektorĤ názornČ ukazuje Obr. 4.
9
Obr. 4 - Standardní typy USB konektorĤ
Na vodiþích D+ a D- se používá diferenciální pĜenos (Obr. 5). Hodnota na D- je tak negací hodnoty na D+. Tento mechanismus je použit kvĤli odstranČní nČkterých chyb zpĤsobených rušením. Ochrana pĜenosu je dále zajištČna pomocí CRC (Ĝídící i datové pole) a Ĝady samoopravných kódu. Všechny tyto záležitosti obstarává standardnČ hostitelský Ĝadiþ, a tudíž je není nutné Ĝešit ani z pozice vývojáĜe pĜíslušného hardware a ani programátora. V pĜípadČ potĜeby však je možnost nechat Ĝadiþ chyby hlásit a dokonce je i nechat Ĝešit programovČ.
Obr. 5 - Diferenciální pĜenos na vodiþích D+ a D-
10
2.3 Protokol pĜenosu USB je Ĝízenou sbČrnicí. Hlavní roli má hostitelský Ĝadiþ, který zpracovává pĜíkazy ovladaþe a na jejich základČ zahajuje potĜebné transakce. Tyto transakce se skládají z nČkolika paketĤ. Zpravidla jde o tĜi. Pouze v pĜípadČ komunikace s Low Speed a Full Speed zaĜízením se používá ještČ þtvrtý. Všechny transakce se následnČ podle nastavení vkládají do úsekĤ zvaných (mikro-)rámce. Klasický rámec má délku 1 ms. V High Speed komunikaci se zavádí pojem mikrorámec, který má délku 125 µs. V principu jde o to samé a mikrorámce jsou zavedeny þistČ k zajištČní nižší latence pĜi použití vyšší rychlosti.
DATA Packet
Hanshake Packet
Token Packet
Typickou transakci v režimu High Speed zobrazuje Obr. 6.
Obr. 6 - Transakce v režimu High Speed
Token paket Tento paket slouží k navázání komunikace s konkrétním zaĜízením. Je v nČm uložen smČr pĜenosu, adresa zaĜízení a þíslo endpointu (smysl endpointu je vysvČtlen v následující kapitole). ZaĜízení þte token pakety, a pokud se v nČjakém objeví jeho adresa, pĜipraví se k pĜenosu. Vzhledem k tomu, že veškerou komunikaci zahajuje právČ hostitel, smČr pĜenosu je taktéž vztažen k jeho pozici (IN = ze zaĜízení do poþítaþe, OUT = z poþítaþe do zaĜízení).
Datový paket Jakmile je komunikace navázána, mohou se zaþít pĜenášet vlastní data zvoleným smČrem. Pokud by šlo o smČr do poþítaþe a zaĜízení ještČ nemČlo data pĜipraveno, pošle se taková informace a pĜenos bude ukonþen (chyba je v pĜípadČ ovladaþe EZ-USB sdČlena návratovou hodnotou funkce pĜenosu).
11
Handshake paket Poslední paket posílá vždy zaĜízení smČrem k hostiteli jako potvrzení pĜenosu dat a je v nČm uložen kontrolní souþet CRC.
2.4 Endpointy Výraz endpoint v rámci USB zaĜízení definuje adresu komunikaþního kanálu. EndpointĤ mívá každé zaĜízení více a oznaþují se zkratkou EP a þíslicí. Hlavním endpointem je EP0, který musí být implementovaný v každém zaĜízení. S pomocí tohoto endpointu probíhá Ĝízení komunikace s hostitelským Ĝadiþem a není možné ho použít pro jiné než Ĝídící pĜenosy. Ostatní endpointy jsou volitelné a mohou být v rozsahu 1–15. Každý endpoint navíc mĤže být konfigurovaný pro oba smČry pĜenosu. Endpoint má v sobČ definovány požadavky na frekvenci a latenci pĜístupĤ, chování obsluhy chyb, velikost datového toku, své þíslo a požadovaný smČr. V závislosti na konkrétní implementaci použitého USB Ĝadiþe bývá omezen poþet endpointĤ, smČr pro vybraná þísla a nČkteré další vlastnosti.
2.5 Roury S jednotlivými endpointy jsou spĜaženy roury a roura (pipe) je tím samotným pĜenosovým kanálem. Hlavní roura spĜažená s EP0 se nazývá Default Control Pipe. Každá roura udává, zda je neþinná. Žádost o její využití se provádí IRP paketem (I/O Request Packet). Pokud je požadovaná roura volná, zablokuje se pro ostatní a zahájí se pĜenos požadovaného poþtu bajtĤ. Obsluha rour je automatizovaná hostitelským Ĝadiþem. Není proto problém pĜenést i vČtší množství dat, než se vejde do jednoho paketu. Systém data v závislosti na typu pĜenosu rozdČlí a pĜenese ve více paketech, aniž by to programátor aplikace nČjak musel Ĝešit. Roury jsou dvojího typu. První jsou roury zpráv (message pipe) a používají se v Ĝídících pĜenosech. Všechny další typy pĜenosĤ využívají proudové roury (stream pipe), které nemají žádnou definovanou strukturu paketĤ. Proudová roura je na rozdíl od roury zpráv pouze jednosmČrná. Z toho vyplývá, že pro obousmČrný endpoint jsou vyžadovány dvČ roury
12
(poþet rour je omezen implementací Ĝadiþe). Pro zámČr rychlého pĜenosu velkého množství dat je nutné použít typy pĜenosĤ s proudovými rourami. TČm budou se budou vČnovat kapitoly 2.8 a 2.9.
2.6 ěídící pĜenosy ěídící pĜenosy jsou základním typem pĜenosĤ pĜi komunikaci s USB zaĜízením a nelze je niþím nahradit. Slouží pro pĜenos konfiguraþních, stavových a Ĝídících dat. Využívají se také pro obsluhu ostatních typĤ pĜenosĤ a jejich struktura je dána použitím roury zpráv. Pro standardní aplikace s pĜehledem staþí ponechat jediný endpoint tohoto typu, a to EP0. U nČj se využívá hlavnČ token paketu SETUP, který obsahuje sadu standardních pĜíkazĤ pro obsluhu zaĜízení. Tyto pĜíkazy jsou z þásti definovány už standardem a výrobce si je dále mĤže rozšíĜit o své vlastní (Vendor Specific Commands). PĜíkazy v Ĝídících pĜenosech využívají dvČ až tĜi transakce (Obr. 7). První transakce posílá pĜíkaz, druhá (volitelná) potĜebná data a tĜetí výsledek (opaþným smČrem proti datĤm). Pro aplikace popisované v dalších kapitolách však není nutné tento typ pĜenosu nijak Ĝešit, neboĢ o obsluhu EP0 se postará pĜímo ovladaþ EZ-USB.
Obr. 7 - Složení transakcí u Ĝídících pĜenosĤ
13
2.7 PĜerušovací pĜenosy Tento typ pĜenosu se využívá v pĜípadech, kdy je vyžadováno rychlé doruþení informace. Slouží pro pĜenos menších dat a své využití nachází napĜíklad u vstupních zaĜízení HID (klávesnice, myš,…). Hlavní výhodou je nutnost Ĝadiþe bezpodmíneþnČ obsloužit všechny pĜenosy tohoto typu. Garance se zajišĢuje již pĜi vytvoĜení roury a v pĜípadČ, že by systém nemohl garantovat zvolenou periodu a velikost pĜenosu, rouru odmítne vytvoĜit. Pro takový pĜíklad vČtšinou musí mít firmware pĜipraven i varianty s delší periodou opakování (pĜípadnČ menší velikostí paketĤ). Pokud žádná varianta neprojde a daný endpoint je potĜeba, zaĜízení nebude možné použít. Pokud už je roura vytvoĜena a z jakéhokoli dĤvodu se pĜenos nČjakého paketu nezdaĜí, Ĝadiþ jej znovu neposílá a nechá problém Ĝešit až vlastní aplikaci. PĜerušovací pĜenosy mohou využít až 80% jednoho mikrorámce. Velikost jednoho paketu mĤže být až 134 B pro USB 2.0. Perioda opakování se nastavuje v intervalu od 125 µs do 4096 ms. Tento typ pĜenosu je zmínČn pouze pro úplnost. V aplikacích pro rychlý pĜenos dat není potĜeba.
2.8 Izochronní pĜenosy StejnČ jako u pĜerušovacích pĜenosĤ je garantován pĜístup s minimálním zpoždČním a konstantní tok dat. Platí zde stejná omezení jako pro pĜerušovací pĜenosy. Liší se však možností pĜenést v High Speed režimu až 1024 B na jeden standardní paket a až 3072 B na high-bandwidth paket. PĜi vhodném nastavení lze garantovat rychlost až 24 MB/s v reálném provozu. Pokud Ĝadiþ nebude moci rychlost garantovat, nezdaĜí se opČt už samotné vytvoĜení roury. Nad použitím tohoto typu pĜenosu jsem uvažoval pĜi realizaci programové þásti své práce. Nakonec jsem od nČj upustil, neboĢ byl zámČr dostat se na vyšší rychlosti a záruka latencí pod 1 ms nebyla pro potĜebné aplikace stČžejní. V komerþní sféĜe se tento typ pĜenosu hojnČ používá napĜíklad u externích zvukových karet, kde je nízká latence vyžadována protokolem ASIO (Audio Stream Input/Output).
14
2.9 Hromadné pĜenosy (Bulk) PĜenosy typu bulk jsou pro potĜeby této práce nejzajímavČjší. Používají se tam, kde je potĜeba pĜenášet data maximální možnou rychlostí. ěadiþ pĜi nich negarantuje žádnou periodu pĜístupĤ a není jim ani vyhrazena žádná konkrétní þást mikrorámce. Umí však v mikrorámci vyplnit všechen volný prostor. Pokud na Ĝadiþi není pĜipojeno žádné další zaĜízení, které by ho vytČžovalo vlastním pĜenosem, je možné mikrorámec využít témČĜ celý. Pro USB 2.0 platí, že jeden paket bulk mĤže pĜenést až 512 B dat a v jednom mikrorámci lze provést až 14 transakcí tohoto typu. ýistČ teoreticky by to v ideálních podmínkách znamenalo až 54 MB pĜenesených dat v jediné sekundČ. V praxi tak velké rychlosti nelze dosáhnout. To už ovšem není chybou samotného pĜenosu, ale vlastní implementací hostitelských ĜadiþĤ, kterým se vČnuji v kapitole 4.5. PĜi tČchto pĜenosech Ĝadiþ sám Ĝeší opakování pĜenosĤ v pĜípadČ chyby. To si mĤže dovolit, protože pro bulk pĜenosy není garantována žádná konkrétní latence. Z pohledu programátora je opakování automatizované a transparentní.
3 Programování EZ-USB pro rychlý pĜenos dat Cypress EZ-USB (CY7C68013A, Obr. 8) je jednoþipovým USB Ĝadiþem s integrovaným 48MHz mikrokontrolérem kompatibilním s Intel 8051, vlastními 16 kB pamČti, Ĝadiþem I2C a UART a 8/16bit datovou sbČrnicí FIFO. Jde v podstatČ o kompletní jednoþipový poþítaþ. Mikrokontrolér 8051 primárnČ slouží k nastavení všech þástí Ĝadiþe a pĜípadných dalších zaĜízení pĜipojených pĜes I2C a UART. Jde samozĜejmČ o plnou implementaci, ale pĜi rychlosti 4 hodinových cyklĤ na jednu instrukci jej nelze použít pro vlastní zpracování pĜijímaných dat v požadované rychlosti. Tento problém Ĝeší integrovaná jednotka GPIF (General Programmable Interface), která umí Ĝídit FIFO sama. Vhodným nastavením pak lze s celým pĜenosem mikrokontrolér úplnČ obejít a ten Ĝeší jen požadavky na pĜerušení a pĜíkazy USB.
15
Obr. 8 - Zjednodušené blokové schéma Ĝadiþe Cypress EZ-USB
V této kapitole se budu vČnovat vhodnému nastavení vlastního zaĜízení a programování jeho firmware pro rychlý pĜenos obecných dat do poþítaþe. K jejímu napsání posloužila 100vývodová verze Ĝadiþe. Kód je však plnČ kompatibilní i osekanou verzí v menším pouzdĜe s 56 vývody.
3.1 Zavedení programu Použitý Ĝadiþ EZ-USB má výhodu v rozmanitých možnostech zavádČní programu. Interní pamČĢ o velikosti 16 kB je vyhrazena pro program i pro data. Po zapnutí probíhá boot sekvence a program lze nahrát z EEPROM nebo externího pamČĢového zaĜízení (platí jen pro verzi se 128 vývody). Jakmile je program v interní pamČti RAM, procesor provede reset a spustí se s nahraným programem. Pokud se program nenahraje ani jedním z tČchto zpĤsobĤ, zavede se výchozí, pĜi kterém je zaĜízení schopno komunikovat s poþítaþem nČkolika základními pĜíkazy. V takovém pĜípadČ je pomocí speciálního pĜíkazu na EP0 možné nahrát vlastní program do interní pamČti pĜímo pĜes USB a vyvolat softwarový reset. Poslední možnost je neocenitelná zejména pĜi návrhu a testování zaĜízení. Nabízí zároveĖ urþitou flexibilitu, kdy klientská aplikace obsahuje více programĤ a nahrává vhodný až na základČ výbČru uživatele. Vzhledem k jednoduchosti a rychlosti nahrání jsem u této možnosti nakonec zĤstal. Operaci je možno provést z programu CyConsole, který je souþástí SDK balíþku nutného pro vývoj PC aplikací využívajících tento Ĝadiþ.
16
Obr. 9 - Diagnostika zaĜízení pomocí programu CyConsole
3.2 Nastavení deskriptorĤ Vhodné nastavení deskriptorĤ je základem pĜi tvorbČ firmware. Cypress v rámci svého SDK dodává sadu nČkolika ukázkových, takže není nutné psát vše od píky. Vycházel jsem z programu Bulkloop uloženém v podadresáĜi SDK: /USB/Examples/Fx2lp/bulkloop/ (funkce: data pĜenesená na jeden vstupní endpoint jsou automaticky pĜekopírována do výstupního, kde je mĤže opČt poþítaþ vyþíst). Nejde o samotný program, ale o všechny doprovodné soubory a vytvoĜený projekt pro vývojové prostĜedí Keil Microvision. První kroky by mČly smČĜovat k vhodné konfiguraci deskriptorĤ – ta se nachází v souboru dscr.a51. Následující kód ukazuje nastavení s jedním endpointem (EP0 se nepoþítá). KonkrétnČ jde o vstupní endpoint EP2 typu bulk. Toto nastavení pĜestavuje minimum pro rychlý pĜenos dat: ,QWHUIDFH'HVFULSWRU GE'6&5B,175)&B/(1'HVFULSWRUOHQJWK GE'6&5B,175)&'HVFULSWRUW\SH GE=HUREDVHGLQGH[RIWKLVLQWHUIDFH GE$OWHUQDWHVHWWLQJ GE1XPEHURIHQGSRLQWV GE1XPEHURIHQGSRLQWV GE1XPEHURIHQGSRLQWV GEII+,QWHUIDFHFODVV GE+,QWHUIDFHVXEFODVV GE+,QWHUIDFHVXEVXEFODVV GE,QWHUIDFHGHVFULSWRUVWULQJLQGH[
17
(QGSRLQW'HVFULSWRU GE'6&5B(1'317B/(1'HVFULSWRUOHQJWK GE'6&5B(1'317'HVFULSWRUW\SH GE+(QGS GE+(QGSRLQWQXPEHUDQGGLUHFWLRQ GE+(QGSRLQWQXPEHUDQGGLUHFWLRQ RLQWQXPEHUDQGGLUHFWLRQ GE(7B%8/.(QGSRLQWW\SH GE(7B%8/.(QGSRLQWW\SH GE(7B%8/.(QGSRLQWW\SH GE+0D[LPXQSDFNHWVL]H/6% GE+0D[LPXQSDFNHWVL]H/6% GE+0D[LPXQSDFNHWVL]H/6% GE+0D[SDFNHFWVL]H06% GE+0D[SDFNHFWVL]H06% GE+0D[SDFNHFWVL]H06% GE+3ROOLQJLQWHUYDO
ZvýraznČné Ĝádky pĜedstavují zásadní zmČny. První takový Ĝádek oznaþuje poþet endpointĤ a pĜesnČ tolik blokĤ kódĤ pro endpoint deskriptory musí být následnČ uvedených v kódu. Pokud se þíslo neshoduje, program nebude možné zkompilovat. Na druhém zvýraznČném Ĝádku oznaþuje první þíslice smČr pĜenosu: 0 znamená smČr ven z poþítaþe a 8 smČr do poþítaþe. Druhá þíslice udává þíslo endpointu. Poslední dva zvýraznČné Ĝádky udávají dvoubajtovou hodnotu (hexxa) velikosti paketu ve FIFO pamČti. Hodnota 0x200h znamená velikost 512 B, což je zároveĖ maximum pro bulk endpoint, jak již bylo zmínČno v kapitole 2.9. Hodnoty nastavené v deskriptorech jsou stČžejní pro ovladaþ zaĜízení v poþítaþi. Pokud ve vlastním firmware nastavíte hodnoty jinak, ovladaþ se bude nadále Ĝídit tČmi s deskriptorĤ. V lepším pĜípadČ vše bude fungovat a jen neefektivnČ využijete FIFO pamČĢ. V horším pĜípadČ program nebude správnČ pracovat.
3.3 Nastavení endpointĤ a jejich prostoru ve FIFO ěadiþ EZ-USB má urþitá specifika nastavení jednotlivých endpointĤ. EP0 má pevnČ danou velikost paketu 64 kB. Dále je ještČ vyhrazen samostatný prostor 2x64 B pro EP1IN a EP1OUT. Tento endpoint je možné nastavit libovolnČ, jen zĤstává omezení na velikost pamČti. Pokud není potĜeba, není nutné jej použít, ale jemu vyhrazenou pamČĢ žádný jiný endpoint využít nemĤže. Pro další endpointy je vyhrazen prostor 4 kB, který je možné rozdČlit mezi až 4 endpointy (EP2, EP4, EP6 a EP8). Celkem Ĝadiþ podporuje pĜesnČ 12 možností konfigurace. Ty jsou znázornČny na Obr. 10.
18
Obr. 10 - Možné konfigurace endpointĤ na EZ-USB
V kapitole 3.2 byla ukázána konfigurace deskriptorĤ pro jeden vstupní endpoint. Tuto konfiguraci je nutné dodržet i ve vlastním programu. Inicializaci endpointĤ je nutné provést pĜi startu, tudíž je nejlepší ji umístit do funkce TD_Init(). Následující Ĝádky slouží k nastavení tohoto endpointu a vyhrazení jeho prostoru v pamČti FIFO: (3&)* [( QDVWDYHQLSDUDPHWUX(3 6<1&'(/$< (3%&/ [ DNWLYDFH(3 6<1&'(/$<
8bitový Registr EPxCFG obsahuje veškeré parametry endpointu. Tyto parametry jsou udány jednotlivými bity:
19
PoĜadí bitu:
Funkce:
Možná nastavení:
7
Validní endpoint
0 = neaktivní, 1 = validní
6
SmČr pĜenosu
0 = výstupní, 1 = vstupní
5-4
Typ pĜenosu
01 = izochronní, 10 = bulk, 11 = pĜerušovací
3
Velikost bufferu
0 = 512 B, 1 = 1024 B (lze použít pouze pro EP2 a EP6)
1-0
Poþet bufferĤ
00 = 4x, 10 = 2x, 11 = 3x
Tab. 1 - Nastavení registru EPxCFG
Hodnota 0x80h registru EP2CFG podle Tab. 1 znaþí validní vstupní endpoint typu bulk s 4x512 B bufferem. PĜíkaz SYNCDELAY se musí vkládat mezi pĜíkazy nastavení nČkterých registrĤ, aby jejich nastavení probČhlo v poĜádku. Aktivací nejvyššího bitu na registru EPxBCL se daný endpoint zprovozní s novým nastavením.
3.4 Registr IFCONFIG a nastavení þítaþe Jakmile jsou všechny endpointy nastaveny, je potĜeba nakonfigurovat registr þasovaþe. EZUSB má v sobČ interní generátor hodinového signálu schopný pracovat na 30 a 48 MHz. FIFO rozhraní mĤže využívat tohoto signálu, nebo mĤže pracovat s hodinovým signálem externího zdroje. Nastavení þasovaþe se provádí 8bit registrem IFCONFIG, jehož možnosti nastavení zobrazuje Tab. 2 a Obr. 11.
20
PoĜadí bitu:
Funkce:
Možná nastavení:
7
Zdroj signálu
0 = externí, 1 = interní
6
Frekvence vnitĜního generátoru hodinového signálu
0 = 30 MHz, 1 = 48 MHz
5
Výstup vnitĜního generátoru
0 = vypnutý, 1 = zapnutý (pouze pro interní generátor)
4
Polarita signálu
0 = normální, 1 = invertovaná
3
Režim FIFO
0 = synchronní, 1 = asynchronní
Tab. 2 - Nastavení registru IFCONFIG
VytvoĜil jsem pro potĜeby této þásti práce jednoduché zapojení (Obr. 12), aby bylo možné otestovat funkþnost pĜenosu. Interní hodinový signál je vyvedený pomocí IFCLK do 8bit þítaþe 74HC590. Všech 8 výstupních vývodĤ þítaþe je následnČ pĜivedeno na vstup FIFO (PB0 – PB7).
Obr. 11 - Nastavení hodinového signálu FIFO sbČrnice registrem IFCONFIG
Takové zapojení vyžaduje následující nastavení ve funkci TD_Init(): ,)&21),* [$
21
Z Tab. 2 vyplývá, že se tímto pĜíkazem nastaví interní zdroj hodinového signálu na frekvenci 30 MHz s vyvedením na IFCLK a že tento signál bude pro FIFO neinvertovaný vĤþi výstupu. ZároveĖ je tímto nastavením zajištČna synchronní práce FIFO. Invertovaná polarita hodinového signálu dává þítaþi více þasu na ustálení prĤbČhĤ, neboĢ do FIFO pamČti se hodnoty þítaþe uloží o polovinu periody pozdČji (inverze hodinového signálu se provádí až pro FIFO a lze ji tedy použít i v pĜípadČ externího signálu). Je dobré polaritu pĜepnout, pokud jsou pĜi ukládání dat do FIFO problémy.
RCK
Cypress EZ-USB
SLWR / SLOE
8bit DATA
PORTB
CCK Q0-Q7
74HC590
CCKEN
CCLR
G
IFCLK
UCC
Obr. 12 - Zapojení Ĝadiþe EZ-USB s þítaþem 74HC590 pro testování pĜenosu dat
Nižší frekvenci hodinového signálu (30 MHz) jsem zvolil zcela zámČrnČ, a to hned ze dvou dĤvodĤ. Prvním jsou omezené schopnosti použití þítaþe 74HC590 v testovacím zapojení (Obr. 12), který už pĜi 48 MHz nemĤže pracovat a druhým je rychlost samotného USB. Pro frekvenci 48 MHz je potĜeba pĜenášet 45,8 MB/s, což hodnota nedosažitelná s vČtšinou bČžných hostitelských ĜadiþĤ. Problematiku hostitelských ĜadiþĤ dále Ĝeším v kapitole 4.5. PĜi frekvenci hodinového signálu 30 MHz se pĜenáší data rychlostí 28,6 MB/s. Taková hodnota by nemČla být problémem pro vČtšinu hostitelských ĜadiþĤ ani pĜi neustálém zatížení.
22
3.5 PĜiĜazení FIFO k endpointu Posledním krokem k nastavení Ĝadiþe pro synchronní pĜenos do FIFO pamČti je vhodná konfigurace FIFO registrĤ jednotlivých endpointĤ zvaných EPxFIFOCFG. Protože je v tomto pĜípadČ využit pouze EP2, bude se nastavovat EP2FIFOCFG, a to následujícím zpĤsobem: (3),)2&)* [&
Tímto nastavením je zajištČn automatický bČh FIFO v 8bit režimu nezávisle na procesoru. Tento registr má stejnČ jako pĜedchozí také 8 bitĤ. Pro úþely této práce jsou však podstatné pouze první 4. Úþel jednotlivých bitĤ popisuje Tab. 3 (bit 1 nesmí být nikdy aktivní). PoĜadí bitu:
Funkce:
Možná nastavení:
3
ěízení FIFO
0 = manuální, 1 = automatické
2
Pakety nulové délky
0 = ignorovat, 1 = pĜijímat
0
ŠíĜka sbČrnice
0 = 8bit, 1 = 16bit
Tab. 3 - Nastavení registru EPxFIFOCFG
Pokud se program spustí s tímto nastavením, do FIFO by zatím žádná data neproudila. Za pomoci vývodĤ FIFOADR[1:0] na EZ-USB je ještČ nutné vybrat endpoint, který se s FIFO spojí. Možnosti nastavení vývodĤ ukazuje Tab. 4. Pro použití EP2 se oba vývody pĜipojí na zem. V synchronním módu se ukládají data do FIFO jen v pĜípadČ neaktivního signálu na SLOE a SLWR (u výstupních endpointĤ jde o SLRD) - Obr. 15. Endpoint
EP2
EP4
EP6
EP8
FIFOADR[1:0]
00
01
10
10
Tab. 4 - SpĜažení endpointu s FIFO podle nastavení FIFOADR[1:0
V tuto chvíli je nastavení hotovo. V hlavní smyþce programu TD_Pool() není nutné nic obsluhovat a do pamČti FIFO jsou data þtena rychlostí signálu interního generátoru
23
hodinového signálu. Pomocí aplikace CyConsole je možné ovČĜit, zda se do endpointu ukládají data. Tato aplikace umí vyvolat izochronní a bulk pĜenosy obČma smČry. Kompletní
zdrojový
kód
tohoto
firmware
lze
nalézt
na
CD
v adresáĜi
\HiSpeed_Transfer_Firmware.
3.6 FIFO Flag pĜíznaky PĜi urþitých aplikacích Ĝadiþe mĤže být vhodné sledování nČkterých pĜíznakĤ v souvislosti s chodem endpointĤ spĜažených s FIFO pamČtí. Tyto pĜíznaky se nazývají FIFO Flags a dokáží indikovat nČkteré stavy, které mohou nastat pĜi pĜenosu. ěadiþ nabízí pĜíznaky FLAGA, FLAGB, FLAGC a FLAGD. U prvních tĜí lze vybrat, zda pobČží v indexovaném þi fixním módu. ýtvrtý funguje jen s fixním nastavením. V indexovaném módu pĜíznaky pracují s endpointem nastavením vývody FIFOADR[1:0] a mají pevnČ danou funkci dle Tab. 5. PĜíznak
FLAGA
FLAGB
FLAGC
funkce
Programmable Level
Full Status
Empty Status
Tab. 5 - Funkce FIFO Flag pĜíznakĤ pro indexovaný mód
Fixní mód umožĖuje nastavit všechny þtyĜi pĜíznaky libovolnČ pomocí registrĤ PINFLAGSAB a PINFLAGSCD. Tato možnost je dĤležitá zejména pĜi použití více endpointĤ pro pĜenos dat.
4 Programování PC aplikace pro rychlý pĜenos dat V minulé kapitole jsem rozebral programové vybavení ze strany USB zaĜízení. S touto kapitolou postupnČ projdu použití univerzálního ovladaþe EZ-USB a všechny dĤležité sekvence pĜíkazĤ nutné k napojení na zaĜízení a zahájení rychlého pĜenosu. V závČru kapitoly jsou uvedeny dosažené rychlosti pĜenosĤ. K programování veškerého vybavení na stranČ poþítaþe jsem použil vývojové prostĜedí C++ Builder 6.0 firmy Borland. NemČl by však být
24
problém použít i konkurenþní vývojové prostĜedí pro C++ od firmy Microsoft. Na webových stránkách výrobce je ke stažení SDK mimo verze pro jazyk C++ i verze pro programovací jazyky rodiny .NET. V této práci se použitím .NET nebudu zabývat.
4.1 Univerzální ovladaþ CyUSB a CyAPI Spoleþnost Cypress dodává v SDK univerzální ovladaþ CyUSB, který dokáže obsloužit veškeré funkce Ĝadiþe. Výrobce poþítá s využitím tohoto ovladaþe jako základního stavebního kamene pro všechna zaĜízení založená na EZ-USB. S ovladaþem je zároveĖ dodáno i potĜebné objektové rozhraní CyAPI, které umožĖuje snadnou komunikaci se zaĜízením a díky kterému není nutné Ĝešit práci s USB nízkoúrovĖovČ. PĜiložený ovladaþ je urþen pro systémy Windows a nebyl problém s jeho použitím na 32bit systémech Windows XP a Windows Vista. Aby bylo možné pracovat v prostĜedí C++ Builder s USB zaĜízením, je potĜeba do zdrojového kódu pĜidat hlaviþkový soubor API pĜíkazem: LQFOXGH&\$3,K
Dále je nutné do vytvoĜeného projektu pĜidat knihovnu CyAPI.lib pomocí Project->Add to project… v hlavní nabídce vývojového prostĜedí.
4.2 Inicializace USB zaĜízení Pokud je k programu správnČ pĜipojeno rozhraní CyAPI, je možné zaþít s inicializací komunikace s USB zaĜízením. Na zaþátku programu je vhodné vytvoĜit potĜebné promČnné: &&\86%'HYLFH 86%'HYLFH &&\%XON(QG3RLQW HQGSW 18//
CyAPI si vytváĜí vlastní datové typy reprezentující urþité þásti USB zaĜízení. První Ĝádek bude reprezentovat pĜipojené zaĜízení a druhý bude pozdČji v programu použit pro endpoint EP2IN urþený ve firmware v kapitole 3.3. PromČnnou USBDevice je možné nastavit už na zaþátku programu, ale není to žádoucí v pĜípadČ, že by uživatel mohl zaĜízení pĜipojit až ve chvíli, kdy už program bČží. Inicializaþní
25
pĜíkazy je dobré vložit do samostatné funkce, která se mĤže provést uživatelem zahájenou inicializací, nebo napĜíklad pĜed zapoþetím pĜenosu. K propojení staþí do inicializaþní funkce pĜidat následující Ĝádek: 86%'HYLFH QHZ&&\86%'HYLFH18//
NáslednČ jsou pĜístupné všechny vlastnosti a tĜídy tohoto objektu, tedy samotného USB zaĜízení. Vhodným zaþátkem je nyní zjištČní poþtu endpointĤ, neboĢ ty je potĜeba v cyklu projít, aby bylo možné najít, který odpovídá požadované adrese EP2IN (0x82h). To zajistí tyto Ĝádky kódu: HSW&RXQW 86%'HYLFH!(QG3RLQW&RXQW IRULQWL LHSW&RXQWL ^ LI86%'HYLFH!(QG3RLQWV>L@!$GGUHVV [ ^ HQGSW &&\%XON(QG3RLQW 86%'HYLFH!(QG3RLQWV>L@ ` `
Prvním Ĝádkem program zjistí poþet endpointĤ zaĜízení vþetnČ EP0. NáslednČ v cyklu projde všechny endpointy a ptá se, zda odpovídají adresou endpointu EP2IN. Vhodný endpoint se pĜiĜadí k promČnné endpt. Takto zinicializovaným endpointem je nyní možné pĜenášet data.
4.3 Nastavení pĜenosĤ a zátČž procesoru Pro vhodné nastavení pĜenosĤ dat je potĜeba správnČ pochopit, jak vlastní pĜenos funguje. V minulých kapitolách to bylo postupnČ vysvČtlováno po stránce teorie. V této kapitole je ukázán praktický vliv nastavených hodnot. Parametrem, který znaþnČ ovlivĖuje výslednou rychlost, je délka jednotlivých pĜenosĤ. Je nutné volit kompromis mezi nízkou latencí a velkou rychlostí. V pĜípadČ krátkých pĜenosĤ je USB Ĝadiþ zatížen množstvím režijních paketĤ, což zpĤsobuje vysokou zátČž procesoru. StandardnČ je nastavena velikost v Ĝádu jednotek kilobajtĤ. V ideálním pĜípadČ je pak možné dosáhnout maximálnČ rychlosti kolem 12 MB/s pĜi 100% zatížení jednoho jádra CPU (mČĜeno s procesorem Intel Core Duo T2050 na 1,6 GHz).
26
Obr. 13 - VytvoĜená aplikace na mČĜení rychlosti pĜenosu (vlevo generátor hodinového signálu na 30 MHz, vpravo na 48 MHz)
Délka pĜenosu by mČla být dČlitelná osmi. Jak již bylo zmínČno, velké pakety jsou automaticky dČleny, takže tento problém programátor nemusí nijak Ĝešit. Pro optimální snížení režie je dobré použít pĜenosy délky alespoĖ 64 kB. PĜi délce 256 kB by nemČl být problém na moderním poþítaþi dosáhnout maximální rychlosti. U této aplikace je prioritou maximální rychlost, tudíž je zvolena délka pĜenosu právČ 256 kB pĜíkazem: HQGSW!6HW;IHU6L]H YHOLNRVWY%DMWHFK
PĜi této délce pĜenosĤ je i pĜi maximální rychlosti zátČž moderních procesorĤ kolem 30%. Pokud je zaĜízení navrženo jen pro pĜenos jednoho typu dat, je vhodné tento Ĝádek pĜidat na konec inicializaþní sekvence.
4.4 PĜenos dat s využitím funkce XferData PĜenosy obČma smČry se provádí pomocí funkce XferData volané následujícím zpĤsobem: HQGSW!;IHU'DWDGDWD%XIOHQ)
PromČnná lenF urþuje požadovanou velikost pĜenášených dat a dataBuf pĜedstavuje prostor, kam budou data nahrána (vstupní endpoint), pĜípadnČ odeslána (výstupní endpoint). Velikost pĜenášených dat nemusí odpovídat délce pĜenosu nastavené v kapitole 4.3. Ovladaþ i
27
na této vyšší úrovni automaticky dČlí pĜenášená data na délku pĜenosu. Nejlepší však je zvolit obČ hodnoty stejnČ. V pĜípadČ synchronního pĜenosu nastaveného pomocí popisovaného firmware se do endpointu neustále pĜesouvají data z FIFO pamČti. Funkci XferData lze tedy volat opakovanČ ve smyþce. Ovladaþ vždy þeká, až je endpoint naplnČn, takže další pĜijatá data vždy pokraþují až tam, kde pĜedchozí pĜenos skonþil. Data je nutné odebírat dostateþnou rychlostí, než se zaplní všechny buffery. V tomto pĜípadČ jsou nastaveny (dle kapitoly 3.3) 4 buffery o velikosti 512 B (maximum pro bulk pĜenos).
4.5 Výsledky, dosažené rychlosti pĜenosu Dosažené výsledky pro mČ byly pĜíjemným pĜekvapením. Ukázalo se, že s mnou zvoleným nastavením není problém pĜenášet data rychlostí 28,6 MB/s (30 MHz). Z toho vyplývá, že se pĜenáší všechna data snímaná z FIFO bez ztráty jediného paketu. Zde je vhodné upozornit, že pro synchronní pĜenos byla rychlost pĜenosu pĜi nastavení synchronního pĜenosu v práci Bc. Pavla Souþka jen 14,0 MB/s. Nastavení popsané v mé práci se liší pĜedevším ve dvou parametrech. EP2 využívá dvakrát vČtšího množství bufferĤ, což poskytuje více þasu, než se data zahodí, v pĜípadČ, že systém v nevhodnou chvíli pĜiĜadí procesorový þas jiné aplikaci. PodstatnČjší zmČnou však je nastavení vhodnČjší délky pĜenosu. Toto nastavení v manuálech k Ĝadiþi není dostateþnČ vysvČtleno, takže bylo nutné bádat na zahraniþních internetových diskuzích. Vyzkoušel jsem rychlost pĜenosu pĜi generátoru hodinového signálu nastaveném na 48 MHz. PĜi tomto nastavení bylo dosaženo rychlosti 43 MB/s. Pro kontinuální snímání už tato frekvence nejde použít, ale pokud by se použil vhodný externí signál napĜíklad na 40 MHz, bylo by možné dosáhnout velmi dobrých rychlostí pĜi zachování pĜenosu všech paketĤ. Rychlost 43 MB/s není možné pĜesáhnout, a jedná se tedy o maximum. PĜedpokládám, že problém není v samotném Ĝadiþi ale v implementaci hostitelského USB Ĝadiþe. Nejlepší volbou pro rychlý pĜenos jsou hostitelské Ĝadiþe spoleþnosti Intel v aktuálnČ používaných
28
þipových sadách Intel 96x a Series 4 (ICH-8, ICH-9). PĜi testu se starším Ĝadiþem v ICH-7M (þipová sada Intel 94x) nebylo možné pĜekroþit rychlost 35 MB/s, která je charakteristická pro více starších hostitelských ĜadiþĤ. Nejhorší situace se ukázala u spoleþnosti ATI/AMD, kde vinou implementace v þipových sadách Xpress 200(M)/11x0(M)/12x0(M) není možné dosáhnout s jakýmkoli zaĜízením rychlosti vyšší než 25–30 MB/s. O chybČ ĜadiþĤ AMD ví, ale chyba byla zakotvena pĜíliš hluboko v návrhu, takže ji nikdy neopravilo. Nové Ĝadiþe ATI SB600 v základních deskách z roku 2008 tímto problémem už netrpí.
5 Využití EZ-USB jako logického analyzátoru S využitím USB Ĝadiþe EZ-USB se není nutné omezovat jen na pĜenos obrazu, potažmo videa. Jeho rychlý pĜenos lze použít relativnČ snadno pro potĜeby jednoduchého logického analyzátoru schopného pracovat i na frekvencích kolem 40 MHz s 8 kanály (pĜípadnČ 20 MHz s 16 kanály). Proti komerþním zaĜízením však zĤstává nízká cena (~1000,- Kþ), díky které mĤže jít o vhodnou pomĤcku pro výuku. Tuto kapitolu jsem se rozhodl zaĜadit v práci pĜed pĜenos videa, neboĢ je mnohem blíže pĜenosu obecných dat a v nČkterých ohledech bych se musel tématicky vracet.
5.1 Možnosti zapojení obvodu a úpravy firmware PĜi návrhu je potĜeba brát v potaz jeden dĤležitý fakt: EZ-USB je rychlé jen za pĜedpokladu, že mikrokontrolér nezpracovává pĜijímaná data. ěízení FIFO sbČrnice se musí pĜenechat jednotce GPIF, která nabízí mnohem ménČ možností nastavení. Lze zmČnit frekvenci zápisu dat do FIFO a urþit, kdy se má signál snímat. K prvnímu je nutné využít jednu ze dvou frekvencí (30 MHz, 48 MHz) generátoru hodinového signálu pĜímo v Ĝadiþi, nebo zvolit externí generátor (vývod IFCLK), který musí mít vlastní frekvenci v rozmezí 5– 48 MHz. Druhé se Ĝeší hodnotou signálu SLWR (Obr. 15). Pokud je vývod pĜipojen na zem, bČží snímání neustále. Pro potĜeby této þásti práce byla vytvoĜena jednoduchá aplikace schopná ukládat mČĜené prĤbČhy rovnou na disk. Mimo to umožĖuje z mČĜeného prĤbČhu zobrazit graficky jeho
29
poþátek (maximálnČ 200 vzorkĤ). Celá aplikace je stejnČ jako firmware navržena pro práci s 8 kanály, ale k pĜepracování na obsluhu 16 kanálĤ staþí pracovat s lichými bajty jako první polovinou kanálĤ a se sudými bajty jako druhou polovinou kanálĤ. V aplikaci je i nČkolik základních funkcí. Je možné použít jako hodinový signál nČkterý z kanálĤ a aplikace následnČ oĜízne nepotĜebné a opakující se nadbyteþné hodnoty. Poslední funkcí je zobrazení hodnoty bitĤ v reálném þase pro pomalé prĤbČhy. Celou aplikaci lze nalézt na pĜiloženém CD a v adresáĜi \USB-LA.
Datové vstupy (8bit)
8bit DATA
PORTB
Povolení snímání
-1
SLWR
IFCLK
Vstup hodinového signálu
Cypress EZ-USB
Obr. 14 - Blokové schéma logického analyzátoru s využitím externího hodinového signálu a Ĝízení snímání dle SLWR
Možné pokroþilejší zapojení ukazuje Obr. 14. ěízení signálu SLWR zde má velký význam v pĜípadČ, že je potĜeba odebrat prĤbČh jen v urþitém þasovém úseku. Po celou dobu takového úseku nesmí být signál aktivní. Takové Ĝešení mĤže být vhodné v laboratoĜích pĜi práci s mikrokontroléry. Student mĤže vyhradit jeden programovatelný vývod k propojení se SLWR a ovládat jeho hodnotu pĜíkazy, které budou ohraniþovat þást kódu, kde je mČĜení zamýšleno. ýasování FIFO pamČtí by bylo v takovém pĜípadČ pro nejefektivnČjší funkþnost Ĝízeno generátorem hodinového signálu mČĜeného zaĜízení. V pĤvodním firmware staþí upravit pouze nastavení tohoto signálu pĜíkazem: ,)&21),* [
30
5.2 Zpracování dat v reálném þase Veškeré zpracování dat se mĤže vykonávat až na stranČ poþítaþe, což frekvencích 20– 40 MHz vytváĜí vČtší nároky na procesorový þas už jen z hlediska samotného pĜenosu. Další zpracování dat za bČhu tudíž pĜináší mnoho omezení. V žádném pĜípadČ není možné procházet všechny namČĜené vzorky ve chvíli, kdy se pĜenesou. Pokud se ví, že nČjaký dĤležitý signál bude mít urþitou hodnotu delší dobu, je možné procházet jen nČkteré vzorky v takovém intervalu, aby bylo jisté, že se potĜebný signál zachytí. S poþtem vynechaných vzorkĤ se snižují nároky na þas procesoru. Aby byl procesor Intel Core Duo ~1,6 GHz schopen zpracovat data pĜi hodinovém signálu 30 MHz, je potĜeba vynechávat kolem 100 vzorkĤ. Tím se reálná frekvence snímání snižuje na 300 kHz. Do mé aplikace jsem pro velmi pomalé signály pĜidal možnost zobrazení hodnoty jednotlivých kanálĤ pĜímo pĜi mČĜení. Vzhledem k omezením rychlosti grafického rozhraní Windows je možné maximálnČ (standardními prostĜedky) dosáhnout jen Ĝádu desítek až stovek Hz.
Obr. 15 - Synchronní mód zápisu do FIFO pamČti (zápis Ĝízen signálem SLWR)
5.3 Zpracování dat po ukonþení mČĜení Mnohem efektivnČjší možností je zpracování dat až po jejich domČĜení. SpuštČní a ukonþení mČĜení lze Ĝídit signálem SLRW (ovlivnČní zápisu do pamČti signálem SLRW ukazuje Obr. 15) dle zapojení na Obr. 14, programovČ, nebo kombinací obou zpĤsobĤ. PĜi kombinaci je možné sledovat v intervalech konkrétní signály a v pĜípadČ splnČní definované podmínky zaþít zaznamenávaná data ukládat do pamČti (pĜípadnČ na disk) po urþitý þas a následnČ provést jejich zpracování.
31
Jednoduché zpracování dat je pĜedvedeno ve vytvoĜené aplikaci (adresáĜ na CD: \USB-LA). Pokud se aktivuje pĜepínaþ Ukládat na disk, lze tlaþítkem Zobrazit prĤbČh vykreslit þást zmČĜených dat. Program zobrazuje standardnČ data ze zaþátku mČĜení.
Obr. 16 - Snímání s frekvencí interního generátoru hodinového signálu 30 MHz
Funkce Zjistit cyklus hodin na zvoleném kanálu testuje periodu opakování signálu. V pĜípadČ, že detekuje vhodný (stálý) hodinový signál zobrazí pouze vzorky s nábČžnou hranou tohoto signálu. Tento zpĤsob Ĝešení mĤže být vhodný pĜi mČĜení na zaĜízení s ĜádovČ nižší rychlostí v pĜípadČ, že logický analyzátor nemĤže využívat jeho hodinový signál. Zobrazený prĤbČh se tak zbaví duplicitních hodnot. Tuto funkci názornČ ukazuje výstup programu na Obr. 17 (jde o stejný prĤbČh jako na Obr. 16).
32
Obr. 17 - Programové urþení hodinového signálu vybraným (3) vstupním datovým vodiþem
5.4 RozdČlení zátČže na více jader procesoru NarĤstající poþet vícejádrových procesorĤ na trhu znaþnČ zvyšuje možnosti celého popisovaného Ĝešení. V dnešní dobČ je již drtivá vČtšina nových stolních poþítaþĤ a notebookĤ vybavena dvoujádrovými procesory. Do stolních poþítaþĤ jsou dokonce cenovČ velmi dostupná Ĝešení procesorĤ s þtyĜmi jádry. Proto byla aplikace naprogramována ve více vláknech, aby se využilo maximum výkonu celého procesoru. Na Obr. 18 je ukázáno rozdČlení programu na dvČ výpoþetnČ nároþná vlákna. Hlavní vlákno Ĝeší obsluhu grafického rozhraní a ovládání jednotlivých funkþních tlaþítek – toto vlákno není nijak procesorovČ nároþné a jeho oddČlení od výpoþetnČ nároþných þástí pĜináší výhody zejména v kratší odezvČ tlaþítek bČhem mČĜení (týká se i procesorĤ s jedním jádrem). V pĜípadČ zapoþetí mČĜení se vytvoĜí další dvČ vlákna. Jedno obsluhuje USB Ĝadiþ a spouští
33
funkci USBGetData(), druhé Ĝeší veškeré další zpracování dat a spouští funkci USBParseData().
Vlákno USBGetData()
NE
Je volný prostor? ANO
Inkrementace ukazatele na blok k zápisu
Platná data 14 (64 kB)
Platná data 12 (64 kB)
Platná data 11 (64 kB)
Platná data 10 (64 kB)
Zpracováná data (pĜipravená k pĜepsání novými)
Platná data 13 (64 kB)
Zápis do bufferu
ýtení z USB
ýtČní z bufferu ANO
Jsou platná data?
NE
Inkrementace ukazatele na blok k þtení
ýekání
Volný prostor
Vykonání vybraných operací
Vlákno USBParseData()
ýekání
Obr. 18 - OddČlení komunikace s USB zaĜízením a zpracování pĜenesených dat
Funkce USBGetData() provádí opakovanČ þtení z endpointu EP2 a data ukládá do programem vytvoĜené vyrovnávací pamČti. Voláním funkcí CyAPI na sebe pĜebírá veškerou zátČž procesoru spojenou s USB pĜenosy. Funkce USBParseData() postupnČ tahá data z vyrovnávací pamČti a provádí na nich pĜíslušné operace (implementováno pouze zobrazení aktuální hodnoty v reálném þase a ukládání na disk). Pokud je vybráno zobrazování aktuální hodnoty v reálném þase a zvolí se velmi krátký interval aktualizace zobrazení, je znatelné zatížení procesoru tímto vláken. Takové nastavení posloužilo k testování zatížení procesoru na jednotlivých jádrech. Na Obr. 19 je ukázáno, jak systém automaticky rozdČlil obČ procesorovČ nároþná vlákna na samostatná jádra procesoru.
34
Obr. 19 - Rozložení výpoþetnČ nároþných vláken logického analyzátoru na obČ jádra procesoru (mČĜení na procesoru Core 2 Duo @ 1 GHz)
Aktuální dČlení umí využít maximálnČ dvou jader procesoru, neboĢ výpoþetnČ nároþná vlákna jsou za každých okolností vždy jen dvČ. Návrh programu by bylo možné vhodnČ zmČnit a použít na každou funkci zpracování výsledkĤ samostatné vlákno. Tento zpĤsob by šel zkombinovat také s dČlením tČch nejnároþnČjších funkcí na více vláken ve smyslu paralelního zpracování více (nČkolika za sebou) vzorkĤ najednou. V souþasné dobČ tento zpĤsob ještČ nejspíše nemá takový smysl, ale brzy se mají objevit na trhu 8jádrové procesory pro osobní poþítaþe a v budoucích letech má Intel plány na použití až 64 (pomalejších) jader v jednom procesoru.
5.5 Výsledky a možnosti nasazení PĜi realizaci této þásti práce se ukázalo, že Ĝadiþ EZ-USB mĤže bez problému sloužit jako rychlý „sbČraþ“ dat do frekvence 40 MHz pro realizaci logického analyzátoru s výpoþetní jednotkou v podobČ vlastního poþítaþe. Toto Ĝešení má úzké hrdlo pouze v rychlosti procesoru a pevného disku. Omezení daná procesorem je možné obejít zpracováním dat až po ukonþení mČĜení (kapitola 5.3) nebo pĜípadnČ snahou využít jej co nejefektivnČji (kapitola 5.4). Pevný disk je brzdou spíše u notebookĤ, kde se používají menší disky aktuálnČ s rychlostí 30– 60 MB/s (dle pozice hlavy na plotnČ). Není však problém nalézt i starší notebooky vybavené USB 2.0 a diskem s rychlostí 15–25 MB/s. Samotný disk však není velká investice a v pĜípadČ poþítaþĤ jsou vČtšinou hodnoty rychlosti o 30–50% vyšší. S úspČšnou aplikací logického analyzátoru se zároveĖ nabízí další dvČ užití – osciloskop a programovatelný generátor prĤbČhĤ. V pĜípadČ osciloskopu by staþilo pĜed vstupy FIFO
35
umístit ochranné obvody a analogovČ-digitální pĜevodníky. Výsledkem by byl osciloskop s frekvencí až 40 MHz v pĜípadČ jednoho kanálu a 20 MHz v pĜípadČ kanálĤ dvou. U generátoru by se místo vstupního endpointu použil výstupní se stejnými parametry. Omezení generátoru by pouze udávala složitost simulované funkce a schopnost procesoru rychle generovat potĜebné vzorky. Pokud by se však i složitČjší funkce nasimulovaly dopĜedu a následnČ se v nich provádČly jen jednoduché poþetní operace, omezení by nebyla nijak drastická.
6 PĜenos videa ze senzoru SPART3KAM VýmČnou za poskytnuté informace o nastavení pro rychlý pĜenos a také z þasových dĤvodĤ mi byl pro potĜeby práce zapĤjþen Ing. Jaroslavem TĜeštíkem mČĜicí modul vybavený VGA CMOS senzorem spoleþnosti Kodak, hradlovým polem Spartan a nejmenší variantou Ĝadiþe EZ-USB (56 vývodĤ). V této þásti práce rozeberu zapojení a princip celého mČĜicího modulu a proberu nČkolik klíþových bodĤ ohlednČ zpracování videa následnČ v poþítaþi. Pro tyto úþely vznikla testovací aplikace (Obr. 20), kterou lze nalézt na pĜiloženém CD v adresáĜi \VideoStreaming. Na závČr v této þásti práce proberu možnosti použití EZ-USB jakožto Ĝídící jednotky pro CMOS senzor.
36
Obr. 20 - Vzhled vytvoĜené aplikace
6.1 CMOS senzor KODAK KAC-9618 KAC-9618 je 48vývodovým monochromatickým obrazovým snímaþem se snímací plochou jedné tĜetiny palce. MĜížka senzoru má rozlišení 664x504, pĜiþemž je aktivních 648x488 bodĤ. Snímaþ je schopen v takovém rozlišení generovat 30 snímkĤ za sekundu (fps) pĜi až 12bit hloubce každého snímaného bodu. Blokové schéma senzoru ukazuje Obr. 21.
37
Obr. 21 - Blokové schéma CMOS senzoru KAC-9618
Pro potĜeby práce je intenzita každého pixelu udávána 8 bity, neboĢ tak je následnČ nejjednodušší zobrazení v poþítaþi, který taktéž využívá 8 bitĤ na jeden barevný kanál. Nastavení senzoru provádí modul automaticky po zavedení programu hradlového pole SPARTAN. V této práci nebudu rozebírat jednotlivá nastavení senzoru. Všechna jsou pĜehlednČ popsána v datasheetu [4].
Obr. 22 - PrĤbČh synchronizaþních pulzĤ (svČtle šedá – synchronizace prvního pixelu Ĝádku, šedá – prodleva mezi snímky, tmavČ šedá – prodleva mezi Ĝádky)
PĜenos obrazu ze senzoru vyžaduje dostateþnČ vysokou rychlost pĜenosu po celou dobu snímání. Senzor nemá žádnou snímkovou pamČĢ a jediná vyrovnávací pamČĢ (2 kB) je tvoĜena pamČtí vyhrazenou pro endpoint na Ĝadiþi EZ-USB. Pokud by poþítaþ nestaþil dostateþnČ rychle pĜenášet data, snímané pixely by nebylo možné uložit a pĜenos obrazu by se nezdaĜil. Mimo pĜenosu dat je také nutné zajistit generování vhodných a pĜedevším vþasných signálĤ pro synchronizaci obrazu. PrĤbČh tČchto signálĤ pro použité progresivní snímkování (snímek se pĜenáší celý) ukazuje Obr. 22.
38
6.2 Zapojení hradlového pole Xilinx SPARTAN XCS200 Programovatelné hradlové pole SPARTAN je umístČno mezi CMOS senzorem a USB Ĝadiþem (Obr. 23). Jeho úlohou je generování Ĝídících signálĤ pro snazší pĜenos do USB Ĝadiþe a k ovládání senzoru. Použití hradlového pole usnadĖuje práci USB Ĝadiþi, který dostává þistá obrazová data, která je možné v nezmČnČné podobČ pĜenášet do PC a v nČm
Posílání pĜíkazĤ a nahrávání programu
D0 - D7
Cypress EZ-USB
SDA / SCL
SYNC / CLOCK / SNAPSHOT
CMOS senzor
SDA / SCL
8bit DATA
Synchronizace / Ĝízení senzoru
SPI
8bit DATA
PORTB
Xilinx SPARTAN
PORTD
Synchronizace / urþení platných dat k þtení
IFCLK / SLWR / INT0
následnČ bez složitých úprav rovnou vykreslit.
I2C - nastavení registrĤ senzoru
Obr. 23 - Blokové schéma zapojení souþástí modulu SPART3KAM
6.3 DĤležité zmČny ve firmware K mČĜicímu modulu byla Ing. Jaroslavem TĜeštíkem dodána i speciální aplikace, která celý modul programuje, protože firmware v USB Ĝadiþi musí Ĝešit nastavení všech ostatních þipĤ a ve speciálním módu programuje hradlové pole SPARTAN k požadované funkci. Vlastní nastavení pro rychlý pĜenos dat pĜes USB se však neliší a neliší se také nastavení k tomu urþeného endpointu EP2IN.
39
Hlavní rozdíl z hlediska komunikace spoþívá v pĜidání dalších dvou endpointĤ typu bulk – EP1IN a EP1OUT. Velikost tČchto endpointĤ je omezena na 64 B pro každý (vysvČtlení: kapitola 3.3) a jsou urþeny pro posílání pĜíkazĤ do zaĜízení a þtení jeho odpovČdí. Použitím endpointĤ typu bulk je zachováno stejné ovládání pĜenosĤ jako pro endpoint EP2 (vysvČtlené v kapitole 4.4). Zda se stihl pĜenést celý obrázek, je možné kontrolovat pomocí FIFO Flag pĜíznakĤ, s jejichž pomocí je možné zjistit, která þást dat v rámci jednoho snímku se ztratila. V pĜípadČ, že se aplikaci v poþítaþi nebude snažit zobrazit co nejvíce z neúplného obrázku, lze využít mnohem snazší metody (ta je použita i zde). Aplikace oþekává, že probČhne pĜenos o velikosti kompletního obrázku, takže v pĜípadČ ztráty libovolného množství dat, nahlásí funkce pro pĜenos (XferData) chybu a pĜijatá data se zahodí. Pokud je obraz snímán o rychlosti alespoĖ 20 snímku za sekundu, uživatel si nevšimne, že pĜedchozí obrázek byl zobrazen po dobu dvakrát delší, než je standardní.
Zpracování pĜíkazu od PC aplikace Aby mohl USB Ĝadiþ okamžitČ zpracovávat pĜijaté pĜíkazy pĜes EP1OUT, využívá se pĜerušení pro tento endpoint. To se aktivuje pĜi startu firmware pĜíkazem: (3,(_ EP%,7ELW (3287
V 8bit registru EPIE každý jednotlivý bit povoluje nČjaké pĜerušení. V pĜípadČ, že pro daný bit není pĜerušení povoleno, není možné ho v programu žádným zpĤsobem vyvolat. Jakmile PC aplikace vyšle pĜíkaz na EP1OUT, v zaĜízení se zavolá funkce ISR_Ep1out(). Pro komunikaci jsou použity pĜíkazy definované jedním znakem. Další volitelné znaky slouží jako parametry daného pĜíkazu. Tento kód ukazuje obsloužení pĜerušení: YRLG,65B(SRXWYRLG LQWHUUXSW ^ ),)25(6(7 [REVDK(3287RYOiGiSURFHVRU 6<1&'(/$< VZLWFK(3287%8)>@ SŏHþWHQtSUYQtKR]QDNXSŏHQRVX ^
EORN\NyGXSURStVPHQDSŏtND]š
`
SULSUDYHQL(3QDGDOãtSŏHUXãHQt
40
),)25(6(7 [ (3287%& (=86%B,54B&/($5 (3,54 EP%,7 `
USB Ĝadiþ dále mĤže odeslat zprávu o úspČšném provedení pĜíkazu pomocí EP1IN napĜíklad tímto zpĤsobem: (3,1%8)>@ 2 (3,1%8)>@ . (3,1%8)>@ [G (3,1%& SRþHWEDMWšNSŏHQHVHQtDXWRPDWLFN\VHSURYHGH
Ovládání senzoru Nastavení parametrĤ senzoru se dle Obr. 23 provádí pomocí I2C sbČrnice (funkce I2CReadByte a I2CSendbyte), která spojuje senzor a USB Ĝadiþ. PĜenos obrazu využívá pouze prvních 8 datových vodiþĤ FIFO sbČrnice (PORTB). Komunikace s hradlovým polem je Ĝešena programovČ realizovanou SPI sbČrnicí na nevyužitých vodiþích (PORTD; zbylých 8 datových vodiþĤ FIFO). ýást programu ukazující kompletní obsluhu pĜerušení EP1OUT je na pĜiloženém CD v adresáĜi \Trestik_SPART3KAM.
6.4 Nastavení endpointu pro pĜenos obrazu ZpĤsobem popsaným v kapitole 3.3 je nutné inicializovat další dva endpointy. Pro EP1OUT je adresa 0x01h a pro EP1IN 0x81h. EP2IN jsem ve své aplikaci pro pĜenos obrazu nazval streamEndpt. Proti nastavení z kapitoly 4.3 je potĜeba zmČnit velikost pĜenosu pĜesnČ na velikost jednoho pĜeneseného snímku. Tím se zajistí minimální režie procesoru v poþítaþi, a tudíž i nejvČtší rychlost. Inicializace EP2 by mČla vypadat takto: VWUHDP(QGSW!6HW;IHU6L]H)5$0(B6,=( )5$0(B6,=( [ VWUHDP(QGSW!7LPH2XW
Druhý Ĝádek slouží k nastavení doby þekání na dokonþení pĜenosu. Na pĜenos se þeká zejména, pokud nedorazí kompletní snímek. V kapitole 6.3 jsem zmínil, že v tomto pĜípadČ se
41
nekompletní snímky zahazují. Je tedy dobré nastavit menší hodnotu þekání (standardnČ jsou 2 sekundy), aby se pĜenos dalších zbyteþnČ nezdržoval.
6.5 PĜenos snímkĤ Pro pĜenos jednoho snímku jsem vytvoĜil funkci getFrame(), která obsluhuje vyslání pĜíkazu na EP1OUT a následný pĜesun dat z EP2IN. Její prĤbČh popisuje diagram na Obr. 24. K odeslání dat se používá opČt funkce XferData. Takto vypadá kód odeslání pĜíkazu pro pĜíjem jednoho snímku: XQVLJQHGFKDU]SUDYD>@ 65åiGRVWRVQtPHN ]SUDYD>@ ]SUDYD>@ GYDEDMW\DGUHVD ]SUDYD>@ ]SUDYD>@ GYDEDMW\GDWD FRQWURO(QGSW!;IHU'DWD]SUDYD
Žádost o snímek
Chyba
Chyba
NE
NE
ÚspČšné?
ANO
PĜenos snímku
ÚspČšné?
ANO
Vykreslení
Obr. 24 - Funkce getFrame()
Funkci getFrame() lze využít také pro snímání videa, což je v ukázkové aplikaci implementováno a lze to vyzkoušet tlaþítky Start a Stop. ýíslem pod tČmito tlaþítky je nastaveno, jak þasto se má funkce volat. Tímto zpĤsobem je možné pĜenášet video v plné rychlosti snímaþe (30 fps), pokud poþítaþ dostateþnČ rychle zpracuje vykreslení obrazu. Pokud se mu to nepodaĜí, musí každý druhý snímek vynechávat (15 fps). PĜenos jednotlivých paketĤ ukazuje výstup programu USBTrace na Obr. 25.
42
Obr. 25 - Výstup programu USBTrace ukazující pĜenosy na sbČrnici (pakety s délkou 6 B jsou žádostí o snímek, který se následnČ pĜenáší paketem s délkou 312 kB)
MČĜicí modul umožĖuje snímat i bez nutnosti žádat o každý snímek. To se provádí pĜíkazem „Z“ a od jeho poslání se snímá video neustále na plné rychlosti.
6.6 Vykreslení snímku K vykreslení pĜenesených snímkĤ jsem použil základních funkcí Windows GDI implementovaných ve vývojovém prostĜedí C++ Builder. Vykreslení probíhá na objekt typu Tbitmap: *UDSKLFV7%LWPDS S%LWPDS QHZ*UDSKLFV7%LWPDS
Vykreslit desítky snímkĤ ve VGA rozlišení vyžaduje urþité optimalizace. Vzhledem k tomu, že v pĜenášeném obrazu je intenzita každého pixelu reprezentována 8 bity, je nejlepší pracovat i pĜi vykreslení s 8bit formátem. U tohoto formátu se musí používat uživatelsky definovaná paleta, aby bylo možné zobrazit snímek bez degradace kvality zobrazení. Paletu stupĖĤ šedi vytváĜí tento kód: /2*3$/(77( SDO /2*3$/(77( PDOORFVL]HRI/2*3$/(77( ? VL]HRI3$/(77((175< SDO!SDO9HUVLRQ [ SDO!SDO1XP(QWULHV IRUVKRUWL LL ^
43
SDO!SDO3DO(QWU\>L@SH*UHHQ %\WH L SDO!SDO3DO(QWU\>L@SH5HG SDO!SDO3DO(QWU\>L@SH*UHHQ SDO!SDO3DO(QWU\>L@SH%OXH SDO!SDO3DO(QWU\>L@SH*UHHQ ` +3$/(77(KSDO &UHDWH3DOHWWHSDO
Jakmile je snímek pĜesunut do poþítaþe, lze ho vykreslit následujícím zpĤsobem: %\WH SRLQWHU IRULQWURZ URZURZ SRVWXSQęSURFKi]tYLGLWHOQpŏiGN\ ^ SRLQWHU %\WH S%LWPDS!6FDQ/LQH>URZ@ PHPFS\SRLQWHUIUDPH'XPSURZ PHPFS\SRLQWHUIUDPH'XPSURZ SŏHQRVŏiGNXGRELWPDS\ ` 0DLQ)RUP!2XWSXW,PDJH!3LFWXUH!$VVLJQS%LWPDS Y\NUHVOHQt
Vykreslování pomocí Windows GDI je nejjednodušším možným zpĤsobem vykreslení, má ovšem hned dvČ velké nevýhody: obraz není možné rychle vykreslovat v jiném než pĤvodním rozlišení a vykreslení je Ĝízeno procesorem. Pokud není dostateþnČ rychlý procesor, vykreslení snímku trvá déle než doba mezi dvČma pĜenosy pĜi rychlosti snímání 30 fps.
6.7 Akcelerace vykreslování grafickou kartou ZaĜízení procesoru pĜi vykreslování lze ĜádovČ snížit pĜenesením tohoto úkonu na grafickou kartu. Grafická karta nabízí dva zpĤsoby akcelerace: pomocí video overlay a s využitím 3D API. První možnost byla implementována do vČtšiny grafických karet v roce 1998 (poþítaþe s Pentium II procesory) a není již dnes doporuþována od pĜíchodu Windows Vista jehož grafické jádro vykresluje vše pomocí 3D funkcí grafické karty. Pro operaþní systémy Windows se momentálnČ používají pro akceleraci 3D grafiky rozhraní Direct3D a OpenGL. Použití aktuální verze Direct3D je však v C++ Builderu velmi komplikované a vestavČná 8 let stará verze není vhodná z dĤvodu možný problémĤ s kompatibilitou. Do testovacího programu jsem chtČl implementovat akceleraci pomocí rozhraní OpenGL, ale z þasových dĤvodĤ to nebylo možné. Tuto metodu jsem již dĜíve s úspČchem použil v dĜívČjších projektech a rychlost vykreslení se znatelnČ zvýšila. Zjednodušený postup vykonávání programu na Obr. 26 ukazuje výhodu vykreslování s pomocí grafické karty.
44
Žádost o pĜekreslení
nahrání textury
ýekání na snímek
PĜenos snímku z USB
PĜekreslení okna
Procesor
PĜesun do VRAM
Grafická karta
PĜenos snímku z USB
Vykreslení ještČ probíhá, ale procesor už pracuje na pĜíjmu nového snímku
Obr. 26 - PrĤbČh zpracování videa s použitím akcelerace grafickou kartou
Vykreslování je nutné nastavit do ortogonálního zobrazení, þímž se eliminuje transformace bodĤ vlivem perspektivy. NáslednČ staþí vytvoĜit þtyĜúhelník (polygon) pĜes celý prostor okna, do kterého lze kreslit (viewport). PĜi každém obdržení nového snímku se pošlou data do pamČti grafické karty a pĜiĜadí se jako textura vytvoĜenému þtyĜúhelníku. NáslednČ staþí zavolat pĜekreslení obrazu (resp. viewportu). Hlavní výhodou Ĝešení je rozdČlení zátČže mezi grafickou kartu a procesor. Na rozdíl od standardního vykreslování v prostĜedí C++ Builder je výraznČ snazší oddČlení do vlastního vlákna. Pak se již procesor bČhem vykreslování mĤže plnČ vČnovat pĜíjmu nových dat z USB. RozdČlení na více vláken by ovšem nemČlo být potĜeba, neboĢ i slabá grafická karta obrázek zpracuje mnohem rychleji než výkonný procesor.
6.8 Výsledky Na senzoru jsem dokázal snímat plnou rychlostí 30 fps v rozlišení senzoru. V pĜípadČ spuštČní na starších poþítaþích jsem narazil na problém rychlosti vykreslování pomocí procesoru, kdy se snímek nestihl vykreslit dostateþnČ rychle, aby poþítaþ vþas pĜenesl další snímek. Na starších poþítaþích je proto vhodnČjší použít metodu, kdy si poþítaþ o každý snímek Ĝekne až ve chvíli, kdy je už pĜedchozí vykreslen. Touto metodou lze stále zajistit stále relativnČ plynulé snímání videa s rychlostí 15 fps. PĜi vykreslování þtyĜnásobného poþtu pixelĤ (1280x960) nebyla doba nutná k vykreslení 4x delší (jen asi o 60%), což prokázalo, že je hlavní problém už v samotných schopnostech
45
rozhraní Windows GDI pĜekreslovat rychle libovolné vČtší množství bodĤ na obrazovce. Toto množství pixelĤ lze na rychlejších poþítaþích (procesory Pentium-D a Core 2) vykreslovat do 50 ms, a je tak možné zajistit snímání 15 fps v rozlišení 1280x960. Úzkým hrdlem není USB, neboĢ jde o pĜenos 17,6 MB/s. V pĜípadČ využití akcelerace grafickou kartou odpadá omezení rychlosti vykreslování a mČlo by být možné dosáhnout bez problému snímání 15 fps pĜi rozlišení 1600x1200 (27,5 MB/s).
6.9 Zapojení Ĝadiþe bez hradového pole SPARTAN K propojení senzoru s USB Ĝadiþem není nutné používat tak komplexního hradlového pole, jakým je Xilinx SPARTAN. Na Obr. 27 je znázornČno nejjednodušší možné schéma zapojení
SLWR
s pĜímým propojením CMOS senzoru a EZ-USB.
IFCLK Posílání pĜíkazĤ a nahrávání programu
PORTB
8bit DATA
PORTD
PDWN SNAPSHOT
PKTEND / INT0
Cypress EZ-USB
SDA / SCL
CMOS senzor
D0 - D7
HSYNC
SDA / SCL
VSYNC
PCLK
-1
SLOE
Obr. 27 - Nejjednodušší zapojení Ĝadiþe s CMOS senzorem
PĜipojením negace HSYNC na SLWR je zajištČno, že se ukládají pouze platná obrazová data. Pokud budeme v obraze ignorovat tenké þerné okraje na zaþátcích ĜádkĤ, lze ukládat do FIFO data kdykoli je aktivní signál HSYNC (okraje je možné odstranit snadno pĜi vykreslení). Konec snímku lze sledovat podle signálu PKTEND (ten slouží k odeslání dat
46
o velikosti menší, než je velikost paketu) generovaného pĜi spádových hranách signálu VSYNC. K Ĝízení senzoru je možné použít I2C sbČrnici nebo nevyužité vývody PORTD. PĜi využití externích hodin je potĜeba zajistit, že použitý signál bude stálý, což znamená nemČnnou frekvenci a neustálý chod. Pokud nebude toto pravidlo dodrženo, Ĝadiþ do FIFO pamČti nebude nic ukládat a tyto problémy se velmi obtížnČ zjišĢují.
7 ZávČr Hlavním cílem práce byla realizace rychlého pĜenosu obrazu z CMOS senzoru (a dat obecnČ) do poþítaþe v reálném þase pomocí Ĝadiþe Cypress EZ-USB. Pokud bych mČl v bodech shrnout, co všechno se mi bČhem tvoĜení této práce podaĜilo, pak by šlo o: •
VytvoĜení firmware Ĝadiþe EZ-USB s nastavením pro pĜenos dat do poþítaþe maximální možnou rychlostí.
•
VytvoĜení aplikace schopné pĜijímaná obrazová data v reálném þase zpracovat a vykreslit na obrazovku.
•
Otestování funkþnosti pĜenosu na mČĜicím modulu SPART3KAM Ing. Jaroslava TĜeštíka.
•
VytvoĜení ukázkové aplikace využívající Ĝadiþ EZ-USB pro potĜeby rychlého logického analyzátoru.
NejvČtší problém realizace zadání spoþíval v nízké rychlosti komunikace s Ĝadiþem Cypress EZ-USB v dosavadních laboratorních pĜípravcích. Nastudoval jsem proto potĜebnou problematiku a v 3. a 4. þásti práce jsem ukázal nastavení Ĝadiþe, se kterým lze dosáhnout nejvyšších rychlostí. V kapitole 4.5 jsem rozebral dosažené výsledky. PĜi nastavené frekvenci 30 MHz je možné pĜenášet plnou rychlostí 28,6 MB/s bez ztráty jediného paketu. Druhá frekvence interního generátoru 48 MHz je už pĜíliš vysoká na kontinuální pĜenos všech dat – maximálnČ se mi podaĜilo dosáhnout rychlosti 43 MB/s (hodnota udávaná i v dokumentech od výrobce).
47
Pokud se ponechá urþitá rezerva, mČlo by být pĜi popsaném nastavení možné za použití 40MHz externího generátoru pĜenášet všechna data po libovolnou dobu. Dosažené rychlosti pĜenosu plnČ postaþují pro pĜenos obrazu v reálném þase i ze senzorĤ s vysokým rozlišením (1600x1200 pĜi 15 fps, výsledky pĜenosu obrazu jsou uvedeny v kapitole 6.8). Vzhledem k odstranČní úzkého hrdla v podobČ pomalého pĜenosu dat jsem se dostal k úzkému hrdlu rychlosti standardního vykreslování pomocí grafického rozhraní Windows. Tento problém lze Ĝešit vykreslováním s pomocí akcelerace grafickou kartou, které diskutuji v kapitole 6.7. V pĜípadČ standardního vykreslování je možné na dnešních poþítaþích pracovat s rozlišením 1280x960 pĜi 15 fps. Funkþnost Ĝadiþe pro rychlý pĜenos obrazu jsem prakticky ovČĜil pĜi programování aplikace pro zapĤjþený modul s kamerou SPART3KAM. ěadiþ Cypress EZ-USB se osvČdþil v pĜípadČ užití pro potĜeby jednoduchého logického analyzátoru pracujícího až do frekvence 40 MHz pro 8 kanálĤ a 20 MHz pro 16 kanálĤ. PĜenášená data je možné þásteþnČ zpracovat už za chodu, nebo je ukládat do pamČti, pĜípadnČ na disk. Výsledky laborování a možnosti užití jsem popsal v kapitole 5.5. PevnČ vČĜím, že tato práce usnadní realizaci libovolných mČĜicích zaĜízení s potĜebou pĜenášení vČtších objemĤ dat.
48
8 Zdroje a literatura [1] Souþek P.: BakaláĜská práce ýVUT – FEL. Praha 2007 [2] Cypress: EZ-USB FX2LP USB Microcontroller. 2006 [3] Skalický P.: Mikroprocesory Ĝady 8051. BEN, Praha 2005 [4] Kodak KAC-9618 CMOS Image Senzor, 2004 [5] Universal Serial Bus, www.usb.org [6] Wikipedia, www.wikipedia.org
9 Obsah CD \Cypress_Install – instalaþní balík SDK a ovladaþĤ \Cypress_docs – dokumenty k Ĝadiþi EZ-USB \HiSpeed_Transfer_Firmware – firmware EZ-USB pro rychlý pĜenos \KAC_9618 – datasheet CMOS senzoru Kodak KAC-9618 \SpeedTest – aplikace pro testování rychlosti pĜenosu \Trestik_SPART3KAM – dokumenty týkající se mČĜicího modulu SPART3KAM \USB-LA – ukázka realizace jednoduchého logického analyzátoru \VideoStreaming – aplikace pro pĜenos videa ze senzoru SPART3KAM v reálném þase
49