July 12, 2012

Unbricking a Nitrogen6X or Sabre Lite i.MX6 board

Your board isn’t booting anymore? U-Boot doesn’t even show up on the serial console? Don’t worry, there’s always a solution to recover!

All our platforms have a DIP switch (SW1) which allow to override the normal boot flow and force a boot to the USB recovery mode (OTG port). Modify its setting to match the pictures below.

sabrelite                 nitrogen6x 

BD-SL (SabreLite)                                                                     Nitrogen6X

nit6xlite                 nitrogen6_som

Nit6x_Lite                                                               Nitrogen6X_SOM

nitrogen6_max                 nit6sx

Nitrogen6_MAX                                                                    Nit6_SoloX

nitrogen6_som2                 nitrogen7

Nitrogen6_SOMv2                                                                Nitrogen7

Linux procedure

If you set the switches to the USB setting and reset the board or cycle power, you should see a “Freescale” device show up in lsusb:

~/$ lsusb
Bus 006 Device 012: ID 15a2:0054 Freescale Semiconductor, Inc.

Combined with the right tools, this can be used to un-brick a board whose serial EEPROM has been trashed, or to program the serial EEPROM on a board which has never been programmed.

Freescale has a tool (the Manufacturing tool) that will do this on Windows OS. For Linux, we built our own, and made the sources available on GitHub:

imx_usb_loader build procedure

To run imx_usb, you’ll need to have libusb installed on your machine. To compile it, you’ll need the libusb headers, which can be installed by grabbing the -dev package:

~$ sudo apt-get install libusb-1.0-0-dev

You can then build your own imx_usb_loader binary:

~$ git clone git://github.com/boundarydevices/imx_usb_loader
Cloning into 'imx_usb_loader'...
remote: Counting objects: 131, done.
remote: Compressing objects: 100% (61/61), done.
remote: Total 131 (delta 71), reused 127 (delta 68)
Receiving objects: 100% (131/131), 44.69 KiB, done.
Resolving deltas: 100% (71/71), done.
~$ cd imx_usb_loader/
~/imx_usb_loader$ make
cc -c imx_usb.c -o imx_usb.o -Wstrict-prototypes -Wno-trigraphs -pipe -ggdb `pkg-config --cflags libusb-1.0`
cc -o imx_usb imx_usb.o -lusb-1.0

imx_usb_loader usage

In normal use, it simply loads a named file into RAM and executes it. If you run it like so, you can launch a U-Boot binary directly.

~/imx_usb_loader$ ./imx_usb u-boot.imx

If you don’t have permissions to access the USB device (can’t open), you should modify your udev rules to fix it. But as a quick workaround, using sudo will help.

~/imx_usb_loader$ sudo ./imx_usb u-boot.imx

If everything goes as planned, you should see U-Boot launch (output on the serial console)

Note that you can find a pre-built binary for your platform here:

If you’ve gone through all of this, you might ask how this un-bricks the board.

It doesn’t. But once you have U-Boot running, you can use U-Boot to upgrade the serial EEPROM using the upgradeu command as discussed in this blog post:

Under Windows

See this post for details on how to use sb_loader.exe under Windows.

The function is essentially the same: sb_loader.exe can be used to download and run a U-Boot image and U-Boot can handle the rest.

Recently, NXP release sb_loader source code in case you need to modify it: