目录
1、概述
mfgtools烧录软件时分为两个阶段:BootStrap和Updater。BootStrap阶段会先下载临时的uboot、dtb、zImage和initramfs并运行,为后续的Updater阶段做好准备。
那么这些文件是怎么生成的呢。
2、4个文件
ucl2.xml中的operation list列出了具体使用的是哪个文件。
2.1 uboot
<LIST name="Linux-4.1.15-eMMC" desc="Target OS: Linux-4.1.15(eMMC)">
<CMD state="BootStrap" type="boot" body="BootStrap" file ="mfgfiles-L4.1.15/uboot-%ek_name%-%ek_spec%-emmc.imx">boot: u-boot</CMD>
# BootStrap阶段加载的uboot是uboot-%ek_name%-%ek_spec%-emmc.imx这个文件
<CMD state="Updater" type="push" body="send" file="image-L4.1.15-uboot/uboot-%ek_name%-%ek_spec%-emmc.imx">send: u-boot</CMD>
# Updater阶段加载的uboot也是uboot-%ek_name%-%ek_spec%-emmc.imx这个文件。
</LIST>
从上面的cmd中可以看出在BootStrap和Updater阶段加载的是同一个uboot,只是使用的环境变量是不一样的,在BootStrap阶段,uboot启动kernel时使用的是bootcmd_mfg命令。bootcmd_mfg命令的具体内容可以参考myimx6a7.h,内容如下:
/* MFG ENV ****************************************************************** */
#define CONFIG_MFG_ENV_SETTINGS \
"bootargs_mfg=setenv bootargs console=${console},${baudrate} " \
"rdinit=/linuxrc " \
"g_mass_storage.stall=0 g_mass_storage.removable=1 " \
"g_mass_storage.file=/fat g_mass_storage.ro=1 " \
"g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF " \
"g_mass_storage.iSerialNumber=\"\" " \
"${mtdparts} " \
"clk_ignore_unused\0" \
"bootcmd_mfg=run bootargs_mfg; bootz ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r};\0"
/* COMMON ENV *************************************************************** */
#define CONFIG_EXTRA_ENV_SETTINGS \
CONFIG_MFG_ENV_SETTINGS \
"bootdelay=1\0" \
"console="CONFIG_CONSOLE_DEV"\0" \
"baudrate="__stringify(CONFIG_BAUDRATE)"\0" \
"loadaddr=0x80800000\0" \
"fdt_addr_r=0x83000000\0" \
"kernel_addr_r=0x80800000\0" \
"ramdisk_addr_r=0x83800000\0" \
"fdt_high=0xffffffff\0" \
"initrd_high=0xffffffff\0" \
"mtdids="MTDIDS_DEFAULT"\0" \
"mmcautodetect=yes\0" \
"panel=MY-WVGA\0" \
"mtdparts="MTDPARTS_DEFAULT"\0" \
"mmcdev="__stringify(CONFIG_SYS_MMC_ENV_DEV)"\0" \
"mmcpart=1\0" \
"file_scr="CONFIG_MY_BOOTSCRIPT"\0" \
"file_ubot=uboot-"CONFIG_BOARD_NAME""CONFIG_BOARD_CPU""CONFIG_BOARD_MEM""CONFIG_BOARD_STORAGE".imx\0" \
"fdt_file="CONFIG_BOARD_NAME""CONFIG_BOARD_CPU""CONFIG_BOARD_MEM""CONFIG_BOARD_STORAGE".dtb\0" \
"my_env_flag=unset\0" \
"load_scr_emmc=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${file_scr};\0" \
"load_scr_nand=nand read ${loadaddr} 0x3c0000 0x20000;\0"
从上面的代码中可以看出,BootStrap阶段kernel是zImage, rootfs的是ramdisk。
2.2 kernel
<LIST name="Linux-4.1.15-eMMC" desc="Target OS: Linux-4.1.15(eMMC)">
<CMD state="BootStrap" type="load" file="mfgfiles-L4.1.15/mfg-zImage-myimx6a7" address="0x80800000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE">load: zImage(mfg)</CMD>
# BootStrap阶段加载的kernel是mfg-zImage-myimx6a7这个文件
<CMD state="Updater" type="push" body="send" file="image-L4.1.15-kernel/zImage-myimx6a7">send: zImage</CMD>
<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblkxp1/zImage-myimx6a7">write zImage</CMD>
# Updater阶段加载的kernel是zImage-myimx6a7这个文件。
</LIST>
从上面的cmd中可以看出,在BootStrap和Updater阶段加载的kernel是不同的。注意在BootStrap阶段,加载mfg-zImage-myimx6a7时的address参数必须和uboot环境变量中的kernel_addr相同。而在Updater阶段,此时临时的kernel和rootfs已经运行了,zImage-myimx6a7直接加载到了临时文件系统中。
2.3 dtb
<LIST name="Linux-4.1.15-eMMC" desc="Target OS: Linux-4.1.15(eMMC)">
<CMD state="BootStrap" type="load" file="mfgfiles-L4.1.15/%ek_name%-%ek_spec%-emmc.dtb" address="0x83000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE">load: dtb</CMD>
# BootStrap阶段加载的dtb是%ek_name%-%ek_spec%-emmc.dtb这个文件
<CMD state="Updater" type="push" body="send" file="image-L4.1.15-dtb/%ek_name%-%ek_spec%-emmc.dtb">send: dtb</CMD>
<CMD state="Updater" type="push" body="$ cp $FILE /mnt/mmcblkxp1/%ek_name%-%ek_spec%-emmc.dtb">write dtb</CMD>
# Updater阶段加载的dtb是%ek_name%-%ek_spec%-emmc.dtb这个文件。
</LIST>
从上面的代码中可以看出,在BootStrap和Updater阶段加载的dtb文件是相同的。注意在BootStrap阶段,加载dtb文件时的address参数必须和uboot环境变量中的fdt_addr_r相同。而在Updater阶段,此时临时的kernel和rootfs已经运行了,dtb直接加载到了临时文件系统中。
2.4 rootfs
<LIST name="Linux-4.1.15-eMMC" desc="Target OS: Linux-4.1.15(eMMC)">
<CMD state="BootStrap" type="load" file="mfgfiles-L4.1.15/fsl-image-mfgtool-initramfs" address="0x83800000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE">load: initramfs</CMD>
# BootStrap阶段加载的rootfs是fsl-image-mfgtool-initramfs这个文件
<CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mmcblkxp2" file="image-L4.1.15-rootfs/%my_rootfs%">pipe: rootfs</CMD>
<CMD state="Updater" type="push" body="frf">frf: rootfs</CMD>
# Updater阶段加载的rootfs是%my_rootfs%这个文件,my_rootfs在cfg.ini中定义。
</LIST>
从上面的代码中可以看出,在BootStrap和Updater阶段加载的rootfs是不同的。注意在BootStrap阶段,加载rootfs即ramdisk文件时的address参数必须和uboot环境变量中的ramdisk_addr_r相同。而在Updater阶段,此时临时的kernel和rootfs已经运行了,rootfs直接加载到了临时文件系统中,然后再同步到emmc上。
2.5 其他
在Updater阶段,还在下载environment.src等文件。
2.6 kernel的编译
由于在BootStrap和Updater阶段使用的kernel是不同的,因此二者的编译过程是不同的。BootStrap阶段使用的mfg-zImage-myimx6a7在编译时需使用myimx6_mfg_defconfig配置文件。而Updater阶段使用的zImage-myimx6a7则使用myimx6a7_defconfig作为配置文件。
2.7 ramdisk的制作
还没有找到官方的制作方法,使用官方提供的ramdisk即可。