Loading Linux Images over UART
This article explains how to load images to the target over UART in U-Boot. Keep in mind that loading via a serial port will take quite a long time (minutes per file!) due to the low speeds (limited to 115.2 Kps). That said, for embedded designs that do not provide an Ethernet port it may be the only reasonable development and software manufacturing option using U-Boot and uClinux.
Using the NXP i.MX RT1170 EVK board, you connect to the target serial console available on the J23 connector on the baseboard. Assuming you connect to a Linux PC host, on the Linux host the i.MX RT1170 serial console will be visible as a /dev/ttyACMx
device. The U-Boot and Linux software configures the console for 115.2 Kps operation.
There are various serial communication tools available for Linux, the most popular perhaps being kermit
. kermit
is a very powerful tool that can be run in interactive mode or controlled by a script. There is abundant documentation on kermit available in the Internet, if you require details.
The download procedure is based on the loadb
command provided by the U-Boot command interface. loadb
implements a download capability over UART using the kermit protocol and has the following synopsis:
loadb [<load_address> <baud_rate>]
If you do not specify a load address, then the value will be taken from the loadaddr
environment variable. On the NXP i.MX RT1170 EVKÂ loadaddr
is set as follows, placing the download buffer into SDRAM:
=> print loadaddr
loadaddr=0x80007fc0
If you do not specify a baud rate, then the speed the console is currently running at will be used (set to a default value of 115200 on the NXP i.MX RT1170 EVK).
Once the transmission using loadb
finishes, the file will be in memory at the specified load address. The loadaddr environment variable will automatically be set to the address the loadb
command used. The filesize
environment variable will automatically be set to the number of bytes transferred during the load operation.
Then you are free to do whatever you like with the loaded image. You can boot Linux from the image (assuming it is a Linux uImage
file), copy it to some other place (for instance, on-module Flash), display the memory, etc.
To automate the download procedure, you might want to put a desired sequence of interactive steps involving interactions with the U-Boot command interface on the target and kermit
on the host into a shell script. For instance, here is a sample script to download a Linux bootable image (rootfs.uImage
) to SDRAM and boot Linux from it:
$ vi uartboot.script
#!/usr/bin/kermit
set port /dev/ttyACM0
set speed 115200
set carrier-watch off
set flow-control none
set prefixing all
echo {loading uImage}
PAUSE 1
OUTPUT loadb ${loadaddr} 115200\{13}
send rootfs.uImage
INPUT 180 {\{13}\{10}=> }
IF FAIL STOP 1 INPUT timeout
echo {running kernel}
PAUSE 1
OUTPUT run addip; bootm\{13}
c
Copy the sample Linux image (rootfs.uImage
) from the Emcraft software distribution to the host directory you will be running the shell script from.
Then run the script to download the image to the target via UART and boot Linux from it:
 $ chmod a+x uartboot.script
$ ./uartboot.script
C-Kermit 9.0.305 OPEN SOURCE: Alpha.07, 24 Jan 2022, Ubuntu-22.04.2.myguest.virt
ualbox.org [10.0.2.15]
Current Directory: /home/sasha/rt1170
Communication Device: /dev/ttyACM0
Communication Speed: 115200
Parity: none
RTT/Timeout: 01 / 03
SENDING: rootfs.uImage => ROOTFS.UIMAGE
File Type: BINARY
File Size: 8489874
Percent Done: 56 ////////////////////////////
...10...20...30...40...50...60...70...80...90..100
Estimated Time Left: 00:05:32
Transfer Rate, CPS: 8430
Window Slots: 1 of 1
Packet Type: D
Packet Count: 554
Packet Length: 9033
Error Count: 0
Last Error:
Last Message:
X to cancel file, Z to cancel group, <CR> to resend last packet,
E to send Error packet, ^C to quit immediately, ^L to refresh screen.
It will take 15+ long minutes to download the image at 115.2Kps but finally it will get to the target and Linux will boot from it: