Nejprve si zkompilujeme jednoduchý program v C a poté nový jaderný modul. Postupy jsou ozkoušené na Gentoo Linuxu, s mírnými obměnami by ale měly fungovat na většině standardních distribucí.
Pokud stojíme před úkolem zkompilovat si pro ARM architekturu jednoduchý program, který nezávisí na příliš mnoha knihovnách, utilita crossdev je přesně to, co potřebujeme. S její pomocí snadno vybudujeme potřebný cross-compilation toolchain (omlouvám se za anglicismus, ale zní to lépe než křížově-kompilační nástrojový řetěz. Crossdev je skript určený pro Gentoo, instaluje se standardně:
$ emerge -v crossdev
Uživatelé distribucí postavených na Debianu mohou využít balíčku dpkg-cross. Vybudování toolchainu je otázka jednoho příkazu – který poběží dost dlouho, na to jsou ale uživatele Gentoo zvyklí.
USE=-* crossdev -s4 -t arm-none-linux-gnueabi
Nyní máme připravený gcc kompilátor pro ARM architekturu, můžeme ho použít ke kompilaci jednoduchého programu. Tradiční hello world program přeskočíme a postup si předvedeme na o něco zajímavějším dostupném DoS PoC pro rpc.metad na Solaris 10. Pokud netušíte, co to znamená, tak se tím netrapte, prostě je to jednoduchý program v jazyce C.
michael@citadela ~ $ arm-none-linux-gnueabi-gcc -o xpl rpc.metadex.c rpc.metadex.c: In function 'main': rpc.metadex.c:68: warning: passing argument 3 of 'cl->cl_ops->cl_call' from incompatible pointer type rpc.metadex.c:68: warning: passing argument 4 of 'cl->cl_ops->cl_call' from incompatible pointer type rpc.metadex.c:68: warning: passing argument 5 of 'cl->cl_ops->cl_call' from incompatible pointer type michael@citadela ~ $ file xpl xpl: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.14, dynamically linked (uses shared libs), not stripped
Po zkopírování na N810 a spuštění se dočkáme kýženého výstupu
Nokia-N810-50-2:/home/user# ./xpl 192.168.1.3 rpc.metad for solaris 10 Using version 2 and request no. 6!! timeout=0 error: RPC: Remote system error - Connection refused
V uvedeném případě jsme se daleko nedostali, na cílovém stroji žádné RPC neběží.
Pro kompilaci jádra zvolíme jinou cestu cross-kompilace. Pomocí utility scratchbox vytvoříme prostředí N810 s emulací ARM procesoru užitím Qemu. Scratchbox má balíky primárně pro Debian, v portage se nenachází, jsou ale dostupné pro Gentoo v sunrise overlay. Instalace overlay je jednoduchá:
$ emerge -va layman $ layman -f -a sunrise $ echo "source /usr/portage/local/layman/make.conf" >> /etc/make.conf
Nainstalujeme Scratchbox dle přímočarého návodu na wiki. Jakmile je instalační procedura hotová, můžeme vstoupit do emulovaného prostředí
michael@citadela ~ $ /opt/scratchbox/login Welcome to Scratchbox, the cross-compilation toolkit! Use 'sb-menu' to change your compilation target. See /scratchbox/doc/ for documentation. [sbox-arm-elf: ~] >
Nyní je třeba vytvořit patřičný target pomocí programu sb-menu. Dostačující volby jsou cs2005q3.2-glibc-arm jako kompilátor, perl, debian a cputransp jako devkits, qemu-arm jako transparency method a správný rootstrap. Po nainstalování rootstrapu je ještě vhodné doinstalovat všechny dostupné soubory a nechat se přepnout na target.
Existují postupy, jak zprovoznit kompletní prostředí Maemo Linux včetně grafického prostředí, to ale není naším cílem. Náš úkol bude kompilace jaderného modulu usbserial, který nám umožní přes USB kabel zprovoznit Zigbee sniffer MACDongle. To je opět spíše pro demonstraci, zařízení, která se připojují pomocí virtuálních sériových portů, je celá řada.
Nejprve nainstalujeme zdrojáky jádra
[sbox-arm-elf: ~] > apt-get source kernel-source-rx-34 Reading Package Lists... Done Building Dependency Tree... Done Need to get 56.8MB of source archives. Get:1 http://repository.maemo.org chinook/free kernel-source-rx-34 2.6.21.0-osso71 (dsc) [458B] Get:2 http://repository.maemo.org chinook/free kernel-source-rx-34 2.6.21.0-osso71 (tar) [55.8MB] Get:3 http://repository.maemo.org chinook/free kernel-source-rx-34 2.6.21.0-osso71 (diff) [926kB] Fetched 56.8MB in 2m37s (361kB/s) dpkg-source: warning: extracting unsigned source package (./kernel-source-rx-34_2.6.21.0-osso71.dsc) dpkg-source: extracting kernel-source-rx-34 in kernel-source-rx-34-2.6.21.0 dpkg-source: unpacking kernel-source-rx-34_2.6.21.0.orig.tar.gz dpkg-source: applying ./kernel-source-rx-34_2.6.21.0-osso71.diff.gz
Potom zavedeme standardní konfiguraci pro N810
[sbox-arm-elf: ~] > cd kernel-source-rx-34-2.6.21.0/ [sbox-arm-elf: ~/kernel-source-rx-34-2.6.21.0] > make nokia_2420_defconfig
Nyní pomocí našeho oblíbeného editoru upravíme soubor .config – přidáme podporu pro usbserial
# # USB Serial Converter support # CONFIG_USB_SERIAL=m
a spustíme oldconfig. Po dotázání na detaily usbserial driveru nesmíme zapomenout na Generic Serial Driver.
[sbox-arm-elf: ~/kernel-source-rx-34-2.6.21.0] > make oldconfig . . . * USB port drivers * * * USB Serial Converter support * USB Serial Converter support (USB_SERIAL) [N/m/y/?] (NEW) m USB Generic Serial Driver (USB_SERIAL_GENERIC) [N/y/?] (NEW) y
Nyní již zbývá jenom zkompilovat moduly
[sbox-arm-elf: ~/kernel-source-rx-34-2.6.21.0] > make modules
a nakopírovat výsledný usbserial.ko do nokie. MACDongle se připojí na USB kabel pomocí redukce popsané v prvním díle našeho seriálu.
Jednoduchý testovací program na komunikaci přes seriový port je pyserial, který stačí rozbalit na vhodném místě.
Nokia-N810-50-2:/home/user# insmod usbserial.ko vendor=0x0B40 product=0x0111 Nokia-N810-50-2:/home/user# ls -l /dev/ | grep -i usb crw-rw---- 1 root dialout 188, 0 May 3 14:44 ttyUSB0 crw-rw---- 1 root root 252, 0 Apr 30 16:46 usbdev1.1_ep00 crw-rw---- 1 root root 252, 1 Apr 30 16:46 usbdev1.1_ep81 crw-rw---- 1 root root 252, 2 May 3 14:44 usbdev1.7_ep00 crw-rw---- 1 root root 252, 4 May 3 14:44 usbdev1.7_ep03 crw-rw---- 1 root root 252, 3 May 3 14:44 usbdev1.7_ep82 crw-rw---- 1 root root 252, 5 May 3 14:44 usbdev1.7_ep83 Nokia-N810-50-2:/home/user# cd /media/mmc2/pyserial-2.2/ Nokia-N810-50-2:/media/mmc2/pyserial-2.2# export PYTHONPATH=/media/mmc2/pyserial-2.2/ Nokia-N810-50-2:/media/mmc2/pyserial-2.2# python examples/miniterm.py --port /dev/ttyUSB0 --- Miniterm --- type Ctrl-D to quit 00 +MSTC=0051
Jak je vidět, MACDongle je nyní přístupný na /dev/ttyUSB0 a komunikuje správně. Uvedený postup umožnuje podstatně rozšířit množinu hardware kompatibilního s N810, pokud se nám ho k tabletu podaří fyzicky připojit, z celého množství návodů uvádíme pro ilustraci Arduino board, kameru nočního vidění nebo Ethernet adaptér.
Na závěr našeho seriálu lze zhodnotit, že volba Linuxu jako OS pro internetový tablet byla velmi štastná. Množství použitelného software a hardware uspokojí i náročné uživatele. Doufejme, že v budoucnu se bude objevovat více podobných zařízení a geekové si tak budou mít s čím hrát.