Posts Tagged ‘cross-compilation’

Getting Started with MediaTek X20 Android Development Board

July 17th, 2017 No comments

Thanks to CNX for helping me get a hand on the 96Boards compliant Mediatek X20 board that was generously donated by Seeed Studio. In this article, I will walk through the steps to get the board up and running and also compile Android from the source code. The current Android is version 6.

Unboxing the Beast

Figure-1 : DHL Packet

Figure-2 : MediaTek X20 Box

Figure-3 : Standoff, board and instructions

Figure-4 : Front Facing

Figure-5 : Powerful tiny MediateTek chip

Figure-6 : Side Shot

Figure-7 : Backside Shot

Figure-8 : Multiple Antenna

First Boot Up

The board boots up from the eMMC, and the first time you boot up you will get Android screen as shown in Figure-9. This is the default Android image from the factory, which surprisingly looks like it was setup for a phone screen mode, which is not sufficient for a HDMI monitor. It would be better to install the images that are made available at Linaro website or build your own. See the other section to flash the board with different images.

Figure-9 : Out-of-the-box Android

Figure-10 : Partition mount information

Switching to Fastboot Mode

Flashing image files are done using fastboot tool in bootloader mode. There are 2 ways to switch to bootloader mode. To prepare the board to be flashed it will need pin 3 (USB Host Set) located at the back of the board as shown in Figure-11 to be set to OFF

Figure-11 : Switch OFF pin 3

Method 1

The first method requires that you boot your board into Android. Power the board and let it boot to Android. Once it boots to Android you can switch to bootloader mode by typing

Once it switch to bootloader mode you can use the fastboot to flash the image

Method 2

The 2nd method require the xflash tool which can be downloaded from the following link Unzip the file and you will see something like Figure-12.

Figure-12 : Tools and Image files

Extract xflash.tar.gz and you will see something like Figure-13.

Figure-13 : Inside xflash.tar.gz

Unplug the power supply, and plug your computer USB cable to the micro USB cable of the board and run the xflash tool as follow

The location of MT6797_Android_scatter.txt can be found inside the <your_unzip_mediatek>/Images/Normal Image/ as shown in Figure-14

Figure-14: Scatter File

Power up your board after running the xflash tool. You will see print out on the screen as shown below.

Once you see the text ‘END’ the board has been switched to bootloader mode, and is ready to be flashed.

Flashing Android Image

Before flashing the new Android image make sure your board is indeed in bootloader mode by running the following command

You know that you are in bootloader mode, once you get a reply like the following

You can either flash using the image files provided by Linaro or build your own custom image. You can download a ready made image file from (the image file are inside the <directory>/Images/Normal Image).

The extracted mediatek-x20-aosp-16.10.tar.xz wil look like Figure-15.

Figure-15: All image files

Copy all the different files inside /Normal Image and /Special Image to a separate folder and flash the files using the fastboot command as follows:

Building From Source

Android 6.0 is supported on the X20 board. Use the following command to checkout the AOSP source code

You will need to download the binary drivers from Linaro website. The driver binary can be downloaded from Download the file called sla.tar.gz and unzip it. You will see something like Figure-16.

Figure-16 : Content of sla.tar.gz

Copy the contents of device/, prebuilts/ and vendor/ into the AOSP directory. After completing the copy steps follow the steps below to start compiling

  1. source build/
  2. lunch
  3. You will be shown the selection like Figure-17

    Figure-17 : Lunch menu

  4. Select 8 (or even 9)
  5. make -j10

Once the build process is complete, you will see list of files as shown in Figure-18.

Figure-18 : Local image files

The image files are now ready to be flashed to the board. Use the same flashboot commands as above to flash the new compiled image.

Mediatek X20 Board Info and Antutu Benchmark

I’ll complete this guide by showing the info provided by CPU-Z and Antutu benchmark for the board for people wanting such details.

Click to Enlarge

Click to Enlarge

Click to Enlarge

If you’re interested in the board, you can purchase it for $199 plus shipping on Seeed Studio.



Amlogic S905 Source Code Published – Linux, U-Boot, Mali-450 GPU and Other Drivers

November 19th, 2015 46 comments

Amlogic has an open linux website where they regurlarly release GPL source code, and with Amlogic S905 devices coming to market, they’ve released a few tarballs at the beginning of the month including Linux 3.14 source code, U-boot source code, and Mali-450MP GPU kernel source code (obviously not userspace), as well as some other drivers for WiFi, NAND flash, PMU, TVIN, etc…
Amlogic_S905_Linux_MenuconfigLet’s get to the download links:

I quickly tried to build the Linux source. If you’ve never build a 64-bit ARM kernel or app before, you’ll fist need to install the toolchain. I installed the one provided with Ubuntu 14.04:

Now extract the tarball and enter the source directory:

At first I had a build failure due to a missing directory, so I created it, and use the default config for Amlogic S905/S912 (in arch/arm64/configs), before building the Linux kernel.

and it ended well:

So that’s a good starting for anybody wanting to work on the Android or Linux kernel…

Unrelated to Amlogic S905/Meson64, but I’ve also noticed some OpenWRT packages and rootfs  on Amlogic website that was released a little earlier this year. So either some people are using Amlogic Sxxx processors with OpenWRT, or Amlogic is working on a router chip that I missed. Probably the former.

Thanks to Olin.

How to Install Ubuntu ARM64 on Nexus 9 Tablet

December 28th, 2014 5 comments

HTC Nexus 9 is one of the first 64-bit ARM platform with powerful ARMv8 cores (e.g. not Cortex A53) that both commercially available, and relatively affordable at $399 to $599, at least significantly cheaper than the server boards such as Applied Micro X-C1. The tablet comes with Android 5.0 Lollipop, but for those of you who wish to have an ARM64 platform running Ubuntu or other 64-bit Linux operating systems, Ubuntu installation instructions provided by Ryan Houdek, Dolphin emulator developer, might come handy, especially it won’t affect your Android installation provided you have already unlocked your bootloader.

Google_Nexus_9_UbuntuThe instructions are fairly long so I won’t reproduce them all here, so I recommend you check the detailed instructions on XDA, but the short summary below may give an idea of the amount of work needed:

  1. Install dependencies such as Aarch64 toolchain:
  2. Build a initramfs with buildroot. You’ll need to enable Aarch64 Linaro toolchain, set consolle output to ttyFIQ0, and select cpio roots in menuconfig step:
  3. Build the Linux kernel. Again you’ll have to change a bunch of options in make menuconfig step related to watchdog, graphics supports, and overall system configuration:
  4. Extract a rootfs (e.g. ubuntu-core-14.04.1-core-arm64.tar.gz) to a USB flash drive formatted with EXT-2/3/4, make some minor modifications to the rootfs, and rebuil the kernel. Once everything is don and well, boot Ubuntu with fastboot as follow:

Beside the Nexus 9, a USB OTG cable, and a USB flash drive required for installing Ubuntu ARM64 with these instructions, you should really make a headphone UART debug cable as accessing the serial console with make it easier to spot potential issues during installation.

TyGL OpenGL ES 2.0 Backend for WebKit Speeds Up Web Rendering by Up to 11 Times

December 23rd, 2014 3 comments

ARM, Szeged University in Hungary, and Samsung Research UK have been working on TyGL, a new backend for WebKit accelerated with OpenGL ES2.0, and developed and tested on ARM Mali-T628 GPU found in Samsung ARM Chromebook. It will typically provide 1.5 to 4.5 times higher performance, but in the best cases, it can achieve up to eleven times the performance of a CPU-only rendered page.

TyGL_ScreenshotThe key features of TyGL include:

  • Web rendering accelerated by GPU Batching of draw calls delivers better results on GPUs. TyGL groups commands together to avoid frequent state changes while calling the Graphics Context API.
  • Automatic shader generationTyGL generates complex shaders from multiple shader fragments, and ensures the batches fit into the shader cache of the GPU.
  • Trapezoid based path rendering – Work in progress. It will leverage GPU capabilities such as the Pixel Local Storage extension for OpenGL ES.
  • No software fallback – Complete GPU-based hardware accelerated solution with no dependency on legacy software.

You can get more technical details about the implementation on TyGL: Hardware Accelerated Web Rendering blog post on ARM community.

They have now officially published benchmark results, but I found some benchmark results on Webkit mailing list:

Since EFL supports cairo, we compared EFL-TyGL and EFL-Cairo

The other good news is that TyGL is now open source, with the code available on github, and you can build it and give it a try on ARM Mali-T62X development boards such as Arndale Octa or ODROID-XU3 (Lite) running Ubuntu Linaro 14.04, or other Linux based distributions. The complete build is said to last about 10 hours, but this will obviously depend on your machine. TyGL should also work on other mobile GPU supporting OpenGL ES 2.0, but I understand this has not been tested yet.

U-Boot and Linux Source Code for ODROID-C1 Board Has Been Released

December 16th, 2014 9 comments

Hardkernel ODROID-C1 board, a more powerful $35 alternative to the Raspberry Pi, garnered a lot of attention when it was announced last week. At the time source code was not available, but as scheduled, U-boot and Linux source code is now available, and the full Android SDL should be released on February 2015. Instructions to get the code, and build both Linux and U-boot are available on ODROID-C1 Wiki, and I’ve just given a try to Linux instructions myself to see if I would encounter any issues in Ubuntu 14.04.


  1. Download Linaro GCC 4.7 toolchain from Linaro or Odroid website.
  2. Install the toolchain. They install it on /opt/toolchain, but instead I’ve installed in ~/opt/toochain, so I don’t need superuser permissions:

    mkdir -p ~/opt/toolchains
    tar xvf gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux.tar.bz2 -C ~/opt/toolchains/

  3. Add the following lines to ~/.bashrc

    export ARCH=arm
    export CROSS_COMPILE=arm-linux-gnueabihf-
    export PATH=~/opt/toolchains/gcc-linaro-arm-linux-gnueabihf-4.7-2013.04-20130415_linux/bin:$PATH

  4. To apply change, log out and log in, or run:
  5. Double check Linaro GCC 4.7 is installed properly:

    arm-linux-gnueabihf-gcc -v
    Using built-in specs.
    Target: arm-linux-gnueabihf
    Configured with: /cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/src/gcc-linaro-4.7-2013.04/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-linux-gnueabihf --prefix=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/install --with-sysroot=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/install/arm-linux-gnueabihf/libc --enable-languages=c,c++,fortran --enable-multilib --with-arch=armv7-a --with-tune=cortex-a9 --with-fpu=vfpv3-d16 --with-float=hard --with-pkgversion='crosstool-NG linaro-1.13.1-4.7-2013.04-20130415 - Linaro GCC 2013.04' --with-bugurl= --enable-__cxa_atexit --enable-libmudflap --enable-libgomp --enable-libssp --with-gmp=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static --with-mpfr=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static --with-mpc=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static --with-ppl=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static --with-cloog=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static --with-libelf=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static --with-host-libstdcxx='-L/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static/lib -lpwl' --enable-threads=posix --disable-libstdcxx-pch --enable-linker-build-id --enable-gold --with-local-prefix=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/install/arm-linux-gnueabihf/libc --enable-c99 --enable-long-long --with-mode=thumb
    Thread model: posix
    gcc version 4.7.3 20130328 (prerelease) (crosstool-NG linaro-1.13.1-4.7-2013.04-20130415 - Linaro GCC 2013.04)

  6. Both Linux and Android Linux are available, and depending on which kernel should want to get checkout the code from the right branch:

  7. I selected the Linux branch. Time to configure the build for ODROID-C1:
  8. Install u-boot-tools for mkimage, and build the kernel image
  9. And the device tree file for ODROID-C1:
  10. I’ve stopped there, but if you have a board you’ll want to copy / flash the files arch/arm/boot/uImage and arch/arm/boot/dts/amlogic/meson8b_odroidc.dtb to a bootable eMMC or SD card
    • For Linux – Copy uImage and meson8b_odroidc.dtb to the FAT32 partition of your boot device, replacing the existing files
    • For Android – Use fast boot as follows:
  11. Have fun 🙂

This source code release for ODROID-C1 should also open the way for Linux Kernel ports, and Ubuntu / Debian or other Linux distributions for other Amlogic S805 devices such as MK808B Plus, MXQ S85, or MINIX NEO X6.

How to Build Android 4.4 for Rockchip RK3288 Devices (Tronsmart Orion R28)

September 16th, 2014 14 comments

After blowing up my ATX power supply, and learning such things as “FULL” power supplies do exists, I finally managed to build Android for Tronsmart Orion R28 using the provided SDK. I haven’t tried to load it on the device yet, but the build could complete successfully after following the steps below in Ubuntu 14.04. The SDK is probably not specific to one device, so it might just also work on other RK3288 TV boxes and tablets.

First download Android 4.4 SDK for RK3288, or use the one in the micro SD card provided with the Beta version of R28 Pro and Meta.

Install some dependencies:

Extract the SDK:

And build the kernel first:

  1. Enter the kernel directory:
  2. Change arch/arm/boot/dts/Makefile to use RK3288 device tree file instead of an RK3188 (may not be needed, but the build failed for me without that change…):

    It’s also quite possible you need to extract the device tree file from your firmware or device.
  3. Building the kernel and resources (device tree + logo) images:
  4. Done
    It will fail with:

    drivers/usb/dwc_otg_310/dwc_otg_hcd.c: In function ‘dwc_otg_hcd_rem_wakeup_cb’:
    drivers/usb/dwc_otg_310/dwc_otg_hcd.c:446:31: error: inlining failed in call to always_inline ‘dwc_otg_hcd_to_hcd’: function body not available

  5. Edit the culprit file, remove the inline directive, and continue the build:
  6. Similar errors will occur one or twice more, so repeat step 5 as needed….
  7. Create kernel.img (not sure the command line is correct)

Before building Android, you need to make sure you use the right version of Java. I recently build AOSP for ARMv8 which requires OpenJDK 1.7 in Ubuntu, but this version requires Oracle 1.6 SE.  At first I used JDK 6u45 (1.6.045), but I got some errors:

In file included from external/chromium_org/content/common/android/
out/target/product/rk3288/obj/GYP/shared_intermediates/content/jni/HashSet_jni.h:10:26: error: extra tokens at end of #ifndef directive [-Werror]

Based on a thread on XDA developer forums, I installed Java instead, which you can download here:

Now add the new Java version to the “alternatives”:

and make sure Java is used by default:

I’m not sure all six tools need to be configured, but it probably does no hurt to do so.

Finally, you just need to run a script to build Android:

Be patient, and it should finish with something like:

Creating filesystem with parameters:
Size: 1073741824
Block size: 4096
Blocks per group: 32768
Inodes per group: 8192
Inode size: 256
Journal blocks: 4096
Blocks: 262144
Block groups: 8
Reserved block group size: 63
Created filesystem with 1792/65536 inodes and 149182/262144 blocks
+ '[' 0 -ne 0 ']'
Install system fs image: out/target/product/rk3288/system.img
out/target/product/rk3288/system.img+out/target/product/rk3288/obj/PACKAGING/recovery_patch_intermediates/recovery_from_boot.p maxsize=1096212480 blocksize=135168 total=598297319 reserve=11083776
system filesysystem is ext4
make ota images...
create boot.img with kernel... done.
create recovery.img with kernel... done.
create misc.img.... done.
create system.img... done.
3288_4.4 sdk do finish

All relevant files can be found in rockdev/Image-rk3288 directory:

Next step is to flash it to the device, and see if it can boot.

Rockchip RK3288 Android 4.4.2 SDK and Schematics Released for Firefly Board

September 2nd, 2014 19 comments

Firefly-RK3288 development board was first announced in July. I still don’t have news about availability nor pricing, but the T-Firefly website launched yesterday. They seem do have a nice Wiki, but unfortunately everything is currently in Chinese, except when you go to the download page. You’ll find firmware upgrade_tool for Linux and Windows, the USB drivers for rooting and firmware update, firmware images (Android 4.4.2, Ubuntu 14.04, and dual boot), the board schematics (PDF), and Android KitKat 4.4.2 SDK with U-Boot, Linux, and Android source code, some documentation, XBMC apk (no source) with H.265 hardware decode support for MP4, MOV and MKV container formats.


The SDK is available on Bitbucket. I planned to test it, but unfortunately my network connection is very slow (and unstable) to this server, and I failed to retrieve it with git clone. The company also posted the build instructions in Chinese in their website, but I’ll reproduce them here for Ubuntu 14.04.

  1. Install required packages:
  2. Checkout the SDK:
  3. Build the Linux kernel:
  4. Build Android:

And after some patience, Android should be fully build. Instructions to create a Ubuntu image are also available in the Wiki, but only in Chinese.

How to Boot a Headless Linux Image on Amlogic S802 TV Boxes (Tronsmart Vega S89 Elite)

May 15th, 2014 34 comments

As some of you already know, I’ve been playing around with Tronsmart Vega S89 Elite, an Android TV Box powered by Amlogic S802 quad core ARM Cortex A9r4 processor at 2 GHz. Today, I’ll show how to boot a headless Linux image on any Amlogic based S802 TV Box from the network. The instructions can mainly be used as a starting point for developers, as it requires access to a serial terminal via  UART, but if you’ve never done it before, the instructions should be easy enough to follow. Everything is loaded from the network, the kernel (via boot.img) is loaded via TFTP, and the rootfs (Linaro ALIP image) is mounted via NFS, so it’s nearly impossible to brick your device using the method provided. Linaro ALIP rootfs comes with LXDE, but at this stage the desktop environment is not showing, even through my HDMI TV is properly detected by the drivers. However, Ethernet, USB mass storage, and the micro SD seem to be working just fine.


If you want to skip the kernel compilation part, ramdisk modification, and just boot your Vega S89 Elite from network you can download vegas89eboot.img (compressed with bzip2), and skip steps 4 to 9 included. Please don’t just flash this image or use it without reading the post, as even if it should not brick your device, Android won’t boot at all if you don’t follow the right instructions.

Let’s get started

  1. Make sure you’ve connected a USB to serial board to your S802 based device.
  2. If not done already, you’ll need to install TFTP and NFS servers, and the get basic development tools in a Linux computer. All instructions here have been performed in a PC running Ubuntu 14.04 64-bit.
    • For the TFTP server, I installed and ran aftfpd as follows:
    • Instructions to install an NFS server on Ubuntu/Debian.
    • You’ll need to install the build-essentials and other tools to successfully build Linux, something like:

      sudo apt-get install git-core build-essential zip curl g++-multilib cpio gcc-arm-linux-gnueabihf gcc-arm-linux-gnueabi

  3. Download a rootfs, and extract it to your NFS directory. For example:
  4. Get the device tree file (DTD) for your device from its firmware image or, if not available, directly from the NAND flash.
  5. Follow the instructions to get S802 kernel source and setup the source tree until after the step where you do
  6. Run “make ARCH=arm menuconfig” to enable NFS client support as shown below.
    Linux_3.10_NFSThen exit and save
  7. You’ll need to edit script for your device using the correct DTD file, which you need to copy to ./arch/arm/boot/dts/amlogic/ directory.  I’ve renamed the script to, and edited it as follows:
  8. We also need to create and init to switch the root to NFS. Normally, we should be able to do  in the bootloader with “bootargs” but this did not work for me, probably because I missed some steps.
    1. Extract the ramdisk provided with the source code
    2. Delete sbin/init symlink to busybox, and create a new init file. Be very careful at this stage as if you inadvertently add a leading slash, you’ll mess up with your PC system.
    3. Here’s the content of sbin/init. Replace by the IP address of your PC / NFS server, and /srv/nfs/alip by the path where you extracted your rootfs in the NFS directory.
    4. Recreate the ramdisk
  9. Now we can finally build the kernel, and boot.img:
  10. It should take between a minute to a few minutes depending on your machine, and if everything works as planned you could get your boot.img, in my case vegas89eboot.img. Copy it to your tftp server directory
  11. Now start minicom connected to ttyUSB0 (115200 8N1), and power the TV box. Press the space bar, or any other key, during boot up to access U-boot command line. Let’s define IP addresses for the board, the TFTP server, and gateway (router), and save these to the U-boot environment:
  12. Setup the boot arguments for NFS. I know I should really have used fixed IP instead of dhcp, for consistency, and to shave off two or three seconds to boot time, but…

    m8_k200_v1# setenv bootargs 'root=/dev/nfs rootfstype=nfs nfsroot=,rw,nolock ip=dhcp rootwait init=/sbin/init no_console_suspend storage=4 logo=osd1,loaded,0x15100000,576cvbs,full hdmimode=720p cvbsmode=576cvbs androidboot.firstboot=0 hdmitx=cec0 console=ttyS0,115200n8'

    You could also use saveenv to save these, but then Android won’t boot anymore next time your start the board. Alternatively, you could create a bootargs2 and copy this to bootargs before running Linux.

  13. Load boot.img from the TFTP server

  14. Start the system

    Once you make sure boot.img loads properly from TFTP server, you could also combine both commands with “bootp; bootm

  15. You should now have access to the command line as root, no password required. An sshd daemon is already running so you can access it via ssh if you want. The board temperature will be outputted every second or so. There must be a way to disable that in the code, but in the meantime you can do:

Let’s have a look at free memory, storage devices and more.

There’s about 1.5GB ram free, I’ve got a lot of storage in the root as it is the 1TB hardware in my PC, and my 4GB USB flash drive was almost mounted automatically.

I’ll also through the CPU information for reference:

You should easily be able to adapt these instructions to boot from flash, by inserting boot.img into one of the available firmware update packages, and switching root to a USB flash or hard drive with the rootfs. I’m not sure how to access the flash partitions right now, as only the bootloader shows up in the MTD partition, but it;s the same thing in Android.

I’m not sure I’ll go much further myself, but hopefully some people will pick up on this, and we’ll get a fully working easily installable Linux server and desktop images for Amlogic S802 based platforms.