全志A33 pack机制解析

全志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时自动去固件里面搜寻需要的内容,这样对用户更透明,操作更简便(做完各个板块后,打包)。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hdh717

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值