i.MX6 Frequently asked questions (and answers)

Published on July 10, 2012

Archived Notice

This article has been archived and may contain broken links, photos and out-of-date information. If you have any questions, please Contact Us.

We've been receiving a number of support calls with the same questions, and we'll use this blog post to answer some of the more frequent.

Doing this will allow us to go into a bit more depth than time allows when answering your e-mails. Don't worry about hitting us up again if something remains unclear, and please recognize that if we give you a link to the FAQ, it's because we want to give you a complete explanation to your question.

It's only through your feedback that we can make the documentation better.

Q: What's the latest U-Boot for Sabre Lite and Nitrogen6x?

A: Short answer: is the boundary-v2016.03 branch of project u-boot-imx6:

You can find all the latest binaries here:

The majority of you who have SABRE Lite or Nitrogen6X boards can use u-boot.nitrogen6q.

The longer answer is in these blog posts:

We're shipping builds for our standard Quad-core, 1GB boards with the configuration nitrogen6q_defconfig.

Q: What's the latest Linux kernel for my platform?

A: There are two: one for Android and one for Linux.

Branch boundary-imx_4.1.15_1.0.0_ga is the latest kernel for Linux projects.

Branch boundary-imx-m6.0.1_1.0.0-ga is the latest kernel for Android projects.

These branches are built on and follow the Freescale releases with the same names.

Q: Why does my HDMI display keeps defaulting to an unwanted resolution?

A: This is most likely due to the fact the required resolution isn't a standard Consumer Electronic Association (CEA) mode. It can be allowed by setting a specific variable in U-Boot as follows.

U-Boot > setenv allow_noncea 1
U-Boot > saveenv && boot

More information on this blog post.

Q: Why does my ethernet adapter show up as eth5 or eth6 instead of eth0 under Ubuntu?

A: The Ubuntu releases contain a file in /etc/udev/rules.d which allows you to configure every network
interface differently, whether it be a USB WiFi adapter or the built-in ethernet adapter on a Sabre Lite.

This makes a lot of sense on a machine with a non-removable drive, but less so on a machine booting to SD card. If you take the SD card from one Sabre Lite and install it on another, or on a Nitrogen6X, the ethernet device will keep incrementing.

Thankfully, there's an easy fix. Delete /etc/udev/rules.d/70-persistent-net.rules:

root@linaro-ubuntu-desktop:~# ls -l /etc/udev/rules.d/
total 16
-rw-r--r-- 1 root root 1427 2012-02-22 10:13 10-imx.rules
-rw-r--r-- 1 root root  306 2011-11-17 09:06 70-persistent-cd.rules
-rw-r--r-- 1 root root  589 1969-12-31 17:00 70-persistent-net.rules
-rw-r--r-- 1 root root 1157 2011-10-08 02:07 README
root@linaro-ubuntu-desktop:~# rm -f /etc/udev/rules.d/70-persistent-net.rules

Q: I bricked my board. How do I fix it?

A: Details in this blog post.

Q: The demos work, now how do I program this thing?

A: There are a lot of options. Details are available in this blog post.

Q: How do I configure my board for a particular display?

A: Details are available in this blog post.

Q: What pre-built images are available?

A: We're supplying images of Android, Ubuntu, Debian and Yocto Linux. There's also an embedded Linux package available from Timesys. See this blog post for a list. Images are also available from QNX and others.

Q: How do I boot from SATA?

A: For most builds, you can just copy your userspace to SATA and boot directly. Refer to the U-Boot getting started guide for details.

Notably, none of our Android builds support boot from SATA because we haven't figured out how to dynamically switch the mount references. Some assembly is required.

Q: Is PCIe supported?

A: Yes. Our current kernels support PCIe.

That said, we probably don't configure your particular PCIe device in the kernel, so you will need to have the driver sources for your PCIe adapter.

Q: Is the 5MP camera supported?

A: Yes. Both parallel and MIPI cameras are supported.

But only one at a time. There's a conflict between the two regarding the I2C bus, so you'll need to choose one or the other in the kernel.

Q: What device is the serial console?

A: /dev/ttymxc1 - Several of the Freescale boards have the console on /dev/ttymxc0, so this occasionally gets overlooked. Use the clause console=ttymxc1,115200 in the kernel command line (bootargs under U-Boot) to get kernel output on this device.

Note that our SoloX board (Nit6_SoloX) and the Nitrogen7 platform are now using /dev/ttymxc0 just like Freescale platforms.

Q: How do you choose between the analog and digital (HDMI) audio output?

A: Some of this is application-specific, but some notes are available in this post.


Q: Why does U-Boot show 792 MHz when the CPU is 1GHz?

A: U-Boot always operates at 800Mhz (792 to be precise). Since nothing in the boot loader is CPU-intensive, there’s little reason to update this, and this simplifies code use on devices which only support 800 MHz.

The Linux kernel will use the CPU frequency scaling code which will switch the processor frequency between 400 MHz and 1GHz based on load and temperature.

Q: What is the memory layout of these boards?

A: The memory layout that U-Boot uses is very simple.  The quick answer is that memory starts at 0x10000000 and U-Boot is located at the end of available memory, the pre-allocated heap range below that and the stack starts just below the heap and grows downward.  In other words, you have everything from 0x10000000 up to the end of the stack to use so you should start low and move up as you need it.

If you want a little more info/explanation you can run the bdinfo command and you'll see output like this:

U-Boot > bdinfo arch_number = 0x00000EB9 boot_params = 0x10000100 DRAM bank = 0x00000000 -> start = 0x10000000 -> size = 0x40000000 eth0name = FEC ethaddr = 00:19:b8:01:03:61 current eth = FEC ip_addr = baudrate = 115200 bps TLB addr = 0x4FFF0000 relocaddr = 0x4FF5E000 reloc off = 0x3875E000 irq_sp = 0x4F55BF30 sp start = 0x4F55BF20 FB base = 0x00000000

You can see that memory starts at 0x10000000 (always the case) and you have (in this case, a nitrogen6q board) 0x40000000 bytes or 1 GiB of RAM.  So memory is from 0x10000000 to 0x4FFFFFFF.

The next bit of useful information is reloc off and relocaddr.  If you built U-Boot yourself, you'll generate a System.map file which gives the addresses of all the functions of U-Boot.  The relocation offset is added to those addresses. 

The first line of System.map is

17800000 T __image_copy_start

If you add 0x17800000 + 0x3875E000 = 0x4FF5E000 or the relocaddr line. 

In other words: U-Boot copies itself to the end of available memory. 

Just below that is the pre-allocated range for the heap (which fills upward and it's size is based on the U-boot config value CONFIG_SYS_MALLOC_LEN, currently set to 10 MiB in our repo). 

Finally the stack starts at sp start = 0x4F55BF20, below the heap range and grows downward.

Note that the SoloX has its RAM mapped at 0x80000000 instead of 0x10000000 for other i.MX6 platforms.

Stay tuned. More to come.