We’re glad to release the latest U-Boot v2017.03 with support for all our platforms:
For the impatient
Our build server automatically generates and uploads all the latest binaries to this address:
The README file contains the exact commit ID of this build images.
Also, the up-to-date 6x_upgrade U-Boot script is included so you can copy all the files directly to the root of your media storage.
For those not sure about which binary to download, here is a quick summary for our boards:
- u-boot.nitrogen6q for the Nitrogen6x/BD-SL-i.MX6 (Sabre-Lite) using the imx.6Q
- u-boot.nitrogen6q2g for the 2G RAM version of Nitrogen6x/Sabre-lite 6Q
- u-boot.nitrogen6_max for the Nitrogen6_MAX
- u-boot.nitrogen6qp_max for the Nitrogen6QP_MAX
- u-boot.nitrogen6q_som2_1g for the Nit6X-SoM V2
- u-boot.nit6xlite for the Nitrogen6x-Lite
- u-boot.nit6xlite1g for the Nitrogen6x-Lite with 1G RAM
- u-boot.nitrogen6sx for the Nitrogen6_SoloX
- u-boot.nitrogen7 for the Nitrogen7
What’s new?
First, this version includes all the latest features and fixes available from mainline U-Boot.
One noticeable change is the use of Kconfig
to select most of the options now (instead of piling them up in the config header).
Also, another important change is the support of sparse images when using Android fastboot
tool.
Build instructions
The usual compilation disclaimers apply for this. It is highly recommended to use the gcc-arm-linux-gnueabihf package available on Ubuntu/Debian.
~$ sudo apt-get install gcc-arm-linux-gnueabihf
First, clone our U-Boot git repository. This is the branch you’ll need to compile and install to work with the new kernel.
~$ git clone https://github.com/boundarydevices/u-boot-imx6 \ -b boundary-v2017.03 ~$ cd u-boot-imx6
Here you’ll need to find and make the relevant defconfig for your board.
If you are using a U-Boot >=2015.07, then at the U-Boot prompt you can type the following to see which defconfig you should build.
=> echo $uboot_defconfig
Otherwise, to see all the defconfigs, use this command and pick the one that is right for you.
~/u-boot-imx6$ find . -name "nit*defconfig" ./configs/nitrogen6_vm1g_defconfig ./configs/nitrogen6q2g_defconfig ./configs/nitrogen6dl2g_defconfig ./configs/nitrogen6s1g_defconfig ./configs/nit6xlite_defconfig ./configs/nitrogen6q_fl_defconfig ./configs/nitrogen7_defconfig ./configs/nitrogen6q_som2_2g_defconfig ./configs/nitrogen6sx_defconfig ./configs/nitrogen6dl_defconfig ./configs/nitrogen6q_defconfig ./configs/nitrogen6s_defconfig ./configs/nitrogen6_lum_dl1_defconfig ./configs/nitrogen6_vm_defconfig ./configs/nitrogen6q_som2_1g_defconfig ./configs/nitrogen6q_som2_4g_defconfig ./configs/nit6xlite1g_defconfig ./configs/nitrogen6qp_max_defconfig ./configs/nitrogen6_max_defconfig
Now compile that defconfig, here I’ll use nitrogen6q_defconfig as an example.
~/u-boot-imx6$ export ARCH=arm ~/u-boot-imx6$ export CROSS_COMPILE=arm-linux-gnueabihf- ~/u-boot-imx6$ make nitrogen6q_defconfig ~/u-boot-imx6$ make -j2 ~/u-boot-imx6$ ./tools/mkimage -A arm -O linux -T script -C none \ -a 0 -e 0 -n "update script" \ -d board/boundary/nitrogen6x/6x_upgrade.txt 6x_upgrade
Flashing procedure
Now you’ll have a u-boot.imx file compiled. Rename the u-boot.imx file to u-boot.{uboot_defconfig} (see below), then move that and the 6x_upgrade script to the root folder of your media (SD Card / USB / SATA drive).
~/u-boot-imx6/$ cp u-boot.imx <mount_path>/u-boot.<uboot_defconfig> ~/u-boot-imx6/$ cp 6x_upgrade <mount_path>/
Plug your media to the platform, power up the board and interrupt u-boot to run the commands below.
If your u-boot prompt is “U-boot >” then you need to set uboot_defconfig
to the value that matches your platform.
Here is an example for Nitrogen6x/BD-SL-i.MX6:
Hit any key to stop autoboot: 0 U-Boot > setenv uboot_defconfig <uboot_defconfig> U-Boot > run upgradeu
Otherwise just run:
Hit any key to stop autoboot: 0 => run upgradeu
This will run the 6x_upgrade script and look for a file u-boot.${uboot_defconfig} and burn it. At this point it might be worth while to clear your environment variables, this will set you up with the default environment variables and no more.
Hit any key to stop autoboot: 0 => env default -a => savee
Then as a final note, if you’ve somehow managed to brick your board through this process and need help. Well, we already wrote a blog post here about that topic.
Hi
I am using Sabre Lite board, with uboot has been upgraded to latest version v2017-03. However currently I cannot boot any of prebuilt images of Ubuntu or Yocto release. Uboot prints out this error:
switch to partitions #0, OK
mmc0 is current device
MMC read: dev # 0, block # 2048, count 8192 … 8192 blocks read: OK
Wrong Image Format for bootm command
ERROR: can’t get kernel image!
Look at the Yocto Morty release, I see zImage instead of uImage. So I tried this way
> fatload mmc 0 10800000 zImage
reading zImage
> fatload mmc 0 12800000 imx6q-sabrelite.dtb
reading imx6q-sabrelite.dtb
> bootz 10800000 – 12800000
At this time the console prints out “Starting kernel …” and hangs there forever.
What possibly is the reason? And is it because uboot cannot load zImage?
Thank you
Hi,
Please make sure to erase previous environment and use 6x_bootscript to boot.
=> run clearenv
Regards,
Gary
Hi Gary
Great! It works perfectly.
Thank you very much for your quick response!
Long Luong
Trying to upgrade Sabrelite board to latest.
typed:
***note after first attempt i renamed u-boot. to 6x_upgrade***
U-boot > run upgradeu
SATA device 0: Model: Firm: Ser#:
Type: Hard Disk
Capacity: not available
… is now current device
** Bad device size – sata 0 **
SATA device 1: unknown device
** Bad device sata 1 **
MMC: no card present
MMC: no card present
** Bad device mmc 0 **
switch to partitions #0, OK
mmc1 is current device
reading /6x_upgrade
527360 bytes read in 106 ms (4.7 MiB/s)
## Executing script at 10008000
Wrong image format for “source” command
USB is stopped. Please issue ‘usb start’ first.
** Bad device usb 0 **
USB is stopped. Please issue ‘usb start’ first.
** Bad device usb 1 **
I then tried:
U-Boot > load mmc 1:1 10008000 /6x_upgrade
reading /6x_upgrade
527360 bytes read in 106 ms (4.7 MiB/s)
U-Boot > source 10008000
## Executing script at 10008000
Wrong image format for “source” command
Here is my board and version info
U-Boot > bdinfo
arch_number = 0x00000EB9
boot_params = 0x10000100
DRAM bank = 0x00000000
-> start = 0x10000000
-> size = 0x40000000
eth0name = FEC
ethaddr = (not set)
eth1name = usb_ether
eth1addr = (not set)
current eth = FEC
ip_addr =
baudrate = 115200 bps
TLB addr = 0x4FFF0000
relocaddr = 0x4FF4F000
reloc off = 0x3874F000
irq_sp = 0x4F34CEC0
sp start = 0x4F34CEB0
FB base = 0x4F354380
U-Boot > version
U-Boot 2014.07-00136-gf870252 (Sep 22 2014 – 09:16:34)
arm-linux-gnueabihf-gcc (Ubuntu/Linaro 4.8.2-16ubuntu4) 4.8.2
GNU ld (GNU Binutils for Ubuntu) 2.24
Question: Is there a Migration path I need to follow?
Hi Butler
It looks like you misunderstood 6x_upgrade script and uboot binary. For sabrelite board please do as below:
1. Download both 6x_upgrade and uboot.tritrogen6q and put to SD Card
http://linode.boundarydevice.wpengine.com/u-boot-images/u-boot.nitrogen6q
http://linode.boundarydevice.wpengine.com/u-boot-images/6x_upgrade
2. Put SD Card into the board and press any key at uboot timer countdown to get into uboot command
> setenv uboot_defconfig nitrogen6q
> run upgradeu
Wait until it says finished and press reset, after that you can see the updated uboot with version 2017-03 displayed on the terminal.
Good luck!
Long
Worked.. I missed the line about copying 6x_upgrade.. thanks!
Sir,
I want to load the new u-boot file using seggar Jlink – JFlash .
As per the Blog : Debugging using Segger J-Link JTAG
Two scripts are Required
1) Scripts to connect
2) Scripts to Initialize the RAM and core.
3) Using then loadbin command , Shall I put the uboot binary in to NOR memory?
Will you able to guide this seggger JTAG flashing method?
Regards
Ramesh
Hi,
Please make sure to check out our wiki. It will point you to our JTAG post that explain how to load U-Boot to RAM:
https://boundarydevice.wpengine.com/debugging-using-segger-j-link-jtag/
Regards,
Gary
Dear Gary
As per this Blog : https://boundarydevice.wpengine.com/debugging-using-segger-j-link-jtag/
It is loading to RAM and using u-boot scripts to write in to SPI Flash.
My humble Query is
Shall I use seggar JTAG Tool load the binary file in to Flash ? ( flashalgorithem needed).
Shall i get any guidance?
Regards
Ramesh
Hi Ramesh,
No we don’t have the necessary modification to write to flash directly from the Segger tool.
We recommend loading U-Boot with JTAG and then having U-Boot do the writing to the NOR.
Regards,
Gary
Hi Gary,
I’m trying to follow Boundary Device’s “Debugging using Segger J-Link JTAG” tutorial using a sabrelite board. I eventually want to target a custom board. Things are going pretty well until trying to execute the gdb script. Loading and running the program fails.
(gdb) monitor memU32 0x021b0404
Reading from address 0x021B0404 (Failed)
(gdb) load
Loading section .text, size 0x4f590 lma 0x17800000
Loading section .rodata, size 0x12db6 lma 0x1784f590
Loading section .hash, size 0x18 lma 0x17862348
Loading section .data, size 0x3b40 lma 0x17862360
Loading section .got.plt, size 0xc lma 0x17865ea0
Loading section .u_boot_list, size 0xb68 lma 0x17865eac
Loading section .rel.dyn, size 0xb598 lma 0x17866a14
Loading section .dynsym, size 0x30 lma 0x17871fac
Loading section .dynstr, size 0x1 lma 0x17871fdc
Loading section .dynamic, size 0x88 lma 0x17871fe0
Loading section .interp, size 0x11 lma 0x17872068
Start address 0x17800000, load size 467060
Transfer rate: 338 KB/sec, 3828 bytes/write.
(gdb) b print_cpuinfo
Breakpoint 1 at 0x17801b78: file arch/arm/imx-common/cpu.c, line 161.
(gdb) c
Continuing.
Program received signal SIGTRAP, Trace/breakpoint trap.
_start () at arch/arm/lib/vectors.S:54
54 b reset
(gdb)
In fact I can’t even read from memory using gdb, or even read from the registers the script wrote to previously.
It looks like the following script entries are causing problems:
(# From U-Boot 1066mhz_4x128mx16.cfg section)
monitor memU32 0x021b001c=0x04088032
monitor memU32 0x021b001c=0x00008033
monitor memU32 0x021b001c=0x00428031
monitor memU32 0x021b001c=0x19308030
monitor memU32 0x021b001c=0x04008040
If I remove these entries from the script, I can read memory-mapped registers successfully after script completion. Reading/Writing to ddr memory only works with the LSB of a 32-bit word. I assume these entries are pretty important to proper memory operation, they are writes to the MDSCR register which sends mode commands to the memory modules. Without working memory I can’t load and run u-boot properly.
Do you have any ideas as to what this could be?
Is it possibly a newer version of JLINK (I have SEGGER J-Link GDB Server V6.18d Command Line Version)?
Hi,
Since this is related to J-Link, please post future questions to the J-Link blog post:
https://boundarydevice.wpengine.com/debugging-using-segger-j-link-jtag/
As for the script, are you using a standard SabreLite (from Boundary Devices, with 1GB of RAM).
Have you moved the switches to USB recovery mode (SW1) so that you know for sure the BootROM didn’t execute anything before running the script?
Regards,
Gary
Gary,
This was it, I feel a bit foolish for missing this in the original blog post.
I will post future questions about j-link debugging the segger blog.
Thanks for the help!
Mike
Hi,
I have followed above steps for Nitrogen 7 board. But when my u-boot stops/hangs with the below log message. I am not getting any other log messages after this. Any suggestion is highly appreciated .
U-Boot 2017.03-26149-gd70bdd5 (May 23 2017 – 18:33:19 +0530)
CPU: Freescale i.MX7D rev1.2 996 MHz (running at 792 MHz)
CPU: Extended Commercial temperature grade (-20C to 105C) at 33C
Reset cause: POR
Board: i.MX7D Nitrogen7
I2C: ready
DRAM: 1 GiB
PMIC: PFUZE3000 DEV_ID=0x30 REV_ID=0x11
MMC: FSL_SDHC: 0, FSL_SDHC: 1
Thanks.
Hi,
Please make sure to update both u-boot and the qspi parameters for Nitrogen7 (QSPI flash requires parameters).
If you haven’t flashed it properly, please make sure to try using the USB recovery procedure:
https://boundarydevice.wpengine.com/unbricking-nitrogen6x-sabre-lite-i-mx6-board/
Regards,
Gary
Hi Gary,
Thanks. I have resolved this hang issue. The reason is, I have used a different ARM tool chain. After changing the tool chain as recommended in the post, every thing works fine.
Now I have an another doubt. How to to flash the u-boot in eMMC and boot the u-boot from eMMC. I guess now, u-boot is booting from NOR flash.
Hi,
Our platforms only boot from NOR flash (fuse blown that way).
Regards,
Gary
I built uboot from source code. After that I tried to follow the steps in “Flashing procedure”
~/u-boot-imx6/$ cp u-boot.imx /u-boot.
~/u-boot-imx6/$ cp 6x_upgrade /
(1) What should be the value of mount_path can it be directory where I want to copy?
(2) The second command does not work. It fails to find the file 6x_upgrade. It is not there in the directory u-boot-imx6. In one of the sub-directories I could find 6x_upgrade.txt Should I copy that?
Hi,
1) The mount path can be a folder, it should be where you mounted the storage device that will go in the target.
2) The 6x_upgrade generation is provided in the build instructions, please follow them all.
Note that we now have a newer U-Boot version which generates the bootscripts for you and copy them where you want:
https://boundarydevice.wpengine.com/u-boot-v2017-07/
Regards,
Gary
Hi All, I am using u-boot 2017 version with kernel 4.1.15.2.0 on Nitrogen6_Max (IMX6Q) board. I have a question regarding 6Q’s LDO settings. How it’s different to the SaberSd board ?
I’ve noticed that LDO_SOC regulator has been set in ‘arch/arm/cpu/armv7/mx6/soc.c’, in u-boot as an ‘ldo-enable’ regulator. However LDO_ARM and LDO_PU regulators do not seem to be set anywhere in u-boot. In kernel (arch/arm/mach-imx/gpc.c), only the ‘pu_reg’ is bypassed. So where those regulators are exactly defined in boundary kernel ?
How we can benefit from ldo_bypass mode ?
Thanks in Advance
Hi Kulunu
SabreSD board has a pmic to adjust the ARM/SOC voltages. Nitrogen6_max does not. I don’t think u-boot sets
LDO_ARM/LDO_SOC regulators because it does not change cpu speed. The bypass regulators are specified from the device tree.
imx6qdl-sabresd has
&cpu0 {
arm-supply = < &sw1a_reg>;
soc-supply = < &sw1c_reg>;
};
Nitrogen6_max does not have a pmic to specify here, so it cannot use ldo_bypass mode.
Dear Tkisky,
Thanks for your prompt response. I find the LDO_SOC setting here (don’t know where this is overwritten by the kernel though) :
https://github.com/boundarydevices/u-boot-imx6/blob/boundary-v2017.03/arch/arm/cpu/armv7/mx6/soc.c#L504
However I cannot find the setting of LDO_ARM anywhere.
And in kernel gpc.c states, ARM and SOC regulators are set (PU is not) in UBOOT and only PU regulator is set to bypassed mode during the kernel.
https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_4.1.15_2.0.0_ga/arch/arm/mach-imx/gpc.c#L860
So do you know exactly where the LDO_ARM is set in the kernel ? Even in dtb, the register map for those analog regulators are there, not the values of those.
Anuradha
Hi, how does the 6x_bootscript of Yocto image load the root file system to the ram address ? I know that zImage and dtb are loaded to 10800000 and 13000000 addresses respectively. what does initrd_high stand for ?
Thanks
So in nutshell I would like to use HAB for rootfs as well 🙂
Hi,
You can sign a ramdisk but not a partition. For partition securing, you can have a look at ecryptfs:
http://events.linuxfoundation.org/sites/events/files/slides/OSELAS.Verified-Boot-20161012-2.pdf
Regards,
Gary
Hi,
Yocto doesn’t use an initrd and mounts the rootfs directly.
Regards,
Gary
Hi Gary,
how can I use this u-boot to boot the device from SD card instead of SPI-NOR.
Regards,
Lokesh
Hi Lokesh,
You can’t, U-Boot doesn’t decide where to boot from, the BootROM does. On our platforms, the fuses are burnt so that the bootROM always boots from SPI NOR.
Regards,
Gary
I see in several places in u-boot build configuration scripts the “config macro” (for lack of a better term) “MX6Q” and “MX6QDL” can someone please explain just what the difference is in terms of u-boot build procedure? Is this actually different silicon?
I downloaded the link http://linode.boundarydevices.com/u-boot-images/u-boot.nitrogen6q
which I copied from above instructions to download 2017-03 version of Uboot. After I installed it showed 2017-07.
The link does not download 2017-03.
I then downloaded 2015-07 version – after installation showed correct version.
Hence the link is broken. Please correct this.
Thank you
Hi,
Here is the link to outdated 2017.03:
http://linode.boundarydevices.com/u-boot-images-2017.03
However we strongly recommend using 2017.07 instead.
Regards
Thank you for this link.
Hi All,
I used Nitrogen 6 Max development board for my custom hardware design. As well as I used Nitrogen 6 Max dtbs and uboot for that. But I changed its VDDSOC_IN and VDDARM_IN to 1.375 volts and I need to use them in LDO enable mode. But Notrogen 6 Max it is using LDO bypass voltages. As well as I couldn’t see any dtb related to LDO enable mode.
1) What are the default settings of the LDO regulator in kernel (In Nitrogen 6 Max) ? Is that LDO enable or LDO bypass ? Do you know any method to see the present status of the LDO in kernel ? Using devrgs command ?
When I read PMU_REG_CORE register using devrgs tools will it give the present settings ?
devregs 0x020C8140
2) Can we set this LDO settings in uboot ?
3) And also some of my custom hardware designs are not working when it is 1.2V for VDDSOC_IN and when I run GPU is highly stressed application. But when I give 1.375V to VDDSOC_IN, I can stress GPU more. Can you comment on this ? Can’t I stress the GPU when I’m using LDO bypass mode(1.2V) ?
4)If I’m using Nitrogen 6 Max dtbs how can I change LDO bypass to LDO enable mode ?
Regards,
Kulunu.
Hi,
Since our designs use passive solution for power management instead of a PMIC, I don’t think LDO bypass mode can be achieved.
Also, I’m sure you’ll understand that we only support our designs.
Regards