# 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 $((16#1000000)) ]; then RAMDISK_OFFSET="0x02000000"; else RAMDISK_OFFSET="0x01000000"; fi #modify ramdisk offset from 16m to 20m RAMDISK_OFFSET="0x01400000"; ${MKBOOTIMG} --kernel ${BIMAGE} \ --ramdisk ${RAMDISK} \ --board ${CHIP} \ --base ${BASE} \ --kernel_offset ${KERNEL_OFFSET} \ --ramdisk_offset ${RAMDISK_OFFSET} \ -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 ```