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,執行畫面如下圖。
|
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 */ |
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,冀望使用者在讀完之後,進一步的了解整個燒錄的過程,為後續的應用起一個好的開局。
5. 參考文件
評論