需求
NXP release出来的mfgtools默认自带fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot
文件,这个文件是mfgtools的uramdisk.img,里面自带uuc
应用程序,用于进行UTP
传输,可以接收ucl2.xml
中指定的命令并执行。
我们需要在mfgtools烧录过程中执行某个动作,有对应的应用程序,现需要将这个应用程序打包进fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot
中,以下列出2种实现方案。
方案1:解压再打包进去
我的想法是将fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot
文件解压出来,然后将应用程序拷贝进去,再原模原样的打包。以下为步骤:
- 1.查看原文件
1
2# file fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot
fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot: u-boot legacy uImage, fsl-image-mfgtool-initramfs-imx8\037\213\010, Linux/ RAMDisk Image (Not compressed), 9406408 bytes, Thu Jun 28 09:30:50 2018, Load Address: 0x00000000, Entry Point: 0x00000000, Header CRC: 0x473F16A9, Data CRC: 0x69DB3466
发现这个文件的头64字节为u-boot头信息,u-boot的头信息格式如下,我们可以通过mkimage
产生u-boot头信息。:
1 | typedef struct image_header { |
2.舍弃前64字节的u-boot头信息
这一步是将.cpio.gz.u-boot
变成.cpio.gz
文件,查看.cpio.gz
文件类型:1
2
3
4
5
6
7# dd if=fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot of=fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz bs=1 skip=64
记录了9451495+0 的读入
记录了9451495+0 的写出
9451495字节(9.5 MB)已复制,9.37393 秒,1.0 MB/秒
# file fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz
fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz: gzip compressed data, from Unix, last modified: Fri Oct 26 17:31:38 20183.解压
.cpio.gz
文件
这一步是将.cpio.gz
文件解压为.cpio
文件:1
2
3# gunzip fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz
# file fsl-image-mfgtool-initramfs-imx_mfgtools.cpio
fsl-image-mfgtool-initramfs-imx_mfgtools.cpio: ASCII cpio archive (SVR4 with no CRC)4.解压
.cpio
文件1
2
3# mkdir rootfs
# cd rootfs /
# cpio -i -F ../fsl-image-mfgtool-initramfs-imx_mfgtools.cpio
解压.cpio
文件后,可以在rootfs/
目录下查看fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot
文件的原始目录结构。
目录结构为:
1 | 总用量 1096 |
5.注入应用程序
实际上就是拷贝:# cp -rf ~/app ./bin/
6.原样打包文件
1
# find . |cpio -ov -H newc | gzip -f -9 -n -c > ../fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz
7.添加u-boot头信息
将打包生成的fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz
文件拷贝到u-boot源码目录下,用u-boot源码中的mkimage
工具添加u-boot头信息。
这一步将.cpio.gz
文件进一步打包成.cpio.gz.u-boot
文件,生成的.cpio.gz.u-boot
文件中u-boot的头信息基本与原先的文件一致(crc和size大小有差异)。1
2
3
4
5
6
7# ./tools/mkimage -A arm64 -O linux -T ramdisk -C none -n fsl-image-mfgtool-initramfs-imx8 -d fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot
Image Name: fsl-image-mfgtool-initramfs-imx8
Created: Mon Oct 29 20:20:17 2018
Image Type: AArch64 Linux RAMDisk Image (uncompressed)
Data Size: 9447708 Bytes = 9226.28 KiB = 9.01 MiB
Load Address: 00000000
Entry Point: 00000000
mkimage
工具的使用参照:
1 | /tools/mkimage: invalid option -- '-' |
使用方案1有可能出现的问题
使用打包的方法,最终mfgtools烧录mini kernel起来后加载rootfs有可能会出现以下的错误:
1 | mount: only root can use "--types" option (effective UID is 1000) |
因为在fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot
中的linuxrc
文件的开头会去挂载sysfs/proc
等文件。如下:
1 | #!/bin/sh |
1 | "effective UID is 1000" - It thinks you are NOT root which is UID 0. |
也就是说,之所以出现这种错误,是UID
不匹配,我的.cpio.gz.u-boot
文件中的文件UID
是为1000,但是在mfgtools中执行的UID
是为0(root用户),导致出现了问题。
解决办法是将上述所有的步骤按照root
权限去操作。
方案2:使用yocto编译出fsl-image-mfgtool-initramfs
编译fsl-image-mfgtool-initramfs
,-v
的选项输出编译log。
1 | # bitbake -f -c compile fsl-image-mfgtool-initramfs |
目前这个方案还没实现成功,不清楚需要将应用程序拷贝到哪个目录进行编译打包。