简介:
uuu是i.MX 8 Universal Update Utility的简称,这个是mfgtools的后续方案,俗称MFGtools v3。
wiki: https://github.com/NXPmicro/mfgtools/wiki
pdf: https://github.com/NXPmicro/mfgtools/releases
原先的MFGtools中,在下载模式下,PC使用USB HID与开发板进行通信,将firmware uboot/kernel/dtb/ramdiskload到DDR上,然后去启动小系统(小kernel),之后PC识别开发板为USB Mass Storage设备,可以通过PC将命令(使用uuc实现)发送给小系统(小kernel),从而实现烧写功能。
而目前的uuu,新增使用fastboot协议,就是在小u-boot中配置支持fastboot。在下载模式下,PC还是使用USB HID与开发板进行通信,将支持fastboot的小u-boot放到开发板上运行,之后PC与开发板使用fastboot协议与小u-boot进行通信,包括load kernel等操作,启动小系统,从而实现烧写功能。
编译/下载:
1 | git clone https://github.com/NXPmicro/mfgtools |
定制和load小u-boot
1、按照UUU.pdf中Uboot config requirement章节的说明,需要配置小u-boot支持以下几种功能,编译生成flash.bin:
- USB Gadget;
- USB UDC(USB Device Controller)
- fastboot命令
最终小u-boot关于uuu的配置如下:
1 | CONFIG_CMD_FASTBOOT=y |
2、将开发板设置为Serial Download模式,与PC机连接;
3、查看USB连接情况(不是必须);
在ubuntu下执行lsusb可以看到连接上了一个Bus 001 Device 048: ID 1fc9:012f NXP Semiconductors设备,可以进一步查看lsusb -v -d 1fc9:012f这个设备是一个Human Interface Device设备。
4、load 小u-boot
执行如下的uuu命令,load 小u-boot到开发板上的DDR并跑起来(目前i.MX8在u-boot运行之前会先跑scfw,已将DDR初始化完毕):
1 | # ./uuu SDPS: boot -f flash.bin |
可以通过串口查看u-boot有如下串口输出表示进入fastboot模式:
1 | [ 217.774] Detect USB boot. Will enter fastboot mode! |
5、查看USB连接情况(不是必须);
在ubuntu下执行lsusb可以看到连接上了一个Bus 001 Device 049: ID 0525:a4a5 Netchip Technology, Inc. Pocketbook Pro 903设备,可以进一步查看lsusb -v -d 0525:a4a5这个设备是一个Android Fastboot设备。
使用FB命令:
FB是Android fastboot protocol,支持如下命令:
比如说./uuu FB: ucmd <any uboot cmd>中就可以通过uuu执行uboot命令,比如执行uboot help或者printenv命令:./uuu FB: ucmd help 和 ./uuu FB: ucmd printenv
比如说./uuu FB: download -f <filename> 可以下载kernel、rootfs、dtb到DRM中,当然,load到DDR的那个地方,需要使用fastboot_buffer环境变量进行指定。
1 | ./uuu FB: ucmd setenv fastboot_buffer ${loadaddr} |
我这边使用上述的命令无法执行成功,原因是没办法取得默认的环境变量${loadaddr}等,所以这里临时测试使用直接的地址进行测试,如下可以保证小kernel跑起来,当然,这里的小kernel和小 rootfs必须重新定制一下。
1 | ./uuu FB: ucmd setenv -f fastboot_buffer 0x80280000 |
无法取得默认的环境变量${loadaddr}的解决方法是要给环境变量加上引号,如下:
1 | ./uuu FB: ucmd setenv fastboot_buffer '${loadaddr}' |
定制和load小kernel
1、按照UUU.pdf中kernel config requirement章节的说明,需要配置小kernel支持以下几种功能,编译生成Image:
- 配置 USB CONFIGFS
- 配置USB UDC
- 配置function fs

关于配置function fs需要配置如下几个宏:
1 | CONFIG_USB_LIBCOMPOSITE=y |
定制小rootfs
当小kernel和小rootfs跑起来后,PC端查看lsusb发现一个USB设备为:Bus 001 Device 099: ID 066f:37ff SigmaTel, Inc.。
按照uuu.pdf的说明,接下来可以使用FBK与小kernel进行fastboot协议的通信。但是我这边执行./uuu FBK: ucmd ls命令就block住了,没有返回Okay或者失败啥的。
根据uuu.pdf的说明,FBK的实现依赖于initramfs,且FBK默认只支持066f:9afe和066f:9bff的设备。
解决FBK不能执行的两种方案如下:
方案1:重新编译initramfs,使用最新的yocto编译新的initramfs为:fsl-image-mfgtool-initramfs-imx8qxpmek.cpio.gz.u-boot,命令如下:
1 | source setup-environment fsl-imx-wayland/ |
可以看到在生成的rootfs中的linuxrc里面,已经设置新的PID和VID了。tmp/work/imx8qxpmek-poky-linux/fsl-image-mfgtool-initramfs/1.0-r0/rootfs/linuxrc
1 | function launch_uuc() { |
将这个initramfs做为小rootfsload进去就可以使用FBK命令了。
方案2:根据uuu源代码中uuu/uuu.lst文件的说明,我们可以重新配置FBK支持的设备。
CFG: Config protocol of specific usb device vid/pid
SDPS|SDP|FB\Fastboot|FBK -chip-pid -vid [-bcdversion ]
使用下面的命令进行配置:./uuu CFG: FBK: -pid 0x37ff -vid 0x066f
按照上述的步骤,小kernel与PC通信上了后接下来烧录的动作就可以使用FBK命令来完成了。
使用uuu实现工厂烧写
1、既然我们现在可以实现uuu的FB和FBK命令,那么我们就可以通过FB命令在u-boot中实现烧写fuse的动作,也就是烧写SRK fuse。可以在出厂的时候使用uuu对fuse进行烧写:
1 | FB: ucmd fuse prog 0 730 0x475e1dca |
遇到的问题:
1、sudo 问题
执行uuu的时候提示要执行sudo的问题,必须在ubuntu下新建sudo vi /etc/udev/rules.d/99-uuu.rules文件,内容如下,最后执行sudo udevadm control --reload-rules。
1 | SUBSYSTEM=="usb", ATTRS{idVendor}=="1fc9", ATTRS{idProduct}=="012f", MODE="0666" |
2、传输大文件问题
按照FBK命令的说明,可以使用ucp命令从PC拷贝文件到板子上,再使用ucmd进行操作,比如说烧写imx8的flash.bin:
1 | ./uuu FBK: ucp file/imx8x/flash.bin t:/tmp |
比如说有个bigdata.img的镜像,大小为256MB,按照这种做法去传输大文件会出问题,必须使用如下的方式:
1 | sudo ./uuu FBK: acmd dd of=/dev/mmcblk0p3 bs=512 |

其中,ucp命令使用的参数t:-表示这个文件是传输到stdio pipe上,在这里是stdin;acmd命令表示不等待命令返回,这里面的dd命令的if=其实就是从stdin里面拿到的,以此实现大文件的传输。
3、如果出现1:11 1/ 0 [Failure open usb device,Try ]的错误,原因是没有执行sudo。
参考资料
u-boot/doc/README.android-fastboot
https://chromium.googlesource.com/aosp/platform/system/core/+/upstream/fastboot/
https://android.googlesource.com/platform/system/core/+/android-sdk-4.4.2_r1/fastboot/fastboot_protocol.txt