i.MX6 kernel 3.10.53

Published on March 31, 2015

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.

Sorry for the delay, but we've just pushed a new kernel branch for kernel version 3.10.53 for our i.MX6 boards:

This release will be pushed to the master branch of the FSL-Community BSP shortly, but there are some very notable changes from earlier releases that we'll discuss below.

For the impatient

We've placed an image on-line here:

The image is configured to run on our BD-SL-i.MX6, Nitrogen6x, Nitrogen6_Lite, Nitrogen6_Max and Nitrogen6_VM boards.

As usual, you can copy the image to an SD card or SATA drive on /dev/sdc using zcat and dd like so:

~/Downloads$ sudo umount /dev/sdc* ~/Downloads$ zcat core-image-sato-3.10.53*.img.gz | sudo dd of=/dev/sdc bs=1M ~/Downloads$ sync

Or you can use Alex Page's USB Image Tool under Windows.

What works (and what doesn't)

In short: everything works. Or at least, everything we've tried works at the kernel level.
Because we based the image on the Yocto master branch, there are some quirks in the image above, notably:

Actually, that's not quite right. There are features of some of our custom boards and peripherals like HDMI input, composite video input and output which have not been tested, but are also not in widespread use.

  1. We don't have the Bluetooth stack configured properly, and
  2. We don't have Wi-Fi configured properly

Both of these have to do with the use of systemd and connman in the latest Yocto layers. In the case of Bluetooth, we've tested against the BlueZ 5.0 stack of our Debian Jessie images by Ubuntunizing the kernel. We'll follow up with Debian and Ubuntu images based on this kernel very soon.

In the case of Wi-Fi, we had to kill the supplicant started by dbus and start things up by hand like so:

root@nitrogen6x:~$ killall wpa_supplicant root@nitrogen6x:~$ rfkill unblock wlan root@nitrogen6x:~$ ifup wlan0 Successfully initialized wpa_supplicant wlcore: firmware booted (Rev 6.3.10.0.133) IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready root@nitrogen6x:~$ wpa_cli scan_res Selected interface 'wlan0' bssid / frequency / signal level / flags / ssid 00:23:69:93:be:46 2412 -49 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS] ssid1 6c:b0:ce:20:f6:14 2462 -53 [WPA-PSK-TKIP][ESS] ssid2 e0:91:f5:ca:de:fe 2412 -59 [WPA2-PSK-CCMP][WPS][ESS] ssid3 10:5f:06:37:67:05 2437 -82 [WPA2-PSK-CCMP+TKIP][ESS] ssid4

Then, after using wpa_cli to configure the network as described in this post, we had to run udhcpc manually like so:

root@nitrogen6x:~/$ udhcpc -f -q -n -i wlan0 udhcpc (v1.23.1) started Sending discover... Sending select for 192.168.4.42... Lease of 192.168.4.42 obtained, lease time 600 /etc/udhcpc.d/50default: Adding DNS 192.168.0.254 /etc/udhcpc.d/50default: Adding DNS 192.168.2.1

We'll address these issues with a more full-featured image with the upcoming Fido release of Yocto.

Display support

You might have thought that 3.10.53 to the previous 3.10.31 release would be a minor update.

We did, and we were wrong.

Lots of changes in a variety of subsystems required re-work of our over 400 patches to the kernel tree, and the most notable (and visible) are in the area of display handling.

Specifically, the LVDS Display Bridge (LDB) driver underwent a major restructuring (for the better) and broke our scheme of building up a kernel command-line with multiple video= clauses for the kernel command line (bootargs variable in U-Boot). Instead, the LVDS displays are defined in the device tree in a much more explicit fashion.

This problem is fairly specific to our off-the-shelf boards and our desire to make each of our standard displays operate in a plug and play fashion, but this change necessitated some re-thinking of our strategy.

For your production applications, the answer is much easier. You can simply cut the bits out of your device trees for displays that you aren't using. After doing so, you can essentially ignore the displays in your boot script.

In short, we've almost completely re-written our boot script to change a build up bootargs process to one that prunes the device tree using the fdt rm command in U-Boot.

The following two snippets show the difference. The old boot script did this to add a video= clause for an HDMI monitor:

if i2c probe 0x50 ; then setenv bootargs $bootargs video=mxcfb${nextcon}:dev=hdmi,1280x720M@60,if=RGB24 setenv fbmem "fbmem=28M"; setexpr nextcon $nextcon + 1 else echo "------ no HDMI monitor"; fi

In 3.10.53+, this turns into the following:

if i2c probe 0x50 ; then echo "------ have HDMI monitor"; else fdt rm hdmi_display echo "------ no HDMI monitor"; fi

The earlier bits of the 3.10.53 boot script have loaded the DTB and we now prune or remove (rm) the unused nodes.

The new boot script

The new boot script is currently only available for use with Yocto and is available here:

Notable changes include:

  • Loads the device tree early. Our previous boot scripts tried to do the right thing for DT-enabled kernels and earlier versions.
  • Doesn't set enable_wait_mode=off. This kernel switch is no longer supported or necessary because the device tree can indicate whether the ENET IRQ is available for use. Note that if you're using a SABRE Lite or Nitrogen6x board and aren't using the parallel camera interface, we can help you tweak your device tree to support the ENET_IRQ on GPIO 6.
  • Doesn't pass fbmem to the kernel. This is no longer needed or supported.
  • Added variable lvds_1080p to allow the use of a 1080P LVDS display using dual-channel LVDS on Nitrogen6_Max. The details are in this test in the boot script.
  • Added support for LVDS1 on Nitrogen6_Max. Since we only have a single I2C touch screen connector, this isn't auto-detected, but we added a variable lvds1_panel that allows you to select which panel you have connected as shown in this block of script.
  • Added support for Nitrogen6_Lite and Nitrogen6_VM. Both our Nitrogen6_Lite and Nitrogen6_VM boards have on board touch controllers that can confuse the auto-detection code. By adding a variable ignore_lcd to this section of the boot script, you can disable this if you're only using the LVDS or LCD channels. U-Boot > setenv ignore_lcd 1 U-Boot > saveenv && boot

Between all of these, the Nitrogen6_Max can support four simultaneous displays (HDMI, RGB, 2xLVDS) and auto-detect all except the second LVDS channel.

The panel=LDB-WXGA variable is still needed to distinguish between the 1024x600 and 1280x800 displays with the FocalTech controller as described in this post.

Again, please note that all of this complexity comes from a desire to plug and play. Once you've determined what displays you'll be using, you should create a custom device tree and a custom boot script that skips all of this. Let us know if you need help with that.

Testing details

The following check-list was used during testing of the kernel. If you find a piece that's missing, please let us know.
As mentioned earlier, there are some components of especially custom boards which have not yet been tested. If you have one of these and want to push forward to the latest kernel, please contact us.

Function SABRE Lite Nitrogen6Q
Nitrogen6DL/S
Nitrogen6-Lite Nitrogen6-Max Nitrogen6_VM
Boots Yes Yes Yes Yes Yes
Peripherals
MMC/SD
Top: mmcblk3
Bottom: mmcblk2
Top: mmcblk2
Bottom: mmcblk3
mmcblk2 SD: mmcblk2

eMMC: mmcblk3

SD: mmcblk2

eMMC: mmcblk3

Ethernet

Tests described in [1]

1Gb 1Gb 10/100 Mb 1Gb 1Gb
USB Host x2 (SMSC hub) x2 (SMSC hub) x1 x2 x1
USB Device Yes
Yes Yes Yes Yes
USB OTG Yes Yes Yes Yes Yes
Headphone Audio out Yes Yes Yes Yes Yes
Speaker Audio out N/A N/A Yes Yes
/sys/class/leds/speaker-enable
Yes
Microphone
Yes Yes Yes Yes Yes
HDMI Audio out Yes Yes Yes Yes Yes
GPIO Buttons Yes Yes N/A Yes N/A
SATA Yes Yes
N/A for DL/S
N/A Yes N/A
PCIe Yes Yes N/A Yes Yes
Wi-Fi N/A Yes Yes Yes N/A
Bluetooth
N/A Works under Debian, not Yocto Works under Debian, not Yocto Works under Debian, not Yocto N/A
SPI-NOR Yes Yes Yes Yes Yes
Uart1/2
Yes Yes Yes Yes Yes
Third UARTS N/A N/A N/A /dev/ttymxc4 /dev/ttymxc2
Magstripe reader N/A N/A N/A N/A imx6dl-nitrogen6_vm-magstripe.dtb
Real-time clock SNVS
no battery
ISL1208 ISL1208 RV4162 RV4162
CAN bus
Yes
Yes N/A Yes N/A
Displays
1920x1080P LVDS N/A N/A N/A Yes N/A
1024x768 LVDS Yes Yes Yes Yes (x2) Yes
1024x600 LVDS Yes Yes Yes Yes (x2) Yes
1280x800 LVDS Yes Yes Yes Yes (x2) Yes
800x480 RGB Yes Yes N/A Yes N/A
480x272 RGB N/A N/A Yes N/A N/A
HDMI Yes Yes Yes Yes Yes
Backlights
LVDS Yes Yes Yes Yes (x2) Yes
RGB Yes Yes Yes Yes Yes
Touch screens
eGalax (Hannstar) Yes Yes Yes Yes Yes
ft5x06 Yes Yes Yes Yes Yes
tsc2004 Yes Yes Yes Yes N/A
AR1020 4/5-wire resistive N/A N/A N/A N/A Yes
Cameras
OV5642 parallel Yes Yes N/A Yes N/A
OV5640 MIPI Yes Yes N/A Yes N/A
Internals
Tapeout 1.0 Yes unknown N/A N/A N/A
Thermal sensor Yes Yes Yes Yes Yes
CPUFreq Yes Yes Yes Yes Yes
OTP Yes Yes Yes Yes Yes
CAAM Yes Yes Yes Yes Yes
RNG Yes Yes Yes Yes Yes
MTD Yes Yes Yes Yes Yes
GPU Yes Yes Yes Yes Yes
VPU Yes Yes Yes Yes Yes