lunedì 23 marzo 2009

Compilare il kernel Atrmark 2.6.26 per armadillo 500

Ecco le maggiori info :)
Cercando in rete ho scoperto che su armadillo 500-FX è già ststo portato android con kernel 2.6.26.
Dato che le due macchine sono così simili a livello hardware mi è parso così strano che il kernel più aggiornato disponibile per armadillo 500 sia il solo 2.6.18.. Quindi ho cercato tra i repository dell'armadillo 500-FX i sorgenti del kernel con l'intenzione di portarlo su armadillo-500.
Il kernel disponibile era proprio il 2.6.26 e con gioia ho scoperto che esisteva anche il file di configurazione per armadillo 500! nonché tutti i sorgenti specifici della CPU board e driver della board di sviluppo!

Bene! Allora i passi per il deploiment:
1
Scaricare e decomprimere i sorgenti del kernel dai repository atmark:
$ wget http://download.atmark-techno.com/armadillo-500-fx/source/kernel/linux-2.6.26-at3.tar.gz
$ tar -xvf linux-2.6.26-at3.tar.gz
2
Configurare e compilare i sorgenti per armadillo con l'aiuto di android:
$ cd linux-2.6.26-at3
$ make armadillo500_defconfig
$ export ARCH=arm
$ export CROSS_COMPILE=[basePathAndroid]/cupcake/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
$ make
Nota: ho usato la toolchain di cupcake, credo che anche con il branch master non abbia problemi..
3
Deploiment nella scheda:
In ./arch/arm/boot sono stati creati i file immagine del kernel: Image e compresso zImage
quindi copiando zImage nella cartella /tftp e scaricandolo nella flash attraverso hermit come nei post precedenti (indicando il nome di file zImage eh!) al reboot tutto funziona correttamente :)

Nota: il comando tftpdl da hermit della scheda, all'attivazione della periferica di rete è come se alcune volte non avesse il link attivato.. rimanendo in attesa della risposta dal server per il download.
Workaround: se da workstation eseguo il ping al'indirizzo impostato per la board il download dell'immagine, prima in attesa, parte contemporaneamente.

sabato 21 marzo 2009

Linux 2.6.26 done!!!

Yeeeee!! spulciando tra i repository atmark ho trovato i sorgenti del kernel 2.6.26! i quali supportano l'armadillo 500!
Compilato il tutto con la toolchain arm-eabi di android e scaricato nella board funziona!!

Dettagli alla prossima volta!

venerdì 20 marzo 2009

Boot dell'ultima distribuzine armadilliana!

Oggi ho terminato la traduzione dei manuali pdf Atmark, i quali contengono si abbastanza informazioni per utilizzare l'Armadillo ma poco o nulla sulle modifiche al kernel per supportare la board.. Spero ci sia qualcosa in più in giro nel kernel tree!
Comunque, mi sono concentrato a far girare il codice più aggiornato possibile -> kernel e distribuzione scaricabili dall'area di download Atmark dedicata.

Cosa ho fatto:
  1. Ho aggiornato il kernel nella flash (Unici device di boot supportati dal bootloader sono la flash interna e la compactflash che non ho..).
  2. Ho Installato la debian-armadillo distribuzione in una partizione della mia SD card utilizzandola come rootfilesystem.
1
Ci sono tre modi per scrivere nella flash della scheda:
  1. Con Hermit-at installato nella Workstation.
  2. Con Shoehorn-at installato nella Workstation.
  3. Da bootloader (Hermit-at nel device) attraverso il protocollo tftp.
Le prime due modalità richiedono l'installazione nella workstation delle relative utility cosa possibile compilando i sorgenti oppure installando i pacchetti debian .deb tramite dpkg.
Visto che lavoro su una Ubuntu non volevo scombinare il tutto ed allora ho optato per la terza!

La terza modalità prevede la presenza di un server tftp raggiungibile nella rete. Nel post precedente descrivo come eseguirne uno nella mia macchina e per controllarne il debug eseguo da shell:
$ inetd -d.
Scaricata l'ultima versione del kernel da http://download.atmark-techno.com/armadillo-500/image/linux-a500-1.05.bin.gz nella cartella /tftp sono pronto per l'aggiornamento:
Da una nuova shell eseguo il minicom (Impostazioni: rate 115200 bps, data 8bit, 1bit stop, No parity, No flowcontrol ) (Il jumper JP1 è cortocircuitato così da farmi presentare il menu del bootloader).
Dal menu del bootloader eseguo:
hermit> tftpdl 192.168.0.10 192.168.0.2 --kernel=linux-a500-1.05.bin.gz
(tftpdl deviceIp workstationIp --regionName=fileToDownload)
Ok! aggiornato il kernel!
Con il seguente comando dico al bootloader di eseguire il boot da flash:
hermit> setbootdevice flash

2
La debian-armadillo si trova qui http://download.atmark-techno.com/armadillo-500/debian/ in 4 file .tgz da estrarre in un'unica cartella.
Dato che in kernel c'è il supporto per i device MMC/SD allora decido di sfruttare la mia schedina da 1 GB ->
  • Cancello le partizioni preesistenti.
  • Creo un'unica partizione ext2.
  • Ci estraggo i debian-armadillo files.
  • Rootfs pronto!
Da menu del bootloader non devo far altro che definire le opzioni di boot del kernel ed eseguire il boot:
hermit> clearenv
hermit> setenv console=ttymcx0 root=/dev/mmcblk0p1 rootdelay=1
hermit> boot
Risultati
  • Nella console seriale ho una shell completamente funzionante.
  • L'uscita vga mi presenta la console virtuale tty1
  • Settando le impostazioni di rete, il controller SMSC funziona perfettamente.
  • Non ci sono moduli in /lib/modules .. ma comunque ciò che serve credo sia tutti in kernel (ma nel caso volessi supporti per espansioni ...! ricompilare il kernel o installare moduli aggiuntivi)

Server tftp con ubuntu

Link di riferimento:
http://mylinuxmind.myblog.it/tag/ubuntu%20tftp
Per il download di file nella flash della scheda tramite bootloader è utile creare un server tftp.

Installare il demone:
sudo apt-get install tftpd-hpa
Creiamo una cartella per lo scambio dei dati e diamo accesso in lettura e scrittura a chi vuole:
sudo mkdir /tftp
sudo chmod a+r /tftp
sudo chmod a+w /tftp
Ora modifichiamo il file di configurazione dei servizi /etc/inet.conf (Ubuntu 8.04 hardy)
la riga tftp deve essere modificata in:
tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /tftp
dove ogni campo significa:
#servicename sockettype protocol wait/nowait user serverprogram serverprogarguments
l'argomento -s indica al dempne tftpd di utilizzare la directory /tftp come root directory, se si vuole più debug aggiungere -v.

con:
sudo inetd
attiveremo anche il server tftp, specificando l'opzione -d verrà visualizzato il debug dei servizi su shell.

Alle prese con traduzioni...

Dopo una giornata alla ricerca di vari automatismi per la traduzione della documentazione dal Giapponese all'Inglese ho trovato questa serie di passi che rendono il tutto abbastanza semplice..
Essenzialmente mi servo della capacità di Google translate di tradurre intere pagine web (basta metterci il link al posto del testo..) e di ZOHO Viewer uno strumento di condivisione dei documenti capace di visualizzare i file pdf.

Tips and Tricks:
Google Translate non riesce a tradurre più di 5-6 pagine di pdf alla volta! -> se si carica l'intero file verrà tradotto pressocé il solo indice..
Pdftk ci viene in aiuto con burst per suddividere il file pdf nelle sue singole pagine:
pdftk nomefile.pdf burst
e merge per fondere singole pagine in unici file pdf:
pdftk nome1.pdf nome2.pdf ... cat output merge.pdf
Allora, suddivisi i file di documentazione in gruppi di 6 pagine, stò trascrivendo le informazioni iportanti della scheda che pubblicherò :)

Ah.. chissà se mi rispondono alla Atmark per la richiesta di documentazione in inglese..! o faranno la stessa cosa???

giovedì 19 marzo 2009

Porting del Kernel Android 2.6.27 su Armadillo 500

Link di riferimento:
Specifiche della board: http://www.atmark-techno.com/en/products/armadillo/a500/specs
Specifiche del processore: http://www.arm.com/products/CPUs/ARM1136JF-S.html
Area di download sw armadillo: http://download.atmark-techno.com/armadillo-500/

Bene Bene! Prima fase reale del mio progetto: Porting del kernel più aggiornato possibile nella board di sviluppo Atmark Armadillo 500! Questa monta un processore Freescale i.MX31L con set di istruzioni ARMv6.
Ho ordinato il mio fantastico libro Building Embedded Linux Systems, Second Edition che spero illuminerà la mia strada ma nell'attesa che arrivi cerco di individuare le modifiche fatte al kernel "vanilla" per supportare la scheda nella versione presente sul sito atmark.

Importante: Questi Giapponesi scrivono solo in giapponese! Servirà la mail che ho inviato per la richiesta di doc inglese?

Altro: Il kernel a disposizione è un 2.6.18 debian etch1 sssoooo old! :)

sabato 7 marzo 2009

Sul repository locale del kernel

Nella cartella "master/prebuilt/android-arm/kernel/" troviamo un bellissimo file "PREBUILT" che recita:
To rebuild the emulator kernel:

% git clone git://android.kernel.org/kernel/common.git kernel
% cd kernel
% export ARCH=arm
% export CROSS_COMPILE=arm-eabi-
% make goldfish_defconfig
% make

If kernel/common.git is mapped into your repo client, you can
just built it from there instead of re-cloning it.
ehm.. un pò da adattare dato che non menziona il branch android-goldfish-2.6.27 (nel branch common del kernel non c'è il file goldfish_defconfig) e che la toolchain di crosscompilazione non è (per ora) nel path d'esecuzione principale (non abbiamo modificato PATH).
Ma almeno abbiam trovato delle informazioni :)

Il nostro nuovo Android sull'emulatore!!

Bene bene, compilato il Kernel 2.6.27 per la macchina goldfish eseguiamo il tutto sull'emulatore!
Raccimoliamo tutti i file di output dei processi di build necessari che sono:
  • Kernel, l'immagine compressa:
    alberdroid/kernel-goldfish/.repo/manifests/arch/arm/boot/zImage
  • Android, i file immagine per ramdisk userdata e system nella cartella:
    alberdroid/master/out/target/product/generic
Io ho copiato la zImage nella cartella di output di android:

$ cd PATH_GIUSTO/alberdroid/master/out/target/product/generic/
$ cp PATH_GIUSTO/alberdroid/kernel-goldfish/.repo/manifests/arch/arm/boot/zImage .

e via all'emulatore!
$ emulator -system . -kernel zImage -show-kernel
Così l'emulatore cercherà i file ramdisk.img userdata.img e system.img nella cartella corrente (-system .), utilizzerà zImage come immagine del kernel (..non utilizzare l'immagine Image ma quella compressa zImage) e nella shell corrente mostrerà l'output del kernel!

venerdì 6 marzo 2009

Kernel per Android..

Link di riferimento:
http://groups.google.com/group/android-kernel
Allora, la sottocartella kernel esiste in master! e perché non viene compilata????
Urc! solita ricerca in rete e vien fuori che la versione che ho non è propriamente la versione per goldfish -> attiviamo il branch giusto!
..consiglio, creiamo un'altra directory per il nostro kernel:
$ mkdir -p alberdroid/kernel-goldfish
$ cd alberdroid/kernel-goldfish
$ repo init -u git://android.git.kernel.org/kernel/common.git -b android-goldfish-2.6.27
$ repo sync
Solito tempo che passa.....
poi:
-
Edit: perché ha salvato i sorgenti in .repo/manifests ??
cmq, dal precedente codice shell
$ cd .repo/manifests
e si continua con:
-
$ export ARCH=arm
$ export CROSS_COMPILE=PATHGIUSTO/alberdroid/master/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
$ make goldfish_defconfig
$ make
Verrà così creato un buon kernel per l'emulatore :)

Prima Build!

Dopo il sync con i sorgenti via al processo di make!
se si vuol compilare il sistema per l'emulatore goldfish (emulatore arm v5) allora dalla directory madre eseguiamo:
$ cd ~/alberdroid/master
$ make
Il processo è abbastanza lungo (più di un'ora nel mio portatile) e necessita di molta memoria! 1GB di ram non basta.....

Ma al termine, con il comando:
$ emulator -system out/target/product/generic/ \
-kernel prebuilt/android-arm/kernel/kernel-qemu -show-kernel
Vedremo apparire il nostro caro emulatore arm con android funzionante!!
Chiaro.. dovremmo avere l'emulatore installato correttamente.. rimando all'installzione dell'sdk per le applicazioni di android.. ma notiamo una cosa fondamentale: Il kernel!
In quasi due ore di compilazione il processo make non ha compilato il kernel! ho dovuto usarne uno che stà nella cartella prebuilt!

Ma siamo contenti d'aver compilato tutto il resto dai..! Il prossimo post sarà dedicato al kernel!

1.1 Download dei sorgenti!

Link di riferimento:
http://source.android.com/download

Allora, il progetto opensource di Android utilizza Git per il Version Management ed è stato sviluppato uno script "repo" per automatizzare molte operazioni.
Qui un manuale sull'utilizzo di Git e repo.

1-Download di Repo

repo è uno script eseguibile e per questo è utile posizionarlo in una cartella presente nel search path di bash, si consiglia quindi di creare una cartella ~/bin, aggiungerla alla variabile d'ambiente PATH scaricare quindi lo script e renderlo eseguibile:
$ cd ~
$ mkdir bin

nel file .bashrc inserire:
PATH=$PATH:/home/NOMEUTENTE/bin
export PATH
poi..
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
Repo è uno script in continuo sviluppo, eseguendolo verrà stampata un'informazione relativa alla presenza di versioni più aggiornate se necessario.

2-Inizializzazione dei sorgenti

Creiamo una cartella che conterrà i sorgenti di android.. attenzione che i sorgenti non compressi sono circa 2,1GB mentre dopo una build verranno occupati in tutto circa 4 GB (6GB a detta del sito ufficiale).
$ mkdir -p alberdroid/master
$ cd alberdroid/master
ed inizializziamo il repository locale con:
$ repo init -u git://android.git.kernel.org/platform/manifest.git
La cartella master è stata creata perché con questo comando verrà scaricato il barnch "master" con "git branch" otterremo i branch disponibili e con
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b BRANCHNAME
inizializzeremo il branch voluto.

3-Download dei sorgenti

dalla cartella alberdroid/master eseguire:
$ cd alberdroid/master
$ repo sync
Per sincronizzare singoli progetti..
$ repo sync NOME1 NOME2 ..

Capitolo Primo, l'inizializzazione!

Link di riferimento:
http://source.android.com/download

Bene, la mia distribuzione è la Ubuntu 8.04 su Pentium M (32bit) aggiornata il più possiblie :p

I pacchetti richiesti sono:
  • Git 1.5.4 or newer and the GNU Privacy Guard.
  • JDK 5.0, update 12 or higher. Java 6 is not supported, because of incompatibilities with @Override. (Ma se me la fa installare dopo con java6-sdk??)
  • flex, bison, gperf, libsdl-dev, libesd0-dev, libwxgtk2.6-dev (optional), build-essential, zip, curl.
e quindi si procede con:

$ sudo apt-get install git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev

oook procediamo con il download...

Presentazione!

Ciao! Sono Alberto aka Alberdroid per voi :)
Il questo Blog leggerete delle mie peripezie nell'avventura: Porting di Android lella board di sviluppo ... (Puntini da riempire più avanti :p).

Beh... presentazione breve ma efficace.. in sostanza, stay tuned!