用户工具

站点工具


jaysnote:pack_tool

这是本文档旧的修订版!


# pack tool

编译打包相关脚本文件。

```bash vim -p build.sh buildroot/scripts/mkcommon.sh buildroot/scripts/mkcmd.sh tools/pack/pack ```

## boot0

* 拷贝`tools/pack/chips/sun50iw1p1/bin/boot0_sdcard_sun50iw1p1.bin`到`out/boot0_sdcard.fex`

  ```bash
  #tools/pack/pack line 132
  boot_file_list=(
  chips/${PACK_CHIP}/bin/boot0_sdcard_${PACK_CHIP}.bin:out/boot0_sdcard.fex
  )
  #tools/pack/pack line 132
  for file in ${boot_file_list[@]} ; do
          cp -f `echo $file | awk -F: '{print $1}'` \
                  `echo $file | awk -F: '{print $2}'` 2>/dev/null
  done
  ```

* 通过sys_config.bin 更新boot0,最终生成boot0_sdcard.fex。

  ```
  #tools/pack/pack line 132
  update_boot0 boot0_sdcard.fex   sys_config.bin SDMMC_CARD > /dev/null
  ```

## u-boot

```bash $./build.sh -p sun50iw1p1 ```

* `brandy/build.sh` 会编译uboot并且将其拷贝到`tools/pack/chips/sun50iw1p1/bin/u-boot-sun50iw1p1.bin`。

* tools/pack/pack 将其拷贝为u-boot.fex;

  ```bash
  #tools/pack/pack line 132
  boot_file_list=(
  chips/${PACK_CHIP}/bin/u-boot-${PACK_CHIP}.bin:out/u-boot.fex
  )
  ```
  ```bash
  #tools/pack/pack line 132
  for file in ${boot_file_list[@]} ; do
          cp -f `echo $file | awk -F: '{print $1}'` \
                  `echo $file | awk -F: '{print $2}'` 2>/dev/null
  done
  ```

* 通过sys_config更新uboot 文件头的元数据;

  ```bash
  update_uboot u-boot.fex sys_config.bin > /dev/null
  ```

* 合并monitor.fex、scp.fex、sunxi.fex

  ```bash
  merge_uboot u-boot.fex monitor.fex u-boot.fex secmonitor
  merge_uboot u-boot.fex scp.fex u-boot.fex scp
  ```
  ```bash
  #偏移地址 0xda800
  update_uboot_fdt u-boot.fex sunxi.fex u-boot.fex
  ```
  > **提示**:monitor.fex、scp.fex 直接位应用,sunxi.fex 为sys_config.fex 最终文件,参考[sys_config](#sys_config)

## sys_config

sys_config 是全志 sunxi的配置脚本,区别linux kernel的dts,但是会作用于dts,以下梳理其完整链路。

* 应用sys_config.fex,通过dts生成sunxi.dtb;

  ```bash
  local DTC_INI_FILE_BASE=${LICHEE_OUT}/../../../../tools/pack/out/sys_config.fex
  local DTC_INI_FILE=${LICHEE_OUT}/../../../../tools/pack/out/sys_config_fix.fex
  cp $DTC_INI_FILE_BASE $DTC_INI_FILE
  $DTC_COMPILER -O dtb -o ${LICHEE_OUT}/sunxi.dtb \
          -b 0                    \
          -i $DTC_SRC_PATH        \
          -F $DTC_INI_FILE        \
          -d $DTC_DEP_FILE $DTC_SRC_FILE
  ```

* 通过生成sys_config.bin 拷贝config.fex,sys_config.bin 用以后面的其他文件更新,config.fex暂时未发现使用;

  ```bash
  busybox unix2dos sys_config.fex
  script  sys_config.fex > /dev/null
  cp -f   sys_config.bin config.fex
  ```

* 使用sys_config.bin 更新boot0、uboot、fes1、toc0。

  ```bash
  update_boot0 boot0_spinor.fex   sys_config.bin SDMMC_CARD > /dev/null
  update_uboot u-boot-spinor.fex  sys_config.bin >/dev/null
  
  update_boot0 boot0_nand.fex     sys_config.bin NAND > /dev/null
  update_boot0 boot0_sdcard.fex   sys_config.bin SDMMC_CARD > /dev/null
  update_uboot u-boot.fex         sys_config.bin > /dev/null
  update_fes1  fes1.fex           sys_config.bin > /dev/null
  update_toc0  toc0.fex           sys_config.bin
  ```

## dts

* 应用sys_config.fex 通过dts生成sunxi.dtb

  ```bash
  $DTC_COMPILER -O dtb -o ${LICHEE_OUT}/sunxi.dtb \
          -b 0                    \
          -i $DTC_SRC_PATH        \
          -F $DTC_INI_FILE        \
          -d $DTC_DEP_FILE $DTC_SRC_FILE
  ```
  > **提示**:使用sys_config 主要是更新dts中的`status` 。

* 拷贝生成 sunxi.fex 合并到uboot

  ```bash
  #偏移地址 0xda800
  update_uboot_fdt u-boot.fex sunxi.fex u-boot.fex
  ```
  ```bash
  hexdump -C -n 1000   tools/pack/out/sunxi.fex
  hexdump -C -n 1000 -s 0xda800  tools/pack/out/u-boot.fex
  ```

## boot-resouce

boot-resource为用以uboot引导的一些资源文件,主要是包含一些背景图片。

* 背景图bootlogo.bmp

  ```
  ../a64_jay/tools/pack/chips/sun50iw1p1/configs/t1/bootlogo.bmp
  ../a64_jay/tools/pack/out/boot-resource/bootlogo.bmp
  ```

整合资源文件后生成boot-resource.fex 和boot-resouce.ini 之后通过fat16 文件系统写入/dev/mmcblk0p2。

##bootimg(kernel+ramdisk)

boot.img 为安卓引导的内核格式,其主要包含描述镜像的文件头和可执行的kernel和ramdisk。相信参考[android boot image](http://docs.leconiot.com/doku.php?id=jaysnote:android_bootimg) 。

linux-3.10/scripts/build.sh 为制作引导镜像脚本,其约定kernel和ramdisk可执行文件的偏移地址和通过mkbootimg 工具制作引导镜像文件。

```bash #“linux-3.10/scripts/build.sh” line 287 if [ ${bss_sz} -gt $1) ]; then

       RAMDISK_OFFSET="0x02000000";

else

       RAMDISK_OFFSET="0x01000000";

fi #modify ramdisk offset from 16m to 20m RAMDISK_OFFSET=“0x01400000”; ${MKBOOTIMG} –kernel ${BIMAGE} \

  1. -ramdisk ${RAMDISK} \
  2. -board ${CHIP} \
  3. -base ${BASE} \
  4. -kernel_offset ${KERNEL_OFFSET} \
  5. -ramdisk_offset ${RAMDISK_OFFSET} \
  6. o output/boot.img

```

pack打包工具未对镜像做任何处理,软连接到了boot.fex。

```bash ln -s ${LICHEE_OUT}/boot.img boot.fex ```

## rootfs

rootfs 的制作通过build.sh moudle=all 制作,会选择`buildroot/scripts/mkcommon.sh`再到`buildroot/scripts/mkcmd.sh`,最终通过`buildroot/target/debian/build.sh` 打包镜像。

```bash OUT_PATH=“../../../out/dragonboard” #“buildroot/target/debian/build.sh” line 36 buildroot/target/tools/host/usr/bin/make_ext4fs -s -l $NEW_NR_SIZE“M” $TARGET_IMAGE ${LICHEE_TOP_DIR}/debian/ cp -v rootfs.ext4 $OUT_PATH/ ```

pack打包工具未对镜像做任何处理,软连接到了rootfs.fex。

```bash ln -s ${LICHEE_OUT}/rootfs.ext4 rootfs.fex ```

1)
16#1000000
jaysnote/pack_tool.1545132877.txt.gz · 最后更改: 2021/06/22 23:14 (外部编辑)