We’ve just uploaded a new image of Ubuntu Trusty for our i.MX6 boards that contains some nice new features that deserve some explanation.
Since the the initial release contains proper packaging, you could upgrade using sudo apt-get update, sudo apt-get dist-upgrade, and sudo apt-get install of a couple of packages (chromium-webgl and nitrogen-firmware).
This is a little inconvenient, though, and an updated image is easier.
For the impatient
This image contains Freescale-licensed content, so you will need to register on our web-site and log in before you can accept the license agreement and download the image from here:
This image contains support for all of our publicly available i.MX6 boards, though using it with the Nitrogen6 Lite requires a couple of tweaks (described below).
Programming the image
The image is a slightly-less-than-4GiB image file containing the partition table, so you can copy it to an SD card or SATA drive on /dev/sdc using zcat and dd like so:
~/Downloads$ sudo umount /dev/sdc* ~/Downloads$ zcat 20140925-nitrogen*.img.gz | sudo dd of=/dev/sdc bs=1M ~/Downloads$ sync
Or you can use Alex Page’s USB Image Tool under Windows.
If you’re using our latest U-Boot and a Nitrogen6 Max board, you can use the new USB Mass Storage Gadget to program the eMMC. If not, there were some notes in our first release that describe a more complicated way of programming eMMC.
Source code access
The kernel image is based on the boundary-imx_3.10.17_1.0.1_ga branch of our Github kernel repository using nitrogen6x_defconfig, tweaked slightly to include support for the Broadcom 4331 Wi-Fi/Bluetooth module on our Nitrogen6 Lite board.
- The Chromium web browser is now accelerated (WebGL and preliminary video decode).
- Now supports WiFi and Bluetooth (with some caveats) on Nitrogen6 Lite.
- Includes the latest GPU patches from the Freescale 3.10.17_1.0.1 release.
- It boots faster through the use of allow-hotplug for the ethernet device
- Full BlueZ (and GUI) support for Bluetooth on Nitrogen6x and Nitrogen6_Max boards.
Chromium Browser acceleration
Several Desktop shortcuts highlight support for various features of the Chromium Browser.
WebGL:

And HTML5:

And HTML5 video acceleration.

Note that H.264/MP4 video is not yet working.
Many thanks to Carlos Giani for all of his hard work integrating i.MX acceleration into the Chromium browser.
Bluetooth support on Nitrogen6x/6Max
On the Nitrogen6X and Nitrogen6_Max boards, the Bluetooth stack is fully integrated using the BlueMan package, as shown in the following screen-shot:

Using this image on Nitrogen6_Lite
There are a few quirks to the use of this image on Nitrogen6 Lite.
In particular:
- The boot script requires variable dtbname in order to identify the board as a Nitrogen6_Lite,
- The default settings of 128MiB of GPU memory are excessive, since the Nitrogen6_Lite board only has 512MiB, and
- The Bluetooth stack is not fully integrated, and conflicts with the Nitrogen6X/6Max boards because a different chip is used.
We have a fairly easy work-around for the first two in the form of a text file named /uEnv-nit6xlite.txt. The boot script is configured as shown here to look for a file named uEnv.txt and read a set of environment variables from the file if found using the env import command of U-Boot.
If you re-name or copy the file uEnv-nit6xlite.txt to uEnv.txt on the SD card after you copy from the image downloaded, you’ll tell U-Boot to read these two variables:
gpumem=67108864 dtbname=imx6dl-nit6xlite.dtb
You can also set these at the U-Boot prompt by using the setenv command, but that’s just a tad harder, and requires access to a serial adapter:
U-Boot > setenv gpumem 67108864 U-Boot > setenv dtbname imx6dl-nit6xlite.dtb U-Boot > saveenv
The Bluetooth conflict is overcome by manually installing a package named brcm-patchram-plus-boundary that has the tool needed to connect the Broadcom Bluetooth device to the Bluetooth subsystem:
root@nitrogen:~# apt-get install brcm-patchram-plus-boundary root@nitrogen:~# sync && reboot ...
The full Bluetooth stack is not (yet) functional, though, so we’ve limited testing to the use of the command-line tools:
root@nitrogen:~# hciconfig hci0 hci0: Type: BR/EDR Bus: UART BD Address: 00:00:00:00:00:00 ACL MTU: 1021:8 SCO MTU: 64:1 DOWN RX bytes:574 acl:0 sco:0 events:27 errors:0 TX bytes:411 acl:0 sco:0 commands:27 errors:0 root@nitrogen:~# hciconfig hci0 up root@nitrogen:~# hcitool -i hci0 scan Scanning ... C4:85:08:01:FB:E3 devicename
This is effectively the same situation we were in with the TiWi Bluetooth module in our first release, so we’re making progress!
Keep in touch
We hope this helps you get started running on Ubuntu and our i.MX6 boards.
As always, please give us some feedback and let us know how things work for you.

Comments 29
Hi ericn,
When do you think that H.264 will be ready? What are the problems? thanks!
Regards,
Mario
Hi Mario,
Because chromium dropped H.264 support long ago. Chrome supports it. We have to find a way how to get it back, while we don’t break any license.
Maybe ffmpeg will be the way.
Because MP3 and H.264 codecs are licensed under the GPL in ffmpeg. Or maybe I find something else, something better. Because ffmpeg is not part of ubuntu anymore, it wouldn’t be so painless to resurrect it.
We will see.
Please be patient a little bit, I’m on it.
Laci
Hi Eric/Laci,
I’m running a Nitrogen6q SoM/Carrier. I installed this latest Trusty image on a 4GB uSD and I have 2 questions:
1. The kernel doesn’t recognize the wireless chip. Is the imx6q-nitrogen6x.dtb correct for the SoM?
root@nitrogen [~] 77> dmesg | grep wl
348:rfkill_gpio wlan_bt_rfkill.39: wlan_bt_rfkill device registered.
376:wl1271_sdio mmc0:0001:2: legacy platform data not found, trying device tree
397:wlcore: ERROR couldn’t get hw info
2. I have a monitor connected via HDMI that is capable of 1600×1200. No matter what I do, it comes up with a virtual of 640×480. I’ve modified the 6x_bootscript to go with 1600×1200, 1440×900 and 1280×1024 with no difference.
ubuntu@nitrogen [~] 2> xrandr –verbose
Screen 0: minimum 240 x 240, current 640 x 480, maximum 8192 x 8192
DISP3 BG connected 640×480+0+0 (0x40) normal (normal left inverted right x axis y axis) 0mm x 0mm
Identifier: 0x3f
Timestamp: 12079
Subpixel: unknown
Gamma: 1.0:1.0:1.0
Brightness: 0.0
Clones:
CRTC: 0
CRTCs: 0
Transform: 1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000
filter:
V:640x480p-60 (0x40) 25.2MHz -HSync -VSync -CSync *current +preferred
h: width 640 start 656 end 752 total 800 skew 0 clock 31.5KHz
v: height 480 start 490 end 492 total 525 clock 60.0Hz
Thanks for any help!!!!!
Bob
Hi Bob,
At the resolution settings :
Stop booting at the u-boot with keypress, and then type this :
Hi Laci,
That worked great! You are a wizard!
Hopefully, I’m not pushing my luck in asking for an answer about the wireless interface.
Thanks,
Bob
Hi Bob,
Eric is coming soon, he is the grand-wizard. I don’t wanna answer silly things to that question.
Laci
Hi Laci,
We seem to be having similar-ish problems with inconsistent wifi module behavior. We are running a Nitrogen6X SOM / carrier board with this version of ubuntu trusty and are trying to use the tiwi-ble wifi module with limited success. There are a couple of failure cases:
1. The module is not recognized on startup, the console reports:
wlcore: ERROR couldn’t get hw info
And Linux doesn’t see the wlan0 interface.
2. Sometimes on startup the console repeatedly generates the following messages endlessly, and we also dont get a wlan0 interface:
wl1271_sdio mmc0:0001:2: sdio write failed (-110)
wl1271_sdio mmc0:0001:2: sdio write failed (-84)
wl1271_sdio mmc0:0001:2: sdio write failed (-84)
wlcore: ERROR firmware boot failed despite 3 retries
3 Sometimes the module comes up with a wlan0 interface but then loses connectivity after several minutes or hours and just doesn’t work until a reset (provided that #1 or #2 doesn’t happen). The messages that we see are:
wl1271_sdio mmc0:0001:2: sdio write failed (-84)
wlcore: ERROR failed to send stop firmware logger command
wlcore: ERROR firmware boot failed despite 3 retries
Or similar failure as #2 we sometimes see these messages repeat constantly on the console when the WiFi module is lost:
wl1271_sdio mmc0:0001:2: sdio read failed (-110)
wlcore: ERROR failed to send stop firmware logger command
wl1271_sdio mmc0:0001:2: sdio write failed (-84)
wlcore: ERROR failed to send stop firmware logger command
I am not sure the state of the driver and WiFi module, so I apologize for my question if this module is new and untested. But could you point me in the direction of some things that I can try to diagnose these issues.
My goal is to test our system with the WiFi module, so if there is a better OS version that I should work with please let me know, that would be fine too.
Thanks,
FC
Author
Hello FC,
We appear to have an issue with WiFi on the SOM carrier in kernel version 3.10.17 and we’re taking a look at it.
At first glance, it appears that we missed something during the transition from a board file to device tree.
Author
Laci is fast! He’s already updated the kernel, so you should be able to get WiFi running on your SOM board by using apt:
Of course, you’ll have to use ethernet for that ;).
Author
Hello Bob and FC,
Troy found the issue with the SoM carrier board and Wi-Fi. The drive strength settings for the SDIO lines needed to be increased:
https://github.com/boundarydevices/linux-imx6/commit/bed3f6a3741ee09cfc767d9628148269ed4fcb12
We’ll update the kernel soon so that you can apt-get dist-upgrade to pull it in, but in the mean-time, you can try this DTB:
If you copy it into the /boot directory, you should find that WiFi works for you.
Sorry for the hassle.
Hi Eric,
Regarding the process for calibrating the chip to set the mac address?
I found the instructions here:
http://boundarydevices.com/differences-sabre-lite-nitrogen6x-and-som/#comment-141127
But I was curious if the calibrator tool should be built from source, or if it is available as a binary.
Thanks
Hi Laci,
Runs fine on my old Sabre Lite (18-18-11) except for the known HDMI “no signal” issue as mentioned in the initial release comments. Not a real problem for me as I was planning on using it headless as an audiostreamer using squeezelite.
For better audio quality I’m using a USB sound card (Behringer UCA222) which is recognized by the kernel (lsmod). Unfortunately the kernel does not seem to have snd_usb_audio included (modprobe snd_usb_audio fails).
Would be great if snd_usb_audio could be included.
Ian
Hi,
I’m using this image with the nitrogen6x board (U-Boot updated at the latest version 22/09/2014). I have noticed when the hdmi monitor is connected, the unit log automatically but when no monitor is connected to the board it doesn’t log automatically (it ask for username and password on the serial terminal).How can we log automatically when no display is connected to the board? Do we have to modify the bootscript to do this?
Thanks in advance
Alex.
Hi Alex,
Yes you have to. In the bootscript, it checks for the existence of HDMI display. When its unplugged, it won’t set it, and later it wont start LXDE, because of that. Of course the whole system is running in the background, we are talking about the desktop only.
If you want your HDMI set, even if currently unplugged, you have to comment those lines out :
... #if hdmidet ; then setenv bootargs $bootargs video=mxcfb${nextcon}:dev=hdmi,${hdmires} setenv fbmem "fbmem=28M"; setexpr nextcon $nextcon + 1 #else # echo "------ no HDMI monitor"; #fi ...And then recompile the bootscript.
In this case your HDMI will be set always, and later, when you switch your display on, your LXDE will be there.
Laci
I just tried this on my SabreLite with 7″ LCD + TSC2004 touch. The touch controller was found but the mouse/pointer seems to need calibration as it moves incorrectly (X axis is inverted).
What do I need to do to get this going?
Hi Gary,
Try to install xinput-calibrator:
$ sudo apt-get update
$ sudo apt-get install xinput-calibrator
then run it :
Main-Menu –> Preferences –> Calibrate Touchscreen
I hope its working.
While in theory this might work, the touch screen is so uncalibrated that I can’t get to the menu button. I suppose I could plug in a USB mouse to run the menu item but that seems rather wrong to need a mouse to be able to use my touch screen 🙁
Note: I did try this and was able to calibrate the screen, I just think it should be a bit cleaner.
Also, while the touch screen is now working, I don’t see any way to use it without a USB keyboard since there does not seem to be a pop-up keyboard. I also seem to need to double touch icons (to simulate a click). All in all, not very touch friendly.
Author
Hi Gary,
You’re right on two fronts:
There is an on-screen keyboard (Onboard), but you need to select it from the task bar in the bottom right of the screen.
Fair enough., although I couldn’t locate the on-screen keyboard in the task bar. I did manage to press screen lock which was hilarious to try and get out of with just the touch panel 🙂
No worries about this – I was just giving it a go. I have no intention of running Ubuntu [much] on my Sabre Lite.
Thanks for your time
Hi Gary,
Onboard’s icon is a blue-white-yellow checker next to the date, at bottom-right corner
running this image with latest U-boot on a Sabre Lite.
How do I turn on ‘cpuset’, is it disabled in the kernel? I get ‘mount: unknown filesystem type ‘cpuset” when I run cset shield commands (as root).
Anybody can check whether OpenCL work in this release (after “apt-get update/upgrade”)?
I get the following result:
—————————————————-
# cd /opt/viv_samples/cl11/UnitTest/
# ./clinfo
>>>>>>>> ./clinfo Starting…
!!! Error # -1001 at line 159 , in file main.cpp !!!
!!! Press to quit…
—————————————————-
Thanks
1) To fix clinfo need remove conflicted package:
$ sudo apt-get remove ocl-icd-libopencl1
2) To compile OpenCL applications use some magic compiler options:
$ CPPFLAGS=”-I/usr/include/vivante” LIBS=”-lGAL -L/usr/lib/arm-linux-gnueabihf/vivante/” ./configure
$ make -j4
Hi Alex,
Thank you for the helpful notes.
You are perfectly right. Some packages (ocl-icd-libopencl1, libgl1-mesa-dev, libegl1-mesa-dev, libgles2-mesa-dev, libopenvg1-mesa-dev) with similarly named libraries as Freescale graphics libraries (libEGL, libGLESv2, libGL, libOpenCL , libOpenVG) are able to make trouble. They put the fool on dynamic linker (ldconfig), then it will be unable to link (at runtime) the Freescale libraries. I can’t fix this, this problem is accruing from the versioning (soname) of Freescale libs.
You are also right about the header and lib paths, although they are not so magical as you think 🙂
But you forgot to mention you have problems with “building” OpenCL applications, you mentioned “apt-getting”.
And there is another thing to talk about : for developing with Freescale graphics, you have to install :
$ sudo apt-get install gpu-viv-bin-mx6q-dev
package, which is not installed by default.
Regards,
Laci
Author
Hi Alexander,
I just tested on a newer release (apt-get update/apt-get dist-upgrade will get this for you), and the clinfo program worked:
Thank you for your review. Maybe the problem because of that I installed some additional packages (“mesa-common-dev” for /usr/include/GL/gl.h, “ocl-icd-libopencl1” for libOpenCL.so and others) to build benchmark taken here: https://blog.visucore.com/2013/3/12/opencl-on-i-mx6
I will try again to reinstall the disk image and repeat again.
I’m an old school Linux/Unix guy and just recently put this image onto a BD-SL board. I made the mods mentioned (other than the BT mod, which I’m not using anyway) and most everything works well.
I am having trouble with 2 items though:
1. For the life of me I cannot seem to change the board from DHCP to Static IP. I started modifying /etc/network/interfaces and that initially seemed to work, but then when I move the image to another board, things stopped working and the eth# values started going up, now, no eth0, just eth1, a few boards later eth2 shows up, even though my /etc/network/interfaces doesn’t have it! I expect the moving between boards and the various MAC addresses, along with the (very very evil) Network Manager are causing my trouble. I tried moving back to a backup copy of the image that I had from before I tried to do Static, and then tried using the LXDE Start->Preferences->Network Connections to allow Network Manager to do it’s thing, but that also didn’t seem to work. It seemed to remember MACs from previous boards.
So, what’s the RIGHT way with this image to get it to boot with a static IP?
2. I had some trouble with chromium in kiosk mode. It seemed to hang waiting for cache and a screen that was mostly painted white, with a bit of gray at the bottom, and a half-white/half-gray line about 3/4 of the way down the screen (connected to HDMI). I eventually disabled the hardware acceleration inside chromium, and that seemed to make the problem go away. I expect there is a problem in the chromium implementation, or in the hardware acceleration part. FYI, I was launching chromium with this command:
chromium-browser –kiosk
I also tried
chromium-browser –start-fullscreen
and got similar results.
I’d really appreciate some insight on #1. Thanks!
Hi Kelly,
In case of increasing network device numbers, you have to delete 2 files (and reboot) :
/lib/udev/rules.d/75-persistent-net-generator.rules
/etc/udev/rules.d/70-persistent-net.rules
These files are the culprits, and they get installed with udev. So, somethimes (not frequently, just when udev gets reinstalled by “apt-get upgrade”) you have to repeat this process. Always make sure that eth and wlan have 0 indices…. eth0, wlan0
If you wanna use GUI Network Manager, first you have to remove (or just comment out) the interface references from /etc/network/interfaces file . This might be eth0 and/or wlan0 … and similars.
If you move the this system image (with unconfigured Network Manager) to an other board, then NM will detect the working eth0 interface and it will add it to the interfaces (in its GUI) automatically and will set it DHCP. But if you select a specific MAC and you move that configured system image to another board, it will be misconfigured. This is my experience also, but it seems logical to me. Is this a bug, you think so?
If you want to set static IPv4, I would recommend to set the specific IP addresses at your router/gateway’s DHCP server. Its called Static DHCP or something like that. You can set specific IP addresses for specific MAC’s. In this case you don’t have to bother with the network settings, all boards can be pure DHCP, and still you will get permanent static addresses.
Thank you for the info about Chromium.
Regards,
Laci
Hi,
I am trying to run chromium with Trusty December release but some how its not connecting .
I had tried executing Chromium WebGL its trying to connect but after sometime gives error as Problem in loading.
I am able to ping to any website but nothing is getting opened in the browser.
Even apt-get install and apt-get update resulting in connection problem errors, could you please let me know where should i look in to resolve all this.