Introduction¶
This is a compilation and usage manual for the Android 4.3.1 operating system for Enclustra’s Mars ZX3 Zynq module.
Acknowledgements¶
We would like to thank Enclustra GmbH (http://enclustra.com) for co-sponsoring the port.
Version information¶
Author | Content | Date | Version |
---|---|---|---|
Peter Gielda | Draft version | 07.07.2013 | 0.1.0 |
Michael Gielda | Updated for Sphinx | 08.07.2013 | 0.2.0 |
Sebastian Kramer | Typos; required packages; improvements | 08.07.2013 | 0.2.1 |
Peter Gielda | Minor improvements | 06.06.2014 | 0.2.2 |
Mariusz Glebocki | Updated to Android 4.3.1 | 03.09.2014 | 0.2.3 |
Michael Gielda | Corrections | 12.09.2014 | 0.2.4 |
Michael Gielda | More info on U-Boot | 19.09.2014 | 0.2.5 |
Peter Gielda | Changed list of packages and default OS to Ubuntu 12.04 | 26.09.2014 | 0.2.6 |
Peter Gielda | Git hashtag updated | 26.09.2014 | 0.2.7 |
Compiling the system¶
The port was prepared using Gentoo and Debian Linux environments. The procedures described here should also work on other systems, but if you detect any errors or ommissions please e-mail us at contact@antmicro.com.
Prerequisites¶
Toolchain¶
The toolchain used to compile the kernel is Sourcery G++ Lite 2011.03-42, and can be obtained from the Mentor Graphics website.
When this was written, Sourcery G++ Lite was directly available without the need for logging in using a direct link:
wget 'https://sourcery.mentor.com/sgpp/lite/arm/portal/package8736/public'\
'/arm-none-eabi/arm-2011.03-42-arm-none-eabi.bin'
chmod +x arm-2011.03-42-arm-none-eabi.bin
./arm-2011.03-42-arm-none-eabi.bin
Warning
The installer for the toolchain does not cope with dash as the system shell, however instructions how to get around that should be printed out when the installer is run.
The toolchain should be decompressed and its bin
directory included in the PATH variable.
The proper availability of the toolchain can be checked by finding out if arm-none-eabi-gcc
is available from the shell.
repo
¶
The repo
tool, used to manipulate the Android git repositories, can be downloaded from Google’s repositories and made available in your system as follows:
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
Java¶
The Java JDK 1.6 is required for Android compilation.
Oracle JDK 1.6 installer might not be available in your system’s package manager.
In this case, get the latest version of the Java SE Development Kit from the Oracle website.
In the file list accept the license and download the .bin
file for your system (Linux x86 or Linux x86).
This step requires logging in.
Instructions to install the package named jdk-6u45-linux-x64.bin
downloaded to the ~/downloads
directory are:
cd ~
chmod +x ~/downloads/jdk-6u45-linux-x64.bin
~/downloads/jdk-6u45-linux-x64.bin
The package is unpacked to the ~/jdk1.6.0_45
directory.
Other packages¶
A number of other dependencies are also required, but these should be available from package managers on most systems without a problem - e.g. on 64-bit Ubuntu 12.04 you can get them by typing:
sudo apt-get install git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386 \
u-boot-tools lzop
Building the Linux kernel¶
You will need to compile your Android-enabled kernel separately. You can base your configuration on https://github.com/antmicro/linux-xlnx/raw/enclustra/config_enclustra_android.
To compile the 3.13 kernel from our repository:
git clone https://github.com/antmicro/linux-xlnx.git
git checkout enclustra
git checkout d66a0ec2f397a285365b339b1386f166c5285b2d .
cp config_enclustra_android .config
CROSS_COMPILE="arm-none-eabi-" LOADADDR=0x8000 ARCH=arm make uImage -j$(nproc)
Getting the Android sources¶
The sources are fetched using the repo
tool:
repo init -u git://github.com/antmicro/android_mars_zx3 -b master
repo sync -f # use -f to ignore fetch errors
Warning
Before starting this procedure, be aware that it may take a long time, especially if you are running on a slow Internet connection!
Building Android¶
Android can now be compiled using your Java installation. Be sure to supply the correct path to the JDK.
source ./build/envsetup.sh
export JAVA_HOME=$HOME/jdk1.6.0_45 # path to the JDK installed before
export ANDROID_JAVA_HOME=$JAVA_HOME
export PATH=$JAVA_HOME/bin:$PATH
lunch mars_zx3-userdebug
make -j$(nproc)
Additional boot files¶
To boot Android on the device, you will also need some additional files:
devicetree.dtb
system_top.bit
To download them, use the following command:
git clone --depth 1 https://github.com/antmicro/boot_files_mars_zx3.git
Creating an SD Card with the system¶
To boot Android on the device you have to use at least a 512 MB SD Card. The system needs four partitions:
- for the kernel image and related files (vfat, 32 MB)
- root partition (ext4, 32 MB)
- system (ext4, 256 MB)
- data (ext4, 100 MB or more)
The last partition, used to store user data and additional applications, will be formatted to take up the remaining space on the SD card.
Preparing the card¶
Warning
All data on the card will be lost. /dev/sdX
below is used as the card device node.
Insert the card into reader and create partitions with the following commands (lines beginning with a colon are typed inside the fdisk
command prompt, without the colon):
sudo fdisk /dev/sdX
: o [enter]
: n [enter] [enter] [enter] [enter] +32M [enter]
: n [enter] [enter] [enter] [enter] +32M [enter]
: n [enter] [enter] [enter] [enter] +256M [enter]
: n [enter] p [enter] [enter] [enter]
: w [enter]
mkfs.vfat -n BOOT /dev/sdX1
mkfs.ext4 -L root /dev/sdX2
mkfs.ext4 -L system /dev/sdX3
mkfs.ext4 -L data /dev/sdX4
Copying files¶
Note
$KERNEL
, $ANDROID
, and $BOOTFILES
used below are respectively: the kernel and Android sources main directories paths, and path to additional boot files (system_top.bin and devicetree.dtb)
If the compilation was successful, the rootfs CPIO image is located at $ANDROID/out/target/product/mars_zx3/ramdisk.img
, and the system partition at $ANDROID/out/target/product/mars_zx3/system.img
.
The compiled kernel image is at $KERNEL/arch/arm/boot/uImage
.
To install files on the card, run the following commands as root:
mkdir -p /mnt/android/{img,boot,root,system}
mount /dev/sdX1 /mnt/android/boot
mount /dev/sdX2 /mnt/android/root
mount /dev/sdX3 /mnt/android/system
mount -o loop $ANDROID/out/target/product/mars_zx3/system.img /mnt/android/img
cp $KERNEL/arch/arm/boot/uImage /mnt/android/boot
cp $BOOTFILES/{devicetree.dtb,system_top.bit} /mnt/android/boot
rsync -av /mnt/android/img/* /mnt/android/system
cd /mnt/android/root
gunzip -c $ANDROID/out/target/product/mars_zx3/ramdisk.img | cpio -i
chmod +x *.sh
cd /
umount /mnt/android/{img,boot,root,system}
Booting¶
U-Boot¶
To boot Android on Mars ZX3 you have to use a matching U-Boot bootloader.
The sources and compilation instructions can be found in the ZX3 GitHub repository
Additional information about the bootloader itself can be found at the U-Boot website.
Note
How to flash the Mars ZX3 module with a proper boot.bin
file with the correct U-Boot is beyond the scope of this manual, but this only needs to be done once.
Setting up the U-Boot environment¶
Connect the USB cable to the micro USB port and run a serial terminal program, for example picocom
:
picocom -b 115200 /dev/ttyUSB0
In the U-Boot command prompt type the following commands to set environment variables:
setenv bootargs console=ttyPS0,115200 root=/dev/mmcblk0p2 rw rootwait earlyprintk
setenv bootcmd mmcinfo && fatload mmc 0 0x3000000 uImage && \
fatload mmc 0 0x2A00000 devicetree.dtb && \
fatload mmc 0 0x200000 system_top.bit && fpga loadb 0 0x200000 ${filesize} && \
bootm 0x3000000 - 0x2A00000
saveenv
And to boot:
boot
Using a USB WiFi dongle¶
By default, only WiFi interfaces based on Atheros AR9271 are supported. Simply connect the dongle to the USB port and go to the Android settings, where you can turn on WiFi.
Hints on adding support for other interfaces¶
To use other interfaces, you have to turn on the required interface’s driver in the kernel config, rebuild it, and optionally put its firmware in the etc/firmware
directory on the system partition.
For detailed information which driver and firmware to use, google for its name or ID, which can be obtained with the lsusb
command.
The Linux Wireless page is a good place to start.