Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    分析Tina打包流程,并在buildroot上来实现打包生成tina镜像,支持PhoenixSuit烧写。

    MR Series
    6
    7
    5217
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • baiwen
      100ask LV 6 last edited by

      • 镜像文件 tina_d1-h-nezha_uart0.img 欢迎烧写体验。

      b8a097c7-e4fd-4a31-bb07-3c8290d7f572-image.png
      68352bac-9caa-446c-93be-13d799e7c306-image.png
      eb965c91-015a-4a29-9c32-07332ff0a424-image.png

      步骤简述

      首先记录下官方 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可以看出整个打包过程大致分为这么几个步骤

      1. 指定一些比较环境变量,比如镜像输出目录 镜像的一些配置信息。
      2. 之后将镜像拷贝到需要打包的目录下,开始进行统一处理
      3. 根据文件系统分区信息,将其转换成 适合后续程序使用的格式。
      4. 转换分区信息为 专门的GPT/MBR分区头部。
      5. 使用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 目录下查看。
      714dc37f-d024-4ffd-86e1-5dabd9519a13-image.png
      我们可以直接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二进制文件,目前我认为这些文件都是和全志官方的烧写工具绑定死的,所以不用管它,只要制作的时候 当前目录下有这些工具即可。
      d3bfa508-7883-4286-bda4-9bbbd981cd98-image.png

      有了这两个文件以后,就可以直接使用 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文件又是怎么生成的。

      64808bf4-975f-43bb-98a7-c9da0ce574f1-image.png

      同样是结合log 加打印
      a99c9ce5-8358-41c0-924f-25836a7db6ee-image.png

      找到了 如下这两个命令。
      busybox unix2dos sys_partition.fex
      script sys_partition.fex

      一开始以为这个 script 是ubuntu的某一个包,后来发现也是一个全志自家提供的工具。
      既然 工具都找全了 那我们可以修改试试看。

      修改 sys_partition.fex 把它的大小 调整为 70824
      c12aa287-2654-4674-aecd-563a9a0e735e-image.png
      之后保存退出,从头执行如下命令 来确认猜想是否正确。

      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 命令了,参考如下。

      分析文件系统生成方式

      72d42ef5-7dfe-4f6a-b9cb-a4bbc92602b0-image.png
      1c42a072-d173-4915-a342-93eab5e022ac-image.png
      ec4624ab-1368-434d-b409-56e15977b52c-image.png
      92a50753-628e-4338-bf6f-145ae53f7efd-image.png

      最后得到 这个
      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_dshannezhastu

      clone下来后,需要更新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

      编译完成后的输出信息。
      04ae1d5f-065b-4602-96ff-5325042b89b7-image.png

      镜像输出在 output/images/目录下
      77648afc-4b4c-45d3-81a7-64440c44a9f5-image.png

      baiwen D 2 Replies Last reply Reply Quote Share 4
      • baiwen
        100ask LV 6 @baiwen last edited by

        @allwinnertech 知道了这些以后,后面就可以 直接抛开 任何的 自动构建系统,来从零自己撸Linux系统了。前面已经告诉了 大家怎么 兼容buildroot 编译各个部分。。

        J 1 Reply Last reply Reply Quote Share 1
        • J
          Juggernaut LV 5 @baiwen last edited by

          @allwinnertech 大佬牛逼

          1 Reply Last reply Reply Quote Share 0
          • E
            elliott LV 4 last edited by

            好帖。自定义制作镜像很有帮助。

            1 Reply Last reply Reply Quote Share 0
            • D
              dream LV 6 @baiwen last edited by

              @allwinnertech 好贴,感谢分享。

              1 Reply Last reply Reply Quote Share 0
              • Referenced by  baiwen baiwen 
              • Y
                yuwei LV 6 last edited by

                好帖子 。。。。。。。。。。。。

                1 Reply Last reply Reply Quote Share 0
                • D
                  dsxiang LV 3 last edited by xiaowenge

                  刷机时会提示错误
                  f5469096-6fc8-4784-89fa-953ade25539b-image.png

                  1 Reply Last reply Reply Quote Share 0
                  • 1 / 1
                  • First post
                    Last post

                  Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

                  行为准则 | 用户协议 | 隐私权政策