SAM9260 a znakový LCD - 5. kompilujeme a zobrazujeme
V předchozích dvou dílech jsme si rozebrali ukázkový zdrojový kód LCD displeje. V dnešním díle si zkusíme ovladač zkompilovat a hlavně také vyzkoušet v praxi.
Kompilace ovladače předpokládá, že máme v našem pracovním počítači nainstalovaný křížový GCC kompilátor pro platformu ARM, např. od firmy Mentor Graphics. Jestliže ne, tak návod, jak na instalaci křížového kompilátoru naleznete na našich stránkách.
Dále potřebujme mít k dispozici zdrojové kódy jádra, které zkompilované běží v modulu SAM9260. Postup, jak na patch jádra pro mikroprocesor AT91SAM9260, jsme již popsali. Upravené zdrojové kódy jádra musíme nakonfigurovat pro modul SAM9260 a připravit pro kompilaci ovladače. Vstoupíme tedy do adresáře stromu jádra a zadáme tyto příkazy:
$ export ARCH=arm $ export CROSS_COMPILE=arm-none-linux-gnueabi- $ make distclean $ make ucsimply_sam9260_defconfig $ make modules_prepare
Nyní jsme připraveni na kompilaci samotného ovladače. Stažený ovladač si buď naimportujeme jako projekt do prostředí Eclipse CDT (menu File->Import) nebo jej rozbalíme a zkompilujme přímo z příkazové řádky Linuxu na našem počítači. V dalším textu si ukážeme kompilaci ovladače z příkazové řádky.
Vstoupíme do adresáře ovladače. Ověříme si, že proměnná KDIR v souboru makefile obsahuje platnou cestu ke stromu jádra, které jsme si v předchozím kroku připravili pro kompilaci ovladače. Pokud ne, cestu upravíme. Pak zkompilujeme ovladač příkazem:
$ make
Výstup příkazu v případě úspěšné kompilace:
make -C /home/emlin/workspace-sam9260/projects/ucsimply/linux/linux-2.6.38.8-at91-ucsimply M=/home/emlin/workspace-sam9260/projects/ucsimply/src/drivers/lcd1602 modules make[1]: Entering directory `/home/emlin/workspace-sam9260/projects/ucsimply/linux/linux-2.6.38.8-at91-ucsimply' WARNING: Symbol version dump /home/emlin/workspace-sam9260/projects/ucsimply/linux/linux-2.6.38.8-at91-ucsimply/Module.symvers is missing; modules will have no dependencies and modversions. CC [M] /home/emlin/workspace-sam9260/projects/ucsimply/src/drivers/lcd1602/lcd1602.o Building modules, stage 2. MODPOST 1 modules CC /home/emlin/workspace-sam9260/projects/ucsimply/src/drivers/lcd1602/lcd1602.mod.o LD [M] /home/emlin/workspace-sam9260/projects/ucsimply/src/drivers/lcd1602/lcd1602.ko make[1]: Leaving directory `/home/emlin/workspace-sam9260/projects/ucsimply/linux/linux-2.6.38.8-at91-ucsimply'
Výsledkem kompilace je binární soubor ovladače lcd1602.ko. Úklid před případnou novou kompilací provedeme příkazem make clean.
Binární soubor ovladače přeneseme na modul SAM9260 do jeho souborového systému. Nejsnazší cesta je s pomocí NFS, případně přes SD kartu. NFS má výhodu, že aktualizovaná verze ovladače je díky sdílení ihned k dispozici v souborovém systému modulu. Popis nastavení pracovního počitače, aby uměl sdílet nějaký adresář přes síť a fungoval jako NFS server, najdete také u nás.
Z modulu SAM9260 se ke sdílenému adresáři našeho počítače připojíme přes NFS takto:
# mount -t nfs -o nolock 192.168.1.123:/home/emlin/nfs-share /mnt/nfs
kde 192.168.1.123 je IP adresa mého počítače, /home/emlin/nfs-share je cesta ke sdílenému adresáři v mém počítači, kam kopíruji binární soubor ovladače a /mnt/nfs je cesta, kam je v modulu připojen sdílený adresář mého počítače.
Pak už rovnou zavedeme v modulu SAM9260 ovladač do jádra a vyzkoušíme jestli funguje spolu s displejem (příkazy zadáváme v příkazové řádce modulu):
1. Vstoupíme do adresáře /mnt/nfs. Zde je připojen sdílený adresář našeho počítače a v něm binární soubor ovladače lcd1602.ko.
2. Ovladač zavedeme do jádra modulu:
# insmod lcd1602.ko
Žádné chybové hlášení znamená úspěch. Displej by měl být smazán a v adresáři /dev by se mělo objevit zařízení lcd1602. Pokud ne, zkusíme příkazem dmesg | tail zjistit jestli jádro nevypsalo nějaké chyby. Případné chyby porovnáme s chybovými hlášeními ve zdrojovém kódu ovladače.
3. Zkusíme do displeje poslat nějaký text, např. naše oblíbené ”Dobry den, mistre!”:
# echo -en "\t\t\tDobry den,\r\t\t\t\tmistre!" >/dev/lcd1602
Ovladač z jádra vyjmeme příkazem rmmod lcd1602. Poslední text zůstane zobrazen na displeji - při vyjímání ovladače neprovádíme smazání obsahu displeje. A kdo chce, může si za domácí úkol naimplementovat posun počáteční pozice pomocí příkazů předávaných funkcí ioctl().