ˇ ´ vysok´ ˇen´ı technick´ Cesk e e uc e v Praze ´ Fakulta elektrotechnicka
´ PRACE ´ DIPLOMOVA Moˇ znosti pouˇ zit´ı operaˇ cn´ıho syst´ emu GNU/Linux v zabezpeˇ covac´ı kameˇ re EYE-02
Praha, 2009
Jiˇ r´ı V´ıt
i
Podˇ ekov´ an´ı Dˇekuji vedouc´ımu sv´e diplomov´e pr´ace Ing. Pavlu P´ıˇsovi za ochotu ujmout se jej´ıho veden´ı a za pˇripom´ınky k pr´aci, d´ale firmˇe JABLOCOM a jej´ım zamˇestnanc˚ um Ing. Jiˇr´ımu Holingerovi a Ing. Jiˇr´ımu Baˇzantovi, PhD., za to, ˇze mi umoˇznili pod´ılet se na v´yvoji jejich v´yrobku a za jejich uˇziteˇcn´e rady a Bc. Janu Breuerovi za jeho rady ohlednˇe detail˚ u operaˇcn´ıho syst´emu Linux.
ii
Abstrakt Diplomov´a pr´ace se vˇenuje pouˇzit´ı operaˇcn´ıho syst´emu Linux v bezpeˇcnostn´ı kameˇre JABLOCOM EYE-02 vybaven´e mikroprocesorem AT91SAM9260 firmy Atmel. Na zaˇc´atku je struˇcnˇe naznaˇcen postup, jak´ym byl operaˇcn´ı syst´em pˇripraven pro pouˇzit´ı v zaˇr´ızen´ı. N´asleduje popis v´yznamu ovladaˇc˚ u v syst´emu Linux, jejich obvykl´a struktura a postupy pˇri v´yvoji. V dalˇs´ıch kapitol´ach je pops´an v´yvoj ovladaˇc˚ u pro nˇekter´a zaˇr´ızen´ı pˇr´ıtomn´a na kameˇre, jmenovitˇe CMOS videosn´ımaˇc a PIR detektor pohybu. Protoˇze je videosn´ımaˇc pˇripojen k mikroprocesoru prostˇrednictv´ım specializovan´eho rozhran´ı ISI, je kromˇe ovladaˇce pro samotn´y sn´ımaˇc prezentov´an tak´e ovladaˇc pro toto rozhran´ı, kter´e zat´ım v Linuxu nen´ı podporov´ano. V z´avˇeru pr´ace jsou zhodnoceny dosaˇzen´e v´ysledky a nast´ınˇen smˇer dalˇs´ıho v´yvoje.
iii
Abstract This diploma thesis focuses on usability of the Linux operation system in security camera JABLOCOM EYE-02. This camera is equipped with Atmel AT91SAM9260 microcontroller. In the first part is shortly described the way how the operation system has been prepared for the use in this device. This is followed by some introduction to Linux device drivers, their usual structure and development methods. Next chapters describe driver development for some devices used in the camera, this is CMOS video sensor and PIR motion sensor. The video sensor is connected to the microprocessor using specialised ISI interface, so the thesis presents two drivers – one for the video sensor a one for the ISI, which is in the kernel not yet supported. The conclusion describes reached results and possibilities of future development.
iv
v
Obsah Seznam obr´ azk˚ u
viii
Seznam tabulek
ix
´ 1 Uvod
1
2 Kamera EYE-02 a operaˇ cn´ı syst´ em Linux 2.1 Kamera EYE-02 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Provoz OS Linux v kameˇre . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 2 2
3 Drivery v Linuxu 3.1 V´yznam a rozdˇelen´ı driver˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Jadern´e moduly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Standardn´ı souborov´e operace na zaˇr´ızen´ı . . . . . . . . . . . . . . . . . . .
5 5 6 7
4 Driver pro CMOS videosn´ımaˇ c 4.1 CMOS videosn´ımaˇc MT9V011 . . . . . . . . . . 4.2 Rozhran´ı Atmel ISI . . . . . . . . . . . . . . . . 4.3 API Video4Linux2 . . . . . . . . . . . . . . . . 4.4 Struktura ovladaˇce . . . . . . . . . . . . . . . . 4.5 Ovladaˇc ISI . . . . . . . . . . . . . . . . . . . . ´ 4.5.1 Upravy linuxov´eho j´adra . . . . . . . . . 4.5.2 Inicializace driveru . . . . . . . . . . . . 4.5.3 Buffer pro zachycen´y obraz . . . . . . . . 4.5.4 Souborov´e operace open() a release() 4.5.5 Proces sejmut´ı obrazu . . . . . . . . . . 4.5.6 Operace read() . . . . . . . . . . . . . . 4.5.7 Operace ioctl() a konfigurace sn´ımaˇce 4.6 Ovladaˇc sn´ımaˇce . . . . . . . . . . . . . . . . . ´ 4.6.1 Upravy linuxov´eho j´adra . . . . . . . . . 4.6.2 Protokol I2C . . . . . . . . . . . . . . . 4.6.3 Struktura k´odu . . . . . . . . . . . . . . 4.7 Pouˇzit´ı ovladaˇc˚ u . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
9 9 10 10 11 12 13 14 15 16 16 17 18 18 19 19 20 21
ˇ 5 Cidlo PIR 23 5.1 Inicializaˇcn´ı funkce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 5.2 Souborov´a operace read() . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 vi
5.3 Obsluha pˇreruˇsen´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 5.4 Dalˇs´ı moˇznosti v´yvoje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 6 USB velkokapacitn´ı zaˇ r´ızen´ı
26
7 Z´ avˇ er
27
A Obsah pˇ riloˇ zen´ eho CD
29
vii
Seznam obr´ azk˚ u 2.1 Blokov´e sch´ema kamery EYE-02 . . . . . . . . . . . . . . . . . . . . . . . . 4.1 4.2 4.3 4.4 4.5
Blokov´e sch´ema sn´ımaˇce MT9V011 . . . . . V´yznam ovladaˇce atmel-isi . . . . . . . . . Zn´azornˇen´ı postupu pˇri sn´ım´an´ı obrazu . . . V´yznam ovladaˇce mt9v011 . . . . . . . . . . Uk´azka obr´azku sejmut´eho kamerou EYE-02
viii
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
3 9 13 17 19 22
Seznam tabulek 4.1 Podporovan´e ioctl pˇr´ıkazy . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
ix
Kapitola 1 ´ Uvod Tato pr´ace se zab´yv´a pouˇzit´ım operaˇcn´ıho syst´emu Linux v bezpeˇcnostn´ı kameˇre EYE02 firmy JABLOCOM v Jablonci nad Nisou. Kamera je v souˇcasnosti provozov´ana bez operaˇcn´ıho syst´emu, proto jsem byl poˇz´ad´an, abych prozkoumal moˇznosti a pˇr´ınos vyuˇzit´ı Linuxu. ´ Ulohu pˇrenesen´ı Linuxu do kamery jsem ˇreˇsil v r´amci t´ymov´eho projektu v roce 2008 se sv´ym kolegou Janem Breuerem. Pˇri ˇreˇsen´ı jsme narazili na probl´em s pˇr´ıliˇs malou pamˇet´ı Data Flash, kterou byla kamera vybavena. Do t´eto pamˇeti se neveˇsel zkompilovan´y bin´arn´ı obraz j´adra syst´emu. Kamera vˇsak obsahuje slot pro Micro SD kartu, kterou jsme pro bootov´an´ı s u ´ spˇechem vyuˇzili. Nyn´ı je v pamˇeti Data Flash um´ıstˇen pouze bootlader, kter´y um´ı ˇc´ıst Micro SD kartu. Obraz j´adra je na kartˇe uloˇzen na pˇresnˇe definovan´e pozici, odkud ho bootloader zkop´ıruje do RAM a n´aslednˇe spust´ı, ˇc´ımˇz dojde k nastartov´an´ı syst´emu. Nyn´ı je m´ym u ´ kolem vytvoˇrit drivery pro hardwarov´e prvky kamery – CMOS videosenzor, PIR detektor pohybu a USB velkokapacitn´ı zaˇr´ızen´ı. Prvn´ı dva drivery budu ˇreˇsit s´am, tˇret´ı byl jiˇz naps´an a je v j´adˇre k dispozici. Mou prvotn´ı ambic´ı je proniknout do problematiky v´yvoje driver˚ u. Na v´yvoji driver˚ u budu pokraˇcovat i po odevzd´an´ı diplomov´e pr´ace a budu je (podle zad´an´ı) vyv´ıjet pod licenc´ı open-source. Driver pro videosenzor (resp. pro rozhran´ı ISI pouˇzit´eho mikroprocesoru, k nˇemuˇz je videosenzor pˇripojen) jeˇstˇe nebyl pro konkr´etn´ı mikroprocesor vyvinut, proto bych ho po dokonˇcen´ı r´ad dostal do hlavn´ı vˇetve linuxov´eho j´adra.
1
Kapitola 2 Kamera EYE-02 a operaˇ cn´ı syst´ em Linux 2.1
Kamera EYE-02
Kamera EYE-02 je zabezpeˇcovac´ı kamera, kterou vyv´ıj´ı firma JABLOCOM v Jablonci nad Nisou. Na obr. 2.1 je zn´azornˇeno blokov´e sch´ema. Jej´ı prvotn´ı funkc´ı je sledov´an´ı vymezen´eho prostoru a v pˇr´ıpadˇe detekce pohybu sejmut´ı obr´azku a upozornˇen´ı uˇzivatele prostˇrednictv´ım SMS nebo MMS. Pro tento u ´ˇcel je kamera vybavena CMOS videosn´ımaˇcem, detektorem pohybu a GSM modulem. Uˇzivatelsk´e rozhran´ı pˇredstavuj´ı dvˇe svˇeteln´e diody (ˇcerven´a a zelen´a) a tlaˇc´ıtko. Kromˇe LED s viditeln´ym svˇetlem m˚ uˇzeme na kameˇre nal´ezt tak´e sadu infraˇcerven´ych LED, kter´e umoˇzn ˇ uj´ı noˇcn´ı vidˇen´ı. Kamera d´ale obsahuje USB rozhran´ı a slot na Micro SD kartu. Pomoc´ı USB rozhran´ı je moˇzn´e pˇripojit kameru k PC, prov´est konfiguraci a st´ahnout sn´ımky. MicroSD karta slouˇz´ı pro uchov´an´ı sn´ımk˚ u a dalˇs´ıch potˇrebn´ych dat. V kameˇre je pouˇzit mikroprocesor AT91SAM9260 od firmy Atmel a CMOS videosn´ımaˇc MT9V011 od firmy Micron. Mikroprocesor je vybaven rozhran´ım ISI (Image Sensor Interface) pro pˇripojen´ı videosn´ımaˇce, schopn´ym pˇrijat´a data okamˇzitˇe zpracovat.
2.2
Provoz OS Linux v kameˇ re
Linux je operaˇcn´ı syst´em unixov´eho typu. Jeho j´adro je ˇsiˇriteln´e podle licence GNU GPL, d´ıky ˇcemuˇz ho lze pˇrizp˚ usobit i jin´ym architektur´am, neˇz je IBM PC i386, pro kterou byl p˚ uvodnˇe naps´an. Komunita dobrovoln´ık˚ u, kter´a se kolem Linuxu vytvoˇrila, uˇz portovala j´adro i na mikroprocesory tˇr´ıdy ARM. Pˇred provozem Linuxu na kameˇre EYE-02 bylo tedy nutn´e prov´est n´asleduj´ıc´ı kroky: • Z´ısk´ an´ı zdrojov´ eho k´ odu j´ adra – zdrojov´e k´ody jsou dostupn´e na internetov´e str´ance The Linux Kernel Archives na adrese http://www.kernel.org. • Aplikace patche pro konkr´ etn´ı architekturu – patch pro mikroprocesory AT91 je k dispozici na adrese http://maxim.org.za/at91 26.html. Tento krok ovˇsem nemus´ı b´yt nezbytn´y – pokud jsou zmˇeny v patchi d˚ ukladnˇe otestovan´e a osvˇedˇc´ı se, jsou zahrnuty do pˇr´ıˇst´ı verze. V dobˇe psan´ı t´eto diplomov´e pr´ace (kvˇeten 2009) je nejnovˇejˇs´ı verze j´adra 2.6.29.3 a ta pro pouˇzit´ı v kameˇre postaˇcuje i bez patche. 2
2
Kamera EYE-02 a operaˇ cn´ı syst´ em Linux
3
Obr´azek 2.1: Blokov´e sch´ema kamery EYE-02 • Pˇ rizp˚ usoben´ı j´ adra hardwaru – j´adro je sice pˇripraven´e pro pouˇzit´ı s mikroprocesorem AT91, ale mus´ı se pˇrizp˚ usobit jeˇstˇe zapojen´ı procesoru v konkr´etn´ı aplikaci. • Konfigurace j´ adra – rozhodujeme se, kter´e ˇc´asti k´odu do pˇrekladu zahrnout a kter´e nikoliv, popˇr. s jak´ymi parametry pˇreklad prov´adˇet. Zdrojov´e k´ody j´adra jsou velice univerz´aln´ı a obsahuj´ı vˇeci pro r˚ uzn´e architektury. My napˇr. pro naˇsi aplikaci nepotˇrebujeme drivery pro LCD nebo myˇs, zato ale uˇzijeme podporu pro komunikaci rozhran´ım I2C. • Pˇ reklad j´ adra – pro tento krok potˇrebujeme pˇrekladaˇc, kter´y um´ı pˇrekl´adat pro c´ılovou platformu ARM. Vhodn´y je napˇr. pˇrekladaˇc GCC, kter´y je v tomto ohledu velmi univerz´aln´ı. • Zaveden´ı bin´ arn´ıho obrazu j´ adra - obraz (vytvoˇren´y pˇrekladem) mus´ıme pˇredat mikroprocesoru, aby ho mohl spustit. V kameˇre EYE-02 se po startu mikroprocesoru spust´ı bootloader, kter´y obraz j´adra zkop´ıruje z Micro SD karty do RAM a n´aslednˇe spust´ı. Po pˇrekladu tedy obraz j´adra mus´ıme um´ıstit na Micro SD kartu.
2
Kamera EYE-02 a operaˇ cn´ı syst´ em Linux
4
• Pˇ r´ıprava souborov´ eho syst´ emu - kdyˇz j´adro nabˇehne a provede inicializaci, potˇrebuje koˇrenov´y souborov´y syst´em. Ten mus´ıme m´ıt pˇripraven´y dopˇredu na blokov´em zaˇr´ızen´ı (pro n´as Micro SD karta), kter´e j´adru specifikujeme pˇri konfiguraci. Souborov´y syst´em obsahuje hlavnˇe konfiguraˇcn´ı skripty a jadern´e moduly. Micro SD karta je rozdˇelena do tˇr´ı odd´ıl˚ u. Prvn´ı odd´ıl m´a velikost cca 4MB a je urˇcen pro bin´arn´ı obraz j´adra, tam ho hled´a bootloader pˇri startu procesoru. Nen´ı na nˇem tedy zaveden ˇz´adn´y souborov´y syst´em, obsahuje pouze bin´arn´ı data. M´ame-li obraz j´adra pˇripraven v souboru zImage a prvn´ı odd´ıl na kartˇe je reprezentov´an souborem /dev/mmcblk0p1, dostaneme obraz j´adra na kartu t´ımto pˇr´ıkazem: dd if=zImage of=/dev/mmcblk0p1 Druh´y odd´ıl m´a velikost cca 20MB a je na nˇem zaveden souborov´y syst´em ext2, kter´y slouˇz´ı operaˇcn´ımu syst´emu jako koˇrenov´y souborov´ y syst´em. Tˇret´ı odd´ıl je form´atov´an jako FAT32 a slouˇz´ı pro uchov´an´ı dat, kter´a budou zpˇr´ıstupnˇena po rozhran´ı USB pomoc´ı driveru USB file storage. Tento prostor je urˇcen pˇredevˇs´ım pro nasn´ıman´e fotografie. S kamerou lze komunikovat dvˇema zp˚ usoby: (a) Rozhran´ım UART, kter´e slouˇz´ı pro debug, (b) rozhran´ım USB, kter´e pˇri pouˇzit´ı modulu g ether emuluje ethernetov´e spojen´ı. V kameˇre bˇeˇz´ı telnetov´y d´emon.
Kapitola 3 Drivery v Linuxu 3.1
V´ yznam a rozdˇ elen´ı driver˚ u
Driver je program, kter´y zprostˇredkuje pˇr´ıstup uˇzivatele k hardwarov´emu zaˇr´ızen´ı. Komunikace s hardwarem je pomˇernˇe n´aroˇcn´a z´aleˇzitost, je nutn´e zn´at strukturu konkr´etn´ıho zaˇr´ızen´ı a princip jeho pr´ace. Driver tyto detaily ukryje a nab´ıdne uˇzivateli rozhran´ı s pˇresnˇe definovanou mnoˇzinou operac´ı (pro vˇsechny drivery shodnou). Zaˇr´ızen´ı ˇclen´ıme na tˇri typy: znakov´a, blokov´a a s´ıt’ov´a. • Znakov´ a zaˇ r´ızen´ı pˇrij´ımaj´ı a poskytuj´ı data ve formˇe sekvenc´ı bajt˚ u. Driver, kter´y takov´e zaˇr´ızen´ı ovl´ad´a, obvykle poskytuje minim´aln´ı mnoˇzinu operac´ı open, close, read a write. Zaˇr´ızen´ı jsou pˇr´ıstupn´a v souborov´em syst´emu v adres´aˇri /dev a patˇr´ı mezi nˇe napˇr. s´eriov´y port nebo speci´aln´ı zaˇr´ızen´ı zero, kter´e pˇri kaˇzd´em ˇcten´ı vr´at´ı nulu. • Blokov´ a zaˇ r´ızen´ı jsou takov´a, na nichˇz m˚ uˇze existovat souborov´y syst´em. Jedn´a se pˇredevˇs´ım o z´aznamov´a zaˇr´ızen´ı (disky, CD-ROM). Tak´e jsou reprezentov´ana soubory v adres´aˇri /dev a v Linuxu (narozd´ıl od vˇetˇsiny ostatn´ıch unixov´ych syst´em˚ u) s nimi lze zach´azet jako se znakov´ymi. Spolupr´ace s j´adrem je ovˇsem zcela odliˇsn´a. • S´ıt’ov´ a rozhran´ı slouˇz´ı pro v´ymˇenu dat s jin´ymi poˇc´ıtaˇci. Nejsou v souborov´em syst´emu, tud´ıˇz na nˇe nelze aplikovat metody pro znakov´a a blokov´a zaˇr´ızen´ı. Soubory v adres´aˇri /dev se nevytvoˇr´ı samy od sebe. K tomu je nutn´e pouˇz´ıt utilitu mknod ve tvaru mknod
<device_type> <major_number> <minor_number> Zde filename je n´azev souboru, kter´ym chceme zaˇr´ızen´ı reprezentovat, device type ud´av´a druh zaˇr´ızen´ı, tedy jestli je znakov´e (c) nebo blokov´e (b) a major a minor jsou ˇc´ısla zaˇr´ızen´ı. ˇ ıslo major v rozmez´ı 0–255 zaˇrazuje zaˇr´ızen´ı do skupiny. V zdrojov´ych k´odech v souC´ boru devices.txt v adres´aˇri Documentation jsou vypsan´e skupiny zaˇr´ızen´ı a jim pˇriˇrazeˇ ıslo minor upˇresˇ n´a major ˇc´ısla. C´ nuje typ zaˇr´ızen´ı v r´amci skupiny. ˇ C´ıslo zaˇr´ızen´ı se vyuˇz´ıv´a pr´avˇe k zaloˇzen´ı souboru v adres´aˇri /dev. Je pˇriˇrazeno v inicializaˇcn´ı funkci driveru. Pokud driver patˇr´ı do nˇejak´e existuj´ıc´ı skupiny, m˚ uˇze si pˇriˇradit jej´ı major ˇc´ıslo, popˇr. m˚ uˇze nechat j´adro, aby mu samo pˇriˇradilo nˇejak´e voln´e. Seznam aktivn´ıch ovladaˇc˚ u najdeme v souboru /proc/devices spolu s ˇc´ısly zaˇr´ızen´ı. 5
3
Drivery v Linuxu
3.2
6
Jadern´ e moduly
Drivery v˚ ubec nemusej´ı b´yt souˇc´ast´ı j´adra, mohou se vyv´ıjet mimo jako jadern´e moduly. To jsou programy, kter´e sice bˇeˇz´ı v jadern´em prostoru, ale mohou se do nˇej zav´est aˇz pˇri jeho chodu. Je to mnohem pohodlnˇejˇs´ı neˇz pˇri kaˇzd´e zmˇenˇe v k´odu driveru znovu pˇrekl´adat a zav´adˇet j´adro. Moduly je moˇzn´e dostat do j´adra tˇremi zp˚ usoby: (a) Modul se vyv´ıj´ı zcela mimo j´adro, pˇrekl´ad´a se nez´avisle na nˇem. Zaveden´ı je moˇzn´e pˇr´ıkazem insmod, bude pops´an n´ıˇze. (b) Modul je souˇc´ast´ı j´adra, pˇrekl´ad´a se s n´ım, ale st´ale je to modul, m˚ uˇze b´yt zaveden aˇz pˇri bˇehu. Toto je nutn´e specifikovat v konfiguraˇcn´ıch souborech Kconfig, aby si uˇzivatel pˇri konfiguraci j´adra mohl vybrat, ˇze chce tuto souˇc´ast pˇrekl´adat jako modul. Pˇri pˇrekladu j´adra se potom vol´an´ım make modules_install pˇreloˇzen´e moduly nainstaluj´ı do zadan´eho adres´aˇre, kde je bude j´adro hledat. (c) Modul je souˇc´ast´ı j´adra a zav´ad´ı se automaticky pˇri jeho startu. Opˇet se specifikuje pˇri konfiguraci (a pokud si nap´ıˇseme takovou souˇc´ast my, mus´ıme ji sami pˇridat do Makefile a Kconfig). Pro pr´aci s moduly nab´ız´ı Linux nˇekolik utilit: • insmod – zavede modul do j´adra. Moduly mohou na sobˇe navz´ajem z´aviset (jeden exportuje symboly, kter´e druh´y vyuˇz´ıv´a) a pokud se pokouˇs´ıme zav´est modul, kter´emu chyb´ı z´avislosti, tak tato funkce vr´at´ı chybu. • rmmod – odstran´ı modul z j´adra. Pokud ovˇsem nen´ı zrovna nˇek´ym vyuˇz´ıv´an. • lsmod – vyp´ıˇse vˇsechny aktivn´ı moduly v j´adˇre, jejich velikost a u kaˇzd´eho modulu poˇcet a seznam jin´ych modul˚ u, kter´e tento vyuˇz´ıvaj´ı. Tato funkce pouze vyp´ıˇse v pohlednˇejˇs´ı formˇe obsah souboru /proc/modules. • modprobe – chytˇrejˇs´ı varianta programu insmod. Jednak hled´a moduly v adres´aˇri, kde jsou nainstalovan´e (takˇze se m˚ uˇze volat odkudkoliv) a jednak ˇreˇs´ı chybˇej´ıc´ı z´avislosti. Pokud zjist´ı, ˇze zav´adˇen´emu modulu nˇejak´a takov´a chyb´ı, tak si prohl´edne tabulku symbol˚ u (kter´a se vytvoˇr´ı pˇri kompilaci j´adra) a pokud tam poˇzadovan´y symbol najde, zavede kromˇe zadan´eho modulu jeˇstˇe ty, kter´e exportuj´ı potˇrebn´e symboly. Pro psan´ı a pˇreklad modul˚ u plat´ı ponˇekud jin´a pravidla neˇz pro psan´ı uˇzivatelsk´ych aplikac´ı. Kaˇzd´y modul mus´ı definovat funkce: int module_init(void); void module_exit(void);
3
Drivery v Linuxu
7
Funkce se nemus´ı jmenovat zrovna takto, staˇc´ı kdyˇz zachovaj´ı prototyp, ale potom je nutn´e pomoc´ı maker (o stejn´ych jm´enech jako v´yˇse uveden´e funkce) definovat, kter´a funkce slouˇz´ı jako init a exit: int isi_init(void) { ... } void isi_exit(void) { ... } module_init(isi_init); module_exit(isi_exit); D´ale je vhodn´e pomoc´ı jin´ych maker definovat n´azev modulu, autora a licenci (pokud ta nen´ı definovan´a, tak j´adro pˇri zav´adˇen´ı nad´av´a). Ani pˇreklad neprob´ıh´a stejnˇe jako u uˇzivatelsk´ych aplikac´ı. M´ame-li zdrojov´y soubor isi.c a chceme z nˇej udˇelat modul, mus´ıme do Makefile um´ıstit ˇr´adku: obj-m := isi.o Pokud ovˇsem na tento Makefile pust´ıme obyˇcejn´y make, dostaneme vynad´ano. Pro pˇreklad modul˚ u se totiˇz mus´ı volat pˇrekl´adac´ı syst´em j´adra. K tomu pouˇzijeme make ve tvaru: make -C /usr/src/linux-2.6.29.3 M=/home/vitj2/c/atmel-isi modules Za parametr C patˇr´ı cesta k zdrojov´emu k´odu j´adra a za M adres´aˇr s modulem. Je nutn´e zm´ınit, ˇze k pˇrekladu modul˚ u je potˇreba pˇreloˇzen´e j´adro s kompletn´ımi zdrojov´ymi k´ody. Pˇrekladem se vytvoˇr´ı modul se jm´enem isi.ko, kter´y zavedeme pˇr´ıkazem insmod.
3.3
Standardn´ı souborov´ e operace na zaˇ r´ızen´ı
Driver komunikuje s uˇzivatelem pomoc´ı vymezen´e mnoˇziny operac´ı, kter´e se prov´adˇej´ı na souboru zaˇr´ızen´ı v adres´aˇri /dev. Tuto mnoˇzinu definuje struktura file operations. Definuje jich mnoho, my si probereme jen ty nejd˚ uleˇzitˇejˇs´ı. Popis ˇcerp´am z literatury [1]. • int (*open)(struct inode *, struct file *); Prvn´ı funkce, kter´a se vol´a pˇri pˇr´ıstupu k souboru zaˇr´ızen´ı. Obvykle v n´ı prov´ad´ıme pˇr´ıpravu zaˇr´ızen´ı k pr´aci. Tak´e se kontroluje poˇcet pˇr´ıstup˚ u – pokud si nepˇrejeme, aby k souboru pˇristupovalo v´ıce proces˚ u, zavedeme si pˇr´ıznak otevˇren´eho zaˇr´ızen´ı a zde ho kontrolujeme. Pokud uˇz bylo otevˇreno, vrac´ıme chybovou hl´aˇsku. • ssize_t (*read)(struct file *, char __user *, size_t, loff_t *); ´ Operace ˇcten´ı dat ze znakov´eho zaˇr´ızen´ı. Ukolem t´eto funkce je pˇredat data do uˇzivatelsk´eho prostoru. Parametr typu size t n´am ˇr´ık´a, kolik dat se vejde do uˇzivatelsk´eho bufferu. Pokud jich m´ame k pˇrenosu v´ıc, bude se funkce volat nˇekolikr´at a my mus´ıme zajistit, aby data spr´avnˇe navazovala. Zde je dobr´e zd˚ uraznit, ˇze pˇresun z jadern´eho prostoru (v nˇemˇz bˇeˇz´ı modul) do uˇzivatelsk´eho nelze realizovat prost´ym pouˇzit´ım pointeru. K tomu jsou pˇripraveny speci´aln´ı funkce v includovan´em souboru , kter´e je nutn´e zavolat.
3
Drivery v Linuxu
8
N´avratov´a hodnota je bud’ mnoˇzstv´ı pˇrenesen´ych dat (kladn´e ˇc´ıslo), konec souboru dat (nula) nebo z´aporn´e chybov´e ˇc´ıslo. V pˇr´ıpadˇe, ˇze pˇreneseme vˇsechna data, je nutn´e vr´atit nulu, protoˇze podle toho uˇzivatelsk´a aplikace pozn´a, ˇze m´a s ˇcten´ım pˇrestat (pokud neˇcte omezen´y poˇcet znak˚ u). • ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *); Z´apis dat do zaˇr´ızen´ı. Funguje podobnˇe jako read() a stejn´a omezen´ı plat´ı i pro pˇrenos dat mezi jadern´ym a uˇzivatelsk´ym prostorem. Vrac´ı mnoˇzstv´ı pˇrijat´ych dat. • int (*ioctl)(struct inode *, struct file *, unsigned int, unsigned long) Speci´aln´ı pˇr´ıkaz pro zaˇr´ızen´ı. Pouˇz´ıv´a se, kdyˇz chceme se zaˇr´ızen´ım prov´adˇet i nˇeco jin´eho, neˇz ˇcten´ı a z´apis dat. Napˇr. konfigurace. Pˇr´ıkazy se specifikuj´ı formou celoˇc´ıseln´e konstanty. Driver definuje mnoˇzinu pˇr´ıkaz˚ u, kter´e podporuje. Lze dodat tak´e pointer na datovou strukturu pro v´ymˇenu dat. • int (*mmap)(struct file *, struct vm_area_struct *) Mapov´an´ı pamˇeti zaˇr´ızen´ı do adresov´eho prostoru procesu. Uˇsetˇr´ı se t´ım ˇcas pro pˇresun dat funkc´ı read(). • int (*release)(struct inode *, struct file *) Uvolnˇen´ı zaˇr´ızen´ı. Podobnˇe jako open(), tato operace se vol´a jako posledn´ı, tˇesnˇe pˇred t´ım, neˇz proces soubor zaˇr´ızen´ı uvoln´ı. V t´eto funkci bychom mˇeli uvolnit vˇsechny zabran´e zdroje, kter´e zaˇr´ızen nepotˇrebuje ke sv´e ˇcinnosti.
Kapitola 4 Driver pro CMOS videosn´ımaˇ c 4.1
CMOS videosn´ımaˇ c MT9V011
V kameˇre EYE-02 je pro sn´ım´an´ı obrazu pouˇzit CMOS sn´ımaˇc MT9V011 od firmy Micron. Jedn´a se ˇctvrtpalcov´y sn´ımaˇc s rozliˇsen´ım 640 × 480 aktivn´ıch pixel˚ u s Bayerovou RGB maskou. Na obr. 4.1 je zn´azornˇeno blokov´e sch´ema sn´ımaˇce. Toto sch´ema je pˇrevzat´e z katalogov´eho listu sn´ımaˇce [4].
Obr´azek 4.1: Blokov´e sch´ema sn´ımaˇce MT9V011 Komunikace se senzorem prob´ıh´a prostˇrednictv´ım nˇekolika druh˚ u sign´al˚ u: • S´ eriov´ e rozhran´ı – dvouvodiˇcov´a komunikace s protokolem SMBus (I2C), slouˇz´ı pro z´apis a ˇcten´ı ovl´adac´ıch registr˚ u senzoru. Tˇemito registry se d´a spustit nebo zastavit sn´ım´an´ı a nastavit r˚ uzn´e parametry, napˇr. doba expozice (neboli integrace). Seznam registr˚ u a jejich pouˇzit´ı lze nal´ezt v katalogov´em listu [4]. • Datov´ y v´ ystup – desetibitov´y paraleln´ı v´ystup pro pˇrenos sejmut´ych dat. ˇ • Casov´ a synchronizace – hodinov´y sign´al CLKIN, kter´y mus´ı poskytnout master zaˇr´ızen´ı a kter´y je pro chod senzoru nezbytn´y, d´ale hodinov´y sign´al PIXCLK, kter´y generuje senzor, a synchronizaˇcn´ı sign´aly LINE VALID a FRAME VALID, kter´e pod´avaj´ı informaci o sejmut´em ˇr´adku a sn´ımku. Sn´ımaˇc neumoˇzn ˇ uje vyˇc´ıtat data v jin´em form´atu, neˇz je Bayer. 9
4
Driver pro CMOS videosn´ımaˇ c
4.2
10
Rozhran´ı Atmel ISI
ISI (Image Sensor Interface) je speci´aln´ı rozhran´ı, kter´ym je vybaven mikroprocesor AT91SAM9260 a kter´e slouˇz´ı pro pˇripojen´ı CMOS sn´ımaˇce. Je t´emˇeˇr dokonal´a protistrana pro pouˇzit´y sn´ımaˇc MT9V011, pouze datov´a sbˇernice je o dva bity ˇsirˇs´ı neˇz ta u sn´ımaˇce, jinak hodinov´e a synchronizaˇcn´ı sign´aly si odpov´ıdaj´ı. Kromˇe samotn´eho pˇr´ıjmu dat nab´ız´ı ISI i uˇziteˇcn´e funkce pro jejich zpracov´an´ı, jako je napˇr. pˇrevzorkov´an´ı na jinou velikost, oˇrez nebo pˇrepoˇcet form´atu. Je schopn´e pˇrij´ımat barevn´y i ˇsedot´onov´y obraz. Barevn´y obraz sn´ım´a ve form´atech RGB nebo YCbCr. Kombinace ISI a pouˇzit´eho senzoru bohuˇzel neumoˇzn ˇ uje plnˇe vyuˇz´ıt funkc´ı ISI. Popsan´e moˇznosti zpracov´an´ı obrazu se totiˇz t´ykaj´ı jen barevn´eho obrazu ve zm´ınˇen´ych form´atech. Sn´ımaˇc MT9V011 vˇsak produkuje data pˇr´ımo z Bayerovy masky, kter´a ˇz´adn´emu podporovan´emu barevn´emu form´atu neodpov´ıdaj´ı, takˇze lze pouˇz´ıt pouze ˇsedot´onov´y reˇzim. V tomto reˇzimu ISI data pouze pˇrenese z datov´e sbˇernice prostˇrednictv´ım DMA do pamˇeti a nijak je nezpracuje. Debayerizace se mus´ı prov´est softwarovˇe.
4.3
API Video4Linux2
Pro usnadnˇen´ı tvorby ovladaˇc˚ u pro multimedi´aln´ı zaˇr´ızen´ı nab´ız´ı linuxov´e j´adro vrstvu Video4Linux2 (dvojka v n´azvu znaˇc´ı, ˇze se jedn´a o n´asledn´ıka Video4Linux). Tato vrstva podporuje ˇsirokou ˇsk´alu zaˇr´ızen´ı, mezi nˇeˇz patˇr´ı napˇr. zaˇr´ızen´ı pro zachyt´av´an´ı videa (kamery, videosn´ımaˇce), pro v´ystup videa nebo r´adiov´a zaˇr´ızen´ı. V´yhodou pouˇzit´ı Video4Linux2 je jednotn´e API pro uˇzivatelsk´e aplikace a usnadnˇen´ı pr´ace v´yvoj´aˇre ovladaˇc˚ u, protoˇze vrstva prov´ad´ı mnoho operac´ı, kter´e by jinak v´yvoj´aˇr musel ˇreˇsit s´am. Pro zaˇr´ızen´ı pro zachyt´av´an´ı videa nab´ız´ı V4L2 n´asleduj´ıc´ı funkce: • zjiˇ stˇ en´ı moˇ znost´ı – uˇzivatelsk´a aplikace se zept´a zaˇr´ızen´ı, co vˇsechno dovede, jak´e form´aty podporuje apod. • konfigurace – nastaven´ı velikosti okna, oˇrezu obrazu, poˇctu sn´ımk˚ u • pˇ r´ıjem dat – pˇr´ıjem sejmut´ych obrazov´ych dat ze zaˇr´ızen´ı a jejich uloˇzen´ı do pamˇeti K tˇret´ımu bodu je vhodn´e poznamenat, ˇze specifikace V4L2 [8] doporuˇcuje, aby ovladaˇc pouze pˇrenesl data do pamˇeti v tom tvaru, v jak´em je z´ıskal ze zaˇr´ızen´ı, a neprov´adˇel ˇz´adn´e zpracov´an´ı nebo pˇrevody form´at˚ u. To by mˇela zajistit aˇz aplikace. Tyto tˇri body se realizuj´ı pomoc´ı obvykl´ych souborov´ych operac´ı se zaˇr´ızen´ım. Zjiˇstˇen´ı moˇznost´ı a konfigurace se prov´ad´ı syst´emov´ym vol´an´ım ioctl(), zat´ımco pˇrenos dat m˚ uˇze ’ prob´ıhat bud vol´an´ım read(), nebo l´epe vol´an´ım mmap(), kdy se uˇsetˇr´ı ˇcas za pˇresun dat do uˇzivatelsk´eho prostoru a aplikace m˚ uˇze data ihned zpracovat. Hlavn´ı strukturou, kter´a reprezentuje videozaˇr´ızen´ı, je struktura video device. V n´ı jsou nejd˚ uleˇzitˇejˇs´ı tˇri skupiny ˇclen˚ u: • identifikace zaˇr´ızen´ı – n´azev, vlastn´ıc´ı modul • souborov´e operace – struktura s ukazateli na funkce, kter´e realizuj´ı vol´an´ı jako open(), read(), mmap()
4
Driver pro CMOS videosn´ımaˇ c
11
• operace IOCTL – struktura s ukazateli na funkce, kter´e realizuj´ı jednotliv´e pˇr´ıkazy z vol´an´ı ioctl() Pr´avˇe vol´an´ı ioctl() vrstva V4L2 velmi usnadˇ nuje. B´yv´a zvykem, ˇze funkce obsluhuj´ıc´ı toto vol´an´ı obsahuje dlouhou konstrukci switch...case pro kaˇzd´y ioctl pˇr´ıkaz a je velmi nepˇrehledn´a. Vrstva V4L2 definuje mnoˇzinu pˇr´ıkaz˚ u a pro kaˇzdou z nich je definov´an funkˇcn´ı prototyp. Program´ator pro kaˇzd´y podporovan´ y ioctl pˇr´ıkaz definuje funkci odpov´ıdaj´ıc´ı pˇr´ısluˇsn´emu prototypu a vrstva se uˇz postar´a o zavol´an´ı t´eto funkce a pˇrenos dat mezi jadern´ym a uˇzivatelsk´ym prostorem. Nejd˚ uleˇzitˇejˇs´ı ioctl pˇr´ıkazy jsou tyto (kaˇzd´y pˇr´ıkaz je uveden konstantou, kter´a tento pˇr´ıkaz reprezentuje): • VIDIOC QUERYCAP – dotaz na identifikaci a moˇznosti zaˇr´ızen´ı. Aplikace pˇri vol´an´ı pˇred´a ukazatel na strukturu v4l2 capability, kterou driver vypln´ı. Struktura obsahuje jm´eno ovladaˇce a zaˇr´ızen´ı, verzi ovladaˇce a bitov´e pole, v nˇemˇz jsou vypsan´e funkce podporovan´e ovladaˇcem. Pro bitov´e pole V4L2 definuje konstanty. N´aˇs ovladaˇc pro ISI bude podporovat vlastnosti VIDEO CAPTURE (je schopen zachyt´avat video) a READWRITE (podporuje souborov´e operace read() a/nebo write()). Ovladaˇc pro ISI podporuje pouze operaci read(), protoˇze zapisovat data do sn´ımaˇce nem´a smysl. • VIDIOC CROPCAP – dotaz na moˇznosti oˇrezu a pˇrevzorkov´an´ı obrazu. Pomoc´ı struktury v4l2 rect je definov´ano nejvˇetˇs´ı okno, kter´e lze z obrazu vybrat. • VIDIOC G CROP, VIDIOC S CROP – zjiˇstˇen´ı / nastaven´ı oˇrezu. Opˇet je vyuˇzita struktura v4l2 rect. • VIDIOC G FMT, VIDIOC S FMT – zjiˇstˇen´ı / nastaven´ı form´atu dat. V4L2 definuje mnoˇzstv´ı form´at˚ u, kter´ymi mohou k´odov´ana obrazov´a data. Protoˇze podle doporuˇcen´ı by mˇel ovladaˇc pˇred´avat data v podobˇe, v jak´e je pˇrijme ze sn´ımaˇce, z´avis´ı podporovan´e form´aty na konkr´etn´ım typu sn´ımaˇce. Sn´ımaˇc MT9V011 podporuje jenom jeden form´at – Bayerovu masku s rozliˇsen´ım 16 bit˚ u. Podporovan´e form´aty zaˇr´ızen´ı lze zjistit pˇr´ıkazem VIDIOC ENUM FMT. • VIDIOC QUERYCTRL, VIDIOC S CTRL, VIDIOC G CTRL – zjiˇstˇen´ı / nastaven´ı jin´eho parametru sn´ım´an´ı, kter´y nen´ı pokryt ostatn´ımi ioctl. V4L2 definuje mnoˇzinu takov´ych parametr˚ u (napˇr. doba expozice) a tyto funkce je obsluhuj´ı. V´yˇcet moˇzn´ych parametr˚ u lze z´ıskat pouˇzit´ım pˇr´ıkazu VIDIOC QUERYCTRL
4.4
Struktura ovladaˇ ce
Rozhran´ı ISI je urˇceno pro pˇripojen´ı mnoha typ˚ u sn´ımaˇc˚ u, nejenom toho jednoho pouˇzit´eho v kameˇre EYE-02. Z toho d˚ uvodu je vhodn´e rozdˇelit k´od na ˇc´ast t´ykaj´ıc´ı se ISI a ˇc´ast t´ykaj´ıc´ı se konkr´etn´ıho videosn´ımaˇce. • Ovladaˇ c ISI bude komunikovat s aplikac´ı a zprostˇredkuje j´ı pˇr´ıstup k cel´emu sn´ımac´ımu syst´emu. Tento ovladaˇc bude zcela nez´avisl´y na pouˇzit´em typu sn´ımaˇce, aby bylo moˇzn´e pouˇz´ıt ho pro vˇsechna zaˇr´ızen´ı, kter´a se k ISI daj´ı pˇripojit.
4
Driver pro CMOS videosn´ımaˇ c
12
• Ovladaˇ c sn´ımaˇ ce bude pˇrizp˚ usoben konkr´etn´ımu typu sn´ımaˇce MT9V011. Sn´ımaˇce se mezi sebou liˇs´ı ve zp˚ usobu ovl´ad´an´ı a konfigurace. Sn´ımaˇc MT9V011 se ovl´ad´a a konfiguruje po s´eriov´e lince podle protokolu I2C. Ovladaˇc proto bude schopen tuto komunikaci realizovat a bude zamˇeˇren´y na mnoˇzinu registr˚ u sn´ımaˇce MT9V011. K tomuto ovladaˇci nebude m´ıt pˇr´ıstup aplikace, ale pouze ovladaˇc ISI. Aby bylo moˇzn´e ovladaˇce takto koncipovat, je potˇreba definovat jednotn´e rozhran´ı mezi nimi. Takov´e, kter´e ovladaˇc pro ISI bude vyuˇz´ıvat a kter´e ovladaˇc sn´ımaˇce bude implementovat. Pokud se napˇr. ovladaˇc ISI rozhodne, ˇze je potˇreba zkr´atit expozici, tak mus´ı m´ıt k dispozici prostˇredek, kter´ym tento poˇzadavek sdˇel´ı ovladaˇci pro sn´ımaˇc, aby to tento mohl zmˇenit v registrech. Takov´eto rozhran´ı je realizov´ano strukturou image sensor, definovanou v souboru camera.h. Tato struktura reprezentuje sn´ımaˇc. Kromˇe nˇekolika formalit, jako je vlastn´ık struktury nebo n´azev sn´ımaˇce, obsahuje tato struktura pˇredevˇs´ım ukazatele na funkce, kter´ymi se sn´ımaˇc konfiguruje a ovl´ad´a. Nam´atkou jsou to napˇr. tyto: struct image_sensor { int (*set_format)
(struct struct int (*cropcap) (struct struct int (*start_capture) (struct
image_sensor *cam, image_sensor_format *fmt); image_sensor *cam, v4l2_cropcap *cropcap); image_sensor *cam);
}; Interakce mezi obˇema ovladaˇci je n´asleduj´ıc´ı: ovladaˇc pro ISI definuje a exportuje tyto funkce: int register_camera (struct image_sensor *cam); void unregister_camera (struct image_sensor *cam); Ovladaˇc pro sn´ımaˇc si definuje strukturu cam, definuje vˇsechny ovl´adac´ı a konfiguraˇcn´ı funkce, pˇriˇrad´ı pointery a strukturu zaregistruje. Ovladaˇc pro ISI si pointer na strukturu uloˇz´ı a n´aslednˇe s n´ım pracuje. Kdyˇz potˇrebuje konfigurovat sn´ımaˇc, zavol´a pˇr´ısluˇsn´y funkˇcn´ı ukazatel v struktuˇre cam a ovladaˇc sn´ımaˇce tuto funkci provede. Konfigurace je potom vˇec specifick´a pro kaˇzd´y sn´ımaˇc (napˇr. pro n´aˇs MT9V011 prob´ıh´a pomoc´ı protokolu I2C) a pro ovladaˇc ISI je zcela transparentn´ı.
4.5
Ovladaˇ c ISI
Ovladaˇc pro rozhran´ı ISI, kter´y jsem nazval atmel-isi, m´a dva z´akladn´ı u ´ koly: • Konfigurace zaˇ r´ızen´ı – nastaven´ı velikosti obr´azku, doby expozice. Prov´ad´ı se ioctl vol´an´ım. • Pˇ renos dat – sejmut´ı obrazov´ych dat ze sn´ımaˇce a jejich zprostˇredkov´an´ı aplikaci. M˚ uˇze b´yt realizov´ano vol´an´ım read(), kdy budou data po sejmut´ı pˇresunuta do uˇzivatelsk´eho prostoru, nebo vol´an´ım mmap(), kdy bude do uˇzivatelsk´eho prostoru namapov´an buffer, do nˇehoˇz byla data pˇrenesena z ISI funkc´ı DMA.
4
Driver pro CMOS videosn´ımaˇ c
13
V´yznam ovladaˇce atmel-isi je zn´azornˇen na obr. 4.2.
Obr´azek 4.2: V´yznam ovladaˇce atmel-isi Ovladaˇc jsem nevymyslel cel´y s´am, ale (jak uˇz to tak u open-source program˚ u chod´ı) inspiroval jsem se u podobn´ych k´od˚ u. Nejuˇziteˇcnˇejˇs´ı mi byl ovladaˇc pro podobn´e zaˇr´ızen´ı na procesoru AVR32.
4.5.1
´ Upravy linuxov´ eho j´ adra
Protoˇze pro zaˇr´ızen´ı ISI zat´ım neexistuje podpora v linuxov´em j´adˇre, musel jsem ji doplnit. T´yk´a se n´asleduj´ıc´ıch soubor˚ u: • arch/arm/mach-at91/include/mach/board.h – doplnˇena definice struktury at91 isi data, kter´a m´a n´asleduj´ıc´ı tvar: struct at91_isi_data { unsigned int clock_rate; unsigned int nr_data_pins; }; Struktura slouˇz´ı pro specifikaci frekvence hodinov´eho sign´alu CLKIN, kter´y vstupuje do sn´ımaˇce (hodnota se ud´av´a v Hz) a poˇctu datov´ych pin˚ u, kter´e se vyuˇz´ıvaj´ı pˇri pˇrenosu dat (pro pˇr´ıpad, ˇze m´a sn´ımaˇc uˇzˇs´ı datovou sbˇernici neˇz ISI). D´ale byl doplnˇen funkˇcn´ı prototyp: extern void __init at91_add_device_isi(struct at91_isi_data *data) Ten slouˇz´ı pro registraci zaˇr´ızen´ı ISI v j´adˇre a byla j´ım nahrazena p˚ uvodn´ı verze bez vstupn´ıch parametr˚ u, kter´a slouˇzila jen jako v´yplˇ n a byla pˇripravena pro doplnˇen´ı. • arch/arm/mach-at91/at91sam9260 devices.c – v tomto souboru jsou definov´any funkce, kter´e registruj´ı a inicializuj´ı jednotliv´a zaˇr´ızen´ı na mikroprocesoru. Mezi tato zaˇr´ızen´ı patˇr´ı tak´e ISI, proto bylo nutn´e doplnit i podporu pro nˇej. Jednak bylo doplnˇeno pole isi resources, kter´e je sloˇzeno ze struktur resource. V tomto poli byly pro zaˇr´ızen´ı ISI definov´any dva zdroje:
4
Driver pro CMOS videosn´ımaˇ c
14
(a) pamˇet’ov´a oblast, kter´a pokr´yv´a ovl´adac´ı registry modulu ISI (b) pˇreruˇsen´ı od modulu ISI D´ale byla doplnˇena struktura at91sam9260 isi device typu platform device, kter´a definuje zaˇr´ızen´ı ISI (pod n´azvem atmel isi), aby mu n´aslednˇe bylo moˇzn´e pˇriˇradit platform driver. Nakonec byla definov´ana funkce at91 add device isi (vyhovuj´ıc´ı prototypu v souboru board.h), kter´a provede pˇr´ıpravu pro pouˇzit´ı modulu ISI a jeho registraci jako platform device. Pˇr´ıprava spoˇc´ıv´a ve dvou ˇc´astech: (a) Nastaven´ı funkce pin˚ u, kter´e vyuˇz´ıv´a modul ISI. Je nutn´e ozn´amit procesoru, ˇze tyto piny budou uˇz´ıv´any periferi´ı a nikoliv jako paraleln´ı port. (b) Nastaven´ı hodinov´eho sign´alu CLKIN pro videosn´ımaˇc. Tento sign´al sn´ımaˇc nezbytnˇe potˇrebuje, aby v˚ ubec komunikoval. Bez nˇej nereaguje ani na komunikaci po I2C. V j´adˇre jsou v adres´aˇri mach-at91 d´ale pˇr´ıtomny soubory typu board-xxx.c, kter´e jsou specifick´e pro jednotliv´e aplikace s mikroprocesorem. Takovou aplikac´ı je i kamera EYE-02, proto byl doplnˇen soubor board-eye02.c, kter´y popisuje konkr´etn´ı architekturu kamery. V tomto souboru je definov´ana struktura eye isi data typu at91 isi data, v n´ı je zad´ana frekvence hodinov´eho sign´alu a poˇcet pouˇzit´ych datov´ych vodiˇc˚ u na ISI. D´ale je v inicializaˇcn´ı funkci aplikace vol´ana funkce at91 add device isi, kter´a zaregistruje ISI jako platform device. Od t´eto chv´ıle je v j´adˇre pˇr´ıtomna struktura typu platform device, kter´a reprezentuje modul ISI a je moˇzn´e pˇriˇradit j´ı platform driver, coˇz bude prov´adˇet uˇz samotn´y ovladaˇc. Kaˇzd´a aplikace s t´ımto mikroprocesorem by mˇela m´ıt sv˚ uj vlastn´ı definiˇcn´ı soubor a z nˇeho volat registraˇcn´ı funkci zaˇr´ızen´ı ISI, aby bylo n´aslednˇe moˇzn´e pˇriˇradit driver.
4.5.2
Inicializace driveru
V pˇredchoz´ı podkapitole jsem uvedl, ˇze modul ISI je nyn´ı v j´adˇre zaveden jako platform device. V inicializaci jadern´eho modulu atmel-isi se tedy prov´ad´ı registrace platform driveru, zat´ımco v cleanup funkci se tato registrace ruˇs´ı. K tomu jsou uˇzity tyto metody: platform_driver_register(&atmel_isi_driver); platform_driver_unregister(&atmel_isi_driver); Struktura atmel isi driver je typu platform driver. M´a uvedeno jm´eno .driver.name = "atmel_isi"; D´ıky tomu ho po registraci j´adro spoj´ı s definovan´ym stejnojmenn´ym platform device a zavol´a metodu .probe. V metodˇe atmel isi probe() se provedou n´asleduj´ıc´ı akce: • Alokace hlavn´ı struktury – tedy struktury atmel isi, kter´a v sobˇe nese vˇsechny potˇrebn´e informace o driveru, aby k nim ostatn´ı funkce mˇely snadn´y pˇr´ıstup.
4
Driver pro CMOS videosn´ımaˇ c
15
• Nastaven´ı hodinov´ eho sign´ alu – potˇrebujeme dva hodinov´e sign´aly. Jeden, kter´y budeme pouˇstˇet do sn´ımaˇce (vstup CLKIN), ten n´am v procesoru zajist´ı programovateln´y zdroj hodin PCK1. D´ale potˇrebujeme sign´al ze skupiny peripheral clock, bez kter´eho se neobejde modul ISI na procesoru. V inicializaci oba tyto sign´aly povol´ıme. • Pˇ r´ıprava video device – zad´an´ı jm´ena a zpˇetn´ych vol´an´ı pro souborov´e operace. • Pˇ remapov´ an´ı pamˇ eti – fyzick´e do virtu´aln´ıho prostoru, abychom mohli pˇristupovat k ovl´adac´ım registr˚ um ISI a do SRAM, kam budeme ukl´adat adresy buffer˚ u pro z´aznam obrazu. • Registrace pˇ reruˇ sen´ı – ISI generuje mnoho pˇreruˇsen´ı, kter´a se n´am hod´ı, napˇr. ozn´amen´ı o dokonˇcen´em resetu nebo o dokonˇcen´em sn´ım´an´ı. • Alokace zachycovac´ıho bufferu – do nˇej bude modul ISI pomoc´ı DMA pˇren´aˇset data ze sn´ımaˇce. Posledn´ı bod si zaslouˇz´ı trochu rozepsat, proto jsem mu vˇenoval samostatnou podkapitolu.
4.5.3
Buffer pro zachycen´ y obraz
Pouˇzit´y senzor je schopn´y sejmout obraz o velikosti 640 × 480 pixel˚ u (ve skuteˇcnosti jeˇstˇe o nˇeco vˇetˇs´ı, ale ˇc´ast z nˇeho uˇz by zab´ıraly ˇcern´e kalibraˇcn´ı z´ony). Protoˇze senzor obsahuje desetibitov´y A/D pˇrevodn´ık, budeme pro kaˇzd´y pixel potˇrebovat dva bajty. Jednoduch´ym v´ypoˇctem z´ısk´ame velikost potˇrebn´eho prostoru 640 × 480 × 2 = 614400 B. Toto je velmi rozs´ahl´y prostor, funkce kalloc() ovˇsem um´ı alokovat jen max. 128 kB. Mohla by se alokovat pamˇet’ v uˇzivatelsk´em prostoru, ale ta nejsp´ıˇs nebude souvisl´a. To by nevadilo, kdyby DMA kan´al podporoval funkci scatter-gather (pozastaven´ı pˇrenosu, v meziˇcase lze pˇrepsat c´ılovou adresu DMA pˇrenosu na jinou str´anku), jenˇze ISI tuto funkci nepodporuje. ˇ sen´ım je patch jm´enem bigphysarea. Ten dopln´ı do j´adra k´od, kter´y pˇri bootov´an´ı Reˇ a rozdˇelov´an´ı pamˇeti zabere souvisl´y u ´ sek pro sebe. Z´aroveˇ n exportuje funkce bmalloc() a bfree(), kter´e maj´ı k tomuto u ´ seku pˇr´ıstup. J´a jsem se ovˇsem pouˇzit´ı tohoto patche vyhnul, protoˇze jsem k alokaci pouˇzil funkci __get_free_pages(GFP_USER|GFP_DMA, get_order(size)); Tento n´apad nepoch´az´ı z moj´ı hlavy, pˇreˇcetl jsem si ho v jin´em k´odu, kde byl doplnˇen koment´aˇrem, ˇze tato funkce dostala bˇehem bootov´an´ı spoustu pamˇeti a ta je st´ale k dispozici. Tento postup funguje, proto jsem ho d´ale nerozeb´ıral a pouˇz´ıval. V pˇr´ıpadˇe probl´em˚ u je tu st´ale moˇznost pouˇzit´ı bigphysarea. Protoˇze ovladaˇc (zat´ım) sn´ım´a jeden obr´azek na jeden poˇzadavek, vystaˇcil jsem si s jedn´ım bufferem. Pokud by pˇriˇsla potˇreba vˇetˇs´ıho mnoˇzstv´ı obr´azk˚ u, je moˇzn´e alokovat v´ıce buffer˚ u za sebou a pˇren´aˇset do nich data cyklicky.
4
Driver pro CMOS videosn´ımaˇ c
4.5.4
16
Souborov´ e operace open() a release()
Operace open() se vol´a v okamˇziku otevˇren´ı souboru zaˇr´ızen´ı v adres´aˇri /dev. Funkce nejprve zkontroluje, jestli uˇz zaˇr´ızen´ı nen´ı otevˇren´e. Nen´ı ˇz´adouc´ı, aby bylo zaˇr´ızen´ı vyuˇz´ıv´ano nˇekolika procesy, na to driver nen´ı pˇripraven. Tato kontrola se prov´ad´ı ovˇeˇren´ım ˇclenu struktury atmel isi.users. Tento ˇclen je inkrementov´an na konci funkce open() a na konci funkce release() je dekrementov´an. D´ale funkce ovˇeˇr´ı, jestli byl pˇr´ıkazem register camera() registrov´an nˇejak´y sn´ımaˇc. Pokud ne, funkce vr´at´ı chybovou hodnotu ENODEV (zaˇr´ızen´ı nen´ı k dispozici). Nem˚ uˇzeme sn´ımat obraz, kdyˇz nem´ame odkud. D˚ uleˇzit´a ˇcinnost, kterou tato funkce prov´ad´ı, je z´apis ˇclenu private data struktury file. Pokud se totiˇz volaj´ı souborov´e operace jako read(), nepˇredaj´ı se jim jako parametr ˇz´adn´a naˇse data, ale pouze ukazatel na strukturu file, kter´a je ta sam´a, co byla pˇred´ana funkci open(). My bychom ovˇsem ve funkci read() potˇrebovali minim´alnˇe pˇr´ıstup k hlavn´ı struktuˇre atmel isi. Jenˇze ta je dynamicky alokovan´a a neexistuje na ni ˇz´adn´y glob´aln´ı ukazatel. Proto jedin´y zp˚ usob, jak se k n´ı ve funkci read() dostaneme, je takov´y, ˇze referenci na ni uloˇz´ıme do pole private data struktury file. Potom pˇri vol´an´ı funkce read() m˚ uˇzeme z pˇredan´e struktury file toto pole pˇreˇc´ıst a m´ame pˇr´ıstup k naˇs´ı struktuˇre atmel isi. V naˇsem driveru m´ame pro zapouzdˇren´ı vˇsech potˇrebn´ych private dat definov´anu strukturu atmel isi fh: struct atmel_isi_fh { struct atmel_isi unsigned int };
*isi; read_off;
Parametr isi je odkaz na hlavn´ı strukturu driveru, zat´ımco parametr read off vyuˇzijeme pˇri operaci read(). Vyuˇzit´ı je pops´ano v jej´ı samostatn´e podkapitole. Nakonec se provede reset rozhran´ı ISI (z´apisem do ovl´adac´ıho registru). Operace release() se prov´ad´ı ve chv´ıli, kdy je soubor zaˇr´ızen´ı uzavˇren. V tento okamˇzik se pˇreruˇs´ı sn´ım´an´ı, zastav´ı se ˇcinnost ISI a sn´ıˇz´ı se poˇcet pˇr´ıstup˚ u k souboru (atmel isi.users).
4.5.5
Proces sejmut´ı obrazu
Postup pˇri sn´ım´an´ı obrazov´ych dat je zn´azornˇen na obr. 4.3. Samotn´a operace sejmut´ı obr´azku se spust´ı funkc´ı atmel isi start capture(). Funkce zavol´a metodu start capture() struktury image sensor. Tuto metodu implementuje driver pro konkr´etn´ı sn´ımaˇc a mˇel by mu d´at pokyn ke spuˇstˇen´ı sn´ım´an´ı. D´ale je aktivov´an DMA kan´al vol´an´ım funkce atmel isi start dma(). Nakonec je z´apisem do ovl´adac´ıho registru ISI povoleno sn´ım´an´ı. V tomto okamˇziku je nutn´e vyˇckat, dokud nen´ı sn´ım´an´ı dokonˇceno. Toto ˇcek´an´ı realizuje funkce atmel isi wait for frame(). Funkce ˇcek´a, dokud nen´ı probuzena obsluhou pˇreruˇsen´ı nebo dokud nevyprˇs´ı timeout. Na tom, kter´y z tˇechto dvou pˇr´ıpad˚ u nastane dˇr´ıv, z´avis´ı n´avratov´a hodnota t´eto funkce. Modul ISI po dokonˇcen´ı sn´ım´an´ı jednoho obr´azku generuje pˇreruˇsen´ı SOF (start of frame), kter´ym signalizuje, ˇze se chyst´a pˇren´est dalˇs´ı obr´azek. V tomto okamˇziku obsluha pˇreruˇsen´ı sn´ım´an´ı zastav´ı a probud´ı ˇcekac´ı funkci.
4
Driver pro CMOS videosn´ımaˇ c
17
Obr´azek 4.3: Zn´azornˇen´ı postupu pˇri sn´ım´an´ı obrazu Proces sn´ım´an´ı se ˇr´ıd´ı z´apisem do registru ISI Control 1 Register (ISI CR1), konkr´etnˇe bitem ISI DIS (Image sensor disable) (viz [3]). Nulov´an´ım tohoto bitu je spuˇstˇena funkce ISI a zah´ajen pˇrenos, zat´ımco nastaven´ım bitu je dokonˇceno sejmut´ı aktu´aln´ıho sn´ımku a pak se modul vypne.
4.5.6
Operace read()
Zpˇetn´e vol´an´ı read() je pouˇzito v momentu, kdy uˇzivatel vyˇc´ıt´a data ze souboru zaˇr´ızen´ı. Je tedy u ´ kolem t´eto funkce oˇcek´avan´a data poskytnout. V z´ahlav´ı funkce m´ame mj. vstupn´ı parametr count, kter´y n´as zpravuje o velikosti bufferu v uˇzivatelsk´em prostoru, do nˇehoˇz m´ame zapsat data. Protoˇze tento parametr jen velmi tˇeˇzko dos´ahne stovek kilobajt˚ u, kter´e obrazov´a data dohromady ˇc´ıtaj´ı, je funkce vol´ana nˇekolikr´at a data se vyˇc´ıtaj´ı postupnˇe. Mus´ıme si tedy zaznamen´avat mnoˇzstv´ı pˇrenesen´ych dat, abychom vˇedˇeli, kde v bufferu m´ame pˇri dalˇs´ım pˇrenosu zaˇc´ıt vyˇc´ıtat. K tomu jsme ve struktuˇre atmel isi fh definovali ˇclen read off. Pˇri vstupu do funkce read() mohou nastat tˇri stavy: • Funkce je vol´ana poprv´e od otevˇren´ı souboru nebo pˇredchoz´ıho kompletn´ıho vyˇcten´ı dat. Mus´ıme zajistit sejmut´ı nov´ych dat, nulovat read off a zaˇc´ıt vyˇc´ıt´an´ı. • Funkce je vol´ana v pr˚ ubˇehu vyˇc´ıt´an´ı, aby z´ıskala dalˇs´ı d´avku dat. Uˇz nic nesn´ım´ame, pouze kop´ırujeme data a inkrementujeme read off. • Funkce je vol´ana po vyˇcten´ı vˇsech dat, read off je roven mnoˇzstv´ı dat v bufferu. Nedˇel´ame nic, pouze vrac´ıme nulu jako znamen´ı konce souboru dat.
4
Driver pro CMOS videosn´ımaˇ c
4.5.7
18
Operace ioctl() a konfigurace sn´ımaˇ ce
Vol´an´ı ioctl() se pouˇz´ıv´a pro speci´aln´ı operace, kter´e se vymykaj´ı bˇeˇzn´emu ˇcten´ı nebo z´apisu dat. U ovladaˇce pro videosn´ımaˇc se t´ımto zp˚ usobem prov´ad´ı konfigurace a zjiˇst’uj´ı se moˇznosti zaˇr´ızen´ı. V kapitole o Video4Linux2 jsem uˇz popsal, jak tato vrstva usnadˇ nuje pouˇzit´ı ioctl(). Zat´ımco v bˇeˇzn´ych ovladaˇc´ıch funkce ioctl() obsahuje obrovskou konstrukci switch–case, kter´a ˇreˇs´ı r˚ uzn´e pˇr´ıkazy, vrstva V4L2 tento probl´em ˇreˇs´ı sama a program´ator mus´ı pouze definovat funkce o pˇredem dan´ych prototypech, kter´e jednotliv´e pˇr´ıkazy ioctl realizuj´ı. V4L2 definuje mnoho ioctl pˇr´ıkaz˚ u a vˇsechny jsou reprezentov´any konstantami ve tvaru VIDIOC xxx. Jejich podrobn´y popis a definice pˇr´ısluˇsn´ych funkˇcn´ıch prototyp˚ u lze nal´ezt ve specifikaci V4L2 [8]. Jsou mezi nimi zahrnuty ale pˇr´ıkazy pro vˇsechny tˇr´ıdy zaˇr´ızen´ı, kter´e V4L2 podporuje. My budeme v naˇsem driveru ˇreˇsit jen velmi malou ˇc´ast. Pˇ r´ıkaz QUERYCAP ENUMFMT G FMT S FMT TRY FMT CROPCAP G CROP S CROP QUERYCTRL G CTRL S CTRL
Popis dotaz na schopnosti zaˇr´ızen´ı dotaz na podporovan´e form´aty dotaz na aktu´aln´ı form´at pˇr´ıkaz k nastaven´ı form´atu dotaz na moˇznost nastaven´ı dan´eho form´atu dotaz na moˇznosti oˇrezu obrazu dotaz na aktu´aln´ı nastaven´ı oˇrezu pˇr´ıkaz k nastaven´ı oˇrezu dotaz na moˇznosti nastaven´ı parametr˚ u dotaz na hodnotu parametru pˇr´ıkaz k nastaven´ı parametru
Tabulka 4.1: Podporovan´e ioctl pˇr´ıkazy Pˇr´ıkazy, kter´e maj´ı vazbu na pouˇzit´y senzor, jsou vyˇrizov´any prostˇrednictv´ım zpˇetn´ych vol´an´ı ve struktuˇre image sensor. Form´ at dat: n´aˇs sn´ımaˇc MT9V011 podporuje jenom jeden form´at, proto funkce pro nastaven´ı asi moc nevyuˇzijeme, ale driver pro ISI mus´ı b´ yt univerz´aln´ı a pˇredpokl´adat moˇznost pˇripojen´ı sn´ımaˇce s v´ıce podporovan´ymi form´aty. Parametry: u MT9V011 podporujeme dobu expozice a zes´ılen´ı jednotliv´ych barevn´ych kan´al˚ u na Bayerovˇe masce. Podporovan´e parametry ale z´avis´ı na typu senzoru, proto je na jeho ovladaˇci, aby sdˇelil jejich seznam.
4.6
Ovladaˇ c sn´ımaˇ ce
Ovladaˇc pro sn´ımaˇc je specifick´y pro konkr´etn´ı v´yrobek Micron MT9V011. Nenab´ız´ı ˇz´adn´e rozhran´ı pro komunikaci s uˇzivatelskou aplikac´ı, protoˇze komunikuje pouze s ovladaˇcem ISI.
4
Driver pro CMOS videosn´ımaˇ c
19
´ Ukolem ovladaˇce je pˇrij´ımat pokyny od ovladaˇce ISI a pˇred´avat je sn´ımaˇci. Komunikace se sn´ımaˇcem prob´ıh´a po s´eriov´e lince protokolem I2C a jedn´a se pouze o z´ apis nebo ˇ cten´ı ovl´ adac´ıch registr˚ u sn´ımaˇ ce. V´yznam driveru je zn´azornˇen na obr. 4.4.
Obr´azek 4.4: V´yznam ovladaˇce mt9v011
4.6.1
´ Upravy linuxov´ eho j´ adra
Stejnˇe jako u ovladaˇce ISI, i pro driver sn´ımaˇce je nutn´e prov´est nˇekolik drobn´ych zmˇen ve zdrojov´ych k´odech linuxov´eho j´adra. V souboru board-eye02.c definujeme pole static struct i2c_board_info __initdata eye_i2c_devices[] = { ... { I2C_BOARD_INFO("mt9v011", 0x5d), }, }; V nˇem kaˇzd´y prvek reprezentuje jedno zaˇr´ızen´ı na sbˇernici I2C a uv´ad´ı jeho n´azev a sedmibitovou adresu. Senzor se na sbˇernici hl´as´ı adresou 0x5d a ponese n´azev mt9v011, stejnˇe jako jeho ovladaˇc (to je podm´ınka). V inicializaˇcn´ım souboru desky potom nezapomeneme volat funkci at91_add_device_i2c(eye_i2c_devices, ARRAY_SIZE(eye_i2c_devices)); Tento k´od mus´ı b´yt uveden pro kaˇzdou pouˇzitou aplikaci v jej´ım souboru board-xxx.c.
4.6.2
Protokol I2C
Komunikace mikroprocesoru se sn´ımaˇcem prob´ıh´a kromˇe rozhran´ı ISI tak´e po s´eriov´e lince, kde je pouˇzit´y protokol I2C. Tento protokol definuje komunikaci na sbˇernici, kde je kromˇe jednoho masteru (mikroprocesor) pˇr´ıtomno tak´e nˇekolik zaˇr´ızen´ı slave (ty jsme definovali v souboru board-eye02.c). Kaˇzd´e zaˇr´ızen´ı m´a svou unik´atn´ı sedmibitovou adresu. V kameˇre EYE-02 je kromˇe videosn´ımaˇce na sbˇernici I2C pˇripojena tak´e pamˇet’ EEPROM.
4
Driver pro CMOS videosn´ımaˇ c
20
Protokol I2C definuje dvˇe z´akladn´ı operace s daty: ˇcten´ı a z´apis. Pˇri kaˇzd´e z tˇechto operac´ı mus´ı b´yt zad´ana sedmibitov´a adresa zaˇr´ızen´ı. Pro pˇr´ıpad zaˇr´ızen´ı jako je n´aˇs sn´ımaˇc nebo EEPROM je jeˇstˇe potˇreba zadat adresu uvnitˇr tˇechto zaˇr´ızen´ı, kterou specifikujeme, s jak´ymi daty budeme pracovat. U videosn´ımaˇce se jedn´a o adresu registru, kter´y budeme ˇc´ıst nebo zapisovat. Pro usnadnˇen´ı komunikace je mikroprocesor vybaven modulem TWI (Two-Wire Interface). Bohuˇzel s n´ım program´atoˇri nemaj´ı dobr´e zkuˇsenosti, proto se doporuˇcuje nepouˇz´ıvat ho a provozovat I2C komunikaci pˇr´ımo pos´ıl´an´ım bit˚ u na s´eriovou linku. V Linuxu je pro tento u ´ˇcel k dispozici ovladaˇc i2c-gpio. Ten provozuje komunikaci protokolem SMBus, kter´y je jakousi podtˇr´ıdou I2C a definuje komunikaci pr´avˇe pro zaˇr´ızen´ı jako EEPROM nebo n´aˇs videosenzor, kter´a funguj´ı jako u ´schovna dat a pˇri ˇcten´ı nebo z´apisu je u nich nutn´e definovat vnitˇrn´ı adresu, na kter´e se nach´azej´ı data, s nimiˇz hodl´ame pracovat.
4.6.3
Struktura k´ odu
V init a exit funkci modulu se prov´adˇej´ı pouze dvˇe vˇeci – registrace a odstranˇen´ı driveru pro zaˇr´ızen´ı I2C: i2c_add_driver(&mt9v011_i2c_driver); i2c_del_driver(&mt9v011_i2c_driver); Struktura mt9v011 i2c driver reprezentuje ovladaˇc zaˇr´ızen´ı I2C a je definov´ana n´asledovnˇe: static struct i2c_driver mt9v011_i2c_driver = { .driver = { .name = "mt9v011", }, .probe = mt9v011_probe, .remove = mt9v011_remove, .id_table = mt9v011_id, }; N´azev driveru mus´ı b´yt shodn´y s n´azvem zaˇr´ızen´ı, kter´e jsme definovali v souboru board-eye02.c. Potom pˇri jeho registraci j´adro zavol´a funkci mt9v011 probe(), kter´a prov´ad´ı inicializaci. Pˇri inicializaci jsou nastaveny potˇrebn´e parametry pro provozov´an´ı I2C komunikace a d´ale se zav´ad´ı struktura image sensor, kter´a slouˇz´ı jako rozhran´ı mezi ovladaˇcem sn´ımaˇce a ovladaˇcem ISI. Funkˇcn´ım ukazatel˚ um v t´eto struktuˇre jsou pˇriˇrazeny funkce, kter´e ovladaˇc sn´ımaˇce definuje a kter´e bude ovladaˇc ISI pˇri svoj´ı pr´aci volat. Na z´avˇer je provedena registrace struktury image sensor: struct image_sensor *ims; ... ims->set_crop = mt9v011_set_crop; ... atmel_isi_register_camera(ims);
4
Driver pro CMOS videosn´ımaˇ c
21
Pˇritom se vol´a registraˇcn´ı funkce, kterou exportuje ovladaˇc ISI. Ovladaˇc sn´ımaˇce d´ale obsahuje funkce, kter´e se daj´ı rozdˇelit do dvou kategori´ı: • z´ apis a ˇ cten´ı registr˚ u sn´ımaˇ ce – obaluj´ı funkce ovladaˇce i2c core, kter´y se v j´adˇre star´a o I2C komunikaci. • zpˇ etn´ a vol´ an´ı struktury image sensor – tyto funkce vol´a ovladaˇc ISI, kdyˇz chce nastavit nˇejak´y obecn´y parametr senzoru a nezaj´ım´a ho, jak se toto nastaven´ı provede na konkr´etn´ım typu senzoru. To uˇz je starost tohoto ovladaˇce senzoru. Pˇr´ıkladem je vol´an´ı set crop – nastaven´ı oˇrezu obr´azku. Ovladaˇc ISI chce nastavit jist´y oˇrez obr´azku, tak zavol´a tuto funkci. Ovladaˇc sn´ımaˇce v´ı, jak se toto nastaven´ı provede na aktu´aln´ım sn´ımaˇci, a tuto akci provede.
4.7
Pouˇ zit´ı ovladaˇ c˚ u
Pouˇzit´ı obou ovladaˇc˚ u jsem otestoval u ´ loze sejmut´ı obr´azku. Po pˇrekladu jsem mˇel k dispozici dva jadern´e moduly: atmel-isi.ko mt9v011.ko Tyto moduly jsem zavedl do j´adra: insmod atmel-isi.ko insmod mt9v011.ko Dokud jsou moduly mimo j´adro, je nutn´e dodrˇzet toto poˇrad´ı, protoˇze modul mt9v011 vyuˇz´ıv´a symboly exportovan´e modulem atmel-isi (funkci pro registraci sn´ımaˇce) a pokud by v momentˇe jeho zav´adˇen´ı nebyl atmel-isi v j´adˇre pˇr´ıtomen, program insmod by ohl´asil chybu, ˇze modul obsahuje nedefinovan´e symboly. Pokud by moduly byly souˇc´ast´ı j´adra, mohla by se na jejich zaveden´ı pouˇz´ıt funkce modprobe, kter´a by poznala, ˇze modulu mt9v011 chyb´ı symboly definovan´e v modulu atmel-isi a jako prvn´ı by sama zavedla pr´avˇe atmel-isi. V j´adˇre mus´ı b´yt d´ale pˇr´ıtomno API Video4Linux2, kter´e vyˇzaduje modul atmel-isi a podpora pro I2C, kterou vyˇzaduje modul mt9v011. V tabulce zaˇr´ızen´ı /proc/devices bychom mˇeli vidˇet poloˇzku video4linux s major ˇc´ıslem 81. Abychom mohli k ovladaˇci ISI pˇristupovat, mus´ıme si vytvoˇrit soubor /dev/video0 pˇr´ıkazem mknod /dev/video0 c 81 0 Ted’ uˇz m˚ uˇzeme vesele sn´ımat obraz. Vyuˇzijeme k tomu operaci read na souboru zaˇr´ızen´ı. Tuto operaci prov´adˇej´ı napˇr. utility dd nebo cat, ale m˚ uˇzeme si vytvoˇrit i vlastn´ı program. cat /dev/video0 > rawdata
4
Driver pro CMOS videosn´ımaˇ c
22
Po t´eto operaci budeme m´ıt v souboru rawdata po ˇr´adc´ıch sekvenˇcnˇe uloˇzen´e jasov´e hodnoty vˇsech pixel˚ u ze sn´ımaˇce, ovˇsem v barevn´em rozloˇzen´ı podle Bayerovy masky. Pˇri zpracov´an´ı je nutn´e prov´est debayerizaci (z Bayerovy masky vytvoˇrit 24-bitov´y RGB form´at). Uk´azka obr´azku poˇr´ızen´eho kamerou je na obr. 4.5.
Obr´azek 4.5: Uk´azka obr´azku sejmut´eho kamerou EYE-02
Kapitola 5 ˇ Cidlo PIR Kamera EYE-02 je vybavena pohybov´ym senzorem PIR (passive infrared). Tento senzor generuje analogov´y sign´al a je pˇripojen na prvn´ı kan´al analogovˇe-ˇc´ıslicov´eho pˇrevodn´ıku v mikroprocesoru. Ovladaˇc pro tento senzor vyˇc´ıt´a data z analogovˇe-digit´aln´ıho pˇrevodn´ıku a nech´av´a na uˇzivatelsk´e aplikaci, aby sign´al zpracovala a detekovala z nˇeho pohyb.
5.1
Inicializaˇ cn´ı funkce
Ovladaˇc jsem pojal velice klasicky a jeho funkce je jednoduch´a. V inicializaˇcn´ı funkci modulu se registruje j´adru znakov´e zaˇr´ızen´ı a vyˇz´ad´a si pˇridˇelen´ı major ˇc´ısla. err = alloc_chrdev_region(&pir_dev, PIR_MINOR, PIR_NR_DEV, PIR_DEVNAME); cdev_init(&pir_cdev, &pir_fops); err = cdev_add(&pir_cdev, pir_dev, PIR_NR_DEV); Driver si registruje dvˇe znakov´a zaˇr´ızen´ı. Zaˇr´ızen´ı s minor ˇc´ıslem 0 na ˇz´adost read vr´at´ı aktu´aln´ı hodnotu analogov´eho sign´alu pˇr´ımo v bin´arn´ı podobˇe, zat´ımco zaˇr´ızen´ı ˇc. 1 vrac´ı tuto hodnotu pˇrevedenou na text. D´ale inicializaˇcn´ı funkce aktivuje zdroj hodinov´eho sign´alu pro periferii ADC: struct clk *adc_clk = clk_get(NULL, "adc_clk"); clk_enable(adc_clk); Blok ADC se stejnˇe jako kaˇzd´a jin´a periferie ovl´ad´a prostˇrednictv´ım ˇr´ıdic´ıch registr˚ u, proto k nim mus´ıme m´ıt pˇr´ıstup. Inicializaˇcn´ı funkce si vyˇz´ad´a pˇr´ıstup do pamˇet’ov´e oblasti, do kter´e jsou registry mapovan´e, a n´aslednˇe provede pˇremapov´an´ı do virtu´aln´ıho pamˇet’ov´eho prostoru. struct resource *adc_res; void __iomem *adc_regs; adc_res = request_mem_region(AT91SAM9260_BASE_ADC, ADC_REGS_LEN, PIR_DEVNAME); adc_regs = ioremap_nocache(AT91SAM9260_BASE_ADC, ADC_REGS_LEN); 23
5
ˇ Cidlo PIR
24
Protoˇze pˇrevod analogov´e hodnoty na digit´aln´ı nˇejakou chv´ıli trv´a, informuje n´as blok ADC o jeho dokonˇcen´ı pˇreruˇsen´ım. Mus´ıme si tedy registrovat obsluhu pˇreruˇsen´ı: err = request_irq(AT91SAM9260_ID_ADC, pir_irqhandler, 0, PIR_DEVNAME, NULL); Nakonec provedeme inicializaci A/D pˇrevodn´ıku. Povol´ıme pˇr´ısluˇsn´y analogov´y kan´al a pˇreruˇsen´ı pro pˇr´ıpad dokonˇcen´ı pˇrevodu. mode = AT91_ADC_LOWRES | AT91_ADC_PRESCAL_(9) | AT91_ADC_SHTIM_(9) | AT91_ADC_STARTUP_(9) | AT91_ADC_SLEEP; adc_writeb(CR, SWRST); adc_writeb(CHER, CH(pir_adc_channel)); adc_writel(MR, mode); adc_writeb(IER, EOC(pir_adc_channel));
5.2
Souborov´ a operace read()
N´apln´ı obsluhy operace read() je pˇrevod aktu´aln´ı hodnoty na PIR senzoru a jeho pˇrenos do uˇzivatelsk´eho prostoru. Pˇrevod prob´ıh´a velmi jednoduˇse – zap´ıˇseme do ˇr´ıdic´ıho registru pˇrevodn´ıku, aby zaˇcal s pˇrevodem, a n´aslednˇe ˇcek´ame, dokud n´as obsluha pˇreruˇsen´ı neinformuje o dokonˇcen´ı pˇrevodu. static struct completion data_ready; ... init_completion(&data_ready); adc_writeb(CR, START); wait_for_completion_timeout(&data_ready, msecs_to_jiffies(1000)); Po dokonˇcen´ı pˇrevodu pˇreneseme v´yslednou hodnotu do uˇzivatelsk´eho prostoru. Ve funkci open() jsme si zjistili, kter´y znakov´e zaˇr´ızen´ı bylo otevˇreno (tedy jeho minor ˇc´ıslo) a podle toho pˇreneseme do uˇzivatelsk´eho prostoru bud’ bin´arn´ı hodnotu nebo ˇretˇezec. Nezapomeneme na oˇsetˇren´ı konce pˇrenosu (to je d˚ uleˇzit´e pˇredevˇs´ım u ˇretˇezce) – po vyˇcten´ı hodnoty si nastav´ıme pˇr´ıznak a pˇri pˇr´ıˇst´ım vol´an´ı read vr´at´ıme nulu sign´al konce souboru dat.
5.3
Obsluha pˇ reruˇsen´ı
´ Ulohou obsluhy pˇreruˇsen´ı je informovat ˇcekaj´ıc´ı funkci read() o dokonˇcen´ı pˇrevodu, aby mohla pˇreveden´a data odevzdat do uˇzivatelsk´eho prostoru. static irqreturn_t pir_irqhandler(int irq, void *dev_id) { if (adc_readb(SR, EOC(pir_adc_channel))) { adc_data = adc_readl(CHR(pir_adc_channel)); complete(&data_ready);
ˇ Cidlo PIR
5
25
} return IRQ_HANDLED; } V obsluze pˇreruˇsen´ı tak´e vyˇcteme pˇrevedenou hodnotu z datov´eho registru, ˇc´ımˇz se zruˇs´ı pˇr´ıznak pˇreruˇsen´ı a procesor bude pˇripraven na dalˇs´ı. Pˇrenesen´a data uloˇz´ıme do glob´aln´ı promˇenn´e, kde si je vyzvedne funkce read().
5.4
Dalˇs´ı moˇ znosti v´ yvoje
Tento driver jsem nestihl dov´est do pokroˇcilejˇs´ı podoby. Urˇcitˇe by bylo uˇziteˇcnˇejˇs´ı, kdyby nejen vyˇc´ıtal data z A/D pˇrevodn´ıku, ale tak´e je zpracov´aval a detekoval v nich situace, kdy se pˇred senzorem nˇekdo pohybuje. V takov´em pˇr´ıpadˇe by mˇel driver obsahovat kruhov´y buffer, do kter´eho by se zaznamen´avala urˇcit´a d´elka pr˚ ubˇehu analogov´eho sign´alu a tento u ´ sek dat by se zpracov´aval. Operace read() by potom nam´ısto digit´aln´ı hodnoty sign´alu z ˇcidla vracela logickou hodnotu podle toho, jestli byl pˇred kamerou detekov´an pohyb nebo ne.
Kapitola 6 USB velkokapacitn´ı zaˇ r´ızen´ı Jak uˇz bylo zm´ınˇeno v u ´ vodn´ıch kapitol´ach, pl´anovanou funkc´ı kamery je stˇreˇzen´ı vymezen´eho prostoru a v pˇr´ıpadˇe detekce pohybu sejmut´ı obr´azk˚ u, jejich uloˇzen´ı do pamˇeti a n´asledn´e upozornˇen´ı uˇzivatele formou SMS nebo MMS. Aby si uˇzivatel po pˇr´ıchodu ke kameˇre mohl sejmut´e obr´azky prohl´ednout, bude kamera podporovat pˇripojen´ı k PC protokolem USB. Poˇc´ıtaˇci by se kamera mˇela pˇredstavit jako velkokapacitn´ı pamˇet’ov´e zaˇr´ızen´ı (USB file storage device), podobnˇe jako napˇr. USB kl´ıˇcenka. Drivery pro zaˇr´ızen´ı s USB protokolem se dˇel´ı na dvˇe skupiny podle toho, na kter´e stranˇe kabelu budou aktivn´ı: (a) Drivery na hostuj´ıc´ım syst´ emu – t´ım je obvykle PC, k nˇemuˇz pˇripojujeme nˇejak´e USB zaˇr´ızen´ı. ˇ ık´a (b) Drivery na zaˇ r´ızen´ı – funguj´ı v embedded zaˇr´ızen´ı, kter´e pˇripojujeme k PC. R´ se jim tak´e USB gadget drivers. Z tohoto rozdˇelen´ı je zˇrejm´e, ˇze pro kameru bude potˇreba driver z druh´e skupiny, tedy driver na zaˇr´ızen´ı. V t´eto ˇc´asti pr´ace za mˇe veˇskerou pr´aci uˇz odvedli druz´ı – gadget driver pro velkokapacitn´ı zaˇr´ızen´ı je v j´adˇre jiˇz pˇr´ıtomen. Lze ho nal´ezt v adres´aˇri drivers/usb/gadget spolu s nˇekolika dalˇs´ımi drivery, kter´e podporuj´ı napˇr. emulaci s´eriov´eho portu nebo ethernetov´eho rozhran´ı na USB portu. Driver pro velkokapacitn´ı zaˇr´ızen´ı nese n´azev file storage. Tento driver je pro kameru pˇrekl´ad´an jako modul, pˇriˇcemˇz pˇri zav´adˇen´ı se mu jako parametr pˇred´a souborov´y syst´em, kter´y m´a driver zpˇr´ıstupnit. V kameˇre je to tˇret´ı odd´ıl Micro SD karty, kter´y je form´atov´an jako VFAT a m´a velikost cca 480 MB. Modul zavedeme do j´adra pˇr´ıkazem modprobe g_file_storage stall=n file=/dev/mmcblk0p3
26
Kapitola 7 Z´ avˇ er ´ Ukolem m´e diplomov´e pr´ace bylo prozkoumat moˇznosti pouˇzit´ı operaˇcn´ıho syst´emu Linux v kameˇre JABLOCOM EYE-02. ´ Uloha instalace operaˇcn´ıho syst´emu do kamery byla jiˇz vyˇreˇsena v r´amci t´ymov´eho projektu, j´a jsem se vˇenoval tvorbˇe ovladaˇc˚ u pro hardwarov´e souˇc´asti kamery. Psal jsem ovladaˇce pro rozhran´ı ISI mikroprocesoru Atmel AT91SAM9260, pˇripojen´y CMOS videosenzor Micron MT9V011 a detektor pohybu PIR. Poˇzadavkem firmy JABLOCOM bylo tak´e vytvoˇrit ovladaˇc pro USB device port, kter´y by kameru prezentoval jako velkokapacitn´ı pamˇet’ov´e zaˇr´ızen´ı, avˇsak takov´y ovladaˇc je jiˇz souˇc´ast´ı j´adra, proto jsem tuto u ´ lohu ’ neˇreˇsil, nebot by to byla zbyteˇcn´a pr´ace. Vytvoˇril jsem ovladaˇc pro rozhran´ı ISI, kter´e slouˇz´ı pro pˇripojen´ı CMOS videosenzor˚ u. M˚ uj ovladaˇc nepokr´yv´a vˇsechny moˇznosti tohoto rozhran´ı. Nˇekter´e funkce jsou omezeny na form´at obrazov´ych dat, kter´y bohuˇzel pouˇzit´y videosenzor neposkytuje. Nepsal jsem tedy k´od, kter´y bych nemˇel moˇznost odladit. D´ale jsem se pˇri pr´aci zamˇeˇril sp´ıˇse na poˇzadavek sejmut´ı jednoho sn´ımku na povel a neˇreˇsil jsem moˇznosti streamov´an´ı. Spolu s ovladaˇcem pro ISI jsem vytvoˇril tak´e ovladaˇc pro pouˇzit´y videosn´ımaˇc. Sn´ımaˇc se totiˇz neovl´ad´a pouze prostˇrednictv´ım rozhran´ı ISI, to slouˇz´ı jen pro pˇrenos dat. Je tak´e potˇreba prov´adˇet konfiguraci sn´ımaˇce a to lze napˇr. prostˇrednictv´ım sbˇernice I2C, jako u pouˇzit´eho senzoru firmy Micron. Tento zp˚ usob ale nen´ı unifikovan´y, m˚ uˇze se u r˚ uzn´ych typ˚ u senzor˚ u liˇsit. Proto by tento u ´ kol mˇel prov´adˇet zvl´aˇstn´ı driver. Jednak je to ˇcistˇs´ı, protoˇze driver pro ISI by mˇel obsluhovat skuteˇcnˇe jenom ISI a jinou pr´aci nechat jin´ym driver˚ um, a d´ale je potˇreba odliˇsit r˚ uzn´e typy senzor˚ u a jejich specifika. M˚ uj driver pro ISI tedy definuje API a m˚ uˇze d´ıky tomu pouˇz´ıvat kaˇzd´y senzor, jehoˇz driver s t´ımto API spolupracuje. D´ale jsem vytvoˇril ovladaˇc pro detektor pohybu PIR. Tento ovladaˇc jsem nestihl dokonˇcit, takˇze jenom pˇren´aˇs´ı sign´al, kter´y tento detektor generuje. Bylo by vhodn´e rozˇs´ıˇrit ho o zpracov´an´ı sign´alu tak, aby uˇzivateli poskytl jasnou informaci o pˇr´ıtomnosti pohybuj´ıc´ıho se objektu pˇred kamerou. Pˇr´ınos t´eto pr´ace vid´ım v z´ısk´an´ı dovednost´ı pˇri tvorbˇe linuxov´ych ovladaˇc˚ u, v bliˇzˇs´ım sezn´amen´ı se s t´ımto operaˇcn´ım syst´emem a jeho vyuˇzit´ım na procesorech ARM.
27
Literatura [1] J. Corbet, A. Rubini, G. Kroah-Hartman: Linux Device Drivers, Third Edition, O’Reilly Media (2005) [2] P. J. Salzman, M. Burian, O. Pomerantz: The Linux Kernel Module Programming Guide, (2001) [3] AT91SAM9260 Preliminary, Revision 6221G, Atmel Corporation (2008) [4] Katalogov´y list CMOS sn´ımaˇce MT9V011, Rev B, Micron Technology, Inc. (2004) [5] N. Matthew, R. Stones: Beginning Linux Programming, 4th Edition, Wiley Publishing (2008) [6] Kurzy na serveru http://free-electrons.com, Free Electrons 2004–2008 [7] R. Kr´atk´y: Seri´al Jadern´e noviny – Video4Linux2 API na serveru AbcLinuxu.cz (http://www.abclinuxu.cz), publikov´an v letech 2006–2007 [8] M. H. Schimek, B. Dirks, H. Verkuil, M. Rubli: Video for Linux Two API Specification, Revision 0.24, (1999–2008) [9] Dokumentace zdrojov´eho k´odu linuxov´eho j´adra (adres´aˇr Documentation)
28
Dodatek A Obsah pˇ riloˇ zen´ eho CD K tiˇstˇen´e verzi pr´ace je pˇriloˇzeno CD s n´asleduj´ıc´ım obsahem: • elektronick´a verze pr´ace ve form´atu PDF • zdrojov´y k´od driveru atmel-isi • zdrojov´y k´od driveru mt9v011 • zdrojov´y k´od driveru pir • patche pro doplnˇen´ı podpory pro ovladaˇce do zdrojov´ych k´od˚ u linuxov´eho j´adra verze 2.6.29.3 • katalogov´y list mikroprocesoru Atmel AT91SAM9260 • katalogov´y list CMOS videosn´ımaˇce Micron MT9V011
29