Tutorial: First Steps with NXP i.MX7 and Toradex Colibri Board

I’m using in several projects different variants of Raspberry Pi boards: they are great and providing a lot of processing power. However, they are not suitable for any hard realtime systems. For a different class of projects I’m currently evaluating the NXP i.MX7 processors: the cool thing with these is that they have up to two ARM Cortex-A7 running at 1 GHz, plus a Cortex-M4 running at 200 MHz. And here things get really interesting: I can run a realtime application and FreeRTOS on that M4, while running Linux on the A7 :-).

i.MX7 on Colibri with Iris Carrier Board

i.MX7 on Colibri with Iris Carrier Board


My first encounter with i.MX was with the RIoT board (see RIot Board). The start with that board was promising, but soon afterwards I decided to put away the RIoT board: too many issues, lack of community support and activities and bring up issues. Additionally the board design and connectors made it really hard to be used in a real project. Too bad :-(.

Because I need more processing power in combination realtime capabilities, I looking into the NXP i.MX7 product line. I already have the NXP SABRE board up and running (maybe worth another article?), but the SABRE board is too big:

Freeescale i.MX7 SABRE Board

Freescale i.MX7 SABRE Board

I was looking for a more compact solution. Toradex is a Swiss company, located very close to our campus, and we are using their modules in different classes and projects. So I was really excited to see that they offer i.MX7 modules a few months back. The hardware I have ordered arrived on Friday, so I used the time this weekend to get things up and running.

This first article describes the different boards and the basic first steps, including getting the console output in a terminal program and the first login into the Linux on the board.


Toradex sells CPU modules and different carrier boards. Because I have not decided yet what kind of carrier board I will use in the project, I ordered two different carrier boards with one CPU module:

Toradex Carrier Boards with CPU module

Toradex Carrier Boards with CPU module

Toradex offers a carrier board accessory kit with adapters and cables. Because I do have these cables available from other boards, I had not ordered that kit. What you need to bring up the kit is:

  1. Power Supply (depending on the carrier board: 5V for the Viola and 6-27V for the Iris)
  2. Serial connection to the host: either a real RS-232 port with a cross-link cable) or a UART-2-USB converter

Colibri CPU Module

There are two different modules available from Toradex: a single A7 core one (Solo), and the Dual one which I ordered. The Dual with the NXP i.MX7Dual has a two ARM Cortex-A7 (1 GHz), one ARM Cortex-M4 (200 MHz), 512 MB DDR3 RAM with 512 MB NAND Flash and costs $65:

Toradex i.MX7D CPU Module

Toradex i.MX7D CPU Module

Toradex i.MX7D Module Bottom Side

Toradex i.MX7D Module Bottom Side

💡 note the 6 golden pads near the top ‘+’ marker: these are JTAG debug pads :-). There are not contacts for these on the carrier boards used in this post, but contacts for it are available on the full size Colibri evaluation board.

The CPU module has a 200 pin SODIMM connector. The same connector is used for standard memory (DDR1) modules so widely available.

Viola Plus Carrier Board

There are two versions of the Viola carrier board. I ordered the V1.2 Plus ($29) which has more connectors than the non-plus version ($22). It is powered by 5V and features USB, Ethernet, micro SD card, RTC and expansion connector. Everything is on a board with a size of 74×74 mm:


Toradex Viola V1.2 Carrier Board Top Side


Toradex Viola 1.2 Carrier Board Bottom Side

Iris Carrier Board

The Iris Carrier Board ($55) comes with more connection options (two RS-232, audio and DVI-I connector) and is a larger in size (100×72 mm) than the Viola board. It accepts a power supply of 6V-27V:


Toradex Iris Carrier Board (Bottom Side)


Toradex Iris Carrier Board Top Side

Debug Serial Port

The Colibri CPU module comes with a pre-installed Linux distribution on it. Later I would like to re-flash it. The first step is to get the preinistalled one up and running up to the root login. There is very brief description of this available on the Toradex site.

Insert the Colibri module into the carrier board:


Colibri CPU Module in Iris Carrier Board

The board is using UART-A as Debug Serial Port. That UART is present on either X13 (with RS-232 level shifter signals) or with 3.3V signals on the connector X16 of the Iris board. You need to connect to either one of the two depending on the cable you have available. I’m showing below both options.



Using X13 I need a cross-linked serial cable, and if the host computer has no real serial port (as my machine 😦 ) a RS-232-to-USB converter.

The 2×5 pin header row is a ‘standard’ flat cable to 9pin serial connector cable with RS-232 voltage levels:


RS-232 on X13 of Iris Carrier Board

The picture below shows the 3.3V UART-A Rx and Tx signals on the expansion header:

Serial UART Connection on Iris Board

Serial UART Connection on Iris Board

I’m using the same UART-to-USB cable I have used for the RIoT board.

On the Viola carrier board, UART-A is available with 3.3V signals on connector X9:

Viola UART Debug Connection

Viola UART Debug Connection


Each carrier board has different power options. The Iris uses 6V-27V with reverse voltage protection. The Iris only accepts 5V (+/- 0.25V!!!!) only, so carefully check the power supply voltage first!

❗ The Viola carrier board does *not* have a reverse voltage protection! And the supply voltage has to be 5V +/- 0.25V!!!!

With jumper JP2 set, the micro-USB connector on the bottom of the board can be used for power:

5V USB Power Option on Toradex Viola Carrier Board

5V USB Power Option on Toradex Viola Carrier Board

Debug Console Output

Connect with a terminal program (115200 baud, no control flow) to the board. Then power the board and you should see the debug output in the terminal connected

U-Boot 2015.04+fslc+g10bc451 (Jun 28 2016 - 13:08:25)
CPU:   Freescale i.MX7D rev1.2 at 792 MHz
CPU:   Temperature 30 C
Reset cause: POR
I2C:   ready
DRAM:  512 MiB
NAND:  512 MiB
*** Warning - bad CRC, using default environment
No panel detected: default to vga-rgb
Display: vga-rgb (640x480)
Video: 640x480x18
In:    serial
Out:   serial
Err:   serial
Model: Toradex Colibri iMX7 Dual 512MB V1.1C, Serial# 02844364
Net:   FEC0
Normal Boot
Hit any key to stop autoboot:  1 [08][08][08] 0 
Booting from NAND...
UBI: default fastmap pool size: 200
UBI: default fastmap WL pool size: 25
UBI: attaching mtd1 to ubi0
UBI: attached by fastmap
UBI: fastmap pool size: 200
UBI: fastmap WL pool size: 100
UBI: attached mtd1 (name "mtd=3", size 507 MiB) to ubi0
UBI: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
UBI: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
UBI: VID header offset: 2048 (aligned 2048), data offset: 4096
UBI: good PEBs: 4056, bad PEBs: 4, corrupted PEBs: 0
UBI: user volume: 4, internal volumes: 1, max. volumes count: 128
UBI: max/mean erase counter: 2/1, WL threshold: 4096, image sequence number: 0
UBI: available PEBs: 0, total reserved PEBs: 4056, PEBs reserved for bad PEB handling: 76
Read 0 bytes from volume kernel to 81000000
No size specified -> Using max size (5113928)
Read 0 bytes from volume dtb to 82000000
No size specified -> Using max size (40257)
Kernel image @ 0x81000000 [ 0x000000 - 0x4e0848 ]
## Flattened Device Tree blob at 82000000
   Booting using the fdt blob at 0x82000000
   Using Device Tree in place at 82000000, end 8200cd40
Starting kernel ...
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.1.15-v2.6b2+g0ff849d (linuxdev@linuxdev.toradex.int) (gcc version 5.2.1 20151005 (Linaro GCC 5.2-2015.11-2) ) #1 SMP Tue Jun 28 13:09:24 CEST 2016
[    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine model: Toradex Colibri iMX7D on Colibri Evaluation Board V3
[    0.000000] Reserved memory: created CMA memory pool at 0x8c000000, size 320 MiB
[    0.000000] Reserved memory: initialized node linux,cma, compatible id shared-dma-pool
[    0.000000] Memory policy: Data cache writealloc
[    0.000000] PERCPU: Embedded 12 pages/cpu @8bb23000 s16960 r8192 d24000 u49152
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 130048
[    0.000000] Kernel command line: ubi.mtd=ubi root=ubi0:rootfs rootfstype=ubifs ubi.fm_autoconvert=1 console=tty1 console=ttymxc0,115200n8 consoleblank=0 mtdparts=gpmi-nand:512k(mx7-bcb),3584k(u-boot)ro,512k(u-boot-env),-(ubi)
[    0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)
[    0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
[    0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
[    0.000000] Memory: 181632K/524288K available (6413K kernel code, 288K rwdata, 2144K rodata, 312K init, 380K bss, 14976K reserved, 327680K cma-reserved)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
[    0.000000]     vmalloc : 0xa0800000 - 0xff000000   (1512 MB)
[    0.000000]     lowmem  : 0x80000000 - 0xa0000000   ( 512 MB)
[    0.000000]     modules : 0x7f000000 - 0x80000000   (  16 MB)
[    0.000000]       .text : 0x80008000 - 0x808639c8   (8559 kB)
[    0.000000]       .init : 0x80864000 - 0x808b2000   ( 312 kB)
[    0.000000]       .data : 0x808b2000 - 0x808fa140   ( 289 kB)
[    0.000000]        .bss : 0x808fd000 - 0x8095c26c   ( 381 kB)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=2, Nodes=1
[    0.000000] Hierarchical RCU implementation.
[    0.000000]     RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.
[    0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=2
[    0.000000] NR_IRQS:16 nr_irqs:16 16
[    0.000000] Architected cp15 timer(s) running at 8.00MHz (phys).
[    0.000000] clocksource arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 440795202120 ns
[    0.000007] sched_clock: 56 bits at 8MHz, resolution 125ns, wraps every 2199023255500ns
[    0.000020] Switching to timer-based delay loop, resolution 125ns
[    0.000437] mxc_clocksource_init 3000000
[    0.000449] Ignoring duplicate/late registration of read_current_timer delay
[    0.000466] clocksource mxc_timer1: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 637086815595 ns
[    0.001579] Console: colour dummy device 80x30
[    0.002216] console [tty1] enabled
[    0.002243] Calibrating delay loop (skipped), value calculated using timer frequency.. 16.00 BogoMIPS (lpj=80000)
[    0.002286] pid_max: default: 32768 minimum: 301
[    0.002401] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.002429] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[    0.003055] Initializing cgroup subsys freezer
[    0.003092] Initializing cgroup subsys debug
[    0.003152] CPU: Testing write buffer coherency: ok
[    0.003458] Setting up static identity map for 0x80008280 - 0x800082d8
[    0.005392] Brought up 2 CPUs
[    0.005424] SMP: Total of 2 processors activated (32.00 BogoMIPS).
[    0.005447] CPU: All CPU(s) started in SVC mode.
[    0.005988] devtmpfs: initialized
[    0.011320] device-tree: Duplicate name in lcdif@30730000, renamed to "display#1"
[    0.016551] VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5
[    0.016957] clocksource jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.028717] pinctrl core: initialized pinctrl subsystem
[    0.030074] NET: Registered protocol family 16
[    0.035879] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    0.060006] cpuidle: using governor ladder
[    0.090023] cpuidle: using governor menu
[    0.103127] DDR type is DDR3!
[    0.109711] imx7d_enet_clk_sel: failed to get enet_out clock, assuming ext. clock source
[    0.109797] hw-breakpoint: found 5 (+1 reserved) breakpoint and 4 watchpoint registers.
[    0.109832] hw-breakpoint: maximum watchpoint size is 8 bytes.
[    0.110204] imx7d-pinctrl 30270000.lpsr-gpr: initialized IMX pinctrl driver
[    0.110404] imx7d-pinctrl 302c0000.iomuxc-lpsr: initialized IMX pinctrl driver
[    0.111680] imx7d-pinctrl 30330000.iomuxc: initialized IMX pinctrl driver
[    0.113214] MU is ready for cross core communication!
[    0.122968] mxs-dma 33000000.dma-apbh: initialized
[    0.124691] SCSI subsystem initialized
[    0.125042] usbcore: registered new interface driver usbfs
[    0.125129] usbcore: registered new interface driver hub
[    0.125257] usbcore: registered new device driver usb
[    0.125518] 30800000.aips-bus:usbphy_nop1 supply vcc not found, using dummy regulator
[    0.125820] 30800000.aips-bus:usbphy_nop2 supply vcc not found, using dummy regulator
[    0.126827] i2c i2c-0: IMX I2C adapter registered
[    0.126862] i2c i2c-0: can't use DMA
[    0.127342] i2c i2c-3: IMX I2C adapter registered
[    0.127373] i2c i2c-3: can't use DMA
[    0.127494] Linux video capture interface: v2.00
[    0.127564] pps_core: LinuxPPS API ver. 1 registered
[    0.127589] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.127646] PTP clock support registered
[    0.128157] Advanced Linux Sound Architecture Driver Initialized.
[    0.129457] Switched to clocksource arch_sys_counter
[    0.140723] NET: Registered protocol family 2
[    0.141554] TCP established hash table entries: 4096 (order: 2, 16384 bytes)
[    0.141635] TCP bind hash table entries: 4096 (order: 3, 32768 bytes)
[    0.141727] TCP: Hash tables configured (established 4096 bind 4096)
[    0.141801] UDP hash table entries: 256 (order: 1, 8192 bytes)
[    0.141850] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
[    0.142040] NET: Registered protocol family 1
[    0.142359] RPC: Registered named UNIX socket transport module.
[    0.142387] RPC: Registered udp transport module.
[    0.142408] RPC: Registered tcp transport module.
[    0.142429] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.144422] virtio_rpmsg_bus virtio0: rpmsg host is online
[    0.144540] imx rpmsg driver is registered.
[    0.145392] Bus freq driver module loaded
[    0.146301] futex hash table entries: 512 (order: 3, 32768 bytes)
[    0.153630] VFS: Disk quotas dquot_6.6.0
[    0.153840] VFS: Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
[    0.155708] NFS: Registering the id_resolver key type
[    0.155790] Key type id_resolver registered
[    0.155812] Key type id_legacy registered
[    0.155847] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    0.156386] ntfs: driver 2.1.32 [Flags: R/W].
[    0.156915] fuse init (API version 7.23)
[    0.160549] io scheduler noop registered
[    0.160587] io scheduler deadline registered
[    0.160803] io scheduler cfq registered (default)
[    0.162692] backlight supply power not found, using dummy regulator
[    0.164692] 30730000.lcdif supply lcd not found, using dummy regulator
[    0.230108] mxsfb 30730000.lcdif: failed to find mxc display driver 
[    0.238764] Console: switching to colour frame buffer device 80x30
[    0.256518] mxsfb 30730000.lcdif: initialized
[    0.259347] imx-sdma 30bd0000.sdma: no event needs to be remapped
[    0.261218] imx-sdma 30bd0000.sdma: loaded firmware 4.2
[    0.266014] imx-sdma 30bd0000.sdma: initialized
[    0.268867] 30860000.serial: ttymxc0 at MMIO 0x30860000 (irq = 280, base_baud = 1500000) is a IMX
[    0.999379] console [ttymxc0] enabled
[    1.005535] 30890000.serial: ttymxc1 at MMIO 0x30890000 (irq = 281, base_baud = 1500000) is a IMX
[    1.018630] 30880000.serial: ttymxc2 at MMIO 0x30880000 (irq = 282, base_baud = 5000000) is a IMX
[    1.038021] loop: module loaded
[    1.062596] nand: device found, Manufacturer ID: 0xc2, Chip ID: 0xdc
[    1.070901] nand: Macronix MX30LF4G28AB
[    1.076625] nand: 512 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 112
[    1.088430] gpmi-nand 33002000.gpmi-nand: enable the asynchronous EDO mode 5
[    1.097672] Bad block table found at page 262080, version 0x01
[    1.105734] Bad block table found at page 262016, version 0x01
[    1.113930] 4 cmdlinepart partitions found on MTD device gpmi-nand
[    1.122197] Creating 4 MTD partitions on "gpmi-nand":
[    1.129306] 0x000000000000-0x000000080000 : "mx7-bcb"
[    1.136877] 0x000000080000-0x000000400000 : "u-boot"
[    1.144202] 0x000000400000-0x000000480000 : "u-boot-env"
[    1.151814] 0x000000480000-0x000020000000 : "ubi"
[    1.159550] gpmi-nand 33002000.gpmi-nand: driver registered.
[    1.169020] spi_imx 30840000.ecspi: probed
[    1.177395] pps pps0: new PPS source ptp0
[    1.185218] libphy: fec_enet_mii_bus: probed
[    1.192960] fec 30be0000.ethernet eth0: registered PHC device 0
[    1.200897] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    1.209321] ehci-mxc: Freescale On-Chip EHCI Host driver
[    1.216706] usbcore: registered new interface driver usb-storage
[    1.224713] usbcore: registered new interface driver usbserial
[    1.232365] usbcore: registered new interface driver usbserial_generic
[    1.240619] usbserial: USB Serial support registered for generic
[    1.248372] usbcore: registered new interface driver ftdi_sio
[    1.255858] usbserial: USB Serial support registered for FTDI USB Serial Device
[    1.266557] usbcore: registered new interface driver pl2303
[    1.273871] usbserial: USB Serial support registered for pl2303
[    1.282641] 30b10200.usbmisc supply vbus-wakeup not found, using dummy regulator
[    1.293534] 30b30200.usbmisc supply vbus-wakeup not found, using dummy regulator
[    1.304630] 30b20200.usbmisc supply vbus-wakeup not found, using dummy regulator
[    1.316426] 30b10000.usb supply vbus not found, using dummy regulator
[    1.327695] ci_hdrc ci_hdrc.0: EHCI Host Controller
[    1.334650] ci_hdrc ci_hdrc.0: new USB bus registered, assigned bus number 1
[    1.359488] ci_hdrc ci_hdrc.0: USB 2.0 started, EHCI 1.00
[    1.367877] hub 1-0:1.0: USB hub found
[    1.373751] hub 1-0:1.0: 1 port detected
[    1.383446] ci_hdrc ci_hdrc.1: EHCI Host Controller
[    1.390429] ci_hdrc ci_hdrc.1: new USB bus registered, assigned bus number 2
[    1.419517] ci_hdrc ci_hdrc.1: USB 2.0 started, EHCI 1.00
[    1.427824] hub 2-0:1.0: USB hub found
[    1.433655] hub 2-0:1.0: 1 port detected
[    1.440505] mousedev: PS/2 mouse device common for all mice
[    1.450893] input: AD7879 Touchscreen as /devices/platform/soc/30800000.aips-bus/30a20000.i2c/i2c-0/0-002c/input/input0
[    1.469063] rtc-ds1307 3-0068: rtc core: registered m41t00 as rtc0
[    1.478015] snvs_rtc 30370000.snvs:snvs-rtc-lp: rtc core: registered 30370000.snvs:snvs- as rtc1
[    1.491093] i2c /dev entries driver
[    1.499099] imx2-wdt 30280000.wdog: timeout 60 sec (nowayout=0)
[    1.507422] sdhci: Secure Digital Host Controller Interface driver
[    1.515669] sdhci: Copyright(c) Pierre Ossman
[    1.522027] sdhci-pltfm: SDHCI platform and OF driver helper
[    1.530485] /soc/aips-bus@30800000/usdhc@30b40000: voltage-ranges unspecified
[    1.539652] sdhci-esdhc-imx 30b40000.usdhc: Got CD GPIO
[    1.548489] sdhci-esdhc-imx 30b40000.usdhc: No vmmc regulator found
[    1.556724] sdhci-esdhc-imx 30b40000.usdhc: No vqmmc regulator found
[    1.609617] mmc0: SDHCI controller on 30b40000.usdhc [30b40000.usdhc] using ADMA
[    1.631074] caam 30900000.caam: Entropy delay = 3200
[    1.637987] caam 30900000.caam: Instantiated RNG4 SH0
[    1.697402] caam 30900000.caam: Instantiated RNG4 SH1
[    1.704337] caam 30900000.caam: device ID = 0x0a16030000000000 (Era -524)
[    1.713021] caam 30900000.caam: job rings = 3, qi = 0
[    1.844901] caam algorithms registered in /proc/crypto
[    1.855291] caam_jr 30901000.jr0: registering rng-caam
[    1.864090] hidraw: raw HID events driver (C) Jiri Kosina
[    1.873666] usbcore: registered new interface driver usbhid
[    1.883188] usbhid: USB HID core driver
[    1.894652] coresight-tmc 30086000.etr: TMC initialized
[    1.902122] coresight-tmc 30084000.etf: TMC initialized
[    1.909275] coresight-tpiu 30087000.tpiu: TPIU initialized
[    1.916788] coresight-funnel 30083000.funnel: FUNNEL initialized
[    1.924736] coresight-funnel 30041000.funnel: FUNNEL initialized
[    1.932729] coresight-replicator replicator: REPLICATOR initialized
[    1.941247] coresight-etm3x 3007c000.etm: ETM initialized
[    1.948629] coresight-etm3x 3007d000.etm: ETM initialized
[    1.962680] imx-sgtl5000 sound: ASoC: CODEC DAI sgtl5000 not registered
[    1.970893] imx-sgtl5000 sound: snd_soc_register_card failed (-517)
[    1.978786] Netfilter messages via NETLINK v0.30.
[    1.985100] nfnl_acct: registering with nfnetlink.
[    1.991476] nf_conntrack version 0.5.0 (7958 buckets, 31832 max)
[    1.999550] nf_tables: (c) 2007-2009 Patrick McHardy <kaber@trash.net>
[    2.008079] ip_tables: (C) 2000-2006 Netfilter Core Team
[    2.015667] NET: Registered protocol family 10
[    2.022718] ip6_tables: (C) 2000-2006 Netfilter Core Team
[    2.029795] sit: IPv6 over IPv4 tunneling driver
[    2.036740] NET: Registered protocol family 17
[    2.042861] bridge: automatic filtering via arp/ip/ip6tables has been deprecated. Update your scripts to load br_netfilter if you need this.
[    2.058874] Bridge firewalling registered
[    2.064664] 8021q: 802.1Q VLAN Support v1.8
[    2.070584] Key type dns_resolver registered
[    2.077053] cpu cpu0: dev_pm_opp_get_opp_count: device OPP not found (-19)
[    2.092319] Registering SWP/SWPB emulation handler
[    2.099648] registered taskstats version 1
[    2.111308] sgtl5000 0-000a: sgtl5000 revision 0x11
[    2.150647] sgtl5000 0-000a: Using internal LDO instead of VDDD
[    2.173385] imx-sgtl5000 sound: sgtl5000 <-> 308a0000.sai mapping ok
[    2.183167] ubi0: default fastmap pool size: 200
[    2.189647] ubi0: default fastmap WL pool size: 100
[    2.196353] ubi0: attaching mtd3
[    2.306725] ubi0: attached by fastmap
[    2.311852] ubi0: fastmap pool size: 200
[    2.317132] ubi0: fastmap WL pool size: 100
[    2.330461] ubi0: attached mtd3 (name "ubi", size 507 MiB)
[    2.337330] ubi0: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
[    2.345582] ubi0: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
[    2.353770] ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
[    2.362134] ubi0: good PEBs: 4056, bad PEBs: 4, corrupted PEBs: 0
[    2.369632] ubi0: user volume: 4, internal volumes: 1, max. volumes count: 128
[    2.379634] ubi0: max/mean erase counter: 2/1, WL threshold: 4096, image sequence number: 0
[    2.390830] ubi0: available PEBs: 0, total reserved PEBs: 4056, PEBs reserved for bad PEB handling: 76
[    2.403090] ubi0: background thread "ubi_bgt0d" started, PID 143
[    2.412409] rtc-ds1307 3-0068: setting system clock to 2001-01-01 01:23:44 UTC (978312224)
[    2.439703] ALSA device list:
[    2.444237]   #0: imx7-colibri-sgtl5000
[    2.464690] UBIFS (ubi0:3): recovery needed
[    2.580381] random: nonblocking pool is initialized
[    2.627552] UBIFS (ubi0:3): recovery deferred
[    2.633523] UBIFS (ubi0:3): UBIFS: mounted UBI device 0, volume 3, name "rootfs", R/O mode
[    2.644862] UBIFS (ubi0:3): LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes
[    2.658080] UBIFS (ubi0:3): FS size: 493428736 bytes (470 MiB, 3886 LEBs), journal size 9023488 bytes (8 MiB, 72 LEBs)
[    2.672300] UBIFS (ubi0:3): reserved for root: 0 bytes (0 KiB)
[    2.679933] UBIFS (ubi0:3): media format: w4/r0 (latest is w4/r0), UUID 2E260FCB-330C-4ECB-AB22-6A25DE8BA398, small LPT model
[    2.695211] VFS: Mounted root (ubifs filesystem) readonly on device 0:13.
[    2.704628] devtmpfs: mounted
[    2.709706] Freeing unused kernel memory: 312K (80864000 - 808b2000)
[    2.835019] systemd[1]: systemd 226 running in system mode. (+PAM -AUDIT -SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP -LIBCRYPTSETUP -GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD +IDN)
[    2.859336] systemd[1]: Detected architecture arm.

Welcome to [1B][1;35mThe Ångström Distribution v2015.12[1B][0m!

[    2.890496] systemd[1]: Set hostname to <colibri-imx7>.
[    3.198140] systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
[[1B][32m  OK  [1B][0m] Started Dispatch Password Requests to Console Directory Watch.
[    3.231092] systemd[1]: Listening on Journal Socket (/dev/log).
[[1B][32m  OK  [1B][0m] Listening on Journal Socket (/dev/log).
[    3.259801] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[[1B][32m  OK  [1B][0m] Started Forward Password Requests to Wall Directory Watch.
[    3.289632] systemd[1]: Reached target Paths.
[[1B][32m  OK  [1B][0m] Reached target Paths.
[    3.311411] systemd[1]: Created slice System Slice.
[[1B][32m  OK  [1B][0m] Created slice System Slice.
[    3.340018] systemd[1]: Created slice system-getty.slice.
[[1B][32m  OK  [1B][0m] Created slice system-getty.slice.
[    3.386539] systemd[1]: Listening on udev Kernel Socket.
[[1B][32m  OK  [1B][0m] Listening on udev Kernel Socket.
[    3.410059] systemd[1]: Created slice system-serial\x2dgetty.slice.
[[1B][32m  OK  [1B][0m] Created slice system-serial\x2dgetty.slice.
[    3.439898] systemd[1]: Created slice User and Session Slice.
[[1B][32m  OK  [1B][0m] Created slice User and Session Slice.
[    3.469666] systemd[1]: Reached target Slices.
[[1B][32m  OK  [1B][0m] Reached target Slices.
[    3.490016] systemd[1]: Listening on networkd rtnetlink socket.
[[1B][32m  OK  [1B][0m] Listening on networkd rtnetlink socket.
[    3.519821] systemd[1]: Listening on /dev/initctl Compatibility Named Pipe.
[[1B][32m  OK  [1B][0m] Listening on /dev/initctl Compatibility Named Pipe.
[    3.549786] systemd[1]: Listening on udev Control Socket.
[[1B][32m  OK  [1B][0m] Listening on udev Control Socket.
[    3.579811] systemd[1]: Listening on Journal Socket.
[[1B][32m  OK  [1B][0m] Listening on Journal Socket.
[    3.612138] systemd[1]: Starting Journal Service...
         Starting Journal Service...
[    3.641656] systemd[1]: Starting Setup Virtual Console...
         Starting Setup Virtual Console...
[    3.672021] systemd[1]: Mounting Debug File System...
         Mounting Debug File System...
[    3.702547] systemd[1]: Mounting Temporary Directory...
         Mounting Temporary Directory...
[    3.721902] systemd[1]: Starting File System Check on Root Device...
         Starting File System Check on Root Device...
[    3.751545] systemd[1]: Starting (null)...
         Starting (null)...
[    3.769723] systemd[1]: Reached target Swap.
[[1B][32m  OK  [1B][0m] Reached target Swap.
[    3.790424] systemd[1]: Set up automount Arbitrary Executable File Formats File System Automount Point.
[[1B][32m  OK  [1B][0m] Set up automount Arbitrary Executab...ats File System Automount Point.
[    3.824468] systemd[1]: Starting Load Kernel Modules...
         Starting Load Kernel Modules...
[    3.851962] systemd[1]: Starting Create list of required static device nodes for the current kernel...
         Starting Create list of required st... nodes for the current kernel...
[    3.893153] systemd[1]: Mounted Debug File System.
[[1B][32m  OK  [1B][0m] Mounted Debug File System.
[    3.919802] systemd[1]: Mounted Temporary Directory.
[[1B][32m  OK  [1B][0m] Mounted Temporary Directory.
[    3.940665] systemd[1]: Started Journal Service.
[[1B][32m  OK  [1B][0m] Started Journal Service.
[[1B][32m  OK  [1B][0m] Started Setup Virtual Console.
[[1B][32m  OK  [1B][0m] Started File System Check on Root Device.
[[1B][32m  OK  [1B][0m] Started (null).
[[1B][32m  OK  [1B][0m] Started Load Kernel Modules.
[[1B][32m  OK  [1B][0m] Started Create list of required sta...ce nodes for the current kernel.
         Mounting Configuration File System...
         Starting Apply Kernel Variables...
         Mounting FUSE Control File System...
         Starting Remount Root and Kernel File Systems...
[    4.238318] UBIFS (ubi0:3): completing deferred recovery
[[1B][32m  OK  [1B][0m] Mounted FUSE Control File System.
[[1B][32m  OK  [1B][0m] Mounted Configuration File System.
[[1B][32m  OK  [1B][0m] Started Apply Kernel Variables.
[    4.306165] UBIFS (ubi0:3): background thread "ubifs_bgt0_3" started, PID 187
[    4.347238] UBIFS (ubi0:3): deferred recovery completed
[[1B][32m  OK  [1B][0m] Started Remount Root and Kernel File Systems.
         Starting Create Static Device Nodes in /dev...
         Starting udev Coldplug all Devices...
         Starting Flush Journal to Persistent Storage...
[[1B][32m  OK  [1B][0m] Started Create Static Device Nodes in /dev.
[    4.492416] systemd-journald[156]: Received request to flush runtime journal from PID 1
[[1B][32m  OK  [1B][0m] Reached target L[    4.509221] systemd-journald[156]: File /var/log/journal/790bd186775a4574b8e77793d1d9f749/system.journal corrupted or uncleanly shut down, renaming and replacing.
ocal File Systems (Pre).
         Mounting /var/volatile...
         Starting udev Kernel Device Manager...
[[1B][32m  OK  [1B][0m] Mounted /var/volatile.
         Starting Load/Save Random Seed...
[[1B][32m  OK  [1B][0m] Reached target Local File Systems.
[[1B][32m  OK  [1B][0m] Started udev Kernel Device Manager.
[[1B][32m  OK  [1B][0m] Started Load/Save Random Seed.
[[1B][32m  OK  [1B][0m] Started Flush Journal to Persistent Storage.
[[1B][32m  OK  [1B][0m] Started udev Coldplug all Devices.
[[1B][32m  OK  [1B][0m] Created slice system-systemd\x2dbacklight.slice.
         Starting Load/Save Screen Backlight...htness of backlight:backlight...
         Starting Create Volatile Files and Directories...
[[1B][32m  OK  [1B][0m] Started Load/Save Screen Backlight Brightness of backlight:backlight.
[[1B][32m  OK  [1B][0m] Found device /dev/ttymxc0.
[    5.190701] CAN device driver interface
[[1B][32m  OK  [1B][0m] Started Create Volatile Files and Directories.
[    5.214452] spi2.0 supply vdd not found, using dummy regulator
[    5.241287] spi2.0 supply xceiver not found, using dummy regulator
         Starting Network Time Synchronization...
         Starting Update UTMP about System Boot/Shutdown...
[[1B][32m  OK  [1B][0m] Reached target Sound Card.
[[1B][32m  OK  [1B][0m] Started Update UTMP about System Boot/Shutdown.
[[1B][32m  OK  [1B][0m] Started Network Time Synchronization.
[[1B][32m  OK  [1B][0m] Reached target System Initialization.
         Starting Restore Sound Card State...
         Starting sshd.socket.
[[1B][32m  OK  [1B][0m] Listening on Avahi mDNS/DNS-SD Stack Activation Socket.
[[1B][32m  OK  [1B][0m] Started Daily Cleanup of Temporary Directories.
[[1B][32m  OK  [1B][0m] Reached target Timers.
[[1B][32m  OK  [1B][0m] Listening on RPCbind Server Activation Socket.
[[1B][32m  OK  [1B][0m] Listening on D-Bus System Message Bus Socket.
[[1B][32m  OK  [1B][0m] Reached target System Time Synchronized.
[[1B][32m  OK  [1B][0m] Started Restore Sound Card State.
[[1B][32m  OK  [1B][0m] Listening on sshd.socket.
[[1B][32m  OK  [1B][0m] Reached target Sockets.
[[1B][32m  OK  [1B][0m] Reached target Basic System.
         Starting Load default USB gadget schema g1.schema...
         Starting Avahi mDNS/DNS-SD Stack...
         Starting Login Service...
[[1B][32m  OK  [1B][0m[    6.015039] using random self ethernet address
] Started Timestamping service.
[    6.021745] using random host ethernet address
[[1B][32m  OK  [1B][0m] Started D-Bus System Message Bus.
[[1B][32m  OK  [1B][0m] Started Avahi mDNS/DNS-SD Stack.
         Starting Connection service...
[[1B][1;31mFAILED[1B][0m] Failed to start Load default USB gadget schema g1.schema.
See 'systemctl status usbg.service' for details.
[[1B][32m  OK  [1B][0m] Started Connection service.
[[1B][32m  OK  [1B][0m] Started Login Service.
[[1B][32m  OK  [1B][0m] Reached target Remote File Systems (Pre).
[[1B][32m  OK  [1B][0m] Reached target Remote File Systems.
         Starting Permit User Sessions...
         Starting Network Service...
[[1B][32m  OK  [1B][0m] Started Permit User Sessions.
[    6.569699] fec 30be0000.ethernet eth0: Freescale FEC PHY driver [Micrel KSZ8041] (mii_bus:phy_addr=30be0000.etherne:00, irq=-1)
         Starting Hostname Service...
         Starting WPA supplicant...
[    6.639733] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[[1B][32m  OK  [1B][0m] Started Serial Getty on ttymxc0.
[[1B][32m  OK  [1B][0m] Reached target Login Prompts.
[[1B][32m  OK  [1B][0m] Started LXDE Display Manager.
[[1B][32m  OK  [1B][0m] Started Network Service.
[[1B][32m  OK  [1B][0m] Started WPA supplicant.
[[1B][32m  OK  [1B][0m] Started Hostname Service.
[[1B][32m  OK  [1B][0m] Reached target Network.
         Starting Network Name Resolution...
[[1B][32m  OK  [1B][0m] Started Network Name Resolution.
[[1B][32m  OK  [1B][0m] Reached target Multi-User System.
[[1B][32m  OK  [1B][0m] Reached target Graphical Interface.
         Starting Update UTMP about System Runlevel Changes...
[[1B][32m  OK  [1B][0m] Started Update UTMP about System Runlevel Changes.

|       |                  .-.           o o        
|   |   |-----.-----.-----.| |   .----..-----.-----.
|       |     | __  |  ---'| '--.|  .-'|     |     |
|   |   |  |  |     |---  ||  --'|  |  |  '  | | | |
'---'---'--'--'--.  |-----''----''--'  '-----'-'-'-'
                -'  |

The Angstrom Distribution colibri-imx7 ttymxc0

Angstrom v2015.12 - Kernel 4.1.15-v2.6b2+g0ff849d


The default login is with ‘root’:

colibri-imx7 login: root

Last login: Thu Jun 30 17:08:02 UTC 2016 on ttymxc0
[1B]7[1B][r[1B][999;999H[1B][6n[1B]8root@colibri-imx7:~# ls -al
ls -al
drwxr-xr-x    5 root     root           504 Jun 30 17:07 .
drwxr-xr-x    3 root     root           224 Jun 24 16:21 ..
-rw-------    1 root     root           115 Jun 30 17:07 .bash_history
drwxr-xr-x    6 root     root           432 Jun 30 17:07 .cache
drwxr-xr-x    5 root     root           352 Jun 30 17:05 .config
-rw-------    1 root     root             0 Jun 30 17:07 .xsession-errors
drwxr-xr-x    2 root     root           160 Jun 30 17:05 Desktop

With this I have booted the default firmware and I have logged in as root :-).


I’m excited to have that i.MX7 board in my hands. It looks much more professional than the RIoT board. The Toradex module plus carrier board combination costs more than say a Raspberry Pi, but I get a module with a Dual ARM Cortex-A7 plus an ARM Cortex-M4 in a small form factor, usable for industrial usage. Next steps will be to reflash the Linux BSP, followed by getting FreeRTOS running on the M4. I will see how far I can get this week end documenting it in follow-up articles.




6 thoughts on “Tutorial: First Steps with NXP i.MX7 and Toradex Colibri Board

  1. Hello Eric

    Now that you have mentioned the imx6solox at the beginning of the article, could you please write an article about how to make the M4 work with FreeRTOS on the imx6solox?

    And I’m begging you on this one please. I haven’t been able to make it work, the documentation on this is scarce and confusing, there is no community support and the freescale FAEs I have contacted I don’t know if the don’t care, if they don’t know how, or what is the deal because nobody has answered my questions.

    We are going to use like 50,000 imx6solox parts a year so I don’t know why they are not interested on helping me out.

    If you don’t have time for the article, could you please refer me to a FAE that knows how to work with the imx6solox and it’s M4? And not just how to make it work in the sabre board, I was able to make it work in the sabre board, like any other dev boards is just like following a kitchen recipe, but that doesn’t help at all, I need somebody that can help me to be able to work with the M4 in a custom board, developing and debugging the M4 for our product.

    Thank you very much for helping and for your great articles!


    • Hi Manuel,
      thanks for the ‘flowers’ :-).
      the RIoT board (at least the one I have (with dust on it)) has an i.MX6Solo, and is not the i.MXSoloX (unless I’m wrong), and has no M4 on it. I don’t own any other i.MX6 board than the RIoT one, so have no experience with it.
      And as I have not read (yet?) the i.MX6SoloX documentation, not sure what the problem could be. But I know that there is variation in the i.MX how the cores come up, and how they are connected to the debug interface. I know for sure that debugging the M4 is a challenge. So I probably won’t be able to help you immediately anyway. But I’ll pass this to my FAE contact inside NXP, so hopefully they can help you.
      I hope this will help,


      • Thank you very much!
        Of course, that helps, a FAE that knows very well how to work with the imx6solox cortex M4 core in a custom board will be definitely a very good help.


  2. Pingback: Tutorial: Running FreeRTOS on NXP i.MX7Dual Cortex-M4F | MCU on Eclipse

  3. Pingback: Tutorial: Updating Embedded Linux on Toradex i.MX7 Colibri Module using SD Card | MCU on Eclipse

  4. Pingback: Tutorial: Building FreeRTOS Applications for ARM Cortex-M4 on i.MX7 with Eclipse | MCU on Eclipse

What do you think?

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s