Archive

Posts Tagged ‘cross-compilation’

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

May 15th, 2014 28 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.

Linux_Amlogic_S802

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:
      sudo apt-get install atftpd
      sudo tftpd --daemon
    • 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:
    mkdir -p /srv/nfs/alip 
    pushd /srv/nfs/alip
    wget http://releases.linaro.org/14.04/openembedded/vexpress-lsk/linaro-image-alip-genericarmv7a-20140417-248.rootfs.tar.gz
    sudo tar xzvf linaro-image-alip-genericarmv7a-20140417-248.rootfs.tar.gz
    popd
  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
    make ARCH=arm meson8_defconfig
  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 mk_m8.sh 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 mk_vegas89e.sh, and edited it as follows:
    # Modify these four lines for your board
    DTDFILE=meson8_vegas89e
    DTDFILE_PATH=./arch/arm/boot/dts/amlogic/
    BOOTIMG=vegas89eboot.img
    ROOTFS="rootfs.cpio"
    
    make uImage -j8
    #make modules
    
    make ${DTDFILE}.dtd
    make ${DTDFILE}.dtb
    
    ./mkbootimg --kernel ./arch/arm/boot/uImage --ramdisk ./${ROOTFS} --second ${DTDFILE_PATH}/${DTDFILE}.dtb --output ./${BOOTIMG}
    ls -l ./${BOOTIMG}
    echo "${BOOTIMG} done"
  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
      mkdir rootfs
      cd rootfs
      sudo cpio -i -F ../rootfs.cpio
    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.
      rm sbin/init
      sudo vi sbin/init
    3. Here’s the content of sbin/init. Replace 192.168.0.104 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.
      #!/bin/busybox sh
      
      echo "CNXSoft init script entered"
      PATH="/bin:/sbin:/usr/bin:/usr/sbin"
      
      echo "DHCP..."
      udhcpc eth0
      
      echo "Mounting NFS rootfs..."
      mount -t nfs -o proto=tcp -o nolock 192.168.0.104:/srv/nfs/alip /mnt
      
      echo "Switching root..."
      exec switch_root /mnt /sbin/init
    4. Recreate the ramdisk
      find .| sudo cpio -o -H newc > ../rootfs.cpio
      cd ..
  9. Now we can finally build the kernel, and boot.img:
    chmod +x mk_vegas89e.sh
    ./mk_vegas89e.sh
  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
    sudo cp vegas89eboot.img /srv/tftp/boot.img
  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:
    m8_k200_v1# setenv ipaddr 192.168.0.144
    m8_k200_v1# setenv serverip 192.168.0.104
    m8_k200_v1# setenv gatewayip 192.168.0.1
    m8_k200_v1# saveenv
  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=192.168.0.104:/srv/nfs/alip,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
    bootp
  14. Start the system
    bootm

    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:
    echo "3 3 3 3" > /proc/sys/kernel/printk

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

root@genericarmv7a:~# uname -a                                                  
Linux genericarmv7a 3.10.10 #2 SMP PREEMPT Tue May 13 17:14:29 ICT 2014 armv7l x
root@genericarmv7a:~# free -m                                                   
             total         used         free       shared      buffers          
Mem:          1578           91         1487            0            3          
-/+ buffers:                 87         1490                                    
Swap:            0            0            0                                    
root@genericarmv7a:~# df -h                                                     
Filesystem                Size      Used Available Use% Mounted on              
192.168.0.104:/srv/nfs/alip                                                     
                        901.0G    656.3G    199.0G  77% /                       
tmpfs                    40.0K         0     40.0K   0% /mnt/.psplash           
tmpfs                   789.3M    176.0K    789.1M   0% /run                    
tmpfs                   789.3M    128.0K    789.1M   0% /var/volatile           
none                    775.2M      4.0K    775.2M   0% /dev                    
/dev/sda1                 3.4G      2.7G    678.8M  80% /media/sda1             
root@genericarmv7a:~# 

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:

root@genericarmv7a:~# cat /proc/cpuinfo                                         
Processor       : ARMv7 Processor rev 1 (v7l)                                   
processor       : 0                                                             
BogoMIPS        : 12.65                                                         
                                                                                
processor       : 1                                                             
BogoMIPS        : 12.65                                                         
                                                                                
processor       : 2                                                             
BogoMIPS        : 12.65                                                         
                                                                                
processor       : 3                                                             
BogoMIPS        : 12.65                                                         
                                                                                
Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls               
CPU implementer : 0x41                                                          
CPU architecture: 7                                                             
CPU variant     : 0x4                                                           
CPU part        : 0xc09                                                         
CPU revision    : 1                                                             
                                                                                
Hardware        : Amlogic Meson8 platform                                       
Revision        : 000b                                                          
Serial          : 1900000000000000

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.

root@genericarmv7a:~# cat /proc/mtd                                             
dev:    size   erasesize  name                                                  
mtd0: 00060000 00001000 "bootloader"                                            
mtd1: 00010000 00001000 "ubootenv"                                              
root@genericarmv7a:~# ls /dev/block/ -l                                         
total 0                                                                         
lrwxrwxrwx    1 root     root             8 Apr 17 15:21 254:0 -> ../zram0      
lrwxrwxrwx    1 root     root            12 Apr 17 15:21 31:0 -> ../mtdblock0   
lrwxrwxrwx    1 root     root            12 Apr 17 15:21 31:1 -> ../mtdblock1   
lrwxrwxrwx    1 root     root             8 Apr 17 15:21 7:0 -> ../loop0        
lrwxrwxrwx    1 root     root             8 Apr 17 15:21 7:1 -> ../loop1        
lrwxrwxrwx    1 root     root             8 Apr 17 15:21 7:2 -> ../loop2        
lrwxrwxrwx    1 root     root             8 Apr 17 15:21 7:3 -> ../loop3        
lrwxrwxrwx    1 root     root             8 Apr 17 15:21 7:4 -> ../loop4        
lrwxrwxrwx    1 root     root             8 Apr 17 15:21 7:5 -> ../loop5        
lrwxrwxrwx    1 root     root             8 Apr 17 15:21 7:6 -> ../loop6        
lrwxrwxrwx    1 root     root             8 Apr 17 15:21 7:7 -> ../loop7        
lrwxrwxrwx    1 root     root             6 Apr 17 15:21 8:0 -> ../sda          
lrwxrwxrwx    1 root     root             7 Apr 17 15:21 8:1 -> ../sda1

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.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter

Atmel SAMA5D3 Xplained Board Unboxing and Quick Start Guide

April 16th, 2014 2 comments

Atmel SAMA5D3 Xplained is an evaluation board running Linux powered by SAMA5D36 ARM Cortex A5 micro-processor with 256 MB DDR2, 256 MB flash, two Ethernet ports, 3 USB connectors, and more. This embedded board targets industrial automation, networks, robotics, control panels and wearable applications. The only video output is an LCD connector so it is reserved for headless or flat panel based applications. You can check full specs on my Atmel SAMA5D3 Xplained announcement post. The company kindly sent me a sample, so that I can share my experience with the board. I’ll first post some unboxing pictures, show how to get started with the pre-installed image, and build my own Linux image.

The board can be purchased for $79 from Atmel e-Store, as well as several distributors (P/N: ATSAMA5D3-XPLD).

Atmel SAMA5D3 Xplained Unboxing

I’ve been sent the board via DHL in the following package, which gives  a short desscription of the board, and what it is used for. There’s also a QR core, but it just returns the board name of some production numbers and dates, no links.

Atmel_SAMA5D3_Xplained_PackageIn the package you’ve got the board, a micro USB to USB cable for power and programming, and a small card entitled “Overview and Compliance Information” which gives a list of key features, a link to get started http://www.atmel.com/sama5d3xplained, which I’ll use later, and some EU compliance informations regarding RoHS2 and EMC. The board is compliant with both CE and FCC standards.

Atmel SAMA5D3 Xplained Package Content (Click to Enlarge)

Atmel SAMA5D3 Xplained Package Content (Click to Enlarge)

Let’s check the board in details.

Top of Atmel SAMA5D3 Xplained Board (Click to Enlarge)

Top of Atmel SAMA5D3 Xplained Board (Click to Enlarge)

On the top of the board, we’ll find the 2 USB host connectors, and 2 Ethernet connectors (GMAC and EMAC) on the right, the micro USB port, as well as pads to solder an external power supply and a micro SD slot on the left, reset, wake up and user buttons, as well as JTAG, LCD, and debug (serial) connectors at the bottom, and around the MPU and memories, the Arduino UNO R3 compatible headers with the names of the different pins. Bear in mind these only support 3.3V, not 5V.

Bottom of Atmel SAMA5D3 Xplained (Click to Enlarge)

Bottom of Atmel SAMA5D3 Xplained (Click to Enlarge)

On the back we’ll find the SD card slot, and again, the markings for the Arduino compatible connectors.

I’ve also shot an unboxing video for those interested.

Atmel SAMA5D3 Xplained Quick Start Guide

From the link provided on the “Overview card”, you can download SAMA5D3 MPU datasheet,  the board brief, design and manufacturing files, and user’s guide, as well as a Getting Started Guide, which I’ll try out in this post.

The board comes pre-loaded with a Linux distribution (poky) built with the Yocto Project comprised of bootloaders (AT91Bootstrap and U-boot), the Linux kernel, and a custom lightweight rootfs. To get started simply connect the micro USB to USB cable to your computer to boot the system, you should see a blue LED lit up and blink. There’s no display, but there are three ways to access the board from Linux or Windows computers:

  • Using the USB connection your PC.  In Linux, run dmesg to check the latest kernel messages:
    [92045.134415] usb 1-1.4.4: new high-speed USB device number 23 using ehci-pci
    [92045.227589] usb 1-1.4.4: New USB device found, idVendor=0525, idProduct=a4a7
    [92045.227598] usb 1-1.4.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    [92045.227603] usb 1-1.4.4: Product: Gadget Serial v2.4
    [92045.227607] usb 1-1.4.4: Manufacturer: Linux 3.10.0-yocto-standard with atmel_usba_udc
    [92045.334096] cdc_acm 1-1.4.4:2.0: This device cannot do calls on its own. It is not a modem.
    [92045.334265] cdc_acm 1-1.4.4:2.0: ttyACM0: USB ACM device

    In my case the interface is /dev/ttyACM0. Run you favorite terminal emulator program, such as minicom, picocom, screen, PuTTY, etc… I’ve used minicom, and configured it to access /dev/TTYACM0 using 115200 8/N/1 configuration. Instructions for Windows can be found in the company’s Getting Started Guide.

  • Via a USB to Serial board connected via J23 header’s Tx, Rx and GND pins. I’ve also done this in minicom with /dev/ttyUSB0 and the same 115200 8/N/1 configuration.
  • Via SSH. The demo image in the board is running sshd, so provided you’ve connected one or two of the Ethernet ports on a LAN with a DHCP server, you should be able to connect with the IP of the board. In Linux: ssh root@ip_address

You can login with the board using the root account without password. The USB and SSH methods are the most convenience since you don’t need to connect extra hardware, but you won’t be able to access the bootloader that way, debugging the Linux kernel, if needed, will be difficult, and each time, the board is rebooted, the connection will be lost. So for development, you should really get a serial to USB debug board.

Here’s the complete boot log for reference:

AT91Bootstrap 3.6.1-00078-g5415d4e (Tue Feb  4 15:36:46 CET 2014)

NAND: ONFI flash detected
NAND: Manufacturer ID: 0x2c Chip ID: 0×32
NAND: Disable On-Die ECC
NAND: Initialize PMECC params, cap: 0×4, sector: 0×200
NAND: Image: Copy 0×80000 bytes from 0×40000 to 0x26f00000
NAND: Done to load image

U-Boot 2013.07 (Feb 04 2014 – 15:36:32)

CPU: SAMA5D36
Crystal frequency:       12 MHz
CPU clock        :      528 MHz
Master clock     :      132 MHz
DRAM:  256 MiB
NAND:  256 MiB
MMC:   mci: 0, mci: 1
*** Warning – bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   gmac0
Warning: failed to set MAC address
, macb0
Warning: failed to set MAC address

Hit any key to stop autoboot:  0

NAND read: device 0 offset 0×180000, size 0×80000
524288 bytes read: OK

NAND read: device 0 offset 0×200000, size 0×600000
6291456 bytes read: OK
Kernel image @ 0×22000000 [ 0x000000 - 0x33be28 ]
## Flattened Device Tree blob at 21000000
Booting using the fdt blob at 0×21000000
Loading Device Tree to 2bb12000, end 2bb1a046 … OK

Starting kernel …

Uncompressing Linux… done, booting the kernel.
Booting Linux on physical CPU 0×0
Initializing cgroup subsys cpuset
Initializing cgroup subsys cpu
Initializing cgroup subsys cpuacct
Linux version 3.10.0-yocto-standard (nferre@tenerife) (gcc version 4.8.1 (GCC) 4
CPU: ARMv7 Processor [410fc051] revision 1 (ARMv7), cr=50c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine: Atmel SAMA5 (Device Tree), model: SAMA5D3 Xplained
bootconsole [earlycon0] enabled
Memory policy: ECC disabled, Data cache writeback
AT91: Detected soc type: sama5d3
AT91: Detected soc subtype: sama5d36
AT91: sram at 0×300000 of 0×20000 mapped at 0xfef58000
CPU: All CPU(s) started in SVC mode.
Clocks: CPU 528 MHz, master 132 MHz, main 12.000 MHz
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 65024
Kernel command line: console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(s
PID hash table entries: 1024 (order: 0, 4096 bytes)
Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
allocated 524288 bytes of page_cgroup
please try ‘cgroup_disable=memory’ option if you don’t want memory cgroups
Memory: 256MB = 256MB total
Memory: 252736k/252736k available, 9408k reserved, 0K highmem
Virtual kernel memory layout:
vector  : 0xffff0000 – 0xffff1000   (   4 kB)
fixmap  : 0xfff00000 – 0xfffe0000   ( 896 kB)
vmalloc : 0xd0800000 – 0xff000000   ( 744 MB)
lowmem  : 0xc0000000 – 0xd0000000   ( 256 MB)
modules : 0xbf800000 – 0xc0000000   (   8 MB)
.text : 0xc0008000 – 0xc05b4fc8   (5812 kB)
.init : 0xc05b5000 – 0xc05d2d60   ( 120 kB)
.data : 0xc05d4000 – 0xc063a9f8   ( 411 kB)
.bss : 0xc063a9f8 – 0xc0663820   ( 164 kB)
NR_IRQS:16 nr_irqs:16 16
sched_clock: 32 bits at 100 Hz, resolution 10000000ns, wraps every 4294967286ms
Console: colour dummy device 80×30
Calibrating delay loop… 351.43 BogoMIPS (lpj=1757184)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
Initializing cgroup subsys memory
Initializing cgroup subsys devices
Initializing cgroup subsys freezer
Initializing cgroup subsys blkio
CPU: Testing write buffer coherency: ok
Setting up static identity map for 0xc0350648 – 0xc0350694
devtmpfs: initialized
pinctrl core: initialized pinctrl subsystem
NET: Registered protocol family 16
DMA: preallocated 256 KiB pool for atomic coherent allocations
AT91: Power Management
gpio-at91 fffff200.gpio: at address fefff200
gpio-at91 fffff400.gpio: at address fefff400
gpio-at91 fffff600.gpio: at address fefff600
gpio-at91 fffff800.gpio: at address fefff800
gpio-at91 fffffa00.gpio: at address fefffa00
pinctrl-at91 pinctrl.2: initialized AT91 pinctrl driver
bio: create slab <bio-0> at 0
at_hdmac ffffe600.dma-controller: Atmel AHB DMA Controller ( cpy slave ), 8 chas
at_hdmac ffffe800.dma-controller: Atmel AHB DMA Controller ( cpy slave ), 8 chas
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
of_dma_request_slave_channel: dma-names property missing or empty
at91_i2c f0014000.i2c: can’t get a DMA channel for tx
at91_i2c f0014000.i2c: can’t use DMA
at91_i2c f0014000.i2c: AT91 i2c bus driver.
at91_i2c f0018000.i2c: using dma0chan0 (tx) and dma0chan1 (rx) for DMA transfers
at91_i2c f0018000.i2c: AT91 i2c bus driver.
at91_i2c f801c000.i2c: can’t get a DMA channel for tx
at91_i2c f801c000.i2c: can’t use DMA
at91_i2c f801c000.i2c: AT91 i2c bus driver.
media: Linux media interface: v0.10
Linux video capture interface: v2.00
Advanced Linux Sound Architecture Driver Initialized.
Bluetooth: Core ver 2.16
NET: Registered protocol family 31
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP socket layer initialized
Bluetooth: SCO socket layer initialized
cfg80211: Calling CRDA to update world regulatory domain
Switching to clocksource tcb_clksrc
NET: Registered protocol family 2
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP: reno registered
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
jffs2: version 2.2. (NAND) �© 2001-2006 Red Hat, Inc.
msgmni has been set to 493
io scheduler noop registered (default)
f001c000.serial: ttyS1 at MMIO 0xf001c000 (irq = 23) is a ATMEL_SERIAL
f0020000.serial: ttyS2 at MMIO 0xf0020000 (irq = 24) is a ATMEL_SERIAL
f0024000.serial: ttyS5 at MMIO 0xf0024000 (irq = 25) is a ATMEL_SERIAL
ffffee00.serial: ttyS0 at MMIO 0xffffee00 (irq = 39) is a ATMEL_SERIAL
console [ttyS0] enabled, bootconsole disabled
console [ttyS0] enabled, bootconsole disabled
brd: module loaded
loop: module loaded
atmel_nand_nfc 70000000.nfc: NFC is probed.
atmel_nand: Use On Flash BBT
atmel_nand 60000000.nand: Using dma0chan2 for DMA transfers.
ONFI param page 0 valid
ONFI flash detected
NAND device: Manufacturer ID: 0x2c, Chip ID: 0xda (Micron MT29F2G08ABAEAWP), 254
atmel_nand 60000000.nand: ONFI params, minimum required ECC: 4 bits in 512 bytes
atmel_nand 60000000.nand: Initialize PMECC params, cap: 4, sector: 512
atmel_nand 60000000.nand: Using NFC Sram read and write
Bad block table found at page 131008, version 0×01
Bad block table found at page 130944, version 0×01
nand_read_bbt: bad block at 0x000000c80000
nand_read_bbt: bad block at 0x000000ca0000
8 cmdlinepart partitions found on MTD device atmel_nand
Creating 8 MTD partitions on “atmel_nand”:
0×000000000000-0×000000040000 : “bootstrap”
0×000000040000-0x0000000c0000 : “uboot”
0x0000000c0000-0×000000100000 : “env”
0×000000100000-0×000000140000 : “evn_redundent”
0×000000140000-0×000000180000 : “spare”
0×000000180000-0×000000200000 : “dtb”
0×000000200000-0×000000800000 : “kernel”
0×000000800000-0×000010000000 : “rootfs”
atmel_spi f0004000.spi: version: 0×213
atmel_spi f0004000.spi: Using dma0chan3 (tx) and dma0chan4 (rx) for DMA transfes
atmel_spi f0004000.spi: Atmel SPI Controller at 0xf0004000 (irq 18)
atmel_spi f0004000.spi: master is unqueued, this is deprecated
atmel_spi f8008000.spi: version: 0×213
atmel_spi f8008000.spi: Using dma1chan0 (tx) and dma1chan1 (rx) for DMA transfes
atmel_spi f8008000.spi: Atmel SPI Controller at 0xf8008000 (irq 28)
atmel_spi f8008000.spi: master is unqueued, this is deprecated
CAN device driver interface
at91_can f000c000.can: device registered (reg_base=d08ea000, irq=19)
at91_can f8010000.can: device registered (reg_base=d08ec000, irq=29)
macb f0028000.ethernet (unregistered net_device): invalid hw address, using ranm
libphy: MACB_mii_bus: probed
macb f0028000.ethernet eth0: Cadence GEM at 0xf0028000 irq 26 (4e:68:35:cc:0c:8)
macb f0028000.ethernet eth0: attached PHY driver [Micrel KSZ9031 Gigabit PHY] ()
macb f802c000.ethernet (unregistered net_device): invalid hw address, using ranm
libphy: MACB_mii_bus: probed
macb f802c000.ethernet eth1: Cadence MACB at 0xf802c000 irq 33 (ca:99:58:69:7f:)
macb f802c000.ethernet eth1: attached PHY driver [Micrel KSZ8081 or KSZ8091] (m)
ehci_hcd: USB 2.0 ‘Enhanced’ Host Controller (EHCI) Driver
ehci-atmel: EHCI Atmel driver
atmel-ehci 700000.ehci: EHCI Host Controller
atmel-ehci 700000.ehci: new USB bus registered, assigned bus number 1
atmel-ehci 700000.ehci: irq 47, io mem 0×00700000
atmel-ehci 700000.ehci: USB 2.0 started, EHCI 1.00
usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb1: Product: EHCI Host Controller
usb usb1: Manufacturer: Linux 3.10.0-yocto-standard ehci_hcd
usb usb1: SerialNumber: 700000.ehci
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 3 ports detected
ohci_hcd: USB 1.1 ‘Open’ Host Controller (OHCI) Driver
at91_ohci 600000.ohci: AT91 OHCI
at91_ohci 600000.ohci: new USB bus registered, assigned bus number 2
at91_ohci 600000.ohci: irq 47, io mem 0×00600000
usb usb2: New USB device found, idVendor=1d6b, idProduct=0001
usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb2: Product: AT91 OHCI
usb usb2: Manufacturer: Linux 3.10.0-yocto-standard ohci_hcd
usb usb2: SerialNumber: at91
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 3 ports detected
usbcore: registered new interface driver usb-storage
usbcore: registered new interface driver usbserial
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial support registered for generic
at91_rtc fffffeb0.rtc: rtc core: registered fffffeb0.rtc as rtc0
at91_rtc fffffeb0.rtc: AT91 Real Time Clock driver.
i2c /dev entries driver
Driver for 1-wire Dallas network protocol.
cpuidle: using governor ladder
leds-gpio leds.4: pins are not configured from the driver
atmel_aes f8038000.aes: version: 0×135
atmel_aes f8038000.aes: Atmel AES – Using dma1chan2, dma1chan3 for DMA transfers
atmel_tdes f803c000.tdes: version: 0×701
atmel_tdes f803c000.tdes: using dma1chan4, dma1chan5 for DMA transfers
atmel_tdes f803c000.tdes: Atmel DES/TDES
atmel_sha f8034000.sha: version: 0×410
atmel_sha f8034000.sha: using dma1chan6 for DMA transfers
atmel_sha f8034000.sha: Atmel SHA1/SHA256/SHA224/SHA384/SHA512
hidraw: raw HID events driver (C) Jiri Kosina
iio iio:device0: Resolution used: 12 bits
iio iio:device0: ADC Touch screen is disabled.
TCP: cubic registered
NET: Registered protocol family 10
sit: IPv6 over IPv4 tunneling driver
NET: Registered protocol family 17
can: controller area network core (rev 20120528 abi 9)
NET: Registered protocol family 29
can: raw protocol (rev 20120528)
can: broadcast manager protocol (rev 20120528 t)
can: netlink gateway (rev 20130117) max_hops=1
VFP support v0.3: implementor 41 architecture 2 part 30 variant 5 rev 1
ThumbEE CPU extension supported.
Registering SWP/SWPB emulation handler
UBI: attaching mtd7 to ubi0
atmel_nand 60000000.nand: Bit flip in data area, byte_pos: 1552, bit_pos: 7, 0xf
atmel_nand 60000000.nand: Bit flip in data area, byte_pos: 315, bit_pos: 0, 0xff
UBI: scanning is finished
UBI: attached mtd7 (name “rootfs”, size 248 MiB) to ubi0
UBI: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
UBI: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
UBI: VID header offset: 2048 (aligned 2048), data offset: 4096
UBI: good PEBs: 1978, bad PEBs: 6, corrupted PEBs: 0
UBI: user volume: 1, internal volumes: 1, max. volumes count: 128
UBI: max/mean erase counter: 2/0, WL threshold: 4096, image sequence number: 321
UBI: available PEBs: 0, total reserved PEBs: 1978, PEBs reserved for bad PEB ha4
UBI: background thread “ubi_bgt0d” started, PID 681
input: gpio_keys.3 as /devices/gpio_keys.3/input/input0
at91_rtc fffffeb0.rtc: setting system clock to 2014-02-05 09:22:13 UTC (1391592)
atmel_mci f0000000.mmc: version: 0×505
atmel_mci f0000000.mmc: using dma0chan5 for DMA transfers
atmel_mci f0000000.mmc: Atmel MCI controller at 0xf0000000 irq 17, 1 slots
atmel_mci f8000000.mmc: version: 0×505
atmel_mci f8000000.mmc: using dma1chan7 for DMA transfers
atmel_mci f8000000.mmc: Atmel MCI controller at 0xf8000000 irq 27, 1 slots
ALSA device list:
No soundcards found.
UBIFS: mounted UBI device 0, volume 0, name “rootfs”, R/O mode
UBIFS: LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2s
UBIFS: FS size: 244936704 bytes (233 MiB, 1929 LEBs), journal size 9023488 byte)
UBIFS: reserved for root: 0 bytes (0 KiB)
UBIFS: media format: w4/r0 (latest is w4/r0), UUID 5CA0915B-7DF9-4652-92C0-71B9l
VFS: Mounted root (ubifs filesystem) readonly on device 0:12.
devtmpfs: mounted
Freeing unused kernel memory: 116K (c05b5000 – c05d2000)
atmel_nand 60000000.nand: Bit flip in data area, byte_pos: 1933, bit_pos: 5, 0xb
INIT: version 2.88 booting
Starting udev
udevd[717]: starting version 182
UBI error: ubi_open_volume: cannot open device 0, volume 0, error -16
atmel_usba_udc 500000.gadget: MMIO registers at 0xf8030000 mapped at d09a8000
atmel_usba_udc 500000.gadget: FIFO at 0×00500000 mapped at d2400000
g_serial gadget: Gadget Serial v2.4
g_serial gadget: g_serial ready
UBIFS: background thread “ubifs_bgt0_0″ started, PID 782
Starting Bootlog daemon: bootlogd.
g_serial gadget: high-speed config #2: CDC ACM config
Configuring network interfaces… IPv6: ADDRCONF(NETDEV_UP): eth0: link is not y
udhcpc (v1.21.1) started
Sending discover…
macb f0028000.ethernet eth0: link up (100/Full)
IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
Sending discover…
Sending select for 192.168.0.108…
Lease of 192.168.0.108 obtained, lease time 7200
/etc/udhcpc.d/50default: Adding DNS 192.168.0.1
done.
Starting rpcbind daemon…done.
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
Starting atd: OK
INIT: Entering runlevel: 5
Starting system message bus: dbus.
Starting OpenBSD Secure Shell server: sshd
done.
creating NFS state directory: done
NFS daemon support not enabled in kernel
Starting system log daemon…0
Starting kernel log daemon…0
Starting Telephony daemon
Starting Lighttpd Web Server: lighttpd.
Starting crond: OK
Stopping Bootlog daemon: bootlogd.

Poky (Yocto Project Reference Distro) 1.5.1 sama5d3_xplained /dev/ttyS0

sama5d3_xplained login: root
root@sama5d3_xplained:~#

For some reasons the Gigabit Ethernet port failed to get a link from my 10/100M switch. I had no problem with the 10/100M Ethernet port.

Let’s have a quick look at the kernel version and memory usage:

# uname -a
Linux sama5d3_xplained 3.10.0-yocto-standard #1 Wed Feb 5 10:03:20 CET 2014 armv7l GNU/Linux
# df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs          216M   80M  136M  37% /
ubi0:rootfs     216M   80M  136M  37% /
devtmpfs        124M     0  124M   0% /dev
tmpfs           124M  112K  124M   1% /run
tmpfs           124M  112K  124M   1% /var/volatile
# free -m
             total       used       free     shared    buffers     cached
Mem:           246         21        225          0          0          8
-/+ buffers/cache:         12        234
Swap:            0          0          0

So the board runs Linux 3.10 built with Yocto, has 136M free on the rootfs, and 21MB used out of 246 MB RAM.

Building the demo image for Atmel SAMA5D3 Xplained

Atmel Getting Started document mentions the software components in the NAND Flash have been compiled following instructions found on the Linux4SAM website, but instead I’ve followed the build procedure found in github.

git clone git://git.yoctoproject.org/poky
cd poky
git checkout dora-10.0.1 -b my_branch
git clone git://git.openembedded.org/meta-openembedded
cd meta-openembedded
git checkout 6572316557e742c2dc93848e4d560242bf0c3995 -b my_branch
cd ..
git clone http://github.com/linux4sam/meta-atmel
  • Initialize the build directory
source oe-init-build-env build-atmel
  • Add meta-atmel layers conf/bblayer configuration file (Lines in bold):
BBLAYERS ?= " \
  /home/jaufranc/edev/Atmel/SAMA5D3/poky/meta \
  /home/jaufranc/edev/Atmel/SAMA5D3/poky/meta-yocto \
  /home/jaufranc/edev/Atmel/SAMA5D3/poky/meta-yocto-bsp \
  /home/jaufranc/edev/Atmel/SAMA5D3/poky/meta-atmel \
  /home/jaufranc/edev/Atmel/SAMA5D3/poky/meta-openembedded/meta-oe \
  /home/jaufranc/edev/Atmel/SAMA5D3/poky/meta-openembedded/meta-networking \
  "
  • Edit conf/local.conf to specify the SAMA5D3 Xplained board, and change the package type to ipk:
[...]
MACHINE ??= "sama5d3_xplained"
[...]
PACKAGE_CLASSES ?= "package_ipk"
  • Build the demo image
bitbake atmel-xplained-demo-image

This step will take a while, and you’ll find the binary images in tmp/deploy/images/sama5d3_xplained/ including the bootloaders, the kernel, modules, device tree files, and rootfs.

  • You can also optionally build the bootloaders separately with:
bitbake at91bootstrap
bitbake u-boot

Flashing the Image

After you’ve built the image you may want to install them. You can also download the pre-built Yocto/Poky demo. I’ll use the files I’ve built, but the scripts from the pre-built demo zip file (linux4sam-poky-sama5d3_xplained-4.3.zip), since I could not find it anywhere else.

First you’ll need to install SAM-BA tool to flash the images. In Ubuntu 64-bit:

sudo apt-get install linux-image-generic linux-headers-generic ia32-libs

Download SAM-BA 2.12 for Linux and SAM-BA 2.12 Patch 6 for Linux using your web browser (registration or form filling required), and install it as follows

unzip sam-ba_2.12.zip
cp patch6.gz sam-ba_cdc_cdc_linux/
cd sam-ba_cdc_cdc_linux/
gzip -d patch6.gz
patch -p1 --binary < patch6
chmod +x sam-ba

Add sam-ba to your PATH, e.g.:

export PATH=$PATH:~/edev/Atmel/SAMA5D3/sam-ba_cdc_cdc_linux/

You’ll then need to add yourself into the dialout group inside /etc/group:

dialout:x:20:myusername

Logout and login.

Now copy demo_linux_nandflash.sh, demo_linux_nandflash.tcl and demo_script_linux_nandflash.tcl scripts from the zip file to tmp/deploy/images/sama5d3_xplained/ directory, and if needed, edit demo_linux_nandflash.tcl to match your newly built filenames:

set bootstrapFile      "sama5d3_xplained-nandflashboot-uboot-3.6.2.bin"
set ubootFile          "u-boot-sama5d3_xplained-v2013.07-at91-r2.bin"
set kernelFile         "zImage-sama5d3_xplained.bin"
set rootfsFile         "atmel-xplained-demo-image-sama5d3_xplained.ubi"

We’ve now ready for the flash procedure itself:

  1. Make sure your board is running connected to your computer via the micro USB port
  2. Remove JP5 (NAND CS, upper left of Atmel MPU) jumper to disable NAND Flash memory access
  3. Press BP2 reset button (bottom left) to boot from on-chip Boot ROM
  4. Close JP5 to enable NAND Flash memory access
  5. Change the name of copy the device tree blob file as follows:
    cp zImage-at91-sama5d3_xplained.dtb at91-sama5d3_xplained.dtb
  6. Run the flash script:
    chmod +x demo_linux_nandflash.sh
    ./demo_linux_nandflash.sh
  7. It will take a little while, and once completed you can login to the baord and verify you’ve got a brand new kernel and rootfs:
    root@sama5d3_xplained:~# uname -a                                               
    Linux sama5d3_xplained 3.10.0-custom #1 Wed Apr 16 09:31:12 ICT 2014 armv7l GNUx
    root@sama5d3_xplained:~# cat /etc/version                                       
    201404160759

You can check the flashing log in logfile.log in case something went wrong. You can find some more info on Linux4Sam SAMA5D3 Xplained page.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter

Mediatek MT6589 Linux Source Code, CyanogenMod 11 Image for Wiko Stairway Smartphone

March 13th, 2014 7 comments

Mediatek and their customers have still not gotten into the habit of complying with the GPL license, and releasing the relevant source code such as the Linux kernel. There appears to be at least one smartphone, Wiko Stairway, where the Linux kernel has been released, and chrmhoffmann, a members of XDA developers forums, has even released on unofficial CyanogenMod 11 ROM (Android 4.4.2 Kit Kat) for the device.

Mediatek_Linux_Kernel_Menuconfig

There are three source repositories for the Linux kernel, “android device“, and Android.

I’ve only looked into the kernel which is version 3.4.5. Mediatek has apparently messed up the Linux kernel quite a bit, and you’ll have to do some funny things to build the kernel, and all Mediatek options in menuconfig are in a sub-section called “Mediatek Properitary Configuration” (sic.), and it’s not possible to simply go to System Type menu to change the processor type for instance.

Let’s get the source first:

git clone https://github.com/chrmhoffmann/android_kernel_wiko_stairway
cd android_kernel_wiko_stairway/
ls
bionic  kernel  mediatek  README

So together with the kernel, we’ve got the bionic library, and the modifications done by Mediatek in the mediatek directory. The Makefile is this Linux kernel is set to use the Android gcc toolchain (arm-linux-androideabi-gcc), but I tried to build the kernel with CROSS_COMPILE=arm-linux-gnueabihf- instead, and it failed along the way with the following error:

fs/file_table.c: In function 'get_empty_filp':
 fs/file_table.c:36:20: error: inlining failed in call to always_inline 'fd_show_open_files': function body not available
 extern inline void fd_show_open_files(pid_t pid, struct files_struct *files, struct fdtable *fdt);
 ^
 fs/file_table.c:160:36: error: called from here
 fd_show_open_files(pid, files, fdt);
 ^
 make[1]: *** [fs/file_table.o] Error 1
 make: *** [fs] Error 2

This is from code added by Mediatek, and at first I just disabled it, but a similar problem occurred in the wlan drivers. Some research indicated in may be a toolchain problem, so I’ve installed the latest Linaro Android toolchain and added it to my path:

wget http://releases.linaro.org/14.02/components/android/toolchain/4.8/android-toolchain-eabi-4.8-2014.02-x86.tar.bz2
tar xvf android-toolchain-eabi-4.8-2014.02-x86.tar.bz2
export PATH=$PATH:~/edev/Mediatek/android-toolchain-eabi/bin/

And started the build:

cd kernel
TARGET_PRODUCT=wiko MTK_ROOT_CUSTOM=../mediatek/custom/ make -j8

Same error. So I gave a last try with an older Linaro Android toolchain using gcc 4.6, and this did the trick:

  LD [M]  mediatek/platform/mt6589/kernel/drivers/devapc/devapc.ko
  LD [M]  mediatek/platform/mt6589/kernel/drivers/dual_ccci/ccci_plat.ko
  LD [M]  mediatek/platform/mt6589/kernel/drivers/devinfo/devinfo.ko
  LD [M]  mediatek/platform/mt6589/kernel/drivers/gpu/pvr/mtklfb.ko
  LD [M]  mediatek/platform/mt6589/kernel/drivers/gpu/pvr/pvrsrvkm.ko
  LD [M]  mediatek/platform/mt6589/kernel/drivers/masp/sec.ko
  LD [M]  mediatek/platform/mt6589/kernel/drivers/videocodec/vcodec_kernel_driver.ko
  AS      arch/arm/boot/compressed/piggy.gzip.o
  LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready

As for the current CM11 ROM, phone calls, SMS, data (2G, 3G), Wi-Fi, audio, and most sensors are working fine, but there’s still more work to do as the second SIM card, the camera, hardware video decoding, GPS, Bluetooth, FM radio and some MTK specific features are not supported yet. It may not be wise to try it on MT6589 hardware other than Wiko Stairway, as you may brick your device.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter

Amlogic GPL Source Code Release – Kernel 3.10, U-Boot, and Drivers (Wi-Fi, NAND, TVIN, Mali GPU)

March 10th, 2014 30 comments

Last month, I noticed Amlogic provided links to the Android SDK for S802 / M802 on their open source website, but the only way to get the source was to share your SSH public with Amlogic, so that they give you access. It did not happen, but the company has released the source for Linux 3.10.10, U-boot 2011.03, Realtek and Broadcom Wi-Fi drivers, NAND drivers, “TVIN”drivers, and kernel space GPU drivers for Mali-400 / 450 GPU. There are also some customer board files for Meson 6 only (AML8726-MX / M6) but they do not seem to match the kernel…

amlogic_kernel_m802_s802

If you want to build the kernel, including the drivers, you’ll need to download a bunch of files:

wget http://openlinux.amlogic.com:8000/download/ARM/kernel/arm-src-kernel-2014-03-06-d5d0557b2b.tar.gz
wget http://openlinux.amlogic.com:8000/download/ARM/wifi/rtk8192du-2014-03-06-7f70d95d29.tar.gz
wget http://openlinux.amlogic.com:8000/download/ARM/wifi/rtk8192eu-2014-03-06-9766866350.tar.gz
wget http://openlinux.amlogic.com:8000/download/ARM/wifi/rtk8192cu-2014-03-06-54bde7d73d.tar.gz
wget http://openlinux.amlogic.com:8000/download/ARM/wifi/rtk8188eu-2014-03-06-2462231f02.tar.gz
wget http://openlinux.amlogic.com:8000/download/ARM/wifi/brcmap6xxx-2014-03-06-302aca1a31.tar.gz
wget http://openlinux.amlogic.com:8000/download/ARM/wifi/wifi-fw-2014-03-06-d3b2263640.tar.gz
wget http://openlinux.amlogic.com:8000/download/ARM/modules/aml_tvin-2014-03-06-fb3ba6b1c8.tar.gz
wget http://openlinux.amlogic.com:8000/download/ARM/modules/aml_nand-2014-03-06-39095c4296.tar.gz
wget http://openlinux.amlogic.com:8000/download/ARM/customer/aml_customer-2014-03-06-76ce689191.tar.gz
wget http://openlinux.amlogic.com:8000/download/ARM/gpu/gpu-2014-03-06-0425a1f681.tar.gz

You’ll need to extract these tarballs in specific directories:

tar xvf arm-src-kernel-2014-03-06-d5d0557b2b.tar.gz
mkdir -p hardware/amlogic/
mkdir -p hardware/wifi/realtek/drivers
mkdir -p hardware/wifi/broadcom/drivers
mkdir -p hardware/arm/
cd hardware/amlogic
tar xvf ../../../aml_nand-2014-03-06-39095c4296.tar.gz
mv aml_nand-amlogic-nand nand
cd ../wifi/realtek/drivers
tar xvf ../../../../rtk8192du-2014-03-06-7f70d95d29.tar.gz
tar xvf ../../../../rtk8192eu-2014-03-06-9766866350.tar.gz
tar xvf ../../../../rtk8192cu-2014-03-06-54bde7d73d.tar.gz 
tar xvf ../../../../rtk8188eu-2014-03-06-2462231f02.tar.gz
mv rtk8188eu-8188eu 8188eu
mv rtk8192du-8192du 8192du
mv rtk8192cu-8192cu 8192cu
mv rtk8192eu-8192eu 8192eu
cd ../../broadcom/drivers
tar xvf ../../../../brcmap6xxx-2014-03-06-302aca1a31.tar.gz
mv brcmap6xxx-ap6xxx ap6xxx
cd ../../../arm
tar xvf ../../gpu-2014-03-06-0425a1f681.tar.gz
mv gpu-r3p2-01rel3 gpu
cd ..
tar xvf ../../aml_tvin-2014-03-06-fb3ba6b1c8.tar.gz 
mv aml_tvin-amlogic-3.10-bringup tvin

You can also extract the customer file into the kernel directory to add some drivers. As I said above I’m not sure the source code inside matches the Linux kernel 3.10.10, because there’s now device tree file for the boards. In arch/arm/plat-meson/Kconfig, there are (commented out) references to customer/meson/dt/Kconfig and customer/drivers/Kconfig. The device tree is not available, but the drivers is, so you could give a try in order to build the touchscreen and sensors drivers available in the customer tarball:

cd ../linux-amlogic-3.10-bringup
tar xvf ../aml_customer-2014-03-06-76ce689191.tar.gz 
mv aml_customer-master customer

Finally, the development tree is ready to build the kernel. There must surely be a script somewhere to do that… I haven’t used the file wifi-fw-2014-03-06-d3b2263640.tar.gz, as the kernel did not complain about it, and it looks like it’s just for Android Kit Kat. There are four scripts to build the kernel: mk_m6.sh, mk_m6tv, mk_m6_tvd.sh, and mk_m8.sh. The first three are for meson6 (dual core processor), and the last one meson8 (quad core S802/M802).

Let’s go with M8 build:

make ARCH=arm meson8_defconfig
./mk_m8.sh

Please not that I had to change mk_m8.sh, as it should just make computer hand requiring a hard reset. The culprity was the line:

make uImage -j

The manpage indicates “If the -j option is given without an argument, make  will  not  limit  the number of jobs that can run simultaneously”.  It does not seem like a good idea… ,s so I changed that to

make uImage -j8

Upon successful build, the end of log you look like:

UIMAGE arch/arm/boot/uImage
Image Name: Linux-3.10.10
Created: Mon Mar 10 11:48:52 2014
Image Type: ARM Linux Kernel Image (lzo compressed)
Data Size: 7099978 Bytes = 6933.57 kB = 6.77 MB
Load Address: 00008000
Entry Point: 00008000
Image arch/arm/boot/uImage is ready
/home/jaufranc/edev/AMLogic/s802/linux-amlogic-3.10-bringup/scripts/amlogic/aml2dtb.sh /home/jaufranc/edev/AMLogic/s802/linux-amlogic-3.10-bringup/arch/arm/boot/dts/amlogic/meson8_skt.dtd
DTD_FILE: /home/jaufranc/edev/AMLogic/s802/linux-amlogic-3.10-bringup/arch/arm/boot/dts/amlogic/meson8_skt.dtd
the middle dts file: /home/jaufranc/edev/AMLogic/s802/linux-amlogic-3.10-bringup/arch/arm/boot/dts/amlogic/meson8_skt.dts
process file /home/jaufranc/edev/AMLogic/s802/linux-amlogic-3.10-bringup/arch/arm/boot/dts/amlogic/meson8_skt.dts start
processing... please wait...
process file /home/jaufranc/edev/AMLogic/s802/linux-amlogic-3.10-bringup/arch/arm/boot/dts/amlogic/meson8_skt.dts end

CC scripts/mod/devicetable-offsets.s
GEN scripts/mod/devicetable-offsets.h
HOSTCC scripts/mod/file2alias.o
HOSTLD scripts/mod/modpost
DTC arch/arm/boot/dts/amlogic/meson8_skt.dtb
rm /home/jaufranc/edev/AMLogic/s802/linux-amlogic-3.10-bringup/arch/arm/boot/dts/amlogic/meson8_skt.dts
-rw-r–r– 1 jaufranc jaufranc 11244948 Mar 10 11:48 ./m8boot.img
m8boot.img done

If you want to get U-boot code it’s not quite as messy, you jut need to download and extract two files:

wget http://openlinux.amlogic.com:8000/download/ARM/u-boot/uboot-2014-03-06-323515c056.tar.gz
wget http://openlinux.amlogic.com:8000/download/ARM/u-boot/aml_uboot_customer-2014-03-06-09887e87b4.tar.gz
tar xvf uboot-2014-03-06-323515c056.tar.gz
cd uboot-next
tar xvf ../aml_uboot_customer-2014-03-06-09887e87b4.tar.gz
mv aml_uboot_customer-next/ customer

Then just select a board in customer/board/ to build U-boot for your hardware. For example:

make m8_k03_M102_v1_config CROSS_COMPILE=arm-linux-gnueabihf-
make CROSS_COMPILE=arm-linux-gnueabihf- -j8

The build failed for me, but it might be I may need to use another compiler, e.g. arm-none-eabi-gcc.

[Update: arm-none-eabi-gcc does seem to go further, but you'll also need an arc compiler as shown in my previous Amlogic U-boot build instructions].

Thanks to M][sko for the tip.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter

Getting Started with Raxda Rock – How to Generate and Flash Ubuntu Saucy Server and Desktop Images

January 27th, 2014 33 comments

I’ve already written a guide showing how to build and install Android in Radxa Rock. Today I’m going to build the Linux kernel, generate a Ubuntu server images based latest Ubuntu Linaro server release, flash the image to the NAND flash, and show how to install LXDE or XFCE desktop environment. If you are just interested in installing one of the latest supported images, you can download Android, dual boot (Android/Ubuntu), Ubuntu ALIP, and Router images for Radxa Rock @ http://dl.radxa.com/rock/images/, and skip “build” and “generate” instructions, and just follow the flashing instructions below. All steps in this tutorial will be done in Ubuntu 13.10, and lots of the instructions below follow hwswbits blog and Ubuntu Radxa Wiki.

Build the Linux kernel

Let’s start by building the Linux kernel. I’m assuming you’ve already install development tools in Ubuntu (e.g. apt-get install build-essentials). You can refer to the list at the beginning of the Radxa Rock Android post for packages to install with apt-get.

Let’s create a working directory, get the code, and build the kernel.

mkdir radxa_ubuntu
cd radxa_ubuntu

git clone -b wip/rockchip-3.0-radxa-rock https://github.com/linux-rockchip/rockchip-3.0.git
cd rockchip-3.0
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make rk3188_radxa_rock_defconfig
make -j8

At this stage, we’ve build the kernel. However, if we use it as is, DNS and some other network functions will not work because CONFIG_ANDROID_PARANOID is enabled in the default config file. Run make arch=ARM menuconfig, and go to Networking support -> Networking options to disable Only allow certain groups to create sockets. Run make again:

make -j8

Let’s complete this section, by building the kernel modules:

mkdir modules
export INSTALL_MOD_PATH=./modules
make modules && make modules_install
cd ..

Generate Initrd

The initrd is used at boot time to speed up boot among other things.

git clone https://github.com/radxa/initrd.git
cd initrd
find . ! -path "./.git*"  | cpio -H newc  -ov > ../initrd.img
cd ..

Generate Boot.img

In order to create boot.img which will be flashed in the boot partition, we need to download mkbootimg tool, and run the following commands:

wget http://dl.radxa.com/rock/tools/linux/mkbootimg 
sudo apt-get install lib32stdc++6 
chmod +x mkbootimg 
./mkbootimg --kernel rockchip-3.0/arch/arm/boot/Image --ramdisk initrd.img -o boot.img

That’s all good as we should now have a working boot.img. I’ll upload my boot.img soon. You  can download boot-radxa-20140127.img.xz.

Generate Ubuntu (Linaro) Server Rootfs

We will first create an empty 1GB file (rock_rootfs.img), format it to EXT-4, and mount it as a loop device:

dd if=/dev/zero of=rock_rootfs.img bs=1M count=1024
mkfs.ext4 -F -L linuxroot rock_rootfs.img 
mkdir mnt
sudo mount -o loop rock_rootfs.img ./mnt

I’ll download and extract the latest Ubuntu Saucy server image from Linaro available as today:

wget https://releases.linaro.org/13.12/ubuntu/saucy-images/server/linaro-saucy-server-20131216-586.tar.gz
sudo tar zxvf linaro-saucy-server-20131216-586.tar.gz -C ./mnt
cd ./mnt
sudo mv binary/* .
sudo rm binary -fr
cd ..

Now we need to copy the kernel modules and firmware to our rootfs:

sudo mkdir ./mnt/lib/firmware
sudo cp -r rockchip-3.0/modules/lib/modules/3.0.36+/ ./mnt/lib/modules
sudo mkdir ./mnt/lib/firmware
sudo cp -r rockchip-3.0/firmware/* ./mnt/lib/firmware/

I’d like Ethernet to work at boot time with DHCP so I edit the relevant file:

sudo vi ./mnt/etc/network/interfaces

and add the two lines:

auto eth0
iface eth0 inet dhcp

If you’ve already referred to Radxa Rock Ubuntu wiki, at this stage they use qemu and chroot to install extra package, I’ll skip that part, because it can be done inside the board instead, and I came across some error with qemu when accessing the network:

apt-get update
0% [Working]
qemu: Unsupported syscall: 374
qemu: Unsupported syscall: 374
Err http://ports.ubuntu.com saucy

We still have one more step to create and enable a script to automatically detect the rootfs partition at boot time.

sudo vi ./mnt/usr/local/bin/mtd-by-name.sh

And copy the following to the file:

#!/bin/sh -e
# mtd-by-name link the mtdblock to name
# radxa.com, thanks to naobsd
rm -rf /dev/block/mtd/by-name/
mkdir -p /dev/block/mtd/by-name
for i in `ls -d /sys/class/mtd/mtd*[0-9]`; do
    name=`cat $i/name`
    tmp="`echo $i | sed -e 's/mtd/mtdblock/g'`"
    dev="`echo $tmp |sed -e 's/\/sys\/class\/mtdblock/\/dev/g'`"
    ln -s $dev /dev/block/mtd/by-name/$name
done

Make sure the script is executable and edit one of the startup script:

sudo chmod +x ./mnt/usr/local/bin/mtd-by-name.shsudo 
sudo vi ./mnt/etc/rc.local

And add the line below before exit 0:

/usr/local/bin/mtd-by-name.sh

We are done, let’s umount the rootfs:

sudo umount ./mnt/

I’ll upload my Ubuntu Saucy Server rootfs soon.  Download link for Ubuntu Saucy server rootfs: radxa_rock_ubuntu_server_saucy_20140127.img.xz (95.4 MB)

Flashing Ubuntu to Radxa Rock

Now that we’ve got boot.img and rock_rootfs.img, we are ready to flash Ubuntu to the board. If you’ve haven’t installed it already, install RKFlashKit, press the recovery button on Radxa Rock, start RkFlashKit, and flash boot.img and rock_rootfs.img respectively to “boot” and “linuxroot” partitions.
Flash_rootfs_radxa_rockClick on Reboot device, and you should be able to access the console via HDMI or the serial console.

Ubuntu Saucy Server Available RAM and storage

SSH is not installed, but you can call install dropbear or ssh if you want to access the board remotely:

apt-get update
apt-get install dropbear

You can now SSH the board with linaro user using the password: linaro.

We’ve got plenty of available RAM:

free -mh
             total       used       free     shared    buffers     cached
Mem:          1.8G       228M       1.6G         0B       7.9M       170M
-/+ buffers/cache:        49M       1.8G
Swap:           0B         0B         0B

But there’s only a 1GB flash partition usable with 409MB available.

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/mtdblock9 1008M  548M  409M  58% /
udev            924M   68K  924M   1% /dev
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none            186M  264K  185M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            927M     0  927M   0% /run/shm
none            100M     0  100M   0% /run/user

However, there’s also a 4GB “user” partition:

cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 00400000 00004000 "misc"
mtd1: 00800000 00004000 "kernel"
mtd2: 01000000 00004000 "boot"
mtd3: 02000000 00004000 "recovery"
mtd4: 04000000 00004000 "backup"
mtd5: 08000000 00004000 "cache"
mtd6: 40000000 00004000 "userdata"
mtd7: 00400000 00004000 "kpanic"
mtd8: 20000000 00004000 "system"
mtd9: 60000000 00004000 "linuxroot"
mtd10: 10c000000 00004000 "user"

We can mount it as follows:

sudo mkdir /mnt/user
sudo mount /dev/mtdblock10 /mnt/user

And get some extra space:

df -h
Filesystem       Size  Used Avail Use% Mounted on
/dev/mtdblock9  1008M  548M  409M  58% /
...
/dev/mtdblock10  4.2G  8.0K  4.2G   1% /mnt/user

But we’d still only get 5GB out of a 8GB NAND flash, and there’s not enough space on the rootfs to install a desktop environment.

Increasing Radxa Rock Ubuntu Rootfs Partition Size

Let’s see what can be done to get rid off useless Android partition, and get a 7GB rootfs.

First we need to modify the Android parameter file to change the MTD layout for linux (parameter-linux). Refer to the Android post to get the parameter files in rockdev directory.

cp ../radxa_rock_android/rockdev/parameter parameter-linux
vi parameter-linux

Edit parameter-linux as follow with only 2 partitions for boot.img and rock_rootfs.img (linuxroot):

FIRMWARE_VER:4.2.2
MACHINE_MODEL:radxa_rock
MACHINE_ID:007
MANUFACTURER:RADXA
MAGIC: 0x5041524B
ATAG: 0x60000800
MACHINE: 3066
CHECK_MASK: 0x80
KERNEL_IMG: 0x60408000
#RECOVER_KEY: 1,1,0,20,0
CMDLINE:console=ttyFIQ0 console=tty0 root=/dev/block/mtd/by-name/linuxroot rw rootfstype=ext4 init=/sbin/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:0x00008000@0x00002000(boot),0x00E00000@0x00A000(linuxroot)

Now get the upgrade_tool (download link), enter recovery mode and flash the parameter file:

./upgrade_tool di -p parameter-linux

Start RkFlashKit again to flash boot.img and rock_rootfs.img again. This time, you should only see two partitions in the tools: boot and linuxroot.

However, the first time I tried to flash rock_rootfs.img, I got the following error message in RkFlashKit:

"Flash memory at 0x0000a000 is differnt from file!"

And after reboot, in the serial console, I got quite a few error message similar to:

FlashReadRetry error!!,row = 0

A low level format, before using RkFlashKit, and flashing the parameter file fixed the issue:

./upgrade_tool lf

You may want to run the command above first in any case, because flashing rock_rootfs.img takes nearly 30 minutes… If you do so, the low level format command must be done before flashing all other files in including the parameter, boot, and rootfs files.

After flashing is completed, reboot the board. You’ll notice the rootfs is still 1GB. Simply resize the EXT-4 partition:

resize2fs /dev/block/mtd/by-name/linuxroot

Let’s check:

root@linaro-server:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/mtdblock1  7.3G  546M  6.4G   8% /
udev            924M   84K  924M   1% /dev
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none            186M  260K  185M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            927M     0  927M   0% /run/shm
none            100M     0  100M   0% /run/user

Yes! Success! The rootfs partition is 7.3 GB with 6.4GB available.

Installing LXDE or XFCE Desktop Environment

If you just plan to use Radxa Rock as a server, you are done, but if you want to run a desktop environment one more step is needed. Since there are no GPU Linux drivers in RK3188 based devices, installing Unity is probably a very bad idea and would lead to poor performance. Two other lightweight desktop environments are frequently used: LXDE in distributions such as Lubuntu or ALIP, or XFCE in distributions such as Xubuntu.

The good news is that installation is very easy, but it can take a few hours to download and install all required packages. So if you want to skip the part below, you can download the compressed rootfs with Xubuntu-Desktop to flash directly to your board.

Lubuntu (LXDE) requires 378 MB of archives and 1166 MB of additional disk space, and can be installed with the following command:

sudo apt-get install lubuntu-desktop

Xubuntu (XFCE) requires 452 MB of archives and 1370 MB of additional disk space, and can be installed with the following command :

sudo apt-get install xubuntu-desktop

I decided to install Xubuntu desktop, and it took 2 to 3 hours. I’ll upload my Ubuntu Saucy XFCE rootfs soon if you want to skip that part.

Once installation is complete we still have 4.5GB free, but somehow it used nearly 2GB additional space, instead of the 1370 MB promised.

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/mtdblock1  7.3G  2.5G  4.5G  36% /
udev            924M   84K  924M   1% /dev
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none            186M  296K  185M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            927M     0  927M   0% /run/shm
none            100M     0  100M   0% /run/user

At boot time, you get the the login screen (use “linaro” user with “linaro” password), and the system is very usable. I’ve opened several programs including Gimp, Firefox, Abiword, a terminal window, a game, a music player, and more (See screenshot below), and  everything runs pretty smoothly. Stability may need to be improved however, since I’ve got one random reboot as I accessed SAMBA shares. I could not reproduce the issue.

Xubuntu in Radxa Rock (Click for Original Size)

Xubuntu in Radxa Rock (Click for Original Size)

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter

LinuxCon North America 2013 Schedule

August 6th, 2013 1 comment

LinuxCon (North America) 2013 will take place on September 16 – 18, 2013 in New Orleans, LA. The event will be co-located with several other conferences: the Linux Plumbers Conference, the Xen Project User Summit, the OpenDaylight Mini-Summit, the Gluster Workshop 2013, the UEFI Plugfest, the Linux Wireless Summit, the Linux Security Summit, and CloudOpen 2013.

LinuxCon consists of 3 days of keynotes, and legal, operations, and developers related sessions as well as tutorials and workshops. There will be around 150 sessions and keynotes during those 3 days. I’ve gone through developer sessions and selected one for each time period.

Linuxcon_2013

Monday, September 16

UEFI has become ubiquitous on the PC client systems and is coming up on servers and ARM-based systems, it is becoming the converged firmware infrastructure. UEFI Secure Boot feature has attracted a lot of attention from the Linux community. Linux distros and Linux Foundation have found solutions.  This presentation provides a review of the motivations behind the creation of the UEFI technology, the history, the current status, and the future. It provides an update on the new significant developments since the publication of UEFI Spec v2.3.1C last June. It also serves as a venue for Q&A with the Linux community.

The LLVM project is an extensive compiler technology suite which is becoming commonplace in many industries. Technology built with LLVM is already shipped in millions of Linux devices as a part of Android/Renderscript. Increasingly it is becoming a big part of the development process for embedded projects, all the way up through to high performance computing clusters. This session will provide an update on the status of the LLVMLinux project; a project which is cooperating with both the Linux kernel and LLVM communities to build the Linux kernel with Clang/LLVM.

Memory compression has long been a topic confined to academic research and development sandboxes. However, with CPU and memory speed improvements outpacing improvements in I/O speed and latency, memory compression is now being deemed a viable way to increase in-memory data density and delaying or avoiding costly I/O.  Zswap, a feature for compressed swap caching, merged into the kernel in v3.11, is a first step toward deploying this functionality in the Linux kernel.

This presentation targets users who own hardware with maxed-out RAM capacities or pay per-GB for RAM usage (IaaS customers) and would like to determine if memory compression can reduce their costs and extend the useful lifetime of their computing assets.

This presentation will cover a brief introduction on how the Bluetooth Low Energy technology works. Then it will present the current status of its support on Linux, presenting the available APIs and how to interact with Bluetooth Smart devices, including the profiles we’re currently working on, and what can be expected to be finished in the near future. There will be also a few demos of Bluetooth Smart devices working with Linux.

With the Linux kernel now supporting NFC, a natural step forward seems to be enabling mobile payments, either cloud or NFC based. To do so we need to give payment applications access to secure elements, via the kernel. At the moment, both the secure element kernel interface and a generic secure element library are missing from any standard Linux distribution, effectively keeping Linux away from the mobile payments market. We will first go through a brief tour of the mobile payments ecosystem and see how it is actually implemented. Then we will describe the proposed kernel APIs for discovering, enabling and talking to secure elements. Finally we will discuss about the possible options for bringing a hardware agnostic secure element library to standard Linux distributions, and how it could be used to implement payment applications on Linux.

Tuesday, September 17

Linaro’s open source automated validation architecture (LAVA) enables developers to test their software on a broad range of hardware platforms. This presentation will describe to developers how they can utilize LAVA to test and validate kernels on real or emulated hardware. This session will showcase a new lightweight interface for testing kernels efficiently, and displaying test results. The goal being that we as developers can leverage automation to ensure that the Linux kernel is well tested and that each iteration becomes more robust than the last

Mobile processors are at the heart of hundreds of devices built on the Linux kernel, but are also being implemented in other Linux-compatible embedded systems. For the Linux community, it’s inevitable that challenges will arise when developing and pinpointing the origin of issues can be a setback. Leon will talk about tools that enable developers to test and refine systems and applications for these powerful mobile processors so the software runs pristinely when launched.

The target audience for this session is software developers, mobile and beyond. Developers can expect to learn how to test and fine tune applications across embedded systems to be not only be functional and problem free, but also visually enticing, battery efficient and packed with cutting-edge features.

With raising popularity of Linux on mobile devices the shortcomings of the default kernel memory management policies become more and more visible. The combination of limited physical memory and lack of swap device brings a challenge in the most efficient use of the available resources. This presentation will give an overview of the current state of improvements (i.e. memory control groups, per-process/group reclaim, memory compression) to the Linux memory management subsystem that together with the cooperating user-space components allow more custom control of the memory available in the system. The usage examples of specific features will be based on Tizen operating system.

This talk is intented mainly at kernel and distribution developers wishing to improve Linux memory management but it may be interesting to whoever would like to know more about the topic.

The Tux3 filesystem project began in 2008 and has now reached a point where it is beginning to show favorable benchmark results compared to other Linux filesystems. Tux3 breaks new ground in Linux filesystem technology with its strong consistency semantics, novel high performance atomic commit and asynchronous frontend/backend design that maps well to the new generation of multi-core CPUs. Tux3 is expected to reach a mergable state in the next few months. Much work remains to be done, including incorporating versioning and replication support, improved filesystem checking and repair facilities, enterprise features such as quotas and end to end checksumming, and availability features such as online checking and repair. In this talk, Daniel Phillips, designer of Tux3, will discuss current implementation status, present benchmark results and lay out plans for kernel merge and beyond.

Software Freedom Conservancy announced last year a renewed effort for cross-project collaborative GPL compliance efforts, including copyright holders from BusyBox, Linux, and Samba. Conservancy uses an internal system of communication and collaboration to take input from stakeholders to discuss and engage in compliance activity to ensure compliance with the GPL throughout the technology industry and particularly in the embedded device market.  Compliance with the GPL is the responsibility of copyright holders of the software, and Conservancy helps those copyright holders pursue the work, so those developers can focus on coding. In this talk, the Executive Director of Conservancy will discuss how Conservancy handles compliance matters, what matters it focuses on, and how the copyright holders that work with Conservancy engage in a collaborative effort to ensure compliance with the GPL.

Wednesday, September 18

The Linux Kernel is currently supported on over 30+ different hardware architectures. This is a huge benefit for Linux adoption on a wide range of deployments. However, the ability to build and test Linux kernels on all possible supported architectures requires having access to such test systems for each of these architectures which is not easy by any means. Therefore, the ability to cross-compile non-native architectures on an architecture that is widely supported such as the x86_64 helps address the building kernels part of the problem.

This talk will present the details of where to find cross-compilers packages for architectures, how to install them, and how to automate compile on each of these architectures on an x86 system. This talk will be of great benefit to any software developer trying to build and test Linux kernel on non-native hardware architecture.

As ARM and ARM64 move out of gadgets and into more PC like hardware, there has been an increasing demand for the same tools to manage these devices as already exists in x86 world. Linaro has been working on UEFI and ACPI on arm/arm64 hardware and this talk is a summary of the current status of the work and the direction that will be taken in the future. We will show the areas of change to the ARM platform boot sequence, change to the ACPI core code, and change to drivers to support ACPI.

The Linux kernel contains multiple energy-saving features. Some of them act on the system as a whole while the others are concerned with individual processors or I/O devices. The majority of them have been developed in isolation and they work reasonably well individually, but that is often insufficient to address problems related to the progressing integration of hardware and growing user expectations. For this reason, it will be necessary to make them work more closely together and he’s going to talk about that in his presentation.  Rafael will describe the current status of the kernel’s energy-saving features, the most important problems they are facing and some possible ways to address those problems

This session is a BoF session organized by LTSI (Long Term Support Initiative) to discuss testing for Linux kernel. Testing is very important when delivering software, validating changes, shipping products and so on but actually each individual is doing its own testing and that are not shared with others. This BoF would like to discuss how to share testing, what is the common testing portion and so on.

Those are just a few choices, and you can check the full schedule to find out which sessions suit you best.

You can register to LinuxCon 2013 and CloudOpen 2013 online for the following fees:

  • US$475 through May 3rd (Early Bird)
  • US$575 May 4th through July 31st (Standard)
  • US$675 thereafter (Late)
  • Student Registration – $150

Fees are up between 11% to 50% compared to last year. Who said there’s no inflation?

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter

Wandboard Dual Unboxing and Quick Start Guide

February 21st, 2013 19 comments

I’ve just received Wanboard Dual development board together with an enclosure, and Wi-Fi antenna. This board is powered by Freescale i.MX6 Duallite Cortex A9 processor, and comes with 1GB RAM, HDMI output and Ethernet. There’s also a version based on Freescale i.MX6 Solo with 512 MB RAM. You can refer to my earlier post for more detailed specifications. I’ll start by showing some unboxing pictures of the board, and write a quick start guide (casing assembly, Ubuntu & Android boot, and development). I also planned to run some benchmarks and test videos, as according to a poll on Wandboard website many people want to use it as a media player, but I’ll do that a bit later since the current Android image is not up to the task yet.

Wandboard Dual Unboxing

The package I received contained 3 boxes: one for Wandboard Dual board, one for the enclosure, and one for the Antenna. The complete kit below should cost around $120, and Wandboard has distributors worldwide. Prices vary so make sure you shop around.

Wandboard_Dual_Casing_Wi-Fi_Antenna_Packages

Inside those packages, you’ll find the Wandboard Dual board, the casing and screws, and the Wi-Fi antenna with a cable to connect it to the Wandboard Dual SoM.
Wandboard_Dual_Casing_Wifi-Antenna

Let’s have a closer look at the board. The top of the board features all the ports (further described below). A SATA connector is included but none of the Freescale SoM (Solo and Duallite) provided with the Wandboard can support it.

Wandboard Top (Click to Enlarge)

Wandboard Top (Click to Enlarge)

At the bottom of the board, there’s an EDM compatible SoM with the Freescale Processor, the RAM chipsets, an internal microSD slot (for the OS), a camera connector, as well as the Wi-Fi module (Dual version only). There’s also a reset button and 4 expansion pin headers at the bottom of the baseboard.

Wandboard Dual Bottom (Click to Enlarge)

Wandboard Dual Bottom (Click to Enlarge)

I’ve take some pictures on the side of the board to have a close look at the ports accessible on the Wandboard.
Wandboard_Ports

From left to right, top to bottom we’ve got:

  • Serial connector (DB9), digital line OUT, digital line IN, microphone, and S/PDIF
  • HDMI, Gigabit Ethernet, and 5VDC Jack
  • USB OTG, microSD slot (for applications/data) and USB Host (USB 3.0 Connector, but only USB 2.0 is supported by Freescale SoM)

One of the advantage of the Wandboard is that it’s comprised of a baseboard and a system-on-module (SoM) which are based on the EDM standard. This means, at least in theory, that you could remove the SoM, and replace it by another EDM Compact SoM (85x60mm). I’ve seen some people interested in upgrading their board to “Wandboard Quad” by replacing the provided SoM with Technexion EDM1-CF-iMX6 Quad SoM.

Wandboard Baseboard with EDM Connector

Wandboard Baseboard with EDM Connector

I’ve removed the 4 screws to remove the EDM-IMX6 SoM.

Wandboard EDM-IMX6 SoM (Click to Enlarge)

Wandboard EDM-IMX6 SoM (Click to Enlarge)

On the back of the module, you’ve got 2 more RAM Chips, Atheros AR8031 (Gb Ethernet), and lots of markings. If you want to connect the Wi-Fi antenna, the (golden) connector is just on top of the Wi-Fi module, and right of the microSD slot in the picture above.

Wandboard Quick Start Guides

Casing Assembly

Putting the enclosure and the board together, is extremely easy. Align the board with the top of the case, cover it with the bottom, insert and tighten the 4 screws and you’re done.

Wandboard_Casing2
You’ve got yourself a nice looking box. There are 2 issues however. The first and most important is that the connector for the Wi-Fi antenna faced the bottom of the enclosure, so it’s impossible to connect the Wi-Fi antenna and use the enclosure at the same time (Wi-Fi should still work without antenna though), unless you drill a small hole at the bottom of the casing. [Update: Wandboard posted the instructions to assemble the enclosure with the Wi-Fi antenna. This involves using a cutter, but it still looks neat]. The second, which is less a problem, is that the OS is stored in the internal microSD, so each time you need to update the OS, you’ll have to open the casing. It would have been a bit more convenient to be able to use the external microSD as well.
Wandboard_Dual_Casing

Installing and Running Android in Wandboard

I’ll provide the instructions for a Linux PC, but it’s also possible to do with Windows, and Win32DiskImager (Included in the images). First Download and unzip Android Jelly Bean (Early Preview) for the Wandboard Dual in your PC:

wget http://www.wandboard.org/images/downloads/android-4.1.2-wand-dual-20130207.zip
unzip android-4.1.2-wand-dual-20130207.zip

You’ll get three files:

  • android-4.1.2-wand-dual-20130207.img – Android Jelly Bean Image for Wanboard Dual
  • android-4.1.2-wand-dual-20130207.txt – Release notes
  • win32diskimager.zip – Disk imager utility for Windows.

Now insert a 4GB (or more) microSD card into your PC, and copy the image with dd or dd.sh:

sudo dd.sh if=android-4.1.2-wand-dual-20130207.img of=/dev/sdc

You’ll have to replace “/dev/sdc” by your microSD card device. You can check by running  sudo blkid.

Insert the microSD card in the internal microSD slot, connect the HDMI connector to your TV, connect Ethernet, a keyboard and mouse via a USB hub, and power the board with a 5V/2A power adapter. After about 2 minutes the boot should be complete, and you should get to the lock screen.

Wandboard_Android

According to the release notes files, wifi, bluetooth, adb, usb gadget and uvc cam are not working in Android yet. HDMI might fail to setup audio rate, and there’s no Setup menu for Ethernet (only dhcp will work). Ethernet works, but there’s no Google Play or file manager, and copying apks into /system/app did not install them automatically. I’ll do more testing once another Android image is available.

Installing and Running Ubuntu 11.10 in Wandboard

Thep rocedure for Ubuntu is very much similar to the one for Android. Get the image, uncompress it, and copy it to a 4GB (or greater) microSD card.

wget http://www.wandboard.org/images/downloads/ubuntu-11.10-wand-dual-20130208.zip
 unzip ubuntu-11.10-wand-dual-20130208.zip
 sudo dd.sh if=ubuntu-11.10-wand-dual-20130208.img of=/dev/sdc

Insert the microSD in the Wandboard, make sure everything is connected, and power on the board. The boot will take a while, and the screen will stay black for about 1m20, then you’ll see a gray background and the mouse pointer, but it will only become usable after 3 minutes (From power on to Unity desktop).

Ubuntu 11.10 in Wandboard (Click to Enlarge)

Ubuntu 11.10 in Wandboard (Click to Enlarge)

As with most other ARM systems, Ubuntu feels really slow to use, mostly because of the I/O on the microSD card, and I suppose Unity is also part of the sluggishness, so using another desktop environment (e..g LXDE) should help with performance. I’ve also tried es2gears just in case GPU acceleration would magically work, but it’s still using software rendering, which is the same issue as with other Freescale i.MX6 devices at the moment. VPU should work, but since there appears to be a lot of fancy things to do with gstreamer, I’ll write a separate post about video playback on Freescale i.MX6 platforms. If you’re planning to use the board as an embedded platform (e.g. for automation), a Yocto Project build is in the work.

Wandboard SDK and Kernel Build

Wandboard developers eventually intend to release the source code in a public repository, but in the meantime, u-boot and linux source code is available as a tar file, which also contains binaries (precompiled kernel, kernel modules, u-boots and patchram util), firmware (for VPU, Bluetooth and WiFi), tools and documentation like SD card layout.

Download and extract the SDK:

wget http://www.wandboard.org/images/downloads/wandboard-sdk-20130208.tar.xz
tar xvf wandboard-sdk-20130208.tar.xz

You can build the kernel and modules (for Linux/Ubuntu) by following the steps below, assuming the toolchain is already installed:

cd wandboard-sdk-20130208/linux-3.0.35-imx6-wand
cp wandboard_ubuntu_defconfig arch/arm/configs/
make ARCH=arm wandboard_ubuntu_defconfig
make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage
make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install INSTALL_MOD_PATH=../modules

Now that the build is complete, copy uImage and the modules to the microSD card with

Ubuntu, and umount it: sudo dd if=arch/arm/boot/uImage of=/dev/sdc bs=1M seek=1
cp ../modules/lib/modules/3.0.35/ /media/<rootfs_mount_point>/lib/modules -rf
sudo umount /dev/sdc1

Insert the microSD card in the Wandboard, it should boot Ubuntu, and can verify the kernel is the one just you built by displaying the build date with uname:

linaro@wandboard:~$ uname -a
Linux wandboard 3.0.35 #3 SMP PREEMPT Thu Feb 21 18:41:10 ICT 2013 armv7l armv7l armv7l GNU/Linux

Ideally you should connect a null modem cable or DB9 serial to USB cable to access the serial console for bootloader and kernel debugging, but since I don’t have one of those, I haven’t tried.

If you have any questions or technical issues with the Wandboard, you can get support on Wandboard Google Group. Header pins description and schematics are available in Wandboard User’s Manual.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter