České vysoké učení technické v Praze Fakulta elektrotechnická
Bakalářská práce
Řadič kamery v FPGA obvodech
Jan Sobotka
Vedoucí práce: Ing. Martin Daněk, Ph.D. Vedoucí specialista: Ing. Petr Honzík
Studijní program: Elektrotechnika a informatika, strukturovaný bakalářský Obor: Informatika a výpočetní technika Letní semestr 2007
ii
Poděkování Děkuji Martinu Daňkovi a Petrovi Honzíkovi za mnoho cenných rad, které mi velmi pomohly při tvorbě této práce a v neposlední řadě i za jejich ochotu a čas.
iii
iv
Prohlášení 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).
Ve Vrchlabí dne 20.08.2007
…………………………………………………
v
vi
Abstract The thesis deals with implementation of a video camera controller on the development platform Xilinx ML401. This project is divided into two main parts. The first part deals with connecting USB peripherals to the development platform ML401. This part starts with a short description of the development board ML401, it describes the USB controller Cypress CY7C67300 and among others it shows the designing of a control system, which is implemented in FPGA and which allows to communicate with a USB controller. This system is designed by means of Xilinx EDK software. The second part deals with a video camera controller.
Abstrakt Práce pojednává o implementaci řadiče kamery na vývojové platformě Xilinx ML401. Tento úkol je rozdělen na dvě hlavní části. První část se zabývá připojováním USB zařízení k vývojové platformě Xilinx ML401. Začíná krátkým seznámením s vývojovou deskou ML401, popisuje USB řadič Cypress CY7C67300 a ukazuje mimo jiné tvorbu řídícího systému implementovaného v FPGA obvodu, který umožňuje s USB řadičem komunikovat. Tento systém je navrhován za pomoci software Xilinx EDK. Druhá část pojednává o vlastním řadiči kamery.
vii
viii
Obsah 1.
ÚVOD...................................................................................................................................... 1 1.1. 1.2.
2.
POUŽITÉ TECHNICKÉ VYBAVENÍ ...................................................................................... 1 DEKOMPOZICE ZADANÉHO ÚKOLU .................................................................................. 2
USB NA VÝVOJOVÉ PLATFORMĚ ML401 .................................................................... 3 2.1. VÝVOJOVÁ PLATFORMA XILINX ML401 ......................................................................... 3 2.2. USB ŘADIČ CYPRESS CY7C67300.................................................................................. 4 2.2.1. Architektura řadiče Cypress CY7C67300.................................................................. 4 2.2.2. Struktura paměti řadiče .............................................................................................. 5 2.2.3. BIOS .......................................................................................................................... 6 2.2.4. Rozhraní pro připojení externího procesoru............................................................... 7 2.2.4.1.
2.2.5. 2.2.6. 2.2.7.
Host Port Interface ............................................................................................................... 7
Link Control Protocol (LCP) ..................................................................................... 8 Připojení USB řadiče k FPGA ................................................................................... 9 Vývojové nástroje Cypress ...................................................................................... 10
2.2.7.1. 2.2.7.2. 2.2.7.3.
Tvorba firmwaru ................................................................................................................10 Ladění programu ................................................................................................................11 Kompilace programu a programovaní USB řadiče .........................................................12
2.3. XILINX EDK.................................................................................................................. 12 2.3.1. Procesor MicroBlaze................................................................................................ 12 2.3.2. On-chip Peripheral Bus............................................................................................ 13 2.3.3. Xilinx Platform Studio ............................................................................................. 13 2.3.3.1. 2.3.3.2. 2.3.3.3. 2.3.3.4.
MHS....................................................................................................................................14 MSS ....................................................................................................................................17 UCF.....................................................................................................................................18 Tvorba uživatelských periferií ..........................................................................................18
2.4. USB PERIFERIE PRO EDK .............................................................................................. 19 2.4.1. Návod na spuštění příkladu připojení USB myši a USB klávesnice........................ 20 3.
ŘADIČ KAMERY................................................................................................................ 37 3.1. VÝBĚR VHODNÉ WEBOVÉ KAMERY ................................................................................ 37 3.1.1. Kritéria pro výběr..................................................................................................... 37 3.1.2. Přehled možností...................................................................................................... 37 3.1.3. Užší výběr ................................................................................................................ 38 3.1.3.1. 3.1.3.2. 3.1.3.3.
Linux Kernel Webcams Driver GSPCA / SPCA5xx.......................................................38 Philips PCVC740K ToUcam PRO ...................................................................................38 Genius VideoCAM Web ...................................................................................................39
3.1.4. Zvolená kamera........................................................................................................ 39 3.2. NÁVRH A IMPLEMENTACE OVLADAČE ........................................................................... 39 3.2.1. Návrh ovladače ........................................................................................................ 39 3.2.2. Implementace ovladače............................................................................................ 40 4.
ZÁVĚR.................................................................................................................................. 41
5.
SEZNAM POUŽITÝCH ZDROJŮ .................................................................................... 43
6.
OBSAH PŘILOŽENÉHO CD ............................................................................................ 47
ix
x
Seznam použitých obrázků Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr. Obr.
1 Blokové schéma desky ML401 [4]...............................................................3 2 Blokové schéma USB řadiče CY7C67300 [5] .............................................4 3 Rozdělení paměti CY16 [6]..........................................................................5 4 Struktura BIOSu CY7C67300 [7] ................................................................6 5 HPI rozhraní řadiče [6] .................................................................................7 6 LCP příkaz COMM_EXEC_INT [6] ...........................................................9 7 Struktura firmwaru kontroléru Cypress [7] ................................................11 8 Blokové schéma procesoru MicroBlaze [10] .............................................13 9 Záložka project v aplikaci XPS ..................................................................14 10 Přidání externího portu v XPS..................................................................16 11 Externí porty pro opb_uartlite v XPS .......................................................16 12 Menu Software v XPS ..............................................................................17 13 Blokové schéma USB systému s periferií OPB_USB..............................20 14 Tvorba nového projektu v XPS ................................................................21 15 BSB - výběr vývojové desky....................................................................21 16 BSB - konfigurace procesoru MicroBlaze................................................22 17 BSB – výběr periferií................................................................................23 18 BSB - nastavení standardního vstupu a výstupu ......................................24 19 Menu Project v XPS .................................................................................24 20 Přidání IP jádra v XPS..............................................................................25 21 Umístění opb_sysace v XPS.....................................................................26 22 Připojení periferie k OPB v XPS..............................................................27 23 Jiný způsob připojení periferie k OPB v XPS ..........................................27 24 Záložka Adresses v XPS...........................................................................28 25 Definice opb_usb v MHS souboru XPS ...................................................29 26 Definice opb_sysace v MHS souboru XPS ..............................................30 27 Okno Software Platform Settings v XPS..................................................33 28 Přidání nového softwaorvého projektu v XPS .........................................33 29 Konfigurace softwarového projektu příkladu v XPS ...............................34 30 Deaktivace softwarového projektu v XPS................................................35 31 USB rozhraní webové kamery Genius VideoCAM Web [20] .................40
xi
xii
Seznam použitých zkratek BIOS BSB CCD CF CMOS DSP EDK FPGA FSL HPI HSS HW LCP MHS MPD MSS OPB PAO PC RAM RISC ROM SDK SIE SPI UCF USB VHDL
Basic Input Output System Base System Builder Charge-Coupled Device Compact Flash Complementary Metal Oxide Semiconductor Digital signal processing Embedded Development Kit Field-programmable gate array Fast Simplex Link Host Port Interface High-speed Serial Interface Hardware Link Control Protocol Microprocessor Hardware Specification Microprocessor Peripheral Definition Microprocessor Software Specification On-chip Peripheral Bus Peripheral Analyze Order Personal Computer Random Access Memory Reduced instruction set computer Read-only Memory Software Development Kit Serial Interface Engine Serial Peripheral Interface User Constraint File Universal Serial Bus Very High Speed Integrated Circuits Hardware Description Language
xiii
xiv
1. Úvod Úkolem bakalářské práce bylo implementovat řadič vybrané kamery na vývojové desce ML401 firmy Xilinx. Zadavatelem práce je Ing. Petr Honzík z Ústavu teorie informace a automatizace Akademie věd České republiky. Předpokladem pro práci bylo navázání na bakalářskou práci Ovládání USB periferií z FPGA od Jiřího Brabce zpracovanou v loňském roce [1]. Tato práce pojednává o možnostech připojení USB zařízení k desce ML401, měla by proto být vhodným odrazovým bodem. Kromě samotného popisu mé činnosti jsou součástí textu i kapitoly poskytující čtenáři alespoň základní úvod do dané problematiky nutné pro pochopení dalších částí. Na přání vedoucího práce by měly být také jednotlivé kapitoly použitelné nezávisle, zejména kapitola o softwarovém balíku Xilinx EDK, který umožňuje návrh kompletních vestavěných systémů pro FPGA obvody stejnojmenné firmy.
1.1. Použité technické vybavení Při práci byly využity tyto prostředky : Použitý software : Software pro návrh vestavěných systému Xilinx EDK 8.2.01i Balík nástrojů pro vývoj firmwaru pro USB řadiče Cypress CY7C67200/CY7C67300 EZ-Host & EZ-OTG Development Kit [2] Použitý hardware: PC Přípravek Xilinx ML401 Webová kamera Genius VideoCAM Web USB myši Logitech Notebook Optical Mouse Plus a Logitech M-BD69 Klávesnice Compaq SK-2865
1
1.2. Dekompozice zadaného úkolu Zadaný úkol byl poměrně rozsáhlý, proto bylo nutné práci vhodně rozdělit. Práci jsem nejprve rozdělil na dvě hlavní části. První část se zabývá prací s USB na vývojové desce ML401. Tuto část dokumentuje kapitola nazvaná USB na vývojové platformě ML401. Druhá část se zabývá samotným řadičem kamery. Tyto dvě části byly ještě dále dekomponovány na několik menších částí. Celá práce byla rozdělena takto : 1. USB na vývojové desce ML401 a) Seznámení se s vývojovou deskou ML401 a s USB kontrolérem Cypress CY7C67300 na ní integrovaným. b) Seznámení s prostředím Xilinx EDK, zejména s částmi týkající se komunikace řadiče USB a procesoru MicroBlaze. c) Vytvoření funkčního systému umožňujícího práci s USB řadičem za pomoci návrhového softwaru EDK. 2. Řadič kamery a) Prostudování oblasti dostupných webových kamer a výběr vhodné kamery. b) Návrh a implementace ovladače kamery. Úkolem první části bylo rovněž seznámení s bakalářskou prací Jiřího Brabce [1]. Po seznámení s návrhovým prostředím EDK bylo potřeba navrhnout systém umožňující komunikaci s USB řadičem. Po prostudování dokumentace a příkladů firmy Xilinx, jsem zjistil, že EDK neumožňuje navrhnout jednoduchým způsobem systém komunikující s USB řadičem. Takový systém je pouze součástí referenčního designu firmy Xilinx pro mnou použitou vývojovou platformu ML401 [3], ale neexistuje samostatná periferie, kterou by bylo možné přidat do libovolného projektu. Práce J. Brabce na kterou jsem měl ve své práci navázat, tento problém také neřeší a jako hardwarový systém implementovaný v FPGA využívá referenční design od společnosti Xilinx. Tento stav byl po dohodě s vedoucím práce označen jako nevyhovující a jako nový hlavní cíl práce bylo stanoveno vytvoření samostatné periferie, kterou je možné přidat do libovolného návrhu v EDK. Tato periferie by měla sloužit jako rozhraní mezi procesorem MicroBlaze a HPI rozhraním USB řadiče. Dále bylo oproti zadaní požadováno vytvoření související dokumentace pro návrhový software Xilinx EDK tak, aby periferie byla přenositelná i na jiné desky používající čip Cypress CY7C67300 a Xilinx System ACE Compact Flash (CF), který je potřebný pro programování řadiče.
2
2. USB na vývojové platformě ML401 Tato kapitola pojednává o připojování USB zařízení k přípravku ML401. Na začátku další práce bylo nutné seznámit se z vývojovou platformou ML401 se kterou jsem do té doby neměl žádné zkušenosti.
2.1. Vývojová platforma Xilinx ML401 Použitá deska Xilinx Virtex-4 ML401 Evaluation Platform je z řady Xilinx ML40x (ML401, ML402, ML403 a nově i ML405), které se liší především typem použitého FPGA obvodu z řady Virtex-4. Řada Virtex-4 je dále rozdělena do tří skupin. Obvody označené LX obsahují hodně logických a vstupně výstupních bloků, obvody SX mají hodně DSP bloků a větší množství paměti a FX, které obsahují procesorová jádra PowerPC. Deska ML401 je osazena FPGA obvodem ze skupiny LX. Deska dále disponuje velkým množstvím rozšiřujících komponent. Pro ilustraci uvádím blokové schéma desky převzaté z [4], ze kterého jsou možnosti desky dobře patrné.
Obr. 1 Blokové schéma desky ML401 [4]
3
Z komponent, které jsou na desce osazeny nás zajímají především USB řadič Cypress CY7C67300, o kterém pojednává zbytek kapitoly a Xilinx System ACE CompactFlash (CF), pomocí kterého budeme načítat firmware pro řadič Cypress z pamětové karty Compact Flash do FPGA, ze kterého bude následně řadič naprogramován.
2.2. USB řadič Cypress CY7C67300 V této části naleznete informace nejprve o struktuře řadiče, dále o jeho připojení k FPGA obvodu na přípravku a nakonec o firmwaru řadiče a podpůrných nástrojích pro jeho tvorbu.
2.2.1.Architektura řadiče Cypress CY7C67300 Řadič má vlastní 16-bitový RISC procesor a může proto pracovat kromě ve standardním režimu coprocessor i v režimu standalone. Procesor CY16 má dále dva časovače, interní 8K x 16 RAM paměť pro kód i data, interní 4K x 16 ROM paměť, která obsahuje BIOS, dvě nastavitelná sériová rozhraní SIE1 a SIE2 celkem se čtyřmi USB porty. Na desce ML401 jsou ovšem fyzicky přítomné porty pouze tři a to jeden port umožňující připojení zařízení v módu host a dva porty které mohou pracovat pouze v módu zařízení. CY16 je little endian, na což je třeba brát ohled. Kromě těchto pamětí lze k řadiči připojit externí paměť přes rozhraní I2C.
Obr. 2 Blokové schéma USB řadiče CY7C67300 [5]
4
2.2.2.Struktura paměti řadiče Paměť 16-bitového RISC procesoru CY16 je adresovatelná po bytech. Její struktura je dobře patrná z následujícího obrázku.
Obr. 3 Rozdělení paměti CY16 [6]
5
Z hlediska tvorby ovladače pro naše zařízení je důležitá informace, že pro náš kód máme přibližně 15 KB paměťového místa začínajícího od adresy 0x4A4. V případě potřeby je možné získat více místa připojením externí paměti.
2.2.3.BIOS Slouží k základní inicializaci řadiče po startu procesoru a poskytuje základní nízko úrovňovou podporu pro hardware kontroléru. Jak vidíme na obrázku, je tvořen sadou rutin, které jsou přístupné přes tabulku přerušení. Procedury BIOSu je možné přepsat vlastními procedurami. Kompletní popis BIOSu je uveden v dokumentaci [6].
Obr. 4 Struktura BIOSu CY7C67300 [7]
6
2.2.4.Rozhraní pro připojení externího procesoru Ke kontroléru Cypress lze připojit externí procesor pomocí třech rozhraní : SPI (Serial Peripheral Interface) HSS (High-speed Serial Interface) HPI (Host Port Interface) V našem případě využíváme pro připojení externího procesoru MicroBlaze rozhraní HPI.
2.2.4.1. Host Port Interface HPI je paralelní 16-bitové rozhraní. Oproti dvěma zbývajícím má výhodu ve své rychlosti (propustnost až 16 MB/s). Umožňuje také přístup do části paměti bez nutnosti použití LCP příkazů (viz dále). Konkrétně je možno bez použití LCP příkazů přistupovat na adresy 0x0000 – 0x3FFF, tedy až do části, kde končí prostor pro uživatelský program. Dále do oblasti BIOSu (adresy 0xE000 – 0xFFFF) a do míst, kde jsou umístěny registry SIE1 (0xC080 – C09F) a SIE2 (0xC0A0 – 0xC0BB). Struktura HPI je nejlépe patrná z dalšího obrázku.
Obr. 5 HPI rozhraní řadiče [6]
7
HPI_Addr[1:0] HPI_Data[15:0] HPI_nWRITE HPI_nREAD HPI_INTR
tyto 2 bity adresují 4 registry HPI 16-bit datové rozhraní výběr zápisu výběr čtení signalizace přerušení z řadiče do externího procesoru
Podle HPI_Addr[1:0] je vybírán jeden z následujících registrů : HPI_Addr[1:0] 00 01 10 11
Registr HPIDATA HPIADD HPIMAILBOX HPISTS
Popis datový registr adresový registr mailbox registr HPI stavový registr
Tab. 1 Registry HPI rozhraní
Příklad práce s rozhraním HPI bude uveden v následující části o protokolu LCP.
2.2.5. Link Control Protocol (LCP) Umožňuje externímu procesoru plnou kontrolu nad USB řadičem. Používá se ve spojení s některým z výše zmiňovaných rozhraní. LCP příkazy jsou stejné pro všechny tři rozhraní. Použití LCP je uvedeno na příkladu zapnutí USB portu připojeného k SIE2 v módu zařízení jako portu pro ladění pomocí gdb. Více informací o tomto tématu uvádím v kapitole o ladění. K inicializaci portu v módu zařízení slouží rutina SUSB_INIT_INT dostupná přes vektor přerušení číslo 113. Nastavení rychlosti a výběr SIE se provádí pomocí nastavení registrů R1 a R2. R1 vybírá mezi Low Speed (R1 = 1) a Full Speed (R1 = 0). R2 určuje, zda bude inicializováno SIE1 (R2 = 1) nebo SIE2 (R2 = 2). Inicializace portu přímo programem kontroléru provedou následující instrukce : mov r1,0 ;full speed mov r2,2 ;SIE2 int SUSB_INIT_INT Na následujícím obrázku je znázorněno, jak se provedení takového kódu spustí pomocí HPI a LCP příkazů.
8
Obr. 6 LCP příkaz COMM_EXEC_INT [6]
Nejdříve tedy nastavíme číslo přerušení na 113 (SUSB_INIT_INT). Nastavení čísla přerušení provedeme tak, že do registru adres zapíšeme adresu místa, kde se nachází v paměti číslo přerušení (0x01C2) a do registru dat vložíme číslo přerušení. Obdobným způsobem nastavíme hodnoty registrů R1 a R2. Registry jsou mapovány do paměti na adresy 0x01C6 a 0x01C8. Provádění příkazu spustíme zápisem kódu COMM_EXEC_INT (0xCE01) do registru HPIMAILBOX. Příkaz COMM_EXEC_INT po svém provedení nevrací žádnou hodnotu.
2.2.6. Připojení USB řadiče k FPGA HPI rozhraní řadiče je k FPGA připojeno podle dokumentace [8]. Některé vodiče jsou na desce ML401 sdílené s porty SystemACE. Konkrétně se jedná o datové vodiče, které jsou ve schématu označené SYSACE_USB_D0 SYSACE_USB_D15, dva adresové vodiče SYSACE_A1_USB_A0 a
9
SYSACE_A1_USB_A0. Tyto dva vodiče slouží k adresaci čtyř registrů HPI rozhraní. Společné jsou ještě SYSACE_MPOE_USB_RD_N a SYSACE_MPWE_USB_WR_N, což jsou společné vodiče pro „enable“ a „write enable“ signál. O přepínání těchto společných signálů se stará jádro addr_logic, které je součástí mnou vytvořené periferie OPB_USB. Výběr správného čipu je zajištěn pomocí nastavování signálů „chip select“.
2.2.7.Vývojové nástroje Cypress Instalační soubory je možné stáhnout ze stránek výrobce pod názvem CY3663 CD-ROM Image v1.0 [2] nebo je naleznete na přiloženém CD. Instalace není nijak složitá, stačí nainstalovat celý balík nástrojů obdobně jako se instaluje většina programů na platformě Windows. Jedná se o sadu nástrojů pocházejících z prostředí operačního systému Linux, pod operačním systémem Windows umožňuje jejich fungování emulátor unixového prostředí Cygwin. Ve složce instalacni_adresar\USB\OTG-Host\Docs je dostupná kompletní dokumentace k řadiči Cypress i k jednotlivým nástrojům. Velmi zajímavá je kniha [7] od Johna Hyda, která vysvětluje psaní ovladačů pro kontroléry CY7C67200/CY7C67300 na příkladech. Bohužel kniha i celá sada nástrojů včetně příkladů je určená primárně pro vývojové desky Cypress CY3663 a CY4640, na což je potřeba brát ohled.
2.2.7.1. Tvorba firmwaru Firmware pro kontrolér je možné psát v jazyce assembler, ale mnohem výhodnější je využít předpřipravenou strukturu ovladače od firmy Cypress a ovladač psát v jazyce C. Tato struktura se jmenuje Frameworks. Tento kód využívají také příklady firmwaru umožňující připojení USB myši a klávesnice. S těmito příklady se seznámíme v kapitole 2.4.1. Podrobné informace o konfiguraci a psaní ovladačů s využitím Frameworks naleznete v referenčním manuálu [9] nebo v již zmiňované knize Johna Hyda [7]. Strukturu kompletního firmwaru s využitím Frameworks pro tvorbu ovladače zobrazuje obrázek. Překladač pro assembler i pro C jsou samozřejmě součástí výše popisovaných nástrojů. Součástí dodávaného softwaru je i vývojové prostředí Elipse, které je možné využít pro tvorbu firmwaru, ale není to nezbytné. Jedná se pouze o prostředí pro psaní programů v C/C++ běžného typu.
10
Obr. 7 Struktura firmwaru kontroléru Cypress [7]
2.2.7.2. Ladění programu Důležitější aplikací je dle mého názoru debugger gdb, respektive jeho grafická nadstavba Insight. Tu je možné propojit s řadičem pomocí utility libremote a provádět pak ladění přímo v kontroléru. Fyzicky je potřeba propojit kontrolér s počítačem, a to lze buď, přes sériový port nebo využít USB port. Pro ladění je možné využít port označený na ML401 jako USB periph 2. Konektor pro sériový port řadiče je na desce ML401 vyveden pouze ve formě kontaktů, je proto potřeba si opatřit vhodný adaptér pro připojení sériového kabelu k přípravku. Já jsem si například takový adaptér vyrobil. Umístění kontaktů a jejich zapojení je uvedeno v návodu k desce ML401 v kapitole o sériovém portu [4]. Při použití USB portu pro ladění je při práci v co-processor módu nutné tento port zapnout pomocí LCP příkazu. Ukázku jak port aktivovat uvádím v kapitole o LCP.
11
2.2.7.3. Kompilace programu a programovaní USB řadiče Hlavní adresář ovladače by měl obsahovat soubor makefile. Tento případ tedy předpokládám a firmware se poté kompiluje jednoduše zadáním příkazu make v okně emulátoru Cygwin. Toto okno si můžeme spustit zástupcem BASH Environment v nabídce Start (Start -> Programy -> Cypress -> USB -> OTG-Host -> BASH Environment). Po spuštění se přepneme do adresáře, kde máme zdrojový kód příkladu a příkazem make příklad zkompilujeme. V tomto adresáři nám vznikne soubor nazev_prikladu.bin, který potom nakopírujeme na paměťovou kartu Compact Flash. Programovaní řadiče se provádí procesorem MicroBlaze a to tak, že MicroBlaze načte firmware z paměťové karty a přes HPI rozhraní firmware nahraje do kontroléru a spustí jeho provádění nastavením program counteru řadiče na adresu paměti, kde začíná uživatelský program.
2.3. Xilinx EDK Softwarový balík Xilinx Embedded Development Kit, zkráceně EDK (bude tak i nazýváno v dalším textu) umožňuje návrh komplexních vestavěných systémů pro FPGA obvody Xilinx. Řídícím prvkem těchto systémů je buď softcore procesor MicroBlaze nebo procesor PowerPC. Pro použití jádra PowerPC je nutné mít takový FPGA obvod, který toto jádro obsahuje. Tyto obvody jsou u řady Xilinx Virtex-4 označovány zkratkou FX, jak již bylo zmíněno v kapitole o vývojové desce ML401. Vzhledem k použité desce, respektive FPGA obvodu, kterým je osazena, je v mé práci použit procesor MicroBlaze.
2.3.1.Procesor MicroBlaze Zde uvádím několik základních informací o procesoru MicroBlaze. Více informací je možné nalézt v referenčním manuálu [10], který je volně dostupný na internetových stránkách firmy Xilinx nebo v diplomové práci Ing. Lukáše Kohouta [11], která pojednává o procesoru MicroBlaze velmi podrobně. Jedná se o 32 bitový RISC procesor s harvardskou architekturou. Jeho konečná podoba je značně konfigurovatelná. Architekturu procesoru ukazuje přiložený obrázek. Šedé bloky jsou součástí procesoru volitelně.
12
Obr. 8 Blokové schéma procesoru MicroBlaze [10]
2.3.2.On-chip Peripheral Bus Pro účely této práce je dále důležitá sběrnice On-chip Peripheral Bus, zkráceně OPB, pomocí níž se připojují periferie k procesoru MicroBlaze a to i periferie uživatelské. OPB je rozhraní, které se využívá k připojení nejrůznějších periferií, např. RS232. Jedná se o standard firmy IBM, adresní sběrnice může být až 64b dlouhá, datová sběrnice je široká 32b nebo 64b. Je to plně synchronní sběrnice s podporou „Master-Slave“ komunikace. Zařízení typu „Master“ může být na sběrnici více, přidělení mezi nimi potom řeší centrální arbitr. MicroBlaze se chová jako „Master“. Při komunikaci nejprve „Master“ žádá o přidělení sběrnice, arbitr sběrnici přidělí a poté proběhne operace čtení či zápisu.
2.3.3.Xilinx Platform Studio Jednou z hlavních součástí balíku EDK je aplikace Xilinx Platform Studio (XPS), která slouží k návrhu vestavěného systému zejména po stránce hardwaru. Software je možné navrhovat také, ale XPS poskytuje pouze základní funkce. Pro návrh softwaru slouží specializovaná aplikace Xilinx Platform Studio SDK, která umožňuje použít při návrhu aplikace obvyklé funkce pro ladění programu. V následující části textu uvedu základní návod pro práci s XPS. K dispozici jsem
13
měl EDK verze 8.2.01i, proto se celý tento návod vztahuje k této verzi. Předpokládám, že návod bude možné použít i pro práci s novějšími verzemi bez větších problémů. Položky znázorněné v textu tučně představují přesné názvy položek v uživatelském rozhraní XPS. Tato konvence neplatí v části o struktuře adresáře uživatelské periferie, kde je tučné písmo použito pro zvýraznění názvů souborů a adresářů. Konfigurace projektu je uložena ve třech hlavních souborech. Tyto soubory jsou uloženy v adresáři projektu a mají přípony mhs, mss a ucf. Úpravy v nich lze provádět buď přímou editací těchto souborů nebo pomocí funkcí XPS. Otevřít některý z těchto souborů lze pomocí editoru, který je součástí XPS a to tak, že poklepeme na název souboru, který chceme editovat na záložce Project, jak ukázáno na následujícím obrázku.
Obr. 9 Záložka project v aplikaci XPS
2.3.3.1. MHS V souboru MHS je uložena hardwarová konfigurace projektu. Pro názornost uvedu, jak vypadají záznamy v jednotlivých souborech, pokud je součástí projektu jádro opb_uartlite, které zprostředkovává komunikaci procesoru se sériovou linkou. BEGIN opb_uartlite PARAMETER INSTANCE = RS232_Uart PARAMETER HW_VER = 1.00.b PARAMETER C_BAUDRATE = 9600 PARAMETER C_DATA_BITS = 8
14
PARAMETER C_ODD_PARITY = 0 PARAMETER C_USE_PARITY = 0 PARAMETER C_CLK_FREQ = 100000000 PARAMETER C_BASEADDR = 0x40600000 PARAMETER C_HIGHADDR = 0x4060ffff BUS_INTERFACE SOPB = mb_opb PORT RX = fpga_0_RS232_Uart_RX PORT TX = fpga_0_RS232_Uart_TX END Na začátku je uveden název IP jádra, dále název instance tohoto jádra a jeho verze. Dále již následují položky, nastavující jednotlivé parametry jádra. V tomto případě rychlost, počet datových bitů a další parametry přenosu po sériové lince. Řádek BUS_INTERFACE SOPB= mb_opb znamená, že jádro je k procesoru připojené pomocí sběrnice OPB. Nakonec je ještě uvedena definice vstupních a výstupních portů. V souboru MHS kromě definic jader, která jsou součástí projektu dále uvedeny definice externích portů. Tyto porty jsou napojeny přímo na piny FPGA obvodu a na jejich definici navazuje definice v UCF souboru. Přidání externího portu je možné opět provést přímým zápisem do MHS souboru. Definice portů pro uart potom vypadá následovně : PORT fpga_0_RS232_Uart_RX_pin = fpga_0_RS232_Uart_RX, DIR = I PORT fpga_0_RS232_Uart_TX_pin = fpga_0_RS232_Uart_TX, DIR = O Druhou možností je využití grafického uživatelského rozhraní XPS. V hlavním okně programu přepneme zobrazení na záložku Ports a volbou Add External Port přidáme nový externí port, který se nám objeví na konci seznamu externích portů. Nově přidaný potřebujeme ještě vhodně nakonfigurovat, v případě uartu stačí port pojmenovat a zvolit směr (určíme, zda se jedná o port vstupní nebo výstupní). Přidání externího portu dokumentují následující dva obrázky.
15
Obr. 10 Přidání externího portu v XPS
Obr. 11 Externí porty pro opb_uartlite v XPS
16
2.3.3.2. MSS Tento soubor obsahuje informace o softwarové konfiguraci projektu. Pro naše jádro opb_uartlite vypadá definice následovně: BEGIN DRIVER PARAMETER DRIVER_NAME = uartlite PARAMETER DRIVER_VER = 1.01.a PARAMETER HW_INSTANCE = RS232_Uart END Určuje nám, že k instanci jménem RS232_Uart, bude přiřazen ovladač uartlite verze 1.01.a. Dále jsou v souboru MSS uvedeny definice knihoven, které chceme přidat do projektu. Kompletní nastavení softwarové části systému je možné provést v okně Software Platform Settings, které se otevře stejnojmennou volbou v menu Software.
Obr. 12 Menu Software v XPS
17
2.3.3.3. UCF Zde se k externím portů přiřazují konkrétní piny FPGA obvodu. Rozdílem oproti předchozím dvěma souborům je, že XPS neposkytuje funkce pro práci s UCF soubory pomocí grafického uživatelského rozhraní. Jedinou možností je tedy v tomto případě přímá editace souboru. Příklad definice pinů pro náš ukázkový uart je zde: Net Net Net Net
fpga_0_RS232_Uart_RX_pin fpga_0_RS232_Uart_RX_pin fpga_0_RS232_Uart_TX_pin fpga_0_RS232_Uart_TX_pin
LOC=W2; IOSTANDARD = LVCMOS33; LOC=W1; IOSTANDARD = LVCMOS33;
Více informací o UCF souboru je možné nalézt v [12].
2.3.3.4. Tvorba uživatelských periferií Kromě periférií integrovaných v XPS je možné do systému přidávat i vlastní periferie napsané v jazyce VHDL nebo Verilog. Tuto periferii můžeme připojit k procesoru pomocí sběrnice OPB nebo pomocí FSL (Fast Simplex Link). Při vytváření periferie je možné využít průvodce, kterého spustíme přes položku v menu Hardware→Create or Import Peripheral... . Návod, jak s průvodcem pracovat lze najít v diplomové práci Ing. Lukáše Kohouta [11]. Periferii je možné vytvořit i bez použití průvodce. Struktura adresáře se soubory periferie je následující : •
•
\data Obsahuje soubor jmeno_periferie_verze.mpd (Microprocessor Peripheral Definition), ve kterém je definice rozhraní z pohledu periferie (parametry, porty). Detaily nalezneme v [13]. Potom je zde soubor jmeno_periferie_verze.pao (Peripheral Analyze Order), který osahuje seznam souborů nutných pro syntézu periferie [13]. Dále může obsahovat soubor jmeno_periferie_verze.tcl, obsahující skript v jazyce Tcl, což je programovací jazyk založený na Lispu. Tyto skripty slouží například ke kontrole správnosti uživatelem nastavovaných parametrů. \hdl\vhdl Zde jsou soubory ve VHDL, které zajišťují vlastní funkčnost periferie.
18
•
•
\hdl\verilog Obsahuje soubory ve Verilogu. Periferie může být napsána v samotném VHDL, v samotném Verilogu a nebo může být složena z obou typů souborů. \doc Může obsahovat datasheet k periferii jmeno_periferie.pdf.
Pro připojení vlastní periferie k procesoru MicroBlaze přes sběrnici OPB je výhodné použít jádro OPB_IPIF, které nám poskytuje rozhraní pro komunikaci s OPB a umožní nám připojit naši periferii jednoduše, bez nutnosti znát detailně sběrnici OPB. Více informací je k dispozici zde [14]. Vytvořenou periferii nakopírujeme do adresáře pcores v projektovém adresáři, aby se objevila na záložce IP Catalog a bylo ji možné přidat do systému.
2.4. USB periferie pro EDK Periferie OPB_USB je uživatelská periferie, která vznikla v rámci této práce. OPB v názvu značí, že se periferie připojuje k procesoru MicroBlaze pomocí stejnojmenné sběrnice. Jedná se o konvenci společnosti Xilinx. Slouží ke komunikaci s USB kontrolérem Cypress CY7C67300 integrovaným na vývojových deskách Xilinx ML40x. Kontrolér Cypress je k jádru připojen pomocí rozhraní HPI (Host Port Interface). Jako vzor pro tvorbu periferie posloužil referenční design od společnosti Xilinx pro vývojovou platformu ML401 [3]. Jádro je specializovanou verzí pro jednu pamětovou banku (řadič Cypress – rozhraní HPI) jádra opb_emc 2.00a, jehož modifikací toto jádro vzniklo. Defaultní nastavení parametrů v souboru opb_usb_v2_1_0.mpd je upraveno pro potřeby komunikace s HPI rozhraním. Dále byl přidán jeden registr, který slouží k resetování řadiče Cypress pomocí programu MicroBlaze. Jádro bylo vyvíjeno na desce ML401, ale mělo fungovat i na jiných deskách podporovaných XPS. Podmínkou je, aby deska obsahovala USB řadič Cypress CY7C67300 a řadič byl k pinům FPGA obvodu připojen stejně jako je připojen na desce ML401 [8]. Dále musí být deska osazena Xilinx System ACE Compact Flash (CF), který je potřebný pro programování řadiče.
19
Obr. 13 Blokové schéma USB systému s periferií OPB_USB
2.4.1.Návod na spuštění příkladu připojení USB myši a USB klávesnice Návod popisuje vytvoření nového projektu s periferií OPB_USB v programu XPS. Jádro je možné vyzkoušet se dvěma příklady (připojení USB myši a USB klávesnice). Firmware USB řadiče pro příklad s USB myší byl vytvořen Jiřím Brabcem v rámci jeho bakalářské práce a firmware pro příklad s USB klávesnicí pochází od firmy Xilinx. Firmware pro USB řadič se přeloží příkazem make. Podrobněji je postup uveden v kapitole 2.2.7.3. Činnost obou příkladů je demonstrována pomocí sériové linky na připojeném terminálu. Ukázka s USB myší byla vytvářena pro myš Creative Labs USB Mouse OMC90S a odzkoušena s dvěma různými typy myší Logitech (Logitech Notebook Optical Mouse Plus a Logitech M-BD69), není tedy možné zaručit, že příklad bude fungovat s jakoukoli USB myší. Požadavky na klávesnici Xilinx uvádí jako libovolná USB, která ovšem nesmí obsahovat integrovaný USB hub. Příklad jsem odzkoušel s klávesnicí Compaq SK-2865. Všechny potřebné soubory naleznete na
20
přiloženém CD. Jejich přesné umístění je popsáno v přiloženém obsahu CD na konci této práce. Budeme postupovat krok za krokem od startu XPS až po spuštění příkladu na desce ML401. Stejně jako v předcházející části textu budou položky uvedené v textu tučně představovat přesné názvy prvků v XPS. Jako první krok si spustíme Xilinx Platform Studio a zvolíme Base System Builder wizard (recommended) a potvrdíme OK.
Obr. 14 Tvorba nového projektu v XPS
V dalším okně nastavíme adresář projektu a pokračujeme dál. Dále vybereme volbu I would like to create a new design. Následuje výběr vývojové desky pro kterou chceme systém vytvořit. V mém případě jsem měl k dispozici desku ML401.
Obr. 15 BSB - výběr vývojové desky
21
Pokračujeme výběrem procesoru, zvolíme MicroBlaze. Zvolená konfigurace procesoru MicroBlaze není pro příklad podstatná, pro ilustraci uvádím své nastavení.
Obr. 16 BSB - konfigurace procesoru MicroBlaze
22
V dalších třech oknech si můžeme vybrat, jaké bude mít MicroBlaze periferie. Pro naše účely je potřeba pouze RS232_Uart, abychom mohli sledovat pohyb myši nebo stisknuté klávesy na terminálu. Plně postačuje UARTLITE, a proto můžeme ponechat nastavení beze změn.
Obr. 17 BSB – výběr periferií
23
SystemACE_CompactFlash prozatím do systému přidávat nebudeme, přidáme ho později. Jako standardní vstup a výstup si vybereme RS232_Uart.
Obr. 18 BSB - nastavení standardního vstupu a výstupu
Další nabídky můžeme odsouhlasit a nový projekt je vytvořen. Do adresáře pcores v projektovém adresáři nakopírujeme adresář opb_usb_1_00a se soubory periferie OPB_USB. Pro zobrazení jádra na záložce IP Catalog je potřeba v menu zvolit Rescan User Repositories.
Obr. 19 Menu Project v XPS
24
Následně je již jádro možné přidat do systému. Periferii tedy přidáme například pomocí pravého tlačítka myši a vybrání volby Add IP.
Obr. 20 Přidání IP jádra v XPS
Stejným způsobem ještě přidáme jádro obp_sysace. Nalezneme ho v kategorii Memory Controller.
25
Obr. 21 Umístění opb_sysace v XPS
Obě jádra máme přidána v našem systému, avšak ještě je potřeba nakonfigurovat jejich propojením s okolím. Začneme tím, že obě jádra připojíme ke sběrnici OPB. V sloupci Bus Connection vybere z nabídky mb_opb, jak je uvedeno na následujícím obrázku.
26
Obr. 22 Připojení periferie k OPB v XPS
To samé můžeme udělat kliknutím na bod znázorňující připojení periferie k OPB. První kliknutí způsobí rozbalení nabídky připojení ke sběrnicím procesoru a další kliknutí již připojí jádro ke sběrnici.
Obr. 23 Jiný způsob připojení periferie k OPB v XPS
27
Poté přepneme na kartu Adresses a stiskneme Generate Addresses, pokud se nevygeneruje adresa REG u opb_usb, nastavíme ji ručně.
Obr. 24 Záložka Adresses v XPS
Na závěr je třeba nastavit propojení výstupních portů periferie OPB_USB a SystemACE a externí porty napojené na piny FPGA obvodu. Pohodlnější je toto nastavení provést přímou editací souborů system.mhs a system.ucf, než-li pomocí záložky Ports, proto bude popsán tento způsob. Otevřeme si tedy jako první soubor system.mhs. V Platform Studiu na záložce Project poklepeme na MHS file:system.mhs. V otevřeném souboru si najdeme místo, kde se nachází definice opb_usb a rozšíříme ji o následující kód, popisující připojení portů : PORT PORT PORT PORT PORT PORT PORT PORT PORT PORT PORT PORT
sysace_mpa = sysace_mpa sysace_mpd_i = sysace_mpd_i sysace_mpd_o = sysace_mpd_o sysace_mpd_t = sysace_mpd_t sysace_mpoe = sysace_mpoe sysace_mpwe = sysace_mpwe sace_usb_a = sace_usb_a sace_usb_d = sace_usb_d sace_usb_oen = sace_usb_oen sace_usb_wen = sace_usb_wen usb_csn = usb_csn usb_hpi_reset_n = usb_hpi_reset_n
28
Obr. 25 Definice opb_usb v MHS souboru XPS
Stejným způsobem doplníme definici portů opb_sysace : PORT PORT PORT PORT PORT PORT PORT PORT PORT PORT
SysACE_CLK = SysACE_MPIRQ SysACE_IRQ = SysACE_MPA = SysACE_CEN = SysACE_MPD_I SysACE_MPD_O SysACE_MPD_T SysACE_OEN = SysACE_WEN =
sysace_clk_in = sysace_mpirq sysace_intr sysace_mpa sace_mpce = sysace_mpd_i = sysace_mpd_o = sysace_mpd_t sysace_mpoe sysace_mpwe
29
Obr. 26 Definice opb_sysace v MHS souboru XPS
Následuje doplnění definice externích portů a úpravy MHS souboru jsou hotové. # System ACE Only Ports PORT sysace_clk_in = sysace_clk_in, DIR = I, SIGIS= CLK PORT sysace_mpirq = sysace_mpirq, DIR = I PORT sace_mpce = sace_mpce, DIR = O # USB HPI Only Signals PORT usb_hpi_reset_n = usb_hpi_reset_n, DIR = O PORT usb_hpi_int = usb_hpi_int, DIR = I, SENSITIVITY = LEVEL_HIGH, SIGIS = INTERRUPT PORT usb_csn = usb_csn, DIR = O # Shared USB/HPI Ports PORT sace_usb_a = sace_usb_a, VEC = [6:0], DIR = O PORT sace_usb_d = sace_usb_d, VEC = [15:0], DIR = IO PORT sace_usb_oen = sace_usb_oen, DIR = O PORT sace_usb_wen = sace_usb_wen, DIR = O
30
Obdobným způsobem jako MHS soubor, editujeme UCF soubor a doplníme definici signálů na konkrétní piny FPGA. #-----------------------------------------------------# IO Pad Location Constraints / Properties for System # ACE MPU / USB #-----------------------------------------------------NET sysace_clk_in NET sysace_clk_in NET sysace_clk_in # Leave 1 ns margin TIMESPEC "TSSYSACE"
LOC = AF11; IOSTANDARD = LVCMOS33; TNM_NET = "sysace_clk_in";
NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET
LOC LOC LOC LOC LOC LOC LOC IOSTANDARD SLEW DRIVE LOC IOSTANDARD SLEW DRIVE LOC LOC LOC LOC LOC LOC LOC LOC LOC LOC LOC LOC LOC
sace_usb_a<0> sace_usb_a<1> sace_usb_a<2> sace_usb_a<3> sace_usb_a<4> sace_usb_a<5> sace_usb_a<6> sace_usb_a<*> sace_usb_a<*> sace_usb_a<*> sace_mpce sace_mpce sace_mpce sace_mpce sace_usb_d<0> sace_usb_d<1> sace_usb_d<2> sace_usb_d<3> sace_usb_d<4> sace_usb_d<5> sace_usb_d<6> sace_usb_d<7> sace_usb_d<8> sace_usb_d<9> sace_usb_d<10> sace_usb_d<11> sace_usb_d<12>
= PERIOD "sysace_clk_in" 29 ns;
31
= = = = = = = = = = = = = = = = = = = = = = = = = = =
U22; Y10; AA10; AC7; Y7; AA9; Y9; LVCMOS33; FAST; 8; AD5; LVCMOS33; FAST; 8; AB7; AC9; AB9; AE6; AD6; AF9; AE9; AD8; AC8; AF4; AE4; AD3; AC3;
NET NET NET NET NET NET NET NET NET NET NET NET NET NET NET
sace_usb_d<13> sace_usb_d<14> sace_usb_d<15> sace_usb_d<*> sace_usb_d<*> sace_usb_d<*> sace_usb_d<*> sace_usb_oen sace_usb_oen sace_usb_oen sace_usb_oen sace_usb_wen sace_usb_wen sace_usb_wen sace_usb_wen
LOC LOC LOC IOSTANDARD SLEW DRIVE PULLDOWN; LOC IOSTANDARD SLEW DRIVE LOC IOSTANDARD SLEW DRIVE
= = = = = =
AF6; AF5; AA7; LVCMOS33; FAST; 8;
= = = = = = = =
AA8; LVCMOS33; FAST; 8; Y8; LVCMOS33; FAST; 8;
NET NET NET NET
sysace_mpirq sysace_mpirq sysace_mpirq sysace_mpirq
LOC = AD4; IOSTANDARD = LVCMOS33; TIG; PULLDOWN;
NET NET NET NET NET NET NET NET NET NET NET
usb_csn usb_csn usb_csn usb_csn usb_hpi_reset_n usb_hpi_reset_n usb_hpi_reset_n usb_hpi_int usb_hpi_int usb_hpi_int usb_hpi_int
LOC IOSTANDARD SLEW DRIVE LOC IOSTANDARD TIG; LOC IOSTANDARD TIG; PULLDOWN;
= = = = = =
AF10; LVCMOS33; FAST; 8; A7; LVCMOS25;
= V5; = LVCMOS33;
Tím je náš projekt z hlediska návrhu hardwaru hotov, budeme proto pokračovat konfigurací softwarové části. Začneme tím, že si přidáme do systému knihovnu xilfatfs. Pomocí menu Software -> Software Platform Settings … si otevřeme okno Software Platform Settings a zatrhneme xilfatfs, jak vidíme na dalším obrázku.
32
Obr. 27 Okno Software Platform Settings v XPS
Nyní si v projektovém adresáři vytvoříme libovolný adresář a do něho si zkopírujeme zdrojové kódy programu pro MicroBlaze z přiloženého CD. Vybereme si buď příklad s myší nebo s klávesnicí. V Xilinx Platform Studiu založíme nový softwarový projekt výběrem Applications -> Add Software Application Project.
Obr. 28 Přidání nového softwaorvého projektu v XPS
33
Poklepáním na Compiler Options otevřeme okno s nastavením kompilátoru, kde nastavíme Stack Size na 4096. Do projektu přidáme naše zdrojové soubory usb_hpi_test.c, sleep.c a sleep.h. Poklepáním na nápis Sources se nám otevře okno, ve kterém požadované soubory vybereme. Hlavičkový soubor se přidá obdobně poklepáním na Headers. Na závěr nezapomeneme zaškrtnout volbu Mark to Initialize BRAMs, aby byl náš program vložen do paměti procesoru.
Obr. 29 Konfigurace softwarového projektu příkladu v XPS
Zbývá jen zkontrolovat, zda jsou v souboru usb_hpi_test.c správně uvedeny adresy USB HPI rozhraní a registru, pomocí kterého se provádí softwarový reset řadiče Cypress. Konstanta USB_RESET_REG uvedená na začátku souboru, musí mít stejnou hodnotu jako REG Base Address na záložce Adresses, pokud jste nezvolili jiné jméno instance jádra opb_usb než defaultní opb_usb_0, tak je vše připraveno ke kompilaci. Pokud ano, pak bude ještě potřeba nastavit konstantu USB_DATA tak, aby odpovídala adrese nastavené na záložce Adresses. Lze to provést změnou názvu konstanty XPAR_OPB_USB_0_MEM0_BASEADDR, tak aby měla stejný
34
název jako příslušná konstanta definovaná v souboru xparameters.h nebo přímým nastavením hodnoty ze záložky Adresses. Pokud chceme mít v projektu příklad s klávesnicí i myší zároveň, stačí opakovat postup od přidání nového softwarového projektu a přidat tak do projektu i zbývající příklad. Nesmíme ovšem zapomenout, že můžeme mít aktivní vždy pouze jeden projekt. Deaktivaci projektu provedeme volbou Make Project Inactive
Obr. 30 Deaktivace softwarového projektu v XPS
Projekt znovu aktivujeme volbou Make Project Active.
35
Celý projekt je hotov, proto můžeme pomocí volby Device configuration/Update Bitstream nechat celý projekt přeložit. Během překládání projektu, můžeme nakopírovat soubor demo.bin s firmwarem pro kontrolér Cypress na pamětovou kartu. Firmware není pro oba příklady stejný, je proto potřeba nakopírovat na paměťovou kartu správnou verzi. Soubor by měl být nakopírován do kořenového adresáře. Pokud zvolíme jiné umístění, musíme změnit cestu k firmwaru v souboru usb_hpi_test.c. Připojíme vývojovou desku k počítači, propojíme sériové porty, připojíme myš nebo klávesnici podle zvoleného příkladu (na desce ML401 do portu USB host), nakonfigurujeme si terminál na PC a volbou Device configuration/Download Bitstream nahrajeme příklad do přípravku. Pokud je vše v pořádku, měly by se při pohybu myší na terminálu zobrazovat souřadnice, respektive zobrazovat stisknuté klávesy na klávesnici.
36
3. Řadič kamery 3.1. Výběr vhodné webové kamery Požadavkem zadání nebylo realizovat řadič pro předem určenou kameru, ale naopak vhodnou kameru vybrat. Na základě požadavků zadavatele práce jsem se zaměřil na hledání vhodné kamery v oblasti webových kamer připojovaných pomocí rozhraní USB.
3.1.1.Kritéria pro výběr Důležitá kritéria pro nás při výběru kamery byla dostupnost na českém trhu (může být i použitá) a dostatečné množství informací nutné pro realizaci řadiče. Nelze opomenout ani cenovou dostupnost.
3.1.2. Přehled možností Výrobci webových kamer většinou mnoho informací o svých produktech k dispozici nedávají, proto se jako nejlepší možnost zdá využití informací z ovladačů pro operační systém Linux. Výběr se tedy zúžil na kamery, pro které existují ovladače pro Linux. Bohužel, ne všechny ovladače je možné získat ve formě zdrojových kódů. Například ovladače pro webové kamery Philips jsou rozdělené na dvě části, první část je k dispozici ve formě zdrojových kódů i s dokumentací, ale druhá část je k dispozici pouze jako binární soubor. Aby jeho vývojáři byl umožněn přístup k dokumentaci, musel podepsat smlouvu s firmou Philips, že získané informace nezveřejní a proto musí být část ovladače šířena jako spustitelný soubor. Toto dokonce vedlo ke sporu s vývojáři linuxového jádra a vývoj tohoto ovladače byl nakonec ukončen. Více informací je možné nalézt na webových stránkách autora [15]. Dále je možné k některým kamerám najít i různě obsáhlé katalogové listy. Většinou zvlášť pro bridge (řídící chip, který zprostředkovává komunikaci kamery s počítačem přes rozhraní USB a zpracovává data ze senzoru) a senzor (většinou chipy CMOS, méně už CCD), ne pro kameru jako celek. Při hledání jsem tedy nejdříve procházel různé projekty vývoje ovladačů pro webové kamery v Linuxu. Projektů je poměrně velké množství. Vývoj mnoha z nich je však bohužel již ukončen. Rozsah kamer podporovaných jednotlivými
37
projekty, respektive ovladači, je různý. Některé projekty se soustředí na kamery určitého výrobce nebo také na kamery s bridgem od konkrétního výrobce, někdy také pouze na kamery s jedním nebo maximálně několika podobnými typy bridgů. Jednotlivých kamer, podporovaných pod OS Linux je relativně velké množství. Velmi zajímavý je projekt Linux Kernel Webcams Driver GSPCA / SPCA5xx [16]. Tento ovladač je v současné době uživateli hodně používaný a podle referencí uživatelů, kamery fungují podobně jako s originálními ovladači pod operačním systémem Windows. Jeho vývoj stále pokračuje a podporuje velké množství kamer. Jejich seznam je uveden zde [17].
3.1.3. Užší výběr Po prostudování informací o jednotlivých ovladačích jsem výběr zúžil na dvě možnosti. Vybrat kameru ze seznamu podporovaných kamer [17] výše zmiňovaného projektu Linux Kernel Webcams Driver GSPCA / SPCA5xx. Druhou možností je analyzovat vhodnost použití některé ze starších kamer. K dispozici jsem měl Philips PCVC740K ToUcam PRO (je dostupná v HW laboratoři na katedře počítačů ČVUT FEL) a Genius VideoCAM Web (zapůjčena Ing. Honzíkem v ÚTIA AV ČR).
3.1.3.1. Linux Kernel Webcams Driver GSPCA / SPCA5xx Jedním z kritérií je, aby kamera byla aktuálně v prodeji v České republice. Dále bych vybíral podle dostupnosti dalších informací k jednotlivým modelům. Zejména vhodných katalogových listů jako zdroj doplňujících informací. Podařilo se mi i sehnat i několik referencí uživatelů ke konkrétním typům, například k Creative Live Notebook Pro a Labtec Webcam Pro.
3.1.3.2. Philips PCVC740K ToUcam PRO Tato kamera je zajímavá tím, že nemá jako většina kamer CMOS senzor, ale senzor CCD. K tomuto senzoru existuje i poměrně obsáhlý katalogový list [18]. Rovněž existuje i pro celou kameru, bohužel ale obsahuje pouze základní informace. Nepodařilo se mi identifikovat bridge kamery, takže nelze zjistit, zda jsou k němu dostupné nějaké bližší informace. Pravděpodobně by ho bylo možné identifikovat jednoduše rozebráním kamery. Linuxový ovladač pro kameru existuje, ale jeho nedostatkem je již uvedené rozdělení na dva moduly (PWC, PWCX), z nichž pouze první je dostupný ve formě zdrojových kódů.
38
3.1.3.3. Genius VideoCAM Web Byla vyráběna ve čtyřech verzích. Od druhé verze bylo přidáno číslo verze za název webové kamery, označení pak bylo Genius VideoCAM Web V2-V4. Jednotlivé verze se liší typem použitého bridge a senzoru. Naše kamera je první verze, označovaná Genius VideoCAM Web. Obsahuje bridge i senzor od firmy OmniVision. Konkrétně bridge OV511+ a senzor OV7620. Vývojem ovladače pro kamery používající chipy od této firmy se zabývá projekt Linux OVCam Drivers [19]. Kameru se mi podařilo pod Linuxem zprovoznit a funguje celkem přijatelně. Obraz je o něco méně kvalitní než s originálními ovladači pod Windows a jeho obnovování je trochu pomalejší. Celkově je obraz podle mého názoru nepříliš kvalitní i na poměry webových kamer. Jako zdroj dalších informací mohou posloužit velmi obsáhlé katalogové listy dostupné jak pro bridge [20], tak i pro senzor [21]. Dále je dostupné schéma zapojení celé kamery [22] a katalogový list pro starší verzi bridge OV 511 [23], od které se čip OV 511+ příliš neliší. Rozdíly mezi čipy OV 511 a OV 511+ jsou popsány na webových stránkách projektu [24].
3.1.4. Zvolená kamera Prostudoval jsem výše zmiňované materiály a na základě dostupných informací považuji za nejvhodnější z možných řešení použití USB kamery Genius VideoCAM Web pro realizaci řadiče, i přes nepříliš velkou kvalitu obrazu.
3.2. Návrh a implementace ovladače V této fázi máme tedy vyřešenou práci s USB na vývojové platformě ML401 a máme vybranou vhodnou kameru. Nyní je tedy připravené vše potřebné pro poslední část projektu, tvorbu ovladače kamery.
3.2.1. Návrh ovladače Pro psaní ovladače potřebujeme znát zejména jakým způsobem je možné s kamerou komunikovat přes USB rozhraní a jak je kamera ovládána pomocí nastavování registrů. Tyto informace jsou celkem dobře popsány v katalogovém listu [26]. Rovněž jsou zde popsány jak registry kamery, tak interní USB řadič kamery. Zbytek potřebných informací získáme z Linuxových ovladačů. Naše
39
kamera komunikuje pomocí dvou endpointů. Endpoint 0 je servisní, slouží inicializaci a konfiguraci kamery. Endpoint 1 pak slouží k přenosu obrazových dat.
Obr. 31 USB rozhraní webové kamery Genius VideoCAM Web [20]
Data jsou ze zařízení posílána komprimovaná, součástí ovladače pro Linux je proto dekompresní modul. V našem případě bude vhodné ovladač rozdělit na dvě části. Jedna část bude implementována v USB řadiči Cypress a bude se starat o inicializaci a konfiguraci kamery, přicházející obrazová data bude předávat pomocí HPI rozhraní procesoru MicroBlaze. Druhá část v procesoru MicroBlaze bude obsahovat dekompresní modul, který získaná data dekomprimuje.
3.2.2. Implementace ovladače K implementaci ovladače vybrané webové kamery po dohodě s vedoucím práce nedošlo. Důvodem byla větší časová náročnost první části, než bylo předpokládáno, především nutnost tvorby periferie komunikující s USB řadičem.
40
4. Závěr Práce byla rozdělena na následujících části, které byly řešeny postupně : 1. USB na vývojové desce ML401 a) Seznámení se s vývojovou deskou ML401 a s USB kontrolérem Cypress CY7C67300 na ní integrovaným. b) Seznámení s prostředím Xilinx EDK, zejména s částmi týkající se komunikace řadiče USB a procesoru MicroBlaze. c) Vytvoření funkčního systému umožňujícího práci s USB řadičem za pomoci návrhového softwaru EDK. 2. Řadič kamery a) Prostudování oblasti dostupných webových kamer a výběr vhodné kamery. b) Návrh a implementace ovladače kamery.
V počátečních dvou bodech první části probíhalo seznámení s vývojovou deskou, USB kontrolérem a návrhovým softwarem EDK V této části jsem se rovněž seznámil s bakalářskou prací Jiřího Brabce. Ve třetím bodě první části jsem očekával navrhnutí vlastního systému v programu XPS, který bude komunikovat s řadičem Cypress pomocí rozhraní pro připojení externího procesoru HPI. Předpokládal jsem dále , že bude možné takový systém navrhnout s využitím IP jader standardně přítomných v XPS. Po prostudování dokumentace a příkladů firmy Xilinx v předchozích dvou bodech, jsem ale zjistil, že EDK neumožňuje navrhnout jednoduchým způsobem systém komunikující s USB řadičem. Takový systém je pouze součástí referenčního designu k mnou použité vývojové platformě ML401 [3]. Neexistuje ale samostatná periferie, kterou by bylo možné přidat do libovolného projektu. Práce Jiřího Brabce, na kterou jsem měl ve své práci navázat, tento problém také neřeší a jako hardwarový systém implementovaný v FPGA využívá referenční design od společnosti Xilinx. Tento stav byl po dohodě s vedoucím práce označen jako nevyhovující, a jako nový hlavní cíl bylo stanoveno vytvoření samostatné periferie, kterou je možné přidat do libovolného návrhu v EDK. Tato periferie by měla sloužit jako rozhraní mezi procesorem MicroBlaze a HPI rozhraním USB řadiče. Dále bylo oproti zadání požadováno vytvoření související dokumentace pro návrhový software Xilinx EDK tak, aby periferie byla přenositelná i na jiné desky používající čip CY7C67300 a Xilinx System ACE Compact Flash (CF), který je potřebný pro programování řadiče.
41
Nově vytyčené cíle bodu 1.c) se podařilo úspěšně splnit. Byla vytvořena periferie, kterou jsem nazval OPB_USB. Tuto periferii je možné otestovat na dvou příkladech. Jedná se o ukázku připojení USB myši a USB klávesnice. Část 2.b) se zabývala výběrem takové webové kamery, ke které bude dostatek potřebných informací pro následující tvorbu řadiče a která bude také dostupná. Tuto kameru se podařilo úspěšně obstarat v podobě modelu Genius VideoCAM Web. V závěrečné části práce mělo dojít k návrhu a implementaci ovladače pro na začátku vybranou kameru. Byl naznačen postup implementace, ale dále se tento bod bohužel nepodařilo splnit a to z důvodů výše uvedených, tedy že ani firma Xilinx a ani práce Jiřího Brabce neposkytla dostatečné podklady pro návrh vlastního systému v EDK pro komunikaci s USB řadičem. Použití referenčního designu bylo po dohodě s vedoucím práce označeno jako nedostatečné řešení a hlavní cíl práce byl přehodnocen. Následně vzhledem k větší časové náročnosti bodu 1.c) nebylo možné z časových důvodů ovladač implementovat. Jednotlivé části práce se tedy podařilo splnit s výjimkou poslední části, k jejíž realizaci nedošlo z časových důvodů. Od implementace ovladače bylo upuštěno po dohodě s vedoucím práce. Nyní je tedy připraven kompletní systém implementovaný v FPGA obvodu propojený s USB řadičem, vybraná vhodná kamera a naznačen postup implementace ovladače. Na práci je možné v budoucnu navázat a naprogramovat ovladač pro kameru Genius VideoCAM Web, případně podle poznatků v kapitole o výběru kamery vybrat jinou kameru a nebo práci využít při připojování libovolného jiného USB zařízení.
42
5. Seznam použitých zdrojů [1]
BRABEC, Jiří. Ovládání USB periferií z FPGA. [s.l.], 2006. xiv, 45 s. České vysoké učení technické v Praze. Fakulta elektrotechnická. Katedra počítačů. Vedoucí bakalářské práce Ing. Tomáš Brabec.
[2]
EZ-Host & EZ-OTG Development Kit [Balík software pro USB řadiče Cypress CY7C67200/CY7C67300]. [cit. 2007-08-20]. Dostupný z WWW:
.
[3]
ML401 EDK Embedded MicroBlaze Reference Design. www.xilinx.com [online]. [cit. 2007-08-20]. Dostupný z WWW: . Ukázkový projekt pro software Xilinx EDK verze 8.1i.
[4]
ML401/ML402/ML403Evaluation Platform User Guide (v. 2.5). www.xilinx.com [online]. 24.5.2006 [cit. 2007-08-20]. Dostupný z WWW: .
[5]
EZ-Host™ Programmable Embedded USB Host and Peripheral Controller with Automotive AEC GradeSupport (38-08015 Rev. *H). www.cypress.com [online]. [cit. 2007-08-20]. Dostupný z WWW: .
[6]
BIOS User’s Manual (v1.1). www.cypress.com [online]. c2003 [cit. 200708-20]. Dostupný z WWW: .
[7]
HYDE, John . USB Multi-Role Device Design By Example. [s.l.] : [s.n.], c2003. 121 s. Dostupný z WWW: .
[8]
ML401 Schematics. www.xilinx.com [online]. [cit. 2007-08-20]. Dostupný z WWW: .
43
[9]
Frameworks Reference Guide Family of Products for the CY7C67300/CY7C67200 (v1.0) [Dokument je součástí instalace nástrojů Cypress z CY3663_CD_Contents.zip]. c2003 [cit. 2007-08-20]. Dostupný v: .
[10]
Xilinx. MicroBlaze Processor Reference - Guide Embedded Development Kit EDK 8.2i (v. 6.0). www.xilinx.com [online]. 1.6.2006 [cit. 2007-08-20]. Dostupný z WWW: .
[11]
KOHOUT, Lukáš. Samoadaptace v FPGA. [s.l.], 2006. xiii, 59 s. České v ysoké učení technické v Praze. Fakulta elektrotechnická. Katedra počítačů. Vedoucí diplomové práce Ing. Martin Daněk, Ph.D.
[12]
Xilinx Constraints Guide (v. 8.2i). www.xilinx.com [online]. [cit. 2007-0820]. Dostupný z WWW: .
[13]
Platform Specification Format Reference Manual Embedded Development Kit EDK 8.2i (v. 4.0). www.xilinx.com [online]. 23.6.2006 [cit. 2007-0820]. Dostupný z WWW: .
[14]
OPB IPIF Architecture [Dokument je součástí instalace Xilinx EDK 8.2i]. 18. 8. 2004 [cit. 2007-08-20]. Dostupný v: .
[15]
Linux support for Philips USB webcams halted [online]. [cit. 2007-08-20]. Dostupný z WWW: .
[16]
Gspca/Spca5xx, Spca5xx-LE, Zr364xx WebCams Driver [online]. 2003 , 0 5/08/2007 [cit. 2007-08-20]. Dostupný z WWW: .
[17]
XHAARD, Michel. Gspca/Spca5xx, Spca5xx-LE, Zr364xx WebCams Driver [online]. 2003 , 2007-08-05 [cit. 2007-08-20]. Dostupný z WWW: .
44
[18]
Sony ICX098BQ.[online] [cit. 2007-08-20] Dostupný z WWW: .
[19]
MCCLELLAND, Mark. Linux OVCam Drivers [online]. c1999-2006 , 6 Apr 2006 [cit. 2007-08-20]. Dostupný z WWW: .
[20]
OV 511+ Advanced Camera to USB Bridge (Rev. 1.2) [online]. 13.5. 2000 [cit. 2007-08-20]. Dostupný z WWW: .
[21]
OV7620 SINGLE-CHIP CMOS VGA COLOR DIGITAL CAMERA (Rev. 1.2)[online]. 2000 [cit. 2007-08-20]. Dostupný z WWW: .
[22]
USB Camera System (Rev. 1.01) [online]. 16.2. 2000 [cit. 2007-08-20]. Dostupný z WWW: < http://ovcam.org/ov511/download/ov511plus_101.pdf>.
[23]
OV 511 Advanced Camera to USB Bridge (Rev. 1.0) [online]. 17.7. 1998 [cit. 2007-08-20]. Dostupný z WWW: .
[24]
MCCLELLAND, Mark. Differences Between the OV511 and OV511+ Camera-to-USB Chips [online]. c2000 [cit. 2007-08-20]. Dostupný z WWW: .
45
46
6. Obsah přiloženého CD \cypress_tools CY3663_CD_Contents.zip - Host & EZ-OTG Development Kit \doc – Použitá dokumentace ve formátu PDF \edk \opb_usb_v1_00_a – vytvořená USB periferie pro EDK ml401_emb_ref_81.zip – Referenční design pro desku ML401 \text_bp – Text práce ve formátu MS Word a PDF BP_webcam.doc BP_webcam.pdf \usb_example – Příklady umožňující otestování USB periferie \keyboard – Příklad s USB klávesnicí \cypress_firmware – Firmware pro USB kontrolér \bin demo.bin – Přeložený firmware \common – Soubory Frameworks \src – Zdrojové soubory samotného ovladače \microblaze_sw – Program pro MicroBlaze \mouse - Příklad s USB myší \cypress_firmware – Firmware pro USB kontrolér \bin demo.bin – Přeložený firmware \common – Soubory Frameworks \src – Zdrojové soubory samotného ovladače \microblaze_sw – Program pro MicroBlaze readme.txt
47