本文主要讲述基于Mfgtool V2来说明ucl.xml文件的使用,以及解释其中的意思。
关于ucl2.xml的介绍可以参照Manufacturing Tool V2 UCL User Guide.docx
文件。
Mfgtool启动参数
在Mfgtool/
目录下会有各种.vbs
的脚本文件,比如说:mfgtool2-android-mx6qp-xxx-emmc.vbs
文件,文件名标记这是使用Android
系统,平台是imx6qp
,板子为xxx
,使用emmc
启动。内容如下:
启动这个脚本文件会去启动mfgtools2.exe
应用程序,并将其中的参数传递给mfgtools2.exe
。各个参数的大概解释如下:
-c “”linux””
:用于告知ucl2.xml
文件在路径为Profiles\linux\OS Firmware\
目录下;-l ""i.MX6QP-xxx-eMMC""
:用于标记在ucl2.xml
文件中使用哪个LIST name
;-s
:可自定义参数传递给ucl2.xml
文件使用;
具体的参数解释如下:
1 | MfgTool2 can support command line feature, the commands that can be accepted are “-c, -l, -p and -noui”. |
当启动.vbs
脚本运行失败后,会有如下提示:
此时在当前目录下会生成MfgTool.log
文件,查看该文件即可知道错误的原因,一般情况下是要烧写的文件与ucl2.xml
标记要烧写的文件名或路径没有对应,或者缺少ucl2.xml
指定的文件。
在此并不建议使用-s
传递给ucl2.xml
参数。一般我们开发中同时开发一个或者两个项目,将所要烧写的image文件固定文件名存放在某个固定目录下,然后在ucl2.xml
指定即可。
而这个-s
参数的出现是为了应对不同的开发项目中不同的board、soc、plus等,-s
参数的出现有更多的扩展性,但是目前我们暂时不需要。
ucl2.xml简介
1 | Manufacturing (Mfg) tool provides a flexible way for users to set their own operations. |
ucl2.xml
的结构如下:
1 | <UCL> |
这里的USB pid”0054”and vid”15A2”标记当前板子是USB HID设备的pid和vid。这也就是为什么在download模式下,板子首先会被识别为HID设备。
(3)、mass storage设备
1 | <STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/> |
这里的USB pid”37FF”and vid”066F”标记当前板子是USB MSC大容量存储设备的pid和vid。
(4)、<LIST>
和</LIST>
中间为命令合集配置<LIST name="xxx", desc="xxx">
name和desc都是用于注释使用,在一个ucl2.xml
文件中会有多个<LIST>
,每个<LIST>
通过name
来区分,并在.vbs
决定使用哪个<LIST>
。大概的结构如下:
1 | <LIST name="i.MX6QP-xxx-eMMC" desc="Write i.MX6QP-xxx system boot from eMMC"> |
(5)、<CMD>
和</CMD>
之间为具体的命令,包括两种类型的命令:
- Host specific commands:parsed and executed by host tool;
- firmware specific commands:parsed and executed by firmware runs on targeted device。
CMD例子分析
(1)、
1 | <!-- |
用来区分标记烧写"i.MX6QP-xxx-eMMC"
的平台;
(2)、
1 | <CMD type="find" body="Recovery" timeout="180"/> |
此处将Mfgtools
的firmware
(u-boot,uImage,ramdisk)load到RAM指定的位置上,然后跳转启动mini os。
前两个文件用户可以自己客制化编译,后面的ramdisk
需要NXP提供。如果想要自己修改ramdisk,可以参照:https://community.nxp.com/thread/300430
此处将uImage
镜像load到RAM的0x10800000
位置上,将ramdisk
镜像load到0x12800000
的位置上。
注意这两个地址之间的大小一定要足够容纳下整个uImage
的大小。
(3)、
1 | <CMD type="push" body="send" file="files/xxx/mknandpartition-xxx.sh.tar">Sending partition shell</CMD> |
将分区脚本的压缩文件mknandpartition-xxx.sh.tar
发送到$FILE
并解压$FILE
文件。
(4)、
1 | <CMD type="push" body="mknod block,mmcblk0,/dev/mmcblk0,block"/> |
创建/dev/mmcblk0
的设备节点,用于创建分区使用。
(5)、
1 | <CMD type="push" body="$ dd if=/dev/zero of=/dev/mmcblk0 bs=128M count=1"> Erasing MBR and kernel parameters...</CMD> |
清除/dev/mmcblk0 128M
大小的信息,之后执行脚本mknandpartition-xxx.sh
,这个脚本的内容为:
1 | #!/bin/sh |
使用sfdisk
命令在/dev/mmcblk0
上面创建三个分区,分区的信息如下:
- 第1个分区:起始位置为128M,大小为300M,83表示linux下挂载的磁盘;
- 第2个分区:起始位置为428M,大小为254M,
- 第3个分区:起始位置为686M,大小为256M。
注意:这里的分区信息要与挂载的文件大小相对应。比如说第1个分区设置为300M,是为了挂载system
分区,要保证system.img
的小于300M。
当然,这里的分区是要跟emmc 的layout挂钩的。
(6)、
1 | <CMD type="push" body="mknod block/mmcblk0,mmcblk0p1,/dev/mmcblk0p1,block"/> |
创建3个分区的设备节点。
(7)、
1 | <CMD type="push" body="send" file="files/files/xxx/u-boot.imx">Sending u-boot.bin</CMD> |
分别将u-boot.imx/kernel-header/ramdisk-header/uImage/uramdisk.img
文件dd到指定的emmc位置上。
具体放到emmc的哪个位置上,要参考layout来进行设置。
(8)、
1 | <CMD type="push" body="$ dd if=/dev/zero of=/dev/mmcblk0 bs=1M seek=127 count=1"> Erasing CCID...</CMD> |
1 | <CMD type="push" body="send" file="files/files/xxx/bootani.img">Sending bootani image</CMD> |
为什么这里要设置这些内容还不是很清楚。
(9)、
1 | <CMD type="push" body="pipe dd of=/dev/mmcblk0p1 bs=1M conv=fsync" file="files/files/xxx/system.img">Sending and writting system image</CMD> |
使用pipe
去传输并dd大的文件(system.img 300M)
而不是使用push
。
这里将system.img
dd到mmcblk磁盘上的第1个分区。
(10)、
1 | <CMD type="push" body="$ mkfs.ext4 -O ^extent -L var /dev/mmcblk0p2">Formatting partition 1</CMD> |
使用mkfs.ext4
的命令创建/var
和/data
分区。
(11)、
1 | <CMD type="push" body="$ sync">sync</CMD> |
最后面标记烧录完毕。