- 1 Needed Tools
- 2 Get Android sources
- 3 Toolchain
- 4 At91bootstrap
- 5 Bootloader
- 6 Linux Kernel
- 7 Building Android file system
- 8 Burning images
- 9 Initial run
- 10 Applications Developing
- 11 Android Compatible devices
- 12 Tip and tricks
- 13 Errata, bugs and uncouth
- 14 Pre-built images
- 15 Build environment in Virtual Machine
- 16 Reference
Android source repository tool
repo(a git script) is a tool to facilitate the use of git with Android code, to install it:
$ mkdir -p ~/usr/local/bin $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/usr/local/bin/repo $ chmod a+x ~/usr/local/bin/repo $ export PATH=$PATH:~/usr/local/bin
Packing Linux kernel suitable for usage by U-Boot
When building U-Boot in the tools directory a tool mkimage will be build, too. To be successful "make uImage" command from the Linux kernel tree, mkimage must be in a directory from the PATH list.
A static executable for GNU/Linux at
Serial communication or terminal emulation software
Use screen or minicom to get connected to the pm9g45 board through RS-232 port.
Java JDK required version for building Android v2.1 file system is 1.5.
JAVA version is required to be 1.5. Get JDK 1.5.0 update 22 and execute:
$ export JAVA_HOME=<java installation path> $ export PATH=$JAVA_HOME/bin:$PATH
If "undefined reference to symbol 'dlsym@@GLIBC_2.0" appears take a look at , and add "LOCAL_LDLIBS += -ldl" before each "LOCAL_MODULE_TAGS := tests" in system/core/libacc/tests/Android.mk file.
Tool for creating JFFS2 root fs file system
The needed tool mkfs.jffs2 is part of mtd-utils and mtd-tools.
A static executable for GNU/Linux at
Get Android sources
The Android codes from their primary locations can be obtained as described in http://www.at91.com/android4sam/bin/view/Android4SAM/GetAndroid
The working directory is assumed to be ~/usr/src/pm9g45/ and could be changed.
$ mkdir -p ~/usr/src/pm9g45/android $ mkdir -p ~/usr/src/pm9g45/u-boot $ mkdir -p ~/usr/src/pm9g45/linux $ cd ~/usr/src/pm9g45/android $ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.1_r2 $ cd hardware $ git clone git://android.git.kernel.org/platform/hardware/alsa_sound.git $ cd alsa_sound $ git checkout origin/eclair $ cd ../external $ git clone git://android.git.kernel.org/platform/external/alsa-lib.git $ cd alsa-lib $ git checkout origin/eclair $ cd .. $ git clone git://android.git.kernel.org/platform/external/alsa-utils.git $ cd alsa-utils $ git checkout origin/eclair
The PM9G45 BSP is based on Atmel AT91SAM9G45 port for Android.
$ cd ~/usr/src/pm9g45/android/vendor $ wget http://download.ronetix.at/boards/android/v2.1/patches/Android-2.1_r2-ver1.1-ronetix-14102011.tar.bz2 $ wget http://download.ronetix.at/boards/android/v2.1/patches/Android-2.1_r2-ver1.1.tar.bz2 $ tar xjvf Android-2.1_r2-ver1.1.tar.bz2 $ tar xjvf Android-2.1_r2-ver1.1-ronetix-14102011.tar.bz2
Android sources comes with prebuilt toolchains and the one mentioned is used.
$ export CROSS_COMPILE=~/usr/src/pm9g45/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
No modifications of the bootstrap required. But for some reason a change is needed see the AT91Bootstrap README. An already built bin file is ready for use(x. Pre-built images)
U-Boot for Android usage requires no special treatment. See U-Boot README to configure and build the boot loader if customizations are needed, else and prebuilt one can be used.(x. Pre-built images)
The commands below shows how to build Linux kernel. For demo and evaluation purposes there is an prebuilt Linux kernel image file (x. Pre-built images).
$ wget http://download.ronetix.at/boards/linux/kernel/2.6.30/linux-2.6.30.tar.bz2 $ tar xjf linux-2.6.30.tar.bz2 $ cd linux-2.6.30 $ git init $ git add * $ git add .gitignore .mailmap $ git commit -m "Initial commit after linux-2.6.30.tar.bz2 extraction" $ wget http://download.ronetix.at/boards/android/v2.1/patches/2.6.30-at91-exp.4-android_2.1_r2-pm9g45_v1.3-09122011.tar.bz2 $ tar xjf 2.6.30-at91-exp.4-android_2.1_r2-pm9g45_v1.3-09122011.tar.bz2 $ git am 2.6.30-at91-exp.4-android_2.1_r2-pm9g45_v1.3-09122011/*.patch $ export CROSS_COMPILE=~/usr/src/pm9g45/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- $ export ARCH=arm $ cp pm9g45_v1.3_android_config .config $ make oldconfig
To build it run:
$ make uImage
The result arch/arm/boot/uImage is to be written to the PM9G45 NAND.
Building Android file system
In the vendor/ronetix/README file from the Android package are available these commands for reminder.
$ cd ~/usr/src/pm9g45/android/ $ make clean $ source build/envsetup.sh $ chmod a-x vendor/atmel/cmd/partner_setup $ partner_setup pm9g45 $ choosecombo device release pm9g45 eng ... ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=2.1-update1 TARGET_PRODUCT=pm9g45 TARGET_BUILD_VARIANT=user TARGET_SIMULATOR=false TARGET_BUILD_TYPE=release TARGET_ARCH=arm HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID=ERE27 ============================================
Here it takes a lot of drinks, and finally the result is at out/target/product/pm9g45
$ make -j4
Pack the images in file for writing to the target
$ cd ~/usr/src/pm9g45/android/ $ _C_PWD=`pwd` $ cd out/target/product/pm9g45 $ cp -T system root/system -r $ chmod 0777 root/ -R $ mkfs.jffs2 -l -s 0x800 -e 0x20000 -p 0x4000000 -d root/ -o pm9g45-android.jffs2 -n -q $ cd $_C_PWD $ unset _C_PWD
Move the pm9g45-android.jffs2 file in a TFTP/FTP reachable place or SD card to be programmed faster with PEEDI. SAM-BA v2.10 can be used to program the file system, too.
RootFS to be written at 0x500000 with JFFS2 OOB.
In case you compile all the sources the produced files will be:
- AT91Bootstap - binaries/pm9g45-nandflashboot-2.13.bin
- U-Boot - u-boot.bin
- Linux kernel - arch/arm/boot/uImage
- Android - out/target/product/pm9g45/pm9g45-android.jffs2
The files are given with respect from the place the build command is issued. If you use the demo prebuilt images, their list is in the prebuilt images topic.
Using SAM-BA v2.10
TODO: SAM-BA build instructions.
Using PEEDI flash programmer
Flash Section 0 and 1 have to be with OOB Info set to FF, but flash sections 2 and 3 must be with OOB Info set to JFFS2.
PEEDI> f s 0 PEEDI> f e ; Erase the whole NAND with 0xFF set in the spare area PEEDI> f p pm9g45-nandflashboot-2.13.bin bin 0x0 PEEDI> f s 1 PEEDI> f p u-boot.bin bin 0x20000 erase PEEDI> f s 2 PEEDI> f p uImage bin 0x200000 erase PEEDI> f s 3 PEEDI> f p pm9g45-android.jffs2 bin 0x500000 erase
If you wish to waste the data saved by Android, play the next two commands:
PEEDI> f s 0 PEEDI> f e 0x2780000 0x10000000
After the program completes unplug the power cord, then detach the JTAG cable or in PEEDI run "ta de", plug the Ethernet and RS-232 cable and finally plug the power cord.
The first run will take around 2 minutes.
Here are some specifics for Android applications:
- "dx" which allows to convert Java Class files into "dex" (Dalvik Executable) files.
- Android applications are packed into an .apk (Android Package) file by the program "aapt" (Android Asset Packaging Tool)
- To simplify development Google provides the Android Development Tools (ADT) for Eclipse
- ADT from the URL https://dl-ssl.google.com/android/eclipse/ and requires "org.eclipse.jdt" to be installed.
- Android supports 2-D and 3-D graphics using the OpenGL libraries and supports data storage in a SQLite database.
- Every Android applications runs in its own process and under its own user id which is generated automatically by the Android system during deployment.
- Steps to instal the Andoid SDK http://developer.android.com/sdk/installing.html
- Insrall JDK plugin for Eclipse Helios: In "Install new window" enter "Helios-http://download.eclipse.org/releases/helios/" then hit enter. From the list select "Eclipse IDE for Java Developers" and "Eclipse Java Development Tools"
- Each application must be signed in order to be accepted by Android, even the applications in the developing phase must be signed with the standard debugkey to be uploaded on the target. The target have to be enabled to accept debuggable applications. Signing and building noted here http://developer.android.com/guide/developing/building/building-cmdline.html
Android Compatible devices
Even though the software is open-source, device manufacturers cannot use Google's Android trademark unless Google certifies that the device complies with their Compatibility Definition Document (CDD). Devices must also meet this definition to be eligible to license Google's closed-source applications, including the Android Market.
Tip and tricks
For a custom screen edit file "common/packages/apps/Calibrate/src/com/android/calibrate/AndroidCalibrate.java" locate where UI_SCREEN_<WIDTH and HEIGHT> are set and modify them.
When building the Android file system a three img files are produced in the out/target/product/pm9g45/ directory: ramdisk.img wich contains the root/ directory, system.img which is the same as system/ directory and userdata.img which is data/ directory. Crating the file system for pm9g45 is descried above.
$ gnucpio -iz -F ramdisk.img
gnucpio -i -t -F ../ramdisk.img | gnucpio -o -H newc -O ../rootfs.img
A list of Android KeyEvents is lested at
A kaymap table can be found:
The SW3 and SW4 buttons are defined as:
KEY_MENU is SW4 KEY_BACK is SW3
How to Unlock the Screen
Press a SW3 or SW4 then drag the lock icon over the yellow-green spot next to the other end.
IP over Ethernet
The software gets IP over Ethernet if the cable is attached. The board IP can be seen by executing the following command on the board serial console.
$ ifconfig eth0 eth0: ip 192.168.10.88 mask 255.255.255.0 flags [up broadcast running multicast]
This IP is used to attach ADB to the board.
There is an errors in the way the DHCP is processed, so take a look at "13.1. Enabling the DNS service".
IP over USB0
Connect the J3 USB device port of the target to the USB port of the host computer. On the host a CDC Ethernet Device driver have to be available.
Set the IP of the target:
# ifconfig usb0 192.168.0.200 netmask 255.255.255.0 up
Set the IP of the host and connect to the target:
# ifconfig usb0 192.168.0.1 netmask 255.255.255.0 up # adb connect 192.168.0.200:5555
Android Debug Bridge
This mechanism gives easy to push(put) and pull(get) files from the target memory, provides command shell access, Eclipse ADT plugin easy software developing and getting the Android stack log on the host computer.
The command "adb devices" shows the already connected devices if any, this command do not make connection to the device even through USB. To connect to a device use "adb connect <device IP here>". Where <device IP here could be IP over Ethernet or over USB.
# export PATH=$PATH:~/usr/src/pm9g45/android/out/host/linux-x86/bin/ # adb connect 192.168.10.88:5555 * daemon not running. starting it now * * daemon started successfully *
connected to 192.168.10.88:5555
# adb devices
List of devices attached
192.168.10.88:5555 device # adb shell
The Linux kernel log can be seen as running "dmesg" command in the Android shell. Android stack logs useful for testing and debug can be shown with "catlog" command from the target command shell or with "adb logcat" from the host computer.
Micro SD card
The Micro SD card must be formatted with FAT16 file system. On GNU/Linux host you can use mkdosfs like this:
$ mkdosfs /dev/sdc1
asound.conf and asound.state and asla_amixer names differ. Using "alsa_amixer" you will get the below names to set the sound.
# alsa_amixer set 'Master' 100 # alsa_amixer set 'Master Playback ZC' unmute # alsa_amixer set 'Sidetone' 0 # alsa_amixer set 'Line' nocap # alsa_amixer set 'Mic' cap # alsa_amixer set 'Mic Boost (+20dB)' mute # alsa_amixer set 'Playback De-emphasis' '32Khz' # alsa_amixer set 'Capture' 31 # alsa_amixer set 'ADC High Pass Filter' unmute # alsa_amixer set 'Input Mux' 'Mic' # alsa_amixer set 'Output Mixer HiFi' unmute # alsa_amixer set 'Output Mixer Line Bypass' mute # alsa_amixer set 'Store DC Offset' unmute
Then do "asla_ctl store -f asound.state", next take the slightly changed names and correct asound.conf. In asound.state are listed parameters ranges and it allowable values.
Recalibrate touch screen from command line
# ps USER PID PPID VSIZE RSS WCHAN PC NAME ...
# kill "here put the PID of com.android.calibrate" # rm /data/etc/pointercal # am start -a android.intent.action.MAIN -n com.android.calibrate/.AndroidCalibrate
Errata, bugs and uncouth
Enabling the DNS service
FIXME: DNS and IP address equivalently in getprop and netcfg after running "netcfg eth0 dhcp".
On the first boot the IPs set on eth0 and on dhcp.eth0.ipaddress are the same, but the DNS server is not set(host names are unresolvable).
To set the DNS server do these commands in the Android stack console:
$ getprop dhcp.eth0.dns1 192.168.10.1 $ setprop net.dns1 192.168.10.1
Note that if the dhcp service is taken again with the next two commnds the IP addresses shown by ipconfig and in dhcp.eth0.ipaddress will differ, also the DNS server have to be set if it defers from the previous one.
$ netcfg eth0 up $ netcfg eth0 dhcp
The initial logo of Atmel is not shown properly
A set of images which are ready to use for demo and evaluation purposes.
Build environment in Virtual Machine
The provided VM(virtual machine) environment has the ARM toolchain, AT91Bootstrap, U-Boot, Linux kernel and Android stuff. The purpose is to test, easy try,
The VM image and its companian manuals can de dowloaded from .
Articles, documents used to write this text.
-  ftp://ftp.linux4sam.org/pub/Android4SAM/9m10g45/v1.1/patches/Android-2.1_r2-ver1.1.tar.bz2
-  http://wiki.openmoko.org/wiki/Android_usage
-  http://www.vogella.de/articles/Android/article.html
-  https://bugzilla.redhat.com/show_bug.cgi?format=multiple&id=593947
-  http://download.ronetix.at/vmware/
-  http://source.android.com/source/downloading.html