COM iMX6ULL Bootloader U-Boot

From Wiki-DB
Jump to navigation Jump to search


Q: U-Boot doesn't start anymore?
A: See U-Boot recovery for i.MX6_Q/D/DL/S/ULL via JTAG
Q: Initialization of MAC address in the bootloader?
A: At the first start, the bootloader reads the MAC addresses from the EEPROMs and create env variables ethaddr and eth1addr. The env variables ethaddr and eth1addr could be changed during lifetime to any other MAC addresses. If you like to get back the original MAC addresses, please remove ethaddr and/or eth1addr, save environment and restart the system. In addition to that the env variables ethaddr and/or eth1addr would be initialized again with eeprom MAC addresses.
Q: The automatic update is not executed before the operating system boots!
A: Check if the command update auto is included in the bootloader environment variable bootcmd or in a script-variable which is called within bootcmd before bootm.
Q: The automatic update does not work with my desired update-media!
A: The command update auto can be configured with flags within the DHCOM settings.bin block. It is possible to disable a interface for the update mechanism. You can run a update from a disabled interface if you use the command update without the argument auto.


Please have a look at the i.MX6ULL Download binaries/images section.

Enter Bootloader Console

  1. Connect DHCOM UART1 via null modem cable to the RS232 Port of your PC
  2. Start terminal program (e.g. Tera Term) on the Host PC with the following settings:
    Baud rate: 115200
    Data: 8 bit
    Parity: none
    Stop bits: 1 bit
    Flow control: none
  3. Press "DEL" on the Host PC during Core Module system start to enter bootloader console

U-Boot recovery

See U-Boot recovery for i.MX6_Q/D/DL/S/ULL via JTAG

U-boot console commands

SPI Flash

SPI Flash Init
sf probe
Example: sf probe
Description: Initializes the OnBoard SPI Flash
SPI Flash Read
sf read <SDRAM address> <SPI Flash address> <Bytes>
Example: sf read 10000000 0 100
Description: Copies 256Bytes from SPI Flash address 0x0 to SDRAM address 0x1000_0000
SPI Flash Write
sf write <SDRAM address> <SPI Flash address> <Bytes>
Example: sf write 10000000 40000 10000
Description: Copies 64kByte from SDRAM address 0x1000_0000 to SPI Flash address 0x4_0000
SPI Flash Erase
sf erase <SPI Flash address> <Bytes>
Example: sf erase 100000 1000
Description: Deletes SPI Flash content from address 0x10_0000 to 0x10_0FFF
Note: The Bytes information needs to be sector size aligned!


Read from NAND-Flash Device
nand read <SDRAM address> <NAND Flash address> <Bytes>
Example: nand read 80000000 400000 b40000
Description: Copies 11,25MByte from NAND Flash address 0x40_0000 to SDRAM address 0x8000_0000
Erase NAND-Flash blocks
nand erase <Block base address> <Bytes>
Example: nand erase 400000 40000
Description: Deletes NAND Flash content from address 0x40_0000 to 0x43_FFFF
Note: The Bytes information needs to be block size aligned!
Write to NAND-Flash Device
nand write <SDRAM address> <NAND-Flash address> <Bytes>
Example: nand write 80000000 400000 b40000
Description: Copies 11,25MByte from SDRAM address 0x8000_0000 to NAND Flash address 0x40_0000
Note: The Bytes information needs to be page size aligned!
Show bad NAND-Flash blocks
nand bad
Description: Shows the bad NAND-Flash blocks.
Show NAND-Flash content
nand dump <NAND-Flash address>
Example: nand dump 400000
Description: Shows the content of the specified NAND-Flash block

UBI Filesystem

Partition Definition
Example: mtdparts
Description: Shows the current nand flash partitions. In case of i.MX6 one default partition set, which includes the entire flash. For linux that partition is used to create two volumes "boot" and "rootfs".
Note: In case of UBIFS it is better to have one big partition with different volumes instead of many small partitions, because the wear leveling process is always applied to every partition.
device nand0 <gpmi-nand>, # parts = 1
 #: name                size            offset          mask_flags
 0: main-nand           0x10000000      0x00000000      0
active partition: nand0,0 - (main-nand) 0x10000000 @ 0x00000000

Set or show active partition
ubi part <partition name>
Example: ubi part main-nand
Description: Show or set current partition. In i.MX6ULL default case this is shold always set to main-nand.
Show ubi layout information
ubi info layout
Example: ubi info layout
Description: Display ubi layout information.
Mount UBI volume
ubifsmount <UBI device>:<volume name>
Example: ubifsmount ubi0:boot
Description: Mount UBIFS volume. The default name of the first i.MX6ULL volume is "boot".
List files
ubifsls <directory>
Example 1: ubifsls
Description: List files in a UBIFS directory.
Load Files from UBI volume
ubifsload <SDRAM address> <directory+filename>
Example 1: ubifsload 10100000 zimage
Description: Load file from an UBIFS filesystem to memory.
Unmount UBI volume
Example: ubifsumount
Description: Unmount current volume.


Switch between MicroSD, SD Slot and eMMC
mmc dev <Slot number> <Partition number>
Example: mmc dev 1
Description: Switch between SD/MMC Slots: 1 => MicroSD Slot | 2 => eMMC (0 => SD/MMC Slot is not available on i.MX6ULL)
Note eMMC hardware partition number: 0 => User partition | 1 => first boot partition | 2 => second boot partition
Initialize SD/MMC Card
mmc rescan
Description: Initialize new inserted SD Card
Show SD/MMC information
Description: Shows SD/MMC device information
Device: FSL_SDHC
Manufacturer ID: 45
OEM: 100
Name: SEM08
Tran Speed: 52000000
Rd Block Len: 512
MMC version 4.41
High Capacity: Yes
Capacity: 7.3 GiB
Bus Width: 8-bit
Write to MicroSD, SD Slot and eMMC
mmc write <SDRAM address> <block number> <block count>
Example: mmc write 11000000 5000 400
Description: Write 512kByte (device block size is 512Byte) to the eMMC offset 10MByte.
Read from MicroSD, SD Slot and eMMC
mmc read <SDRAM address> <block number> <block count>
Example: mmc read 11000000 5000 400
Description: Read 512kByte (device block size is 512Byte) from the eMMC offset 10MByte.


NOTE: File system types are recognized automatically
List files
ls <interface> <device[:partition]> <directory>
Example 1: ls mmc 1
Example 2: ls mmc 1 /folder
Load Files from device to SDRAM
load <interface> <device[:partition]> <SDRAM address> <directory+filename>
Example 1: load mmc 1 10100000 nk.gz
Example 2: load mmc 1 10100000 /folder/nk.gz


Load File via TFTP to SDRAM
tftp <SDRAM address> <directory+filename>
Example: tftp 80100000 nk.gz
Example TFTP Server: "Winagents TFTP Server Manager"
Note: For TFTP download it is necessary to config the ENV variables "ipaddr" and "serverip"
Load File via TFTP to SDRAM using DHCP
dhcp <SDRAM address> <directory+filename>
Example: dhcp 80100000 nk.gz
Example TFTP Server: "Winagents TFTP Server Manager"
Note: It is necessary to config the ENV variable "serverip" with the ip-address of your TFTP-Server
ping <IP address>
Example: ping


unzip <source address> <destination address>
Example: unzip 12900000 10100000
Note: The unzip command is supporting the gzip file format.


bmp info <Bitmap address>
Image size    : 800 x 480
Bits per pixel: 8
Compression   : 0
bmp display <Bitmap SDRAM address> [x y]
Note: It is necessary to load bitmap file to memory address with an offset of an odd multiple of +2, since the use of a four-byte alignment will cause alignment exceptions at run-time.


md[.b, .w, .l] <address> [count]
Example: md.b 80100000 100
mw[.b, .w, .l] <address> <value> [count]
Example: mw.b 80100000 aa 100
Description: Writes the value 0xaa to the next 0x100 bytes from the address 0x8010_0000.
cp[.b, .w, .l] <source> <destination> <count>


Set current I2C bus
i2c dev <I2C bus>
Example: i2c dev 0
Description: Set current I2C bus to 0.
Valid buses on i.MX6ULL:
0 = DHCOM I2C port 1
1 = DHCOM I2C port 2
List available devices
i2c probe
Description: Test for and show device(s) on the I2C bus.
Valid chip addresses: 32 50 51 52 53 58 59
i2c md <I2C address> <start address> <end address>
Example: i2c md 57 10 20
Description: Reads 16 Bytes from the address 0x10 to address 0x20.
i2c mw <I2C address> <I2C register> <Value> <Bytes>
Example: i2c mw 57 0 aa 5
Description: Writes 0xaa to 5 Bytes from the offset 0.


Show ENV variables
env print

Environment size: 449/262140 bytes
Set ENV variables
env set <ENV name> <ENV value>
setenv <ENV name> <ENV value>

Example: env set ipaddr
Note: If you need to edit "bootcmd" it is necessary to insert ; between the unique commands. Put the whole sequence in quotation marks '...'.
Save ENV variables
env save

Delete ENV variable
env delete <ENV name>
Revert to default ENV (all)
env default -a
Revert to default ENV (almost everything: preserve DH serial numbers and ethernet MAC addresses)
env default -ae
Import ENV from textfile
env import -t <SDRAM address> $filesize
load mmc 0 0x10000000 uLinuxEnv.txt
env import -t 0x10000000 $filesize
The uLinuxEnv.txt file should have unix line ending. Also make sure that there is an empty line at the end of the file.

USB Mass Storage

Use device as USB Mass Storage
ums <USB_controller> <devtype> <dev[:part]>
Example: Write an image on PDK2 to the eMMC using the "ums" command:
1. Connect the USB OTG on the PDK2 with a suitable cable to a computer running Debian Linux
2. Go to the U-Boot console on the module
3. Start UMS by typing:
ums 0 mmc 2
4. Eject partitions that may appear
5. Double klick on the image (*.img.xz file)
6. Select a destination drive
7. Press "Start Restoring..."
8. Stop UMS in U-Boot by pressing CTRL+C

How to do Updates

DHCOM Update Mechanism

Building U-Boot

Prepare Build Environment

1. Download and start the Virtual Machine for Application Development

Get Sources

2. Start a terminal on Linux
3. # git clone
4. # cd u-boot-imx6qdl
5. # git checkout dev/2018.05_dhcom

Start Build

6. # make ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- dh_imx6ull_emmc_defconfig
7. # make ARCH=arm CROSS_COMPILE=/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- all

Your new u-boot-with-spl.imx file is available in u-boot-imx6qdl/