分析Tina打包流程,并在buildroot上来实现打包生成tina镜像,支持PhoenixSuit烧写。
-
- 镜像文件 tina_d1-h-nezha_uart0.img 欢迎烧写体验。
步骤简述
首先记录下官方 tina-sdk 打包的log输出。
book@virtual-machine:~/D1s-Core/tina-d1-h$ pack --==========-- PACK_CHIP sun20iw1p1 PACK_PLATFORM tina PACK_BOARD d1-h-nezha PACK_KERN PACK_DEBUG uart0 PACK_SIG none PACK_SECURE none PACK_MODE normal PACK_FUNC android PACK_PROGRAMMER none PACK_TAR_IMAGE none PACK_TOPDIR /home/book/D1s-Core/tina-d1-h --==========-- No kernel param, parse it from d1-h copying tools file copying configs file storage_type value is 5 rm /home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/sys_partition_nor.fex rm /home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/image_nor.cfg copying boot resource LZMA 4.65 : Igor Pavlov : Public domain : 2009-02-03 copying boot file make user resource for : /home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/sys_partition.fex handle partition user-res no user resource partitions APP_PART_DOWNLOAD_FILE = /home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/app.fex Need size of filesystem no data resource partitions don't build dtbo ... create sys_partiton.fex +++++++++++++++++++++++++++++++++++++++++++++++++++++4 argc = 2 input name sys_partition.fex Script 1 source file Path=/home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/sys_partition.fex Script 1 bin file Path=/home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/sys_partition.bin update_fdt: num 1752 randto1k parser 1 file ok create sys_partiton.fex+++++++++++++++++++++++++++++++++++++++++++++++++++++5 update_chip pack boot package GetPrivateProfileSection read to end content_count=3 LICHEE_REDUNDANT_ENV_SIZE config in BoardConfig.mk --mkenvimage create redundant env data!-- ---redundant env data size 0x20000--- packing for tina linux normal update mbr use 4++++++++++++++++++++++ mbr count = 4 partitation file Path=/home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/sys_partition.bin mbr_name file Path=/home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/sunxi_mbr.fex download_name file Path=/home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/dlinfo.fex mbr size = 252 mbr magic softw411 disk name=boot-resource disk name=env disk name=env-redund disk name=boot disk name=rootfs disk name=dsp0 disk name=recovery this is not a partition key update_for_part_info 0 crc 0 = 4c7bc2df crc 1 = d9c69382 crc 2 = bc706624 crc 3 = 29cd3779 gpt_head->header_crc32 = 0x892c53ba GPT----part num 8--- gpt_entry: 128 gpt_header: 92 GPT:boot-resource: a1f8 c177 GPT:env : c178 c36f GPT:env-redund : c370 c567 GPT:boot : c568 1161f GPT:rootfs : 11620 1b597 GPT:dsp0 : 1b598 1b987 GPT:recovery : 1b988 227c7 GPT:UDISK : 227c8 ffffffde update gpt file ok update mbr file ok temp = 20 mbr count = 4 total_sectors = 15269888 logic_offset = 40960 partitation file Path=/home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/sys_partition.bin mbr_name file Path=/home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/sunxi_mbr.fex download_name file Path=/home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/dlinfo.fex mbr size = 252 mbr magic softw411 disk name=boot-resource disk name=env disk name=env-redund disk name=boot disk name=rootfs disk name=dsp0 disk name=recovery this is not a partition key update_for_part_info 0 crc 0 = 4c7bc2df crc 1 = d9c69382 crc 2 = bc706624 crc 3 = 29cd3779 gpt_head->header_crc32 = 0x1328fa28 GPT----part num 8--- gpt_entry: 128 gpt_header: 92 GPT:boot-resource: a1f8 c177 GPT:env : c178 c36f GPT:env-redund : c370 c567 GPT:boot : c568 1161f GPT:rootfs : 11620 1b597 GPT:dsp0 : 1b598 1b987 GPT:recovery : 1b988 227c7 GPT:UDISK : 227c8 e8ffde update gpt file ok update mbr file ok cp sys parttion.fex for dragon.fex ++++++++++++++++++++++++++++ ==================================== show "sys_partition_for_dragon.fex" message ------------------------------------ [mbr] mbr_size : 252 Kbyte ------------------------------------ partition_name : boot-resource partition_size : 8064 downloadfile : boot-resource.fex boot-resource.fex size : 3.0M byte ------------------------------------ partition_name : env partition_size : 504 downloadfile : env.fex env.fex size : 128K byte ------------------------------------ partition_name : env-redund partition_size : 504 downloadfile : env.fex env.fex size : 128K byte ------------------------------------ partition_name : boot partition_size : 20664 downloadfile : boot.fex boot.fex -> /home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/boot.img boot.img size : 5.0M byte ------------------------------------ partition_name : rootfs partition_size : 40824 downloadfile : rootfs.fex rootfs.fex -> /home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/rootfs.img rootfs.img size : 5.9M byte ------------------------------------ partition_name : dsp0 partition_size : 1008 downloadfile : dsp0.fex dsp0.fex size : 249K byte ------------------------------------ partition_name : recovery partition_size : 28224 ------------------------------------ /home/book/D1s-Core/tina-d1-h/out/host/bin/ /home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image Begin Parse sys_partion.fex Add partion boot-resource.fex BOOT-RESOURCE_FEX Add partion very boot-resource.fex BOOT-RESOURCE_FEX FilePath: boot-resource.fex FileLength=2f8c00Add partion env.fex ENV_FEX000000000 Add partion very env.fex ENV_FEX000000000 FilePath: env.fex FileLength=20000Add partion env.fex ENV_FEX000000000 Add partion very env.fex ENV_FEX000000000 FilePath: env.fex FileLength=20000Add partion boot.fex BOOT_FEX00000000 Add partion very boot.fex BOOT_FEX00000000 FilePath: boot.fex FileLength=4f4000Add partion rootfs.fex ROOTFS_FEX000000 Add partion very rootfs.fex ROOTFS_FEX000000 FilePath: rootfs.fex FileLength=5e0000Add partion dsp0.fex DSP0_FEX00000000 Add partion very dsp0.fex DSP0_FEX00000000 FilePath: dsp0.fex FileLength=3e38cBuildImg 0 Dragon execute image.cfg SUCCESS ! ----------image is for nand/emmc---------- ----------image is at---------- /home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/tina_d1-h-nezha_uart0.img pack finish
分析打包过程
从上述log可以看出整个打包过程大致分为这么几个步骤
- 指定一些比较环境变量,比如镜像输出目录 镜像的一些配置信息。
- 之后将镜像拷贝到需要打包的目录下,开始进行统一处理
- 根据文件系统分区信息,将其转换成 适合后续程序使用的格式。
- 转换分区信息为 专门的GPT/MBR分区头部。
- 使用dragon打包,将所有配置文件里指定的文件,进行汇总,打包输出。
使用命令操作 主要分为4步
busybox unix2dos sys_partition.fex tina-d1-h/tools/pack-bintools/src/script sys_partition.fex tina-d1-h/tools/pack-bintools/src/update_mbr sys_partition.bin 4 tina-d1-h/tools/pack-bintools/src/dragon image.cfg sys_partition.fex
dragon分析
这里面 最关键的就是 sys_partition.fex 文件,它定义了分区的信息 以及大小等。
可以进入 编译后的 tina-d1-h/out/d1-h-nezha/image 目录下查看。
我们可以直接cat sys_partition.fex文件book@virtual-machine:~/D1s-Core/tina-d1-h/out/d1-h-nezha/image$ cat sys_partition_for_dragon.fex ;--------------------------------------------------------------------------------------------------- ; 说明: 脚本中的字符串区分大小写,用户可以修改"="后面的数值,但是不要修改前面的字符串 ;--------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------- ; 固件下载参数配置 ;--------------------------------------------------------------------------------------------------- ;*************************************************************************************************** ; mbr的大小, 以Kbyte为单位 ;*************************************************************************************************** [mbr] size = 252 ;*************************************************************************************************** ; 分区配置 ; ; ; partition 定义范例: ; [partition] ; //表示是一个分区 ; name = USERFS2 ; //分区名称 ; size = 16384 ; //分区大小 单位: 扇区.分区表示个数最多2^31 * 512 = 2T ; downloadfile = "123.fex" ; //下载文件的路径和名称,可以使用相对路径,相对是指相对于image.cfg文件所在分区。也可以使用绝对路径 ; keydata = 1 ; //私有数据分区,重新量产数据将不丢失 ; encrypt = 1 ; //采用加密方式烧录,将提供数据加密,但损失烧录速度 ; user_type = ? ; //私有用法 ; verify = 1 ; //要求量产完成后校验是否正确 ; ; 注:1、name唯一, 不允许同名 ; 2、name最大12个字符 ; 3、size = 0, 将创建一个无大小的空分区 ; 4、align to logical block size(504 sectors), leb size = 2*(1 nand phy block size - 1 phy page size) ;*************************************************************************************************** [partition_start] [partition] name = boot-resource size = 8064 downloadfile = "boot-resource.fex" user_type = 0x8000 [partition] name = env size = 504 downloadfile = "env.fex" user_type = 0x8000 [partition] name = env-redund size = 504 downloadfile = "env.fex" user_type = 0x8000 [partition] name = boot size = 20664 downloadfile = "boot.fex" user_type = 0x8000 [partition] name = rootfs size = 40824 downloadfile = "rootfs.fex" user_type = 0x8000 [partition] name = dsp0 size = 1008 downloadfile = "dsp0.fex" user_type = 0x8000 [partition] name = recovery size = 28224 ;downloadfile = "recovery.fex" user_type = 0x8000
这里面所有的 downloadfile文件 都是我们编译出来要烧写的文件。所以只需要把相应的文件放到这个目录下,就可以进行打包操作了。
如果你在不改变 文件大小的前提下,可以直接执行tina-d1-h/tools/pack-bintools/src/dragon image.cfg sys_partition.fex
命令,你会发现它生成了一个 tina_d1-h-nezha_uart0.img,镜像,这个镜像是和使用pack命令打包生成的一样。那么这里面还有一个 img.cfg文件。这个文件里面包含了很多 fex二进制文件,目前我认为这些文件都是和全志官方的烧写工具绑定死的,所以不用管它,只要制作的时候 当前目录下有这些工具即可。
有了这两个文件以后,就可以直接使用 dragon打包生成可以用 凤凰烧写器 烧写的系统镜像啦。
sys_partiton分析
如果你的系统镜像格式 一直保持大小不变,那么上面这个命令 就可以一直用,但是这个时候 我想自己编译内核 增加 驱动模块,编译文件系统 增加组件 导致系统镜像变大了 这要怎么办?
简单点,直接修改 sys_partition.fex为 文件大小不就可以了吗?
但是你会发现 这样做不行,他会提示错误。
这个时候 我们就要继续分析 log日志输出了,会发现,我们执行 dragon打包 只有下面这些输出信息,没有上面的 GPT/MBR分区信息。/home/book/D1s-Core/tina-d1-h/tools/pack-bintools/src/ /home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image Begin Parse sys_partion.fex Add partion boot-resource.fex BOOT-RESOURCE_FEX Add partion very boot-resource.fex BOOT-RESOURCE_FEX FilePath: boot-resource.fex FileLength=2f8c00Add partion env.fex ENV_FEX000000000 Add partion very env.fex ENV_FEX000000000 FilePath: env.fex FileLength=20000Add partion env.fex ENV_FEX000000000 Add partion very env.fex ENV_FEX000000000 FilePath: env.fex FileLength=20000Add partion boot.fex BOOT_FEX00000000 Add partion very boot.fex BOOT_FEX00000000 FilePath: boot.fex FileLength=4f4000Add partion rootfs.fex ROOTFS_FEX000000 Add partion very rootfs.fex ROOTFS_FEX000000 FilePath: rootfs.fex FileLength=5e0000Add partion dsp0.fex DSP0_FEX00000000 Add partion very dsp0.fex DSP0_FEX00000000 FilePath: dsp0.fex FileLength=3e38cBuildImg 0 Dragon execute image.cfg SUCCESS !
那么这个时候 就需要往回找,这个文件是哪里来的 怎么生成的?
通过 搜索 分析 发现是 来自于 sys_partiton.bin 文件,但是这个文件又是一个 二进制文件,而且也是后面打包生成的,那么还是要继续往回找 sys_partition.bin文件又是怎么生成的。同样是结合log 加打印
找到了 如下这两个命令。
busybox unix2dos sys_partition.fex
script sys_partition.fex一开始以为这个 script 是ubuntu的某一个包,后来发现也是一个全志自家提供的工具。
既然 工具都找全了 那我们可以修改试试看。修改 sys_partition.fex 把它的大小 调整为 70824
之后保存退出,从头执行如下命令 来确认猜想是否正确。book@virtual-machine:~/D1s-Core/tina-d1-h/out/d1-h-nezha/image$ busybox unix2dos sys_partition.fex book@virtual-machine:~/D1s-Core/tina-d1-h/out/d1-h-nezha/image$ ~/D1s-Core/tina-d1-h/tools/pack-bintools/src/script sys_partition.fex argc = 2 input name sys_partition.fex Script 1 source file Path=/home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/sys_partition.fex Script 1 bin file Path=/home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/sys_partition.bin update_fdt: num 1752 randto1k parser 1 file ok book@virtual-machine:~/D1s-Core/tina-d1-h/out/d1-h-nezha/image$ ~/D1s-Core/tina-d1-h/tools/pack-bintools/src/update_mbr sys_partition.bin 4 mbr count = 4 partitation file Path=/home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/sys_partition.bin mbr_name file Path=/home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/sunxi_mbr.fex download_name file Path=/home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image/dlinfo.fex mbr size = 252 mbr magic softw411 disk name=boot-resource disk name=env disk name=env-redund disk name=boot disk name=rootfs disk name=dsp0 disk name=recovery this is not a partition key update_for_part_info 0 crc 0 = ea84dacc crc 1 = 7f398b91 crc 2 = 1a8f7e37 crc 3 = 8f322f6a gpt_head->header_crc32 = 0x53fc3a66 GPT----part num 8--- gpt_entry: 128 gpt_header: 92 GPT:boot-resource: a1f8 c177 GPT:env : c178 c36f GPT:env-redund : c370 c567 GPT:boot : c568 1161f GPT:rootfs : 11620 22ac7 GPT:dsp0 : 22ac8 22eb7 GPT:recovery : 22eb8 29cf7 GPT:UDISK : 29cf8 ffffffde update gpt file ok update mbr file ok book@virtual-machine:~/D1s-Core/tina-d1-h/out/d1-h-nezha/image$ book@virtual-machine:~/D1s-Core/tina-d1-h/out/d1-h-nezha/image$ ~/D1s-Core/tina-d1-h/tools/pack-bintools/src/dragon image.cfg sys_partition.fex /home/book/D1s-Core/tina-d1-h/tools/pack-bintools/src/ /home/book/D1s-Core/tina-d1-h/out/d1-h-nezha/image Begin Parse sys_partion.fex Add partion boot-resource.fex BOOT-RESOURCE_FEX Add partion very boot-resource.fex BOOT-RESOURCE_FEX FilePath: boot-resource.fex FileLength=2f8c00Add partion env.fex ENV_FEX000000000 Add partion very env.fex ENV_FEX000000000 FilePath: env.fex FileLength=20000Add partion env.fex ENV_FEX000000000 Add partion very env.fex ENV_FEX000000000 FilePath: env.fex FileLength=20000Add partion boot.fex BOOT_FEX00000000 Add partion very boot.fex BOOT_FEX00000000 FilePath: boot.fex FileLength=4f4000Add partion rootfs.fex ROOTFS_FEX000000 Add partion very rootfs.fex ROOTFS_FEX000000 FilePath: rootfs.fex FileLength=5e0000Add partion dsp0.fex DSP0_FEX00000000 Add partion very dsp0.fex DSP0_FEX00000000 FilePath: dsp0.fex FileLength=3e38cBuildImg 0 Dragon execute image.cfg SUCCESS ! book@virtual-machine:~/D1s-Core/tina-d1-h/out/d1-h-nezha/image$
最后在当前目录下 生成了一个 名为 tina_d1-h-nezha_uart0.img 文件,把它用 凤凰烧录 工具烧录进去。
你会发现你可以把你增加过文件的分区 烧进去 并启动啦。那么这个时候,还存在一个问题,就是D1使用的都是 squashfs 类型的文件系统,这个时候,你也需要分析一下 他们的这个文件系统 生产方式,这个就可以借助 grep 命令了,参考如下。
分析文件系统生成方式
最后得到 这个
rootfs.squashfs -noappend -processors 9 -nopad -noappend -root-owned -comp xz -b 256k -p '''/dev d 755 0 0''' -p '''/dev/console c 600 0 0 5 1''' -processors 4\n' >> /home/book/buildroot_dshannezhastu/buildroot-awol/output/build/buildroot-fs/squashfs/fakeroot然后 把它 扔进 buildroot 就可以制作出 可以供 D1内核使用的系统,
注意 tina的环境变量里面的 init 进程位置和buildroot 不一样 需要修改。
注意 tina的环境变量里面的 init 进程位置和buildroot 不一样 需要修改。
注意 tina的环境变量里面的 init 进程位置和buildroot 不一样 需要修改。最后 给大家放上,我们已经支持过 NEZHA D1的buildroot完整系统镜像源码
https://github.com/DongshanPI/buildroot_dshannezhastuclone下来后,需要更新git 子模块 执行如下命令来拉取子模块的源码。
git submodule update --init --recursive
git submodule update --recursive --remote
git pull --recurse-submodules之后进入 buildroot-awol 目录下,稍等一会 就可以生成 供spi nand 烧写的flash镜像了。 当然,也可以烧到tf卡启动。。
buildroot_dshannezhastu/buildroot-awol$ make BR2_DL_DIR=../Download BR2_EXTERNAL=../br2nezhastu/ dshannezhastu_spinand_core_defconfig编译完成后的输出信息。
镜像输出在 output/images/目录下
-
@allwinnertech 知道了这些以后,后面就可以 直接抛开 任何的 自动构建系统,来从零自己撸Linux系统了。前面已经告诉了 大家怎么 兼容buildroot 编译各个部分。。
-
@allwinnertech 大佬牛逼
-
好帖。自定义制作镜像很有帮助。
-
@allwinnertech 好贴,感谢分享。
-
-
好帖子 。。。。。。。。。。。。
-
刷机时会提示错误
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号