Pokusím se zde vyjevit základní postup jak kompilovat (nejen) moduly pro Android. Pochopitelně tento postup není jediný možný a existuje mnoho variant téhož. Níže popsaný postup jsem použil já a dosáhl jsem uspěšného zavedení modulů na cílové platformě.
1. TOOLCHAIN
Nuže, nejprve budeme potřebovat takzvaný toolchain. Je to sada vývojových nástrojů, které dokaží kompilovat zdrojový kód pro cílový procesor na PC. Proto název cross ( křížová) compiling (kompilace). Jak zjistím jaký toolchain potřebuji? Bud použijte Google třeba už to někdo řešil a uspěl nebo zapátráte sami. Je třeba zjistit jaký procesor použivá Vaše zařízení a jakým kompilerem bylo jádro zkompilováno. Tady předpokládám že máte k dispozici linuxovou konzoli a že máte alespoň základní znalost linuxu. Spustťe na tabletu přikaz cat /proc/version. Dostanete něco takového:
Linux version 3.0.8+ (weny@Ingen-cross) (gcc version 4.5.1 (Sourcery G++ Lite 200.09-50 ) ) #47 PREEMPT Thu May 3 10:04:10 CST 2012
Co z toho vyčteme? Máme jádro 3.0.8+, kompilován byl pomocí gcc 4.5.1 . Pro ARM embedded systémy a to je většina tabletů s Androidem se používá tzv. ARM GNU EABI kompiler. To bude klíčové při hledání správného toolchainu. Opět použijme Všeználka pana Googla. Klíčová slova budou: “gcc 4.5” “gnu eabi” “linux” “arm” ještě můžete přidat distribuci linuxu který používáte na PC. To by spolehlivě mělo odkázat na některý balíček. Nainstalujte podle konkrétního návodu.
Pokud používáte Debian můžete ho sehnat zde: http://emdebian.org/crosstools.html nebo instalovat přímo z linuxu
apt-get install gcc-4.5-arm-linux-gnueabi (případně gcc-4.3 nebo 4.4)
apt-get install build-essential git
apt-get install u-boot-tools (pokud nenajde u-boot-tools zkuste uboot-mkimage)
2. KERNEL SOURCE TREE
Dalším krokem je sehnat zdroják k vašemu kernelu (source kernel tree). Víme tedy že sháníme kernel 3.0.8+, podle konkrétního tabletu najděte na internetu jaký SoC (system on chip) používá (např. Allwinner A10-A13, Rockchip, MediaTek atd…) seznam těch nejznámejších třeba zde. Hledání bych začal v repozitáři github. Jako klíčové slovo nedávejte celou verzi jádra, většínou se stejně do názvu dává jen 3.0 apod.
Pokud naleznete kernel na Gitu v linuxu ho stáhnete:
git clone https://github.com/název_kernelu.git
cd název_kernelu
git checkout název větve (branch) obyčejně to bývá Master
3. BUILD
Porozhlídněte se v tomto adresáři případně v adresáři scripts po scriptech nazívající se něco jako build.sh. Někdy tam může být build_název_zařízení.sh . Naleznete-li něco takového spustťe to. Tehle skriptík zařídí zpravidla vše od A-Z. Pokud chcete mít nad kompilací kontrolu čtěte dál.
Ještě než budeme pokračovat dál, chci zmínit jednu věc. Pokud plánujete experimentovat s různýmy konfiguracemi, například kompilovat moduly pro více tabletů, existuje parametr který způsobí, že se všechny generované soubory vytváří pod jeden Vámi určený adresář a zároveň se z tohoto adresáře načítá vlastní nastavení. Takto můžete vytvořit mnoho nezávislých variant zároveň. Při tomto způsobu kompilace musí zůstat základní adresářová struktura staženého kernelu čistá, jinak se kompilace nezdaří. Naproti tomu pokud chcete kompilovat jen jednu variantu nemusíte tento parametr uvádět a veškerá kompilace bude probíhat do základní struktury. Já preferuji 1. variantu a proto u všech příkazů make bude parametr O=adresář. (tedy kromě těch které mají pročistit základní adresářovou strukturu). Proto všechny konfigurační soubory dávejte právě do adresáře za parametrem O. Ti ostatní dávejte dávejte soubory přímo do adresáře “název_kernelu” nebo-li src tree.
Vytvořte adresář kam kompiler bude ukládat výsledky, tedy ten co uvedete za parametr O. Já vyberu třeba název TABLET_A.
4. CONFIG
Pokud jste nenašli skript alá build.sh bude třeba konfigurovat kernel jinak. Nejprve se podívejte do adresáře ./arch/arm/configs, bude tam pravděpodobně spousta souborů něco_defconfig. Pokuste se nalézt nějaký nesoucí název Vašeho zařízení. Našli jste-li ho, zkopírujte ho do adresáře TABLET_A a změnte mu jméno na .config . Pokud jste nic takového nenašli vyberete nějaký generický config a upravíme si ho později. Ještě existuje způsob jak přečíst config z Vašeho tabletu, ale né vždy to jde. Více v článku Extrahujeme Module.symvers a config. Abychom kernel správně nakonfigurovali potřebujeme zjistit pár informací. Najděte na tabletu jakýkoliv modul, u mě jsou v adresáři /system/vendor/modules a spustťe příkaz
modinfo modul.ko | grep vermagic
dostanete něco jako:
vermagic: 3.0.8+ SMP preempt mod_unload modversion ARMv7
a přesně tohle musí vypisovat vámi zkompilované moduly, jinak je kernel odmítne načíst. Pro tuto chvíli toto stačí vrátíme se k vermagicu v následující kapitole.
5. MAKE
Nastavíme několik proměných které nastaví kompiler na náš toolchain a architekturu. Přizpůsobte Vašim potřebám. Já u sebe mám.
1 2 3 4 |
export CROSS_COMPILER=arm-linux-gnueabi- export ARCH=arm export KERNELRELEASE='3.0.8+' #to co ukazoval vermagic export INSTALL_MOD_PATH=modules_out #do tohoto adresare se moduly po kompilaci nakopiruji |
Nejprve pro jistotu vyčistíme základní src tree. Ujistěte se, že jste v základním adresáři src tree a spusťte:
make mrproper
poznámka: od teď už musíte vždy uvádět u příkazu make parametr O.
pokud potřebujete upravit konfiguraci kernelu pokračujte příkazem. Ostatní mohou přeskočit.
make O=TABLET_A menuconfig
Objeví se dialog kde můžete pozměňovat konfiguraci. Zmíním se jen o pár duležitých nastaveních a to těch které mení vermagic (viz. kapitola 4) a nastavení modulů.
Pokud máte v vermagicu
SMP nastavte Kernel Features —>Symmetric Multi-Processing
preempt nastavte Kernel Features —>Preemption Model—>Preemptible Kernel (Low-Latency Desktop)
mod_unload nastavte Enable loadable module support —>Module unloading
modversion nastavte Enable loadable module support —>Module versioning support
a pak samozřejmě záleží na Vás co všechno chcete nastavit, ještě zmíním menu kde se povolí kompilování modulů pro dvb tunery
Device Drivers —> Multimedia support —>DVB for Linux —>DVB/ATSC adapters —>
Několik slov k souboru Module.symvers. Pokud hodláte kompilovat moduly, budete potřebovat správný Module.symvers. Ten vzniká při kompilaci kernelu a zjednodušeně řečeno “napovídá” kompilátoru jak správně propojit kernel a moduly. Pokud byste tedy kompilovali kernel a zároveň moduly, které byste následně nahráli do tabletu, nemusíte nic řešit. Co ale dělat, když do tabletu chcete přidat jen moduly? Kde vzít správný Module.symvers? No někteří výrobci tabletů tento soubor nechávají ve stejném adresáři s modulama. Koukněte se tam, pokud ho tam najdete máte o starost méně. Jen ho nakopírujte do adresáře TABLET_A a můžete začít vesele kompilovat moduly. Ti ostatní můžou použít návod Extrahujeme Module.symvers a config. Pokud Module.symvers nedodáte kompileru nebo bude špatný, kernel nenačte moduly.
Zazálohujte si někam soubor .config a Module.symvers. Může se stát že ho nějaký proces přepíše nebo vymaže, třebas make O=TABLET_A clean to určitě udělá.
Pokud jste už dříve kompilovali proveďte právě make O=TABLET_A clean a obnovte .config a Module.symvers ze zálohy
začněte tímto příkazem, přichystá vše potřebné pro kompilaci
make O=TABLET_A oldconfig prepare modules_prepare headers_install scripts
tímto příkazem zkompilujete moduly pod kernelem, které jste si povolili v configu, parametr M není nutný, chcete-li přeložit jenom určité moduly v nějakém adresáři, použijte ho
make O=TABLET_A M=/cesta_k_modulum modules
tímto příkazem nakopírujete zkompilované moduly do adresáře definovaného proměnou INSTALL_MOD_PATH
make O=TABLET_A modules_install
tímto příkazem zkompilujete kernel image
make O=TABLET_A zImage uImage bzImage
tímto příkazem zjistíte další možnosti příkazu make
make O=TABLET_A help
6. ZÁVĚR
Před nahráním modulů do tabletu zjistěte příkazem modinfo názevmodulu.ko zda-li mají shodný vermagic s kernelem. Pokud ne, něco jste měli špatně nastavené a musíte nastavení opravit a zkompilovat moduly znovu.
Přeji úspěšnou kompilaci.
Z těhto zdrojů jsem čerpal:
http://rhombus-tech.net/allwinner_a10/kernel_compile/
http://glandium.org/blog/?p=2664
https://www.kernel.org/doc/Documentation/kbuild/modules.txt
[…] získaní správného Toolchainu pomocí kterého můžete kompilovat zdrojaky na PC pro Androida. (koukni sem).Taktéž získání zdrojaků pro mou verzi kernelu mě stálo nejeden šedivý vlas. Dost bylo […]