本文主要讲述基于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.imgdd到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> |
最后面标记烧录完毕。