-
Notifications
You must be signed in to change notification settings - Fork 0
On iMX23
Recently, whilst tidying up my stuff after moving into a new house, I found this Olinuxino Mini and that iMX233 EVK board. Both are built with iMX233 SoC which comes originally from Freescale what had later become NXP. (I should have said 'came' since iMX233 SoC is officially obsolete and discontinued since 2019.)
[!TIP] For less patient readers: here is my Buildroot for imx23 branch which includes all patches I made to provide better support for iMX23 platform. I hope it might be interesting for someone who is considering or counting out options to upgrade a fleet of iMX23 based devices.
Initial search on the internet brought me to OpenWRT iMX233 Olinuxino page. The first impression was less than great. I would have expected mature SoC platform, but looking at what is under 'Working' turns out that only USB and LAN (attached to USB, BTW) work. Everything else - might or might not work, hmm... To jump ahead: I've just wanted to play a bit with a very cool DirectFB2 project and LCD attached to iMX233 EVK to see what DirectFB2 could be useful for, but... Well, it's open source, so save help yourselves!
Next stop to check for board support was Buildroot. Buildroot includes configuration files for both boards. Having enough experience with Buildroot I forked it into https://github.com/xaelsouth/buildroot/tree/feature/imx23, cloned and then kicked off the build process:
make O=output/imx233_olinuxino olimex_imx233_olinuxino_defconfig && cd output/imx233_olinuxino && make -j$(nproc)
make O=output/imx233_evk imx23evk_defconfig && cd output/imx233_evk && make -j$(nproc)Few coffee cups later I was presented with sdcard.img - one for each board - ready to write to SD card. iMX233 readme and Olinuxino readme will explain that better than I would ever be able to do. The only difference is that Olinuxino uses micro SD card vs. iMX233 EVK wants SD card.
According to the schematics Olinuxino Mini does not exactly have a lot hardware, what could have been tested after booting from uSD card:
- works: uSD card/SPI, USB host, RTC with watchdog, GPIO
- does not work: line in, line out, composite video/TV-out
- untested: JTAG, PWM, I2C, DCP (crypto hardware), LRADC (analog to digital converter)
In terms of hardware the iMX233 EVK is way more interesting. According to the schematics (SPF_77066.pdf), the board has 8-bit NAND, UART, ENC28J60 SPI Ethernet, SD card, array of buttons, LCD, I2C devices (ADC, accelerometer, 24LC128 EEPROM), two PWM controlled LEDs. 128MB RAM (yep, MB!) is quite cool too.
After booting from SD card the LCD will immediately light up, which means that LCD and PWM used as LCD backlight work.
Sad, but SPI Ethernet is multiplexed with uSD card and can work only if booted from USB or NAND.
Application UART works, so at least we could SLIP at no less than 115200 bps or approx. 10KB/s 😒.
While trying to test accelerometer and EEPROM sitting on I2C bus, I quickly realised that using SD card for the development with plugging and unplugging really sucks. Therefore I had considered ordering of USB SD MUX and even its price, approx. 120€, didn't go down the wrong pipe, but I would probably have been waiting several days or maybe weeks until the package arrives from Europe! Anyway, since the board supports booting from USB I would rather use it this way. Unfortunately, due to the old hardware and not very well maintained drivers and tools I ran into a whole bunch of issues which I will be describing below.
According to the Linux BSP guide, iMX23 ROM loads so called bootstream from via DIP switch or OTP fuses configured boot media to perform hardware initialisation and to finally boot Linux. Bootstream is usually split into multiple bootlets: one will initialise power supply, next one clocks and RAM, third one optionally creates ATAGS for the Linux kernel command line. Even the Linux kernel will be considered as bootlet. Bootlets can be found in the Buildroot tree boot/mxs-bootlets. When using mxs-bootles the boot sequence is as follows:
- power_prep for power supply initialisation
- boot_prep for clock and RAM initialisation
- optionally: U-Boot (proper). Can be used to load device tree, initial ramdisk - if applicable, and Linux kernel from any media and finally boot into
- alternatively: directly boot Linux kernel with included initial ramdisk and attached device tree. Linux kernel command line should preferably be written out as bootargs in the device tree, but can instead be compiled into the Linux kernel statically.
[!NOTE] Should one want to use mxs-bootstreams, don't forget to tweak CPU clock somewhere after RAM initialisation. Otherwise, the CPU would be clocked at 227MHz instead of 454MHz. I think the old 2.6 kernel changed the clock automagically, but newer ones, and I'm talking about 6.6.x, don't.
[!NOTE] Using mxs-bootlets makes sense if long-term proven old bootlets for power and RAM initialisation have to be preserved.
Although mxs-bootlets work with iMX233 EVK board, using them does not make much sense since U-Boot replaces bootlets with its own implementation. In that case bootstream will include exactly two bootlets as they are, for example, being used to boot from SD card:
- U-Boot SPL for power and RAM initialisation
- U-Boot (proper) to boot Linux
Now enough about bootstreams and their alternatives. How to use them for USB boot?
Windows users might be considering sb_loader. Don't know how or whether it works, sorry.
Linux users can use sb_loader, which will be compiled as host utility. When creating imx-sb-loader I took the liberty of including the source file in the package. BTW, sbloader.c has been developed in 2010, 16 years ago at the time of writing, and still works - impressive!
Having sb_loader I was still missing the bootstream (something with .sb file extension) in the folder with all build artefacts, usually output/images. Turns out, BR2_TARGET_UBOOT_FORMAT_SB must be enabled and u-boot.sb will be copied along with other binaries. Having DIP switch set to 0000 and debug serial (115200 8N1) attached, let's boot u-boot.sb:
# Host PC
sudo output/imx233_evk/host/bin/sb_loader -d -p hid output/imx233_evk/images/u-boot.sb
Device: 066f:3780 @ 1.76
libusb: error [submit_control_transfer] submiturb failed, errno=16
Cannot probe transfer size, using default.
Transfer size: 1024
Status: PassedHTLC appears in the debug console; nothing else happens. Linux BSP guide reveals that L is LOAD and C is CALL. Well, it loads and calls U-Boot SPL and then gets stuck there for unknown reason, whilst the same code works when booting from SD card 😕. Digging for three halfdays... It turns out that something in U-Boot SPL must have gone wrong with the RAM size detection. After applying this patch I can finally see U-Boot prompt, yay:
HTLCLJ
U-Boot 2024.04 (Jul 10 2026 - 19:13:50 +1200)
CPU: Freescale i.MX23 rev1.3 at 454 MHz
BOOT: USB
DRAM: 128 MiB
Core: 22 devices, 15 uclasses, devicetree: separate
NAND: 4096 MiB
MMC: MXS MMC: 0
Loading Environment from MMC... MMC: no card present
*** Warning - No block device, using default environment
Loading Environment from nowhere... OK
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
=>The disadvantage of the patch mentioned above is that the RAM size must be correct hard-coded as PHYS_SDRAM_1_SIZE.
boot would boot Linux from SD card, which is not exactly what I wanted, since Ethernet would still be blocked by SD card. Also, at this time I could not use NAND to load Linux kernel to boot, because MXS NAND driver for iMX23 is sort of unsupported. Bump.
The solution to that problem was to create a bootstream with preloaded ITB file to include Linux, initial ramdisk and device tree. Now it can boot nicely:
Click to view USB boot output
```console HTLCLLJU-Boot 2024.04 (Jul 10 2026 - 19:13:50 +1200)
CPU: Freescale i.MX23 rev1.3 at 454 MHz BOOT: USB DRAM: 128 MiB Core: 22 devices, 15 uclasses, devicetree: separate NAND: 4096 MiB MMC: MXS MMC: 0 Loading Environment from MMC... MMC: no card present *** Warning - No block device, using default environment
Loading Environment from nowhere... OK In: serial Out: serial Err: serial Hit any key to stop autoboot: 0 MMC: no card present MMC: no card present Try booting from ITB at 0x46000000
Using 'config-imx23-evk-enc28j60' configuration Verifying Hash Integrity ... OK Trying 'kernel' kernel subimage Description: Kernel Type: Kernel Image Compression: uncompressed Data Start: 0x460000b4 Data Size: 6737048 Bytes = 6.4 MiB Architecture: ARM OS: Linux Load Address: 0x42000000 Entry Point: 0x42000000 Hash algo: sha256 Hash value: f237d652f1c62d43abbfd604d9030ae348a3f956b2a1caae445c1c5c5234374e Verifying Hash Integrity ... sha256+ OK
Using 'config-imx23-evk-enc28j60' configuration Verifying Hash Integrity ... OK Trying 'ramdisk' ramdisk subimage Description: Ramdisk Type: RAMDisk Image Compression: uncompressed Data Start: 0x4666ce38 Data Size: 5830130 Bytes = 5.6 MiB Architecture: ARM OS: Linux Load Address: 0x43000000 Entry Point: unavailable Hash algo: sha256 Hash value: c1b62d1f366459a64f55fe07a823ccecd8ce3eab0d00d6a02b6a2e280788ed00 Verifying Hash Integrity ... sha256+ OK Loading ramdisk from 0x4666ce38 to 0x43000000
Using 'config-imx23-evk-enc28j60' configuration Verifying Hash Integrity ... OK Trying 'fdt-imx23-evk-enc28j60' fdt subimage Description: Device Tree: imx23-evk-enc28j60 Type: Flat Device Tree Compression: uncompressed Data Start: 0x46bfc530 Data Size: 13569 Bytes = 13.3 KiB Architecture: Unknown Architecture Load Address: 0x41000000 Hash algo: sha256 Hash value: b3b7c6179eeba6b6f0ca10d368ca6316f01837bbf28a86fb864c20b57ec31c43 Verifying Hash Integrity ... sha256+ OK Loading fdt from 0x46bfc530 to 0x41000000 Booting using the fdt blob at 0x41000000 Working FDT set to 41000000 Loading Kernel Image to 42000000 Loading Ramdisk to 475c3000, end 47b525f2 ... OK Loading Device Tree to 475bc000, end 475c2500 ... OK Working FDT set to 475bc000
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 6.6.143 (hal@ade-laptop) (arm-linux-gcc.br_real (Buildroot 2021.11-18033-g83947c7bb6) 14.3.0, GNU ld (GNU Binutils) 2.43.1) #1 Fri Jul 10 19:31:32 NZST 2026 [ 0.000000] CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=0005317f [ 0.000000] CPU: VIVT data cache, VIVT instruction cache [ 0.000000] OF: fdt: Machine model: Freescale i.MX23 Evaluation Kit [ 0.000000] Memory policy: Data cache writeback [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000040000000-0x0000000047ffffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000040000000-0x0000000047ffffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000040000000-0x0000000047ffffff] [ 0.000000] Kernel command line: console=ttyAMA0,115200 root=/dev/ram0 rw rootwait=30 [ 0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes, linear) [ 0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes, linear) [ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 32512 [ 0.000000] mem auto-init: stack:all(zero), heap alloc:off, heap free:off [ 0.000000] Memory: 103396K/131072K available (9455K kernel code, 1228K rwdata, 3016K rodata, 256K init, 6534K bss, 27676K reserved, 0K cma-reserved) [ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [ 0.000000] Running RCU self tests [ 0.000000] Running RCU synchronous self tests [ 0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16 [ 0.000000] clocksource: mxs_timer: mask: 0xffff max_cycles: 0xffff, max_idle_ns: 911346093 ns [ 0.000000] Console: colour dummy device 80x30 [ 0.000000] Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar [ 0.000000] ... MAX_LOCKDEP_SUBCLASSES: 8 [ 0.000000] ... MAX_LOCK_DEPTH: 48 [ 0.000000] ... MAX_LOCKDEP_KEYS: 8192 [ 0.000000] ... CLASSHASH_SIZE: 4096 [ 0.000000] ... MAX_LOCKDEP_ENTRIES: 32768 [ 0.000000] ... MAX_LOCKDEP_CHAINS: 65536 [ 0.000000] ... CHAINHASH_SIZE: 32768 [ 0.000000] memory used by lock dependency info: 4125 kB [ 0.000000] memory used for stack traces: 2112 kB [ 0.000000] per task-struct memory footprint: 1536 bytes [ 0.000000] sched_clock: 32 bits at 100 Hz, resolution 10000000ns, wraps every 21474836475000000ns [ 0.000000] Calibrating delay loop... 227.32 BogoMIPS (lpj=1136640) [ 0.080000] CPU: Testing write buffer coherency: ok [ 0.080000] pid_max: default: 32768 minimum: 301 [ 0.080000] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear) [ 0.080000] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear) [ 0.110000] Setting up static identity map for 0x40008400 - 0x40008458 [ 0.130000] devtmpfs: initialized [ 0.200000] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns [ 0.200000] futex hash table entries: 256 (order: 2, 12288 bytes, linear) [ 0.210000] pinctrl core: initialized pinctrl subsystem [ 0.240000] NET: Registered PF_NETLINK/PF_ROUTE protocol family [ 0.240000] DMA: preallocated 256 KiB pool for atomic coherent allocations [ 0.300000] /apb@80000000/apbh@80000000/pinctrl@80018000: Fixed dependency cycle(s) with /apb@80000000/apbh@80000000/pinctrl@80018000/hog@0 [ 0.360000] gpio gpiochip0: Static allocation of GPIO base is deprecated, use dynamic allocation. [ 0.390000] gpio gpiochip1: Static allocation of GPIO base is deprecated, use dynamic allocation. [ 0.430000] gpio gpiochip2: Static allocation of GPIO base is deprecated, use dynamic allocation. [ 0.500000] /apb@80000000/apbh@80000000/lcdif@80030000: Fixed dependency cycle(s) with /panel [ 0.500000] /panel: Fixed dependency cycle(s) with /apb@80000000/apbh@80000000/lcdif@80030000 [ 0.520000] Serial: AMBA PL011 UART driver [ 0.540000] 80070000.serial: ttyAMA0 at MMIO 0x80070000 (irq = 116, base_baud = 0) is a PL011 rev2 [ 0.540000] printk: console [ttyAMA0] enabled [ 0.890000] SCSI subsystem initialized [ 0.900000] regulator-vddio-sd0 enforce active low on GPIO handle [ 0.930000] usbcore: registered new interface driver usbfs [ 0.960000] usbcore: registered new interface driver hub [ 0.960000] usbcore: registered new device driver usb [ 0.980000] pps_core: LinuxPPS API ver. 1 registered [ 0.990000] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti giometti@linux.it [ 1.000000] PTP clock support registered [ 1.020000] Advanced Linux Sound Architecture Driver Initialized. [ 1.080000] clocksource: Switched to clocksource mxs_timer [ 1.580000] NET: Registered PF_INET protocol family [ 1.590000] IP idents hash table entries: 2048 (order: 2, 16384 bytes, linear) [ 1.640000] tcp_listen_portaddr_hash hash table entries: 128 (order: 1, 5120 bytes, linear) [ 1.650000] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear) [ 1.660000] TCP established hash table entries: 1024 (order: 0, 4096 bytes, linear) [ 1.670000] TCP bind hash table entries: 1024 (order: 5, 81920 bytes, linear) [ 1.680000] TCP: Hash tables configured (established 1024 bind 1024) [ 1.710000] UDP hash table entries: 256 (order: 3, 24576 bytes, linear) [ 1.720000] UDP-Lite hash table entries: 256 (order: 3, 24576 bytes, linear) [ 1.730000] NET: Registered PF_UNIX/PF_LOCAL protocol family [ 1.740000] RPC: Registered named UNIX socket transport module. [ 1.750000] RPC: Registered udp transport module. [ 1.760000] RPC: Registered tcp transport module. [ 1.760000] RPC: Registered tcp-with-tls transport module. [ 1.770000] RPC: Registered tcp NFSv4.1 backchannel transport module. [ 1.830000] Unpacking initramfs... [ 5.000000] workingset: timestamp_bits=30 max_order=15 bucket_order=0 [ 5.020000] squashfs: version 4.0 (2009/01/31) Phillip Lougher [ 5.040000] NFS: Registering the id_resolver key type [ 5.060000] Key type id_resolver registered [ 5.060000] Key type id_legacy registered [ 5.080000] ntfs3: Read-only LZX/Xpress compression included [ 5.080000] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc. [ 5.100000] NET: Registered PF_ALG protocol family [ 5.100000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 248) [ 5.110000] io scheduler mq-deadline registered [ 5.120000] io scheduler kyber registered [ 5.140000] io scheduler bfq registered [ 5.260000] mxs-dma 80004000.dma-controller: initialized [ 5.320000] mxs-dma 80024000.dma-controller: initialized [ 5.360000] 8006c000.serial: ttyAPP0 at MMIO 0x8006c000 (irq = 118, base_baud = 1500000) is a 8006c000.serial [ 5.380000] mxs-auart 8006c000.serial: Found APPUART 3.0.0 [ 5.500000] [drm] Initialized mxsfb-drm 1.0.0 20160824 for 80030000.lcdif on minor 0 [ 5.760000] Console: switching to colour frame buffer device 100x30 [ 5.790000] mxsfb 80030000.lcdif: [drm] fb0: mxsfb-drmdrmfb frame buffer device [ 5.880000] gpmi-nand 8000c000.nand-controller: clock setting: expected 22000000, got 21818182 [ 5.910000] nand: device found, Manufacturer ID: 0xec, Chip ID: 0xd7 [ 5.920000] nand: Samsung NAND 4GiB 3,3V 8-bit [ 5.920000] nand: 4096 MiB, MLC, erase size: 512 KiB, page size: 4096, OOB size: 218 [ 5.950000] gpmi-nand 8000c000.nand-controller: clock setting: expected 22000000, got 21818182 [ 5.960000] gpmi-nand 8000c000.nand-controller: Scanning for an NCB fingerprint... [ 5.990000] gpmi-nand 8000c000.nand-controller: Found a fingerprint [ 6.000000] Scanning device for bad blocks [ 6.190000] Bad eraseblock 137 at 0x000004480000 [ 8.090000] Freeing initrd memory: 5696K [ 10.860000] Bad eraseblock 5162 at 0x0000a1500000 [ 11.110000] Bad eraseblock 5475 at 0x0000ab180000 [ 11.190000] Bad eraseblock 5573 at 0x0000ae280000 [ 12.180000] Bad eraseblock 6872 at 0x0000d6c00000 [ 12.270000] Bad eraseblock 6976 at 0x0000da000000 [ 12.500000] Bad eraseblock 7278 at 0x0000e3700000 [ 12.720000] random: crng init done [ 13.220000] 8 fixed-partitions partitions found on MTD device gpmi-nand [ 13.220000] Creating 8 MTD partitions on "gpmi-nand": [ 13.230000] 0x000000000000-0x000004000000 : "boot" [ 13.290000] 0x000004000000-0x000005000000 : "env1" [ 13.330000] 0x000005000000-0x000006000000 : "env2" [ 13.360000] 0x000006000000-0x000016000000 : "rootfs1" [ 13.400000] 0x000016000000-0x000026000000 : "rootfs2" [ 13.440000] 0x000026000000-0x000036000000 : "data1" [ 13.480000] 0x000036000000-0x000046000000 : "data2" [ 13.520000] 0x000046000000-0x000100000000 : "spare" [ 13.620000] gpmi-nand 8000c000.nand-controller: driver registered. [ 13.690000] tun: Universal TUN/TAP device driver, 1.6 [ 13.710000] enc28j60 spi0.0: Ethernet driver 1.02 loaded [ 13.750000] SLIP: version 0.8.4-NET3.019-NEWTTY (dynamic channels, max=256). [ 13.760000] CSLIP: code copyright 1989 Regents of the University of California. [ 13.770000] usbcore: registered new interface driver asix [ 13.780000] usbcore: registered new interface driver ax88179_178a [ 13.780000] usbcore: registered new interface driver cdc_ether [ 13.790000] usbcore: registered new interface driver smsc95xx [ 13.800000] usbcore: registered new interface driver net1080 [ 13.810000] usbcore: registered new interface driver cdc_subset [ 13.810000] usbcore: registered new interface driver zaurus [ 13.820000] usbcore: registered new interface driver cdc_ncm [ 13.830000] usbcore: registered new interface driver r8153_ecm [ 13.840000] usbcore: registered new interface driver usb-storage [ 13.890000] ------------[ cut here ]------------ [ 13.890000] WARNING: CPU: 0 PID: 1 at drivers/base/platform.c:450 __platform_get_irq_byname+0xb4/0xd0 [ 13.900000] 0 might be an invalid IRQ number [ 13.910000] Modules linked in: [ 13.910000] CPU: 0 PID: 1 Comm: swapper Not tainted 6.6.143 #1 [ 13.910000] Hardware name: Freescale MXS (Device Tree) [ 13.910000] unwind_backtrace from show_stack+0x10/0x14 [ 13.910000] show_stack from dump_stack_lvl+0x38/0x4c [ 13.910000] dump_stack_lvl from __warn+0x78/0x138 [ 13.910000] __warn from warn_slowpath_fmt+0x94/0xcc [ 13.910000] warn_slowpath_fmt from __platform_get_irq_byname+0xb4/0xd0 [ 13.910000] __platform_get_irq_byname from platform_get_irq_byname+0x10/0x30 [ 13.910000] platform_get_irq_byname from mxs_lradc_ts_probe+0x18c/0x378 [ 13.910000] mxs_lradc_ts_probe from platform_probe+0x58/0xb4 [ 13.910000] platform_probe from really_probe+0xc4/0x2dc [ 13.910000] really_probe from __driver_probe_device+0x90/0x1c4 [ 13.910000] __driver_probe_device from driver_probe_device+0x30/0x11c [ 13.910000] driver_probe_device from __driver_attach+0x94/0x18c [ 13.910000] __driver_attach from bus_for_each_dev+0x7c/0xd0 [ 13.910000] bus_for_each_dev from bus_add_driver+0xc4/0x1ec [ 13.910000] bus_add_driver from driver_register+0x80/0x118 [ 13.910000] driver_register from do_one_initcall+0x60/0x238 [ 13.910000] do_one_initcall from kernel_init_freeable+0x194/0x220 [ 13.910000] kernel_init_freeable from kernel_init+0x10/0x108 [ 13.910000] kernel_init from ret_from_fork+0x14/0x38 [ 13.910000] Exception stack(0xc8819fb0 to 0xc8819ff8) [ 13.910000] 9fa0: 00000000 00000000 00000000 00000000 [ 13.910000] 9fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 13.910000] 9fe0: 00000000 00000000 00000000 00000000 00000013 00000000 [ 14.070000] irq event stamp: 342137 [ 14.070000] hardirqs last enabled at (342145): [] console_unlock+0x138/0x168 [ 14.080000] hardirqs last disabled at (342154): [] console_unlock+0x124/0x168 [ 14.090000] softirqs last enabled at (342136): [] handle_softirqs+0x31c/0x410 [ 14.090000] softirqs last disabled at (342125): [] __irq_exit_rcu+0x12c/0x164 [ 14.100000] ---[ end trace 0000000000000000 ]--- [ 14.120000] input: mxs-lradc-ts as /devices/soc0/80000000.apb/80040000.apbx/80050000.lradc/mxs-lradc-ts/input/input0 [ 14.150000] stmp3xxx-rtc 8005c000.rtc: registered as rtc0 [ 14.150000] stmp3xxx-rtc 8005c000.rtc: setting system clock to 1970-01-01T00:08:24 UTC (504) [ 14.170000] i2c_dev: i2c /dev entries driver [ 14.190000] stmp3xxx_rtc_wdt stmp3xxx_rtc_wdt: initialized watchdog with heartbeat 19s [ 14.210000] mxs-dcp 80028000.crypto: initialized [ 14.220000] mxs-dcp 80028000.crypto: Not in Trusted or Secure State, Non-volatile Test Key in effect [ 14.250000] usbcore: registered new interface driver usbhid [ 14.250000] usbhid: USB HID core driver [ 14.320000] mxs-builtin-codec 80048000.mxs-builtin-codec: Registered mxs-builtin-codec [ 14.340000] mxs-builtin-cpu-dai 80048000.mxs-builtin-cpu-dai: Registered mxs-adc-pcm-driver [ 14.350000] mxs-builtin-cpu-dai 80048000.mxs-builtin-cpu-dai: Registered mxs-builtin-codec-dai [ 14.370000] NET: Registered PF_PACKET protocol family [ 14.370000] Key type dns_resolver registered [ 14.490000] registered taskstats version 1 [ 14.800000] at24 0-0050: supply vcc not found, using dummy regulator [ 14.830000] at24 0-0050: 16384 byte 24lc128 EEPROM, writable, 64 bytes/write [ 14.850000] input: adc-keys as /devices/soc0/adc-keys/input/input1 [ 14.930000] clk: Disabling unused clocks [ 14.950000] ALSA device list: [ 14.950000] #0: mxs-builtin-audio [ 14.960000] uart-pl011 80070000.serial: no DMA platform data [ 14.980000] Freeing unused kernel image (initmem) memory: 256K [ 14.980000] Kernel memory protection not selected by kernel config. [ 14.990000] Run /init as init process Saving 256 bits of creditable seed for next boot Starting syslogd: OK Starting klogd: OK Running sysctl: OK Starting mdev... OK Starting network: OK Starting crond: OK
Welcome to Buildroot buildroot login:
</details>
### U-Boot NAND driver
After more than three half days I managed to port Linux' GPMI driver to U-Boot:
```console
=> nand info
Device 0: nand0, sector size 512 KiB
Page size 4096 b
OOB size 218 b
Erase size 524288 b
ecc strength 16 bits
ecc step size 512 b
subpagesize 4096 b
options 0x00004208
bbt options 0x00010000