简介:
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/ramdisk
load到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
做为小rootfs
load进去就可以使用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