LTIB on i.MX6 without X

Our previous LTIB images for i.MX6 have all been re-packaged versions of the binaries released by Freescale.

We just uploaded the first that we actually built ourselves. You can download it from here:

To install it, simply download and extract onto a single-partition SD card like so:

~/$ echo ,,83 | sudo sfdisk /dev/mmcblk0
~/$ sudo mkfs.ext3 -L ltib-12.09 /dev/mmcblk0p1 && sync
~/$ udisks --mount /dev/mmcblk0p1
~/$ sudo tar -C /media/ltib-12.09/ -zxvf ltib-12.09-20121218.tar.gz
~/$ sync && sudo umount /media/ltib-12.09
For those of you who have gone through the process, LTIB can be quirky and has a number of host-system dependencies that can get in the way of a successful build.

The following is a list of the hurdles we had to overcome during the build process.

The LTIB image contains our latest non-Android kernel from Github and the latest version of U-Boot.

The LTIB configuration itself includes G-Streamer acceleration and the Vivante GPU demos and is configured to provide a login on /dev/tty0. Additional details are available in the file README.ltib in the root of the tar-ball.


40 Responses to “LTIB on i.MX6 without X”

  1. chrismurf December 18, 2012 7:56 pm #

    You say “latest non-android kernel”, but your link goes to a branch with “android” in the name. If I build that kernel with the nitrogen6x defconfig, will I get the same kernel? Is that a typo? Am I confused? Thanks!

    • ericn December 18, 2012 8:44 pm #

      Hi Chris,

      Good catch! It appears that I let auto-complete point me at the wrong thing.

      I’ve updated the link above, so that it points at our “boundary-L3.0.35_12.09.01_GA” branch.

      We really gotta figure out shorter names…

  2. ericn December 19, 2012 11:29 am #

    Note that the first instance of this image (ltib-12.09-20121218.tar.gz) was missing a glib patch from Rogerio.

    The 20121219 tar-ball fixes this.

  3. marko December 27, 2012 6:25 pm #

    Not all easy sailing. Some warnings I’m not sure I need to pay attention on.

    MX6Q SABRELITE U-Boot > run upgradeu
    Card did not respond to voltage select!
    mmc0(part 0) is current device
    MMC: block number 0x1 exceeds max(0x0)
    ** Can’t read from device 0 **

    ** Unable to use mmc 0:1 for fatload **
    ** Bad partition 1 **
    mmc1 is current device
    reading /6q_upgrade

    ** Unable to read “/6q_upgrade” from mmc 1:1 **
    Loading file “/6q_upgrade” from mmc device 1:1 (xxb1)
    ** File not found /6q_upgrade

    Also, should I rename the 6x_upgrade on memory card to 6q_upgrade?

    • ericn December 27, 2012 6:35 pm #

      Hi Marko,

      Sorry about that. I didn’t include a 6q_upgrade in this package, since the focus was on the userspace, not U-Boot.

      If you want to upgrade U-Boot, I suggest using the files in the package here:

      The blog post describing the upgrade process is here.

      • marko December 27, 2012 7:27 pm #

        Thanks! Now this LTIB is up and running here.

      • Marko December 28, 2012 10:45 am #

        If I want to modify kernel boot parameters, specifically add vt.global_cursor_default=0, can I modify 6x_bootscript directly or should I use

        • ericn December 28, 2012 11:10 am #

          Hi Marko,

          You can’t edit the bootscript directly because of the CRC in the header. The source text file is in this file.

          You can edit it, then use bootscript.php to convert it for you.

  4. Dennis January 2, 2013 2:09 pm #

    I’m trying to get the image running but I keep getting an error while trying to mount mmcblk0p1 as the root filesystem:

    VFS: Cannot open root device “mmcblk0p1″ or unknown-block(179,1)
    Please append a correct “root=” boot option; here are the available partitions:
    1f00 768 mtdblock0 (driver?)
    1f01 8 mtdblock1 (driver?)
    1f02 1272 mtdblock2 (driver?)
    b300 15558144 mmcblk0 driver: mmcblk
    b301 15557631 mmcblk0p1 00000000-0000-0000-0000-000000000000
    Kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(179,1)

    I do see the driver come up (from earlier in the log):

    sdhci: Secure Digital Host Controller Interface driver
    sdhci: Copyright(c) Pierre Ossman
    mmc0: SDHCI controller on platform [sdhci-esdhc-imx.2] using DMA
    sdhci sdhci-esdhc-imx.3: no write-protect pin available!
    mmc1: SDHCI controller on platform [sdhci-esdhc-imx.3] using DMA
    mxc_vdoa mxc_vdoa: i.MX Video Data Order Adapter(VDOA) driver probed
    VPU initialized
    mxc_asrc registered
    Thermal calibration data is 0x58e5523a
    anatop_thermal_counting_ratio: raw25c=1422 raw_hot=1362 hot_temp=58
    Anatop Thermal registered as thermal_zone0
    anatop_thermal_probe: default cooling device is cpufreq!
    usb 2-1: new high speed USB device number 2 using fsl-ehci
    mmc0: new high speed SDHC card at address aaaa
    mmcblk0: mmc0:aaaa SU16G 14.8 GiB (ro)
    mmcblk0: p1

    I have tried 3 different SD cards, two give this error but one card (a 1Gig) wasn’t discovered by u-boot, also there is no display available.

    Any ideas?
    Thank you,

    • ericn January 2, 2013 2:21 pm #

      Hi Dennis,

      It appears that the SD card is coming up as read-only:

      mmcblk0: mmc0:aaaa SU16G 14.8 GiB (ro)

      Are you using the full-sized slot on a SABRE Lite? If so, please check the write-protect tab.

      If not, can you run an fsck on the card?

      • Dennis January 2, 2013 2:41 pm #

        Hi Eric,

        I’m using full sized cards.
        The write protect tab is off (I can write the image and I tried writing a file from the host).
        I have already run fsck on one card (without -f though), so I just tried fsck -f /dev/sdb1 for all 3 cards, and they’re ok.
        The R/O is puzzling, though. I have the u-boot (2013.01-rc1-02392-ge86d319) loaded. Is there a way to try writing to the SD card with it? It reads the card (mmc dev 0; ext2ls mmc 0:1) properly (as well as loading the script/kernel).

        Thank you for your quick response!

      • Denn January 2, 2013 2:55 pm #

        Hi Eric,

        I think I found it – the SD3 connector seems to have a cold solder joint on the far left pin. I held it down and reset, and the image came up!

        Thank you,

        • ericn January 2, 2013 3:00 pm #

          Thanks for the note, Dennis, and sorry for the trouble.

          Let us know if you’d like us to swap it out.

          • Martin September 10, 2013 8:13 am

            I had the same unsoldered joints on the two far left pins. Maybe there’s a production problem.

            I just soldered them and my full size SD card is mounted in RW mode.

  5. Ron January 8, 2013 10:51 am #

    I installed the new release and am using gstreamer for my work on my sabrelite. The decoder
    test from file worked as did the test to see the usb camera: gst-launch v4l2src ! mfw_v4lsink
    But for some reason the encode test from usb camera did not work. I post it here since
    it did work with the previous ubuntu os I was using. Below is the command I uses along with
    the output. I would prefer not to go back to the bloated ubuntu. Thanks.


    gst-launch v4l2src num-buffers=-1 ! queue ! vpuenc codec=0 ! matroskamux ! filesink location=output.mkv sync=false

    Setting pipeline to PAUSED …
    [INFO] Product Info: i.MX6Q/D/S
    vpuenc versions :)
    plugin: 3.0.2
    wrapper: 1.0.24(VPUWRAPPER_ARM_LINUX Build on Dec 18 2012 07:12:03)
    vpulib: 5.4.6
    ERROR: Pipeline doesn’t want to pause.
    ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Could not negotiate format
    Additional debug info:
    gstbasesrc.c(2787): gst_base_src_start (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
    Check your filtered caps, if any
    Setting pipeline to NULL …
    Freeing pipeline …

    • ericn January 8, 2013 11:18 am #

      Hi Ron,

      I suspect that the issue has to do with the kernel configuration. Specifically, I suspect that the UVC drivers aren’t included in this release. You can verify that by looking in /proc/config.gz.

      root@boundary ~$ zcat /proc/config.gz | grep USB | grep VIDEO
      # CONFIG_VIDEO_PVRUSB2 is not set
      # CONFIG_VIDEO_USBVISION is not set

      If you have a kernel that’s working on an Ubuntu release, you should be able to copy it over. If the UVC drivers were compiled as modules, you’ll need to copy /lib/modules/ as well.

      • Ron January 8, 2013 11:29 am #

        Thanks for getting back to me so fast. The result of the zcat was exactly the
        output you showed. I am not sure if this is good or bad. If bad then what
        do I need to copy over? What seems odd about this is that I can get video
        input from the USB camera when I display it right to the screen. It only fails
        when I try to send it to the encoder.
        This always worked: gst-launch v4l2src ! mfw_v4lsink


        • ericn January 8, 2013 12:44 pm #

          Hi Ron,

          If the vrl2src ! mfw_v4lsink thing works, then never mind about the USB camera driver. It’s obviously working.

          Then the question is, what isn’t. I haven’t used the vpuenc element against a USB camera, so I’m at a loss. If the pipeline is working under Ubuntu, I’d recommend comparing the output from gst-inspect vpuenc on each version to see if the interface has changed. You might need to fill in some additional details before it can negotiate format.

          What color-space does your camera return?

          • Ron January 8, 2013 1:02 pm

            The “gst-inspect vpuenc” returns the same for both with the exception of the version number being
            3.0.1 on the ubuntu and 3.0.2 on the newer linux w/0 X version. Cam is Logitech Pro 9000.


      • Ron January 8, 2013 12:45 pm #

        The previous ubuntu release had the same results from the zcat /proc/config.gz
        I poked for differences and I noticed differences in the plugin, wrapper, and firmware
        Original version on ubutu version:
        vpuenc versions :)
        plugin: 3.0.1
        wrapper: 1.0.24(VPUWRAPPER_ARM_LINUX Build on Sep 7 2012 20:27:33)
        vpulib: 5.4.6

        On new linux version
        vpuenc versions :)
        plugin: 3.0.2
        wrapper: 1.0.24(VPUWRAPPER_ARM_LINUX Build on Dec 18 2012 07:12:03)
        vpulib: 5.4.6

  6. February 4, 2013 6:34 pm #

    Newbie here, please be gentle. Downloaded this package and got it booting. Now I need to login using the ‘freescale’ login and password. What is the login and password I need for this package? Tried all the common variants to no avail.

    • ericn February 4, 2013 8:23 pm #

      Easiest question of the day… The root password is Boundary. This comes up often enough that it has it’s own page here.

      We do this mainly so that openssh will allow root login (it won’t without a password).

  7. Ron March 11, 2013 9:01 am #

    I want to compile applications on the sabrelite platform with this OS (not cross-compile). Which gcc do I
    install for native compiles and what options are needed to get best performance from the device?

  8. synthnassizer March 15, 2013 9:45 am #

    Hi there,
    I have successfully untar’ed the LTIB image on a microSD card and boot into it.
    I seem to have difficulty though to do the same, with the same rootfs & kernel by trying to boot from nfs.
    The boot procees stops at

    VFS: Mounted root (nfs filesystem) on device 0:13.
    Freeing init memory: 192K

    so the rcS script is not run. Do you have a reason why this happens? Thank you very much for your help.

  9. synthnassizer March 15, 2013 12:11 pm #

    correction on previous post.
    The system actually boots butREALLY REALLY slowly.

    Freeing init memory: 212K
    starting pid 1386, tty ”: ‘/etc/rc.d/rcS’
    Mounting /proc and /sys
    Starting the hotplug events dispatcher udevd
    pwm_config: pwm freq = 32786, clk_select=2 clock_rate=22000000
    pwm_config: pwm freq = 20000, clk_select=2 clock_rate=22000000
    udevd (1395): /proc/1395/oom_adj is deprecated, please use /proc/1395/oom_score_adj instead.
    Synthesizing initial hotplug events
    camera_reset: power_gp=0x6, reset_gp=0x8 reset_gp2=0xab
    mx6_csi0_powerdown: powerdown=0, power_gp=0x6
    ov5642_read_reg:write reg error:reg=300a
    ov5642_probe:cannot find camera
    Setting the hostname to freescale
    Mounting filesystems
    Booted NFS, not relocating: /tmp /var
    Starting the ssh server:
    /var/empty must be owned by root and not group or world-writable.
    Running sysctl
    Setting up networking on loopback device:
    Setting up networking on eth0:
    udhcpc (v1.20.2) started
    Sending discover…
    Sending select for…
    Lease of obtained, lease time 86400
    nfs: server not responding, still trying

    I don’t know what is going on, but quite possibly some interrupt is being served and doesn’t leave any room userspace commands to be executed. I do not know what happened in the end with the nfs server – it surely is still up..

    • ericn March 15, 2013 12:46 pm #

      Can you forward your kernel command-line?

      Are you using the ‘tcp’ option for NFS (i.e. nfsroot=,v3,tcp)?

      How about the enable_wait_mode=off flag?

      • synthnassizer March 15, 2013 1:10 pm #

        hi ericn,
        I have kept the original uboot (2009.08) for now and only modified the relevant boot variables. so uboot > print , gives (showing the relevant bits only):

        bootargs_nfs=setenv bootargs ${bootargs} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp
        bootcmd_net=run bootargs_nfs;tftpboot ${loadaddr} ${kernel}; bootm
        bootcmd=run bootcmd_net

        tcp is in, enable_wait_mode=off is off…

        if i do add enable_wait_mode=off after tcp, booting will stop a little earlier

        IP-Config: Got DHCP answer from, my address is
        IP-Config: Complete:
        device=eth0, addr=, mask=, gw=,
        host=imx6_armboard, domain=, nis-domain=(none),
        bootserver=, rootserver=, rootpath=

        right here.. it will stop and not continue (at least not within a few seconds) to the following

        VFS: Mounted root (nfs filesystem) on device 0:14.
        devtmpfs: mounted
        Freeing init memory: 212K

        which it goes to quickly otherwise

  10. synthnassizer March 19, 2013 9:41 am #

    Hi ericn,
    I need to know the toolchain that you used to build this LTIB rootfs.
    I am trying to debug an application running on a sabre lite board.
    I built the application using the gcc-linaro-arm-linux-gnueabi-2012.04-20120426_linux toolchain.
    but the application exits as soon as a thread is spawned. I verfied this in gdb, using both the Linaro and the rootfs runtime libraries.

    I am hoping it has something to do with the library’s differences…

    • ericn March 19, 2013 10:19 am #

      We used the LTIB-provided defaults, which looks like it’s not the
      Linaro toolchain by default, and appears to be using eglibc:

  11. kguilbert April 17, 2013 9:10 am #

    Can I get a copy of your LTIB distro with the patchset for this image somewhere?

  12. jkrupp August 28, 2013 6:57 am #

    What should MACHINE= while building this? I’m using the BD-SL-i.MX6. During link, I’m getting

    ld: cannot represent machine ‘arm:wandboard-dual’


    • ericn August 28, 2013 7:14 am #

      Hi Jeffrey,

      Note that this is an older image. You likely want the 4.0.0 version and the SABRE machine.

      I placed tar-balls of the configurations on-line at:

      You should be able to extract them into the root of your LTIB install and have things configured in the same way as we did.

  13. kimokono July 14, 2014 9:51 pm #

    I did follow the above mentioned instruction but after inserting the sd card into nitrogen 6x board it doesn’t boot. just black screen

    • bdbdbd October 24, 2014 2:48 am #

      I got exactly the same on my Nitrogen6_lite board. I ran this:

      for dtype in mmc ; do for disk in 0 1 ; do ${dtype} dev ${disk} ;for fs in fat ext2 ; do ${fs}load ${dtype} ${disk}:1 10800000 /6x_upgrade && source 10800000 ; done ; done ; done

      and now it’s bricked. :-(

      • ericn October 24, 2014 8:02 am #

        The 6x_upgrade script should normally be used with a bootfile= parameter to specify the file.

        Without that, it will load u-boot.imx and it’s up to you to make sure that this was built for the board and memory configuration you have. This image was built in Decemlber 2012, i.e. before we created Nitrogen6_Lite.

        Steps for unbricking are here.

        The latest version of U-Boot is here (2014.07).

  14. bdbdbd October 24, 2014 3:26 am #

    Using my own U-Boot and my own U-Boot bootargs, I’ve got this booting.

    I run
    “export GST_PLUGIN_PATH=/usr/lib/gstreamer-0.10:/usr/lib/imx-mm/video-codec:/usr/lib/imx-mm/audio-codec”
    because this image you have provided does not have the paths set up correctly. Without the GST_PLUGIN_PATH you get these error messages with gst-inspect:

    (gst-plugin-scanner:2497): GStreamer-CRITICAL **: gst_pad_template_new: assertion `caps != NULL’ failed
    (gst-plugin-scanner:2497): GStreamer-CRITICAL **: gst_element_class_add_pad_template: assertion `GST_IS_PAD_TEMPLATE (templ)’ failed

    The I run gst-inspect-0.10 and get 86 good plugins but 11 blacklisted plugins. Why are these blacklisted? How do I unblacklist them?

    root@freescale ~$ gst-inspect-0.10 -b
    Blacklisted files:

    Total count: 11 blacklisted files

    I thought that this image was meant to be a good one??

    • ericn October 24, 2014 7:57 am #

      These files are software codecs for other i.MX boards that don’t have VPU.

      I believe that these are also compiled with soft-float, so they won’t load on hard-float images.

      Finally, this image was a good image, but is a bad place to start now, since it’s woefully old.

Leave a Reply