全志A33在编译好系统后,(zImage-boot.img,rootfs-ext4),采用的是./build.sh pack打包为一个img文件进行烧录。
因此,可以在打包(./build.sh pack)的输出信息,查找相关的pack制作过程。
一、根据终端输出信息,查找制作来源
在制作时,根据输出信息,查找
根据刚开始的输出的几条开始查找,在此通过copying configs file查找
grep 'copying configs file' * -r
找到有该字段的文件在dragonboard/tools/pack/pack文件中 打开该文件解析
浏览文件,可以知道,该文件为打包(./build.sh pack)脚本文件,在文件中,声明了使用模块和执行路径:
export PATH= $ {TOOLS_DIR}/mod_update:${TOOLS_DIR}/eDragonEx
二、pack文件解析
1、pack实现功能
主要实现三部分功能:
do_prepare:制作前的准备工作,重命名,复制,粘贴
do_common:制作uboot,boot-resource.ini文件
do_pack_dragonboard: 执行pctools中相应的命令,制作成img文件
do_finish:制作完成,退出,提示用户
整体pack命令由各自函数功能展开
我的开发板第三项,使用的是else,do_pack_${PACK_PLATFORM}
对应的是,do_pack_dragonboard()
2、pack文件中各函数功能
1)、function do_prepare
(1)、创建out目录、将tools_file_list中的文件拷贝到out目录
(2)、拷贝相关配置文件到out目录
(3)、拷贝boot资源文件
(4)、重命名 tools/pack/out/目录下的*.fex文件
(5)、awk_db_emmc制作sys_config.fex,支持SD卡启动
(6)、修改out/boot-resource.ini ,image.cfg中的文件信息
根据配置与选择的平台信息,给生成的img镜像文件命名
2)、function do_common
(1)、将fex文件更新为dos格式,执行模块“script”命令
unix2dos:将文件格式更新为dos格式
(2)、将fex文件,写至boot-resource分区
dos2unix:将DOS格式文本文件转换成Unix格式
(3)、更新boot文件参数,带NAND,sdcard,fes读写,启动
(4)、生成split_xxxx.fex文件
(5)、生成env分区(执行的else部分)
uboot优先使用env分区(env.cfg)中的环境变量,如果没有env分区,则使用默认环境变量
通过上面的操作,可以执行dragon image.cfg sys_partition.fex生成固件,即do_pack_dragonboard函数
3)、function do_pack_dragonboard
打包内核和rootfs
(1)、打包boot.img
boot.img由内核生成,来源于linux-3.4/output/目录
(2)、boot.img打包方法
查询编译输出信息,搜索“Copy boot.img to output directory”字符查找相关信息
grep 'Copy boot.img to output directory' * -r
查询到在 linux-3.4/scripts/目录下 build.sh文件中有相关字符,打开文件
vi ~/workspace/a33/dragonboard/linux-3.4/scripts/build.sh
找到相应的执行命令,mkbootimg文件,在~/workspace/a33/dragonboard/tools/pack/pctools/linux/android/目录下。
${MKBOOTIMG}路径:
(3)、boot.img打包方法regen_rootfs_cpio解析
进入regen_rootfs_cpio()函数
linux-3.4/scripts$
vi build.sh
01、首先进入output目录
如果在Linux目录的下级目录有linux-3.4/scripts/build_rootfs.sh文件存在,执行下面的命令,传递参数 $1 = e $2 = …/rootfs.cpio.gz
linux-3.4/scripts$
vi build.sh
vi build_rootfs.sh
02、当传递的参数为e时,执行extract_rootfs
进入linux-3.4/scripts/目录,当传递的参数为e时,执行extract_rootfs,为c时,执行generate_rootfs。
linux-3.4/scripts$
vi build_rootfs.sh
fakeroot:模拟 root 权限
gzip -dc:解开名为.gz的压缩文件
cpio -i : --extract 执行copy-in模式,备份文件
linux-3.4/scripts$
vi build_rootfs.sh
03、当传递的参数为C时,执行generate_rootfs
linux-3.4/scripts$
linux-3.4/scripts$
在build.sh中执行…/scripts/build_rootfs.sh传递参数 c和rootfs.cpio.gz,build_rootfs.sh中的执行函数generate_rootfs,将build_rootfs.sh传递的参数$2(rootfs.cpio.gz),递归给了函数generate_rootfs使用,作为generate_rootfs的 $1 参数使用。
(4)、打包image文件
将编写好的kernel文件制作成boot.img文件
linux-3.4/scripts$
vi build.sh
到此生成boot.img文件
(5)、打包rootfs.ext4文件
rootfs由buildroot生成。
ln -s ${LICHEE_OUT}/rootfs.ext4 rootfs.fex
经过上面的操作后,即可执行打包固件操作, dragon image.cfg sys_partition.fex
dragon image.cfg sys_partition.fex
4)、function do_finish()
三、全志固件img打包,快速更新系统
之前使用的其他平台的设备通常是将luboot、kerne、rootfs编译好后、分开烧写到flash中,更新一个完整的系统时,会需要烧写多个bin文件。把这些整合到一个固件文件中,在烧写到flash时自动去固件里面搜寻需要的内容,这样对用户更透明,操作更简便(做完各个板块后,打包)。