Articles for Developer by Paolo Medici [PMX.it]. See License on bottom of this page.

Introduction

First of all exists two version of SABRE: Smart Device and Automotive Infotainment. Those information focus on the second, but can also be valid for the first device.

This document is focused on QUAD IMX6 version. Dual and also Solo are similar.

Actually the SABRE AI Quick Start Guide is the main source for starting but this guide is not available online, now.

Preparing SD-CARD

The instruction for installing the image can be found in chapter8 of i.MX_6Dual6Quad_Sabre-AI_Linux_User_Guide.pdf, contained in the L3.0.35_4.0.0_LINUX_DOCS package.
Data file can be found on FreeScale website [1] under section Demo Images for i.MX 6Quad/Dual

Installing DEMO IMAGE

The last release is L3.0.35_4.0.0_DEMO_IMAGE

To install (flash on sd-card) u-boot:

sudo dd if=u-boot-mx6q-sabreauto.bin of=/dev/[device name] bs=512 seek=2 skip=2 conv=fsync
for example
sudo dd if=u-boot-mx6q-sabreauto.bin of=/dev/sdc bs=512 seek=2 skip=2 conv=fsync
(please, take care of the name of disk device)

and install the linux kernel (which one?) at 0x10000000

sudo dd if=uImage of=/dev/[device name] bs=512 seek=2048 conv=fsync

After, following instruction of pdf, it is necessary to create the partition for the linux OS.

sudo mkfs.ext3 /dev/[partion]

Mount the source file system

sudo mount -o loop -t ext2 rootfs.ext2 <mount point>

mount the SD card, change dir inside the <mount point> and copy all files.

sudo cp -av * <sd card>

Files involved in this stage were

L3.0.35_4.0.0_130424_images_MX6/u-boot-mx6q-sabreauto.bin
L3.0.35_4.0.0_130424_images_MX6/uImage
L3.0.35_4.0.0_130424_images_MX6/rootfs.ext2.gz


IMPORTANT NOTE: The SABRE AI release 1.1.0 shows a unstable kernel at 1Ghz freqs, reporting frequent kernel crash:


Unable to handle kernel NULL pointer dereference at virtual address 0000027
Internal error: Oops: 17 [#1] PREEMPT SMP


Internal error: Oops - undefined instruction: 0 [#1] PREEMPT SMP


Alignment trap: not handling instruction e0040094 at [<8008de58>]
Unhandled fault: alignment exception (0x801) at 0x00000001
Internal error: : 801 [#1] PREEMPT SMP


Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = 80004000
[00000000] *pgd=00000000
Internal error: Oops: 80000005 [#1] PREEMPT SMP

and bla bla bla...

This problem seems solved in 4.0.0 release. With this version it is possible to reach 1Ghz clock.


login: user
password: user

Installing UBUNTU ONEIRIC

The file system is bundled in the package L3.0.35_4.0.0_UBUNTU_RFS.
Instead of expand rootfs of the demo image it is possible to extract the ubuntu_oneiric_4.0.0.tgz image on SD-Card.
Install additional package according to i.MX_6Dual6Quad_Sabre-AI_Linux_User_Guide.pdf

Installing LINARO 12.09

Using information in http://boundarydevices.com/linaro-12-09-for-i-mx6/

In testing, but it seems to work correctly.

Other Installation:

Here: http://boundarydevices.com/imx6-builds/


Boot using SD CARD


According to SABRE_AI_User_Guide_L3.0.35_1.1.0.pdf, locate the three dip switches and set up as follow:

D1
D2
D3
D4
D5
D6
D7
D8
D9
D10
S1
X
X
X
OFF
ON
X
X
X
X
X
S2
X
OFF
ON
OFF






S3
OFF
OFF
ON
OFF







Insert the SD Card with OS in the SD/MMC slot on CPU board.


Booting Sequences

Debug Console Actually the RS232 connector J18 is the primary debug device. It is a 115200 serial connection (no HW/SW flow control).

uboot (4.0.0)

        

U-Boot 2009.08 (Apr 25 2013 - 01:15:30)

CPU: Freescale i.MX6 family TO1.2 at 792 MHz
Thermal sensor with ratio = 184
Temperature: 23 C, calibration data 0x58b4ef7d
mx6q pll1: 792MHz
mx6q pll2: 528MHz
mx6q pll3: 480MHz
mx6q pll8: 50MHz
ipg clock : 66000000Hz
ipg per clock : 66000000Hz
uart clock : 80000000Hz
cspi clock : 60000000Hz
ahb clock : 132000000Hz
axi clock : 264000000Hz
emi_slow clock: 132000000Hz
ddr clock : 528000000Hz
usdhc1 clock : 198000000Hz
usdhc2 clock : 198000000Hz
usdhc3 clock : 198000000Hz
usdhc4 clock : 198000000Hz
nfc clock : 24000000Hz
Board: i.MX6Q-SABREAUTO: unknown-board Board: 0x63012 [POR]
Boot Device: SD
I2C: ready
DRAM: 2 GB
MMC: FSL_USDHC: 0,FSL_USDHC: 1,FSL_USDHC: 2,FSL_USDHC: 3
In: serial
Out: serial
Err: serial
Net: got MAC address from IIM: 00:04:9f:20:76:bd
FEC0 [PRIME]

Now, hitting any key it is possible to configure uboot, as follow:
setenv loadaddr 0x10800000
setenv bootargs_base 'setenv bootargs console=ttymxc3,115200'
setenv bootargs_mmc 'setenv bootargs ${bootargs} root=/dev/mmcblk0p1 rootwait rw video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666 video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24'
setenv bootcmd_mmc 'run bootargs_base bootargs_mmc;mmc dev 2;mmc read ${loadaddr} 0x800 0x2000;bootm'
setenv bootcmd 'run bootcmd_mmc'
saveenv
run bootmcd

To limit cores speed use this line:

setenv bootargs_base 'setenv bootargs console=ttymxc3,115200 arm_freq=800'

To Disable LVDS:

setenv bootargs_mmc 'setenv bootargs ${bootargs} root=/dev/mmcblk0p1 rootwait rw video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 video=mxcfb1:off'

linux kernel (4.0.0)

MMC read: dev # 2, block # 2048, count 8192 ... 8192 blocks read: OK
## Booting kernel from Legacy Image at 10800000 ...
Image Name: Linux-3.0.35-2508-g54750ff
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 3860824 Bytes = 3.7 MB
Load Address: 10008000
Entry Point: 10008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK

Starting kernel ...



Check OS/Testing the system

# uname -a
Linux freescale 3.0.35-2310-gc27cb38 #1 SMP PREEMPT Tue Dec 18 17:23:15 CST 2012 armv7l GNU/Linux

Configure network manually

# ifconfig eth0 up
# ifconfig eth0 <ip address>
# route add default gw <address>
# echo "nameserver <dns addres>" > /etc/resolv.conf 

In Ubuntu is possible to disable Network Manager and modify network scripts.

Mount NFS file system

# mount -t nfs -o nolock <host>:<dir> nfs

CPU Frequency

1. check CPU frequency

# cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq

2. change CPU frequency
# echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# echo 792000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed

Enabling USB OTG

I do not know.
Anyway USB HOST is locate on USB1 J30. Mouse tested to work. Keyboard in progress. [Release 1.1.0]

Distro/Cross Compile/ToolChain

FREESCALE LTIB 4.0.0

All information can be found on Setting_Up_LTIB_Host.pdf and seems that, officially, only ubuntu 9.04 is supported, so a VM (es VirtualBOX) is highly suggested.
Ubuntu 9.04 now is in http://old-releases.ubuntu.com so require to set up sources.list and I had some trouble to install texinfo. I tested both Ubuntu 10.04 or 11.10 (32 and 64 bit) and they work fine.
It is important to read carefully the Setting_Up_LTIB_Host.pdf document. A copy of the script for install all the package required by LTIB can be downloaded from here

NOTE To install also X11 SDK the following package is required:

sudo apt-get install xsltproc

Download i.MX 6Quad and i.MX 6Dual Linux BSP Source Code Files (in this case L3.0.35_4.0.0_130424_source.tar.gz) extract it, and run install

About 4Gb of free space are required (6Gb for build GNOME)

After ltib complete building in the ltib folder there are
- rootfs [the complete file system, unstripped, contains additional files]
- rootfs_image [a jffs2 image or better a ext2.gz]

uboot and linux kernel are in rootfs/boot, rootfs.ext2.gz have to be ungizipped and installed according to section Installing DEMO IMAGE.

New Distro

Unfortunately on my distro, a Debian Jessie, LTIB cannot be installed at this moment.

Information on patch LTIB on recent distro can be found here but seems that those are not enough for my Debian.

After ran ./ltib command, the installation stopped with error:

Exiting on error or interrupt
Please see >> [...]/ltib/host_config.log for details

Some hint can be found here: https://community.freescale.com/docs/DOC-1442 or here: http://vijay496.blogspot.in/2012/03/ltib-for-ubuntu-1110-error-faced.html

1) I installed patch according to https://community.freescale.com/docs/DOC-93455

2) m4 have to be patched: http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/sys-devel/m4/files/m4-1.4.16-no-gets.patch
./stdio.h:477:1: error: 'gets' undeclared here (not in a function)

3) I patched ./dist/lfs-5.1/wget/wget.spec adding --without-ssl to ./configure line

4) mconf continue to be not possible to be found and the patch not work:

$cmd .= "--force-debian " if $rpm =~ m/rpm-fs/ && `uname -a` =~ m/ubuntu/i;

or

$cmd .= "--force-debian " if $rpm =~ m/rpm-fs/ && `uname -a` =~ m/debian/i;
to ltib script (before $cmd .= "--define '_tmppath $cf->{tmppath}' ";)


Also on Ubuntu 12.04 the patch file seems to be not enough to install LTIB and additional fixes are required.

Configure LTIB

Selection: imx6q

board: mx6q_sabreauto

u-boot: 2009.08 works (2012.10 cannot be found on bitshrine)

kernel: 3.0.35 works (3.5.7 cannot be found on bitshrine)

BOUNDARY DEVICE LTIB

http://boundarydevices.com/ltib-4-0-0-images/ is in testing. Use it with L3.0.35_4.0.0_DEMO_IMAGE uboot and kernel.

UBUNTU ONEIRIC

Based on Linaro 11.10:

Welcome to Linaro 11.10 (development branch) (GNU/Linux 3.0.35-2508-g54750ff armv7l)

It is possible to build using gcc directly on board, but it is not possible to cross-compile.

username: linaro
password: linaro

Yocto

Yocto works greatly.
I followed the instruction on https://community.freescale.com/docs/DOC-93844 to create environment for imx6qsabreauto.

I am using

 umask 002


There are 3 images available for yocto IMX6:

The image can be build using

# bitbake fsl-image-test

or

# bitbake fsl-image-gui

and I moved the built image on sd-card with

# dd if=<image.sdcard> of=<memory card>

U-Boot actually reports:

U-Boot 2012.10-00994-g7e6c682 (May 01 2013 - 21:52:59)                       

CPU: Freescale i.MX6Q rev1.2 at 792 MHz
Reset cause: POR
Board: MX6Q-Sabreauto revA
DRAM: 2 GiB
WARNING: Caches not enabled
MMC: FSL_SDHC: 0
*** Warning - bad CRC, using default environment

In: serial
Out: serial
Err: serial
Net: FEC [PRIME]
Warning: FEC using MAC address from net device

To limit clock and setup HDMI

setenv mmcargs 'setenv bootargs console=${console},${baudrate} root=${mmcroot} arm_freq=800 video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 video=mxcfb1:off'

Username: root
Password: [no pwd, press only enter]

Test distro:

root@imx6qsabreauto:/# uname -a
Linux imx6qsabreauto 3.0.35-12.09.01+yocto+g0596856 #1 SMP PREEMPT Wed May 1 21:01:48 CEST 2013 armv7l GNU/Linux

The SDK fsl-image-gui-sdk actually [8maj2013] not build due to some issue with cogl and vivante gpu, in particular during mesa-demos building:

.../rootfs_builder/build/tmp/sysroots/imx6qsabreauto/usr/include/GL/osmesa.h:119:1: error: unknown type name 'GLAPI'

etc etc


To have an SDK try with

# bitbake meta-toolchain

and install it using the .sh script.

In this case you can test the environment with

# source /opt/poky/1.3.1/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi 
# $CC --version
arm-poky-linux-gnueabi-gcc (GCC) 4.7.2

GCC Flags

yocto fsl set the default flags in ${CXX} to

-march=armv7-a     -mthumb-interwork -mfloat-abi=softfp -mfpu=neon -mtune=cortex-a9

gcc complete flags can be:

- for softfp system (or multilib)

-mthumb -O3 -march=armv7-a -mcpu=cortex-a9 -mtune=cortex-a9 -mfpu=neon -mvectorize-with-neon-quad -mfloat-abi=softfp

-for hardfp system (or multilib)

-mthumb -O3 -march=armv7-a -mcpu=cortex-a9 -mtune=cortex-a9 -mfpu=neon -mvectorize-with-neon-quad -mfloat-abi=hard

Using Vivante GPU with OpenCL

Tutorial here: https://community.freescale.com/docs/DOC-93984

I.MX_6DL_S_VIVANTE_VDK_TOOLS

Resources

[1] FreeScale Website or https://community.freescale.com/docs/DOC-94809
[2] http://boundarydevices.com/
[3] www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX6_SW
[4] www.cnx-software.com/2012/11/18/freescale-i-mx6-resources-development-boards-documentation-source-code-and-tools/
[5] www.eewiki.net/display/linuxonarm/i.MX6x+SABRE+Lite?focusedCommentId=13599622

Last Update: 19 JUL 2013