1. UUU 簡介
UUU 全名為 Universal Update Utility。對 NXP i.MX 系列熟悉的使用者對 MFGTools 一定不會感到陌生,而 UUU 就是從 MFGTools 演進而來的,也稱為 MFGTools v3。至於不熟悉的人也還是得問,這個 UUU(MFGTools)到底是做什麼的?我們不賣關子,它的答案就是進行 Freescale/NXP Chip image 的燒錄。
這個改版的 UUU 有一個重大的改變,在於可運行的環境。原本的 MFGTools 只能提供 Windows 版本,改為 UUU 之後,即可以在 Windows 或是 Linux OS 下進行操作。此外,官方也提供原始碼(https://github.com/NXPmicro/mfgtools/wiki),讓客戶可以基於其核心,自行設計自己的燒錄工具。在這份文件中,會介紹 UUU 的使用方式以及其架構,讓客戶在燒錄時能了解目前燒錄的進度到哪,也有能力在無法燒錄時進行故障排除,進一步可以客製化自己的燒錄工具。
UUU 是一個 command line tools,執行畫面如下圖。
UUU 執行畫面示意圖
1.1 UUU 運行環境
Windows 10, 64bit
Ubuntu 16.14 or above, 64bit
1.2 License
若需要引用原始碼來開發自己的軟體需要注意相關授權的問題。UUU 基本上為 BSD 授權。而其他配套相關的 linked library,使用的授權列舉如下,
bzip2 (BSD license) is from https://github.com/enthought/bzip2-1.0.6
zlib (zlib license) is from https://github.com/madler/zlib.git
libusb (LGPL-2.1) is from https://github.com/libusb/libusb.git
2. UUU 指令介紹
一般而言,UUU 可逐行單獨執行,也可以將其收集寫成一個腳本,或是直接採用內建的腳本。另外,UUU 也可以做同時多塊板子同 image 或是不同 image 的燒錄。後續章節我們將會對這些內容做說明。
2.1 基本單指令
uuu + protocol:可進行溝通,下載或是直接燒錄
2.1.1 SDP protocol:USB SDP(Standard Downstream Port)協定,可下載映像至板端(internal RAM)。適用於 MX6/7/8M
Run DCD from image with ivt header
uuu sdp: dcd -f
Write image to address.
uuu sdp: write -f [-addr 0x000000] [-ivt 0]
Jump to image with ivt header
uuu sdp: jump -f [-ivt 0]
Boot image, include (dcd, write and jump three commands)
uuu sdp: boot -f [-nojump]
2.1.2 SDPS protocol:與 SDP 相同,適用於MX8QXP 和 i.MX8QM。
Send image by sdp command.
uuu sdps: boot -f [-offset 0x0000]
2.1.3 SDPU/SDPV protocol:通常接續在 SDP 之後,指令與 SDP 雷同,在 uboot 執行。
Run DCD from image with ivt header
uuu sdpu: delay 1000
uuu sdpu: write -f flash.bin -offset 0x57c00
uuu sdpu: jump
2.1.4 FB:Android fastboot protocol in uboot
ucmd:
acmd:
Boot linux kernel
uuu FB: ucmd setenv fastboot_buffer ${loadaddr}
uuu FB: download -f Image
uuu FB: ucmd setenv fastboot_buffer ${fdt_addr}
uuu FB: download -f imx8qxp_mek.dtb
uuu FB: acmd booti ${loadaddr} - ${fdt_addr}
Extended environment for fastboot
fastboot_buffer /* Image download address */
fastboot_bytes /* reflect previous download image byte size */
Write image to emmc
uuu FB: flash -raw2sparse all
2.1.5 FBK:Android fastboot protocol in kernel
ucmd:
acmd:
ucp:複製檔案
sync:等待、確保指令結束
複製檔案至指定目的地
uuu FBK: ucp imx8x/flash.bin t:/tmp
使用 kernel 指令 dd 進行燒錄
uuu FBK: ucmd dd if=/tmp/flash.bin of=/dev/mmcblk0 bs=1024 seek=32
2.2 特定單指令燒錄
uuu + bootloader(等同於 uuu + SDP)
2.2.1 下載 bootloader for imx6/imx7/imx8qxp 至 internal RAM
uuu uboot.imx
uuu flash.bin
2.3 使用內建的燒錄腳本
實際內容不外乎就是基本單指令的集合。
2.3.1 emmc 專用腳本
uuu -b emmc bootloader /* 寫入 bootloader 至 emmc */
uuu -b emmc_all bootloader rootfs.sdcard /* 完整燒錄至 emmc */
uuu -b emmc_all bootloader rootfs.sdcard.bz2/* /*解壓縮後,完整燒錄 至 emmc */
比如imx8mm的烧录如下
sudo uuu -b emmc_all flash_sd_emmc.bin rootfs.sdcard
imx8qxp编译生成的镜像如下
forlinx@ubuntu:~/work/bin/imx-yocto-bsp/imx8qxpmek_wayland/tmp/deploy/images/imx8qxpmek$
2.3.2 sd 專用腳本
uuu -b sd bootloader /* 寫入 bootloader 至 SD 卡 */
uuu -b sd_all bootloader rootfs.sdcard /* 完整燒錄至 SD 卡 */
uuu -b sd_all bootloader rootfs.sdcard.bz2/* /*解壓縮後,完整燒錄 至 SD 卡 */
2.3.3 qspi 專用腳本
uuu -b qspi qspi_bootloader
uuu -b qspi qspi_bootloader m4image
2.3.4 spl 專用腳本
uuu -b spl bootloader /* 寫入 spl 和 uboot 至 Internal RAM */
2.4 多塊板子燒錄
2.4.1 燒錄選項〝d〞
Daemon mode(可進行重覆燒錄)
uuu -d uuu.auto
2.4.2 燒錄選項〝m〞
若同時連接兩塊以上的板子,可以看到類似以下畫面。以此為例,板子 1:2 此時停留在 FB mode,而板子 1:1 停留在 SDP mode
所以在後續使用上,利用 -m 可以針對某個或某些 port 進行燒錄。
2.4.3 綜合〝d〞和〝m〞
綜合上述兩個選項,針對不同的 USB port 連續燒錄不同的板子或是不同的 image 的方法如下,
uuu -d -m 1:1 -m 2:1 boardA_uuu.auto //monitor port 1:1 and 2:1 for boardsA.
uuu -d -m 1:3 -m 4:1 boardB_uuu.auto //monitor port 1:3 and 4:1 for boardsB.
3. 相關設定
3.1 UUU 支援的協定
UUU可以支援多種不同的協定,在不同的平台或是不同的階段下,各平台適用的協定以及各協定的 VID/PID 參考如下。另外,在 console 下,可以使用 uuu -lsusb 立即查詢目前板端的狀態。
Pctl Chip Vid Pid BcdVersion
==================================================
SDPS: MX8QXP 0x1fc9 0x012f [0x0002…0xffff]
SDPS: MX8QM 0x1fc9 0x0129 [0x0002…0xffff]
SDP: MX7D 0x15a2 0x0076
SDP: MX6Q 0x15a2 0x0054
SDP: MX6D 0x15a2 0x0061
SDP: MX6SL 0x15a2 0x0063
SDP: MX6SX 0x15a2 0x0071
SDP: MX6UL 0x15a2 0x007d
SDP: MX6ULL 0x15a2 0x0080
SDP: MX6SLL 0x1fc9 0x0128
SDP: MX7ULP 0x1fc9 0x0126
SDP: MXRT106X 0x1fc9 0x0135
SDP: MX8MM 0x1fc9 0x0134
SDP: MX8MQ 0x1fc9 0x012b
SDPU: SPL 0x0525 0xb4a4 [0x0000…0x04ff]
SDPV: SPL1 0x0525 0xb4a4 [0x0500…0xffff]
FBK: 0x066f 0x9afe
FBK: 0x066f 0x9bff
FB: 0x0525 0xa4a5
FB: 0x18d1 0x0d02
上圖的例子除了可以理解 USB port 的分佈之外,也可以對應前面的 table,看得出來 Path 1:2 目前處在 FB Protocol,且VID 為 0x0525,PID為 0xA4A5;而 Path 1:1 目前則處在 SDP Protocol,且 VID 為 0x1FC9,PID 為 0x012B,是 i.MX8MQ 板子。
3.2 uboot config 需求
為了有效應用 uuu,uboot 需要 enable fastboot,以下是 fastboot 必開選項,而且會在偵測到是 USB 開機的情況下自動執行。
CONFIG_CMD_FASTBOOT=y
CONFIG_USB_FUNCTION_FASTBOOT=y
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_USB_GADGET_MANUFACTURER=“FSL”
CONFIG_USB_GADGET_VENDOR_NUM=0x0525
CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
#UDC need change according system, some system use CONFIG_USB_DWC3, some use CONFIG_USB_CDNS3
CONFIG_CI_UDC=y
CONFIG_FSL_FASTBOOT=y
CONFIG_FASTBOOT=y
#Address need change according system, generally it can be the same as ${LOADADDR}
CONFIG_FASTBOOT_BUF_ADDR=0x83800000
CONFIG_FASTBOOT_BUF_SIZE=0x40000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=1
CONFIG_EFI_PARTITION=y
CONFIG_ANDROID_BOOT_IMAGE=y
使用 SDP 的話,則需要開啟
CONFIG_SPL_USB_HOST_SUPPORT=y
CONFIG_SPL_USB_GADGET_SUPPORT=y
CONFIG_SPL_USB_SDP_SUPPORT=y
CONFIG_SDP_LOADADDR=0x40400000 #Address need change according system, choose free memory
4. 總結
以軟體而言,將 build 好的 image 燒錄至板端然後開機是最最最基本的功課。而後續要展開各式各樣的應用當然也是基於能開機的前提之下,所以如何進行完整的成功的燒錄非常重要。〝工欲善其事、必先利其器〞,這篇文章介紹了 i.mx 的燒錄 tool – UUU,冀望使用者在讀完之後,進一步的了解整個燒錄的過程,為後續的應用起一個好的開局。