一目了然
- 1 简述
- 2 命令添加
- 2.1 mfgtools烧录程序原理
- 2.2 mfgtools程序改动
- 2.3 u-boot fastboot模块程序改动
1 简述
NXP mfgtools工具是NXP官方提供的,为配合iMX(iMX6、iMX7、iMX8)系列芯片烧录镜像文件而开发的软件工具,其中镜像烧录程序名称为UUU (Universal Update Utility),在UUU程序中提供了烧录eMMC程序数据的两种方式,即烧录BootLoader至eMMC boot0区域和烧录完整的镜像文件(包括BootLoader、DTB、Kernel和rootfs)至eMMC,经测试发现,烧录完整镜像文件时,BootLoader数据被烧录在了eMMC的用户区域。
在软件开发过程中会遇到BootLoader的大小大于所使用的eMMC boot区域空间的情况,这种情况下BootLoader数据不能完整的被烧录在eMMC boot区域内,需要将BootLoader烧录在eMMC用户空间(User Data Area)内。因此,需要基于mfgtools添加eMMC用户区域烧录BootLoader的方式。
2 命令添加
2.1 mfgtools烧录程序原理
mfgtools程序是运行在PC端的,通过PC与开发套件之间连接的USB进行通信完成数据的烧录。实际上,mfgtools并不直接对开发套件进行操作,而是基于USB通过SDP协议与开发套件端运行的程序进行通信,由开发套件运行的程序对自身硬件进行操作。
经测试发现,iMX8在下载烧录模式下,Boot ROM固化代码首先将通过SDP协议传输的BootLoader程序数据挂载到硬件内存中运行,而BootLoader程序中有相应的fastboot模块负责与mfgtools通信完成对开发套件的硬件操作。
2.2 mfgtools程序改动
本文是基于mfgtools uuu_1.4.139 tag版本进行的修改,参照UUU程序中已经存在的emmc和emmc_all命令,添加emmc_user命令用于往eMMC用户区域中烧录BootLoader程序数据。emmc和emmc_all命令格式如下:
uuu -b emmc bootloader
uuu -b emmc_all bootloader rootfs.sdcard
添加的emmc_user命令格式如下:
uuu -b emmc_user bootloader
mfgtools需要修改的文件有:
- uuu/buildincmd.cpp
- mfgtools/uuu/CMakeLists.txt
需要添加的文件有:
- uuu/emmc_burn_user.lst
uuu/buildincmd.cpp文件的修改如下:
{
"emmc",
#include "emmc_burn_loader.clst"
,"burn boot loader to eMMC boot partition"
},
{
"emmc_user",
#include "emmc_burn_user.clst"
,"burn boot loader to eMMC user partition"
},
{
"emmc_all",
#include "emmc_burn_all.clst"
,"burn whole image to eMMC"
},
其中添加的内容为:
{
"emmc_user",
#include "emmc_burn_user.clst"
,"burn boot loader to eMMC user partition"
},
mfgtools/uuu/CMakeLists.txt文件的修改如下:
set(LSTS
uuu.lst
emmc_burn_loader.lst
emmc_burn_user.lst
emmc_burn_all.lst
fat_write.lst
qspi_burn_loader.lst
sd_burn_loader.lst
spl_boot.lst
sd_burn_all.lst
nand_burn_loader.lst
)
其中添加的内容为:
emmc_burn_user.lst
添加的uuu/emmc_burn_user.lst文件内容如下:
uuu_version 1.2.39
# @_flash.bin | bootloader
# @_image [_flash.bin] | image burn to emmc, default is the same as bootloader
# This command will be run when i.MX6/7 i.MX8MM, i.MX8MQ
SDP: boot -f _flash.bin
# This command will be run when ROM support stream mode
# i.MX8QXP, i.MX8QM
SDPS: boot -f _flash.bin
# These commands will be run when use SPL and will be skipped if no spl
# SDPU will be deprecated. please use SDPV instead of SDPU
# {
SDPU: delay 1000
SDPU: write -f _flash.bin -offset 0x57c00
SDPU: jump
# }
# These commands will be run when use SPL and will be skipped if no spl
# if (SPL support SDPV)
# {
SDPV: delay 1000
SDPV: write -f _flash.bin -skipspl
SDPV: jump
# }
FB: ucmd setenv fastboot_dev mmc
FB: ucmd setenv mmcdev ${emmc_dev}
FB: ucmd mmc dev ${emmc_dev}
FB: flash userdata _image
FB: ucmd if env exists emmc_ack; then ; else setenv emmc_ack 0; fi;
FB: ucmd mmc partconf ${emmc_dev} ${emmc_ack} 7 0
FB: Done
2.3 u-boot fastboot模块程序改动
u-boot fastboot程序的改动是为了使u-boot支持eMMC用户区域烧写BootLoader程序功能,需要修改的文件有:
- drivers/fastboot/fb_fsl/fb_fsl_dev.c
- drivers/fastboot/fb_fsl/fb_fsl_partitions.c
drivers/fastboot/fb_fsl/fb_fsl_dev.c文件的修改如下:
if( strncmp(ptn->name, FASTBOOT_PARTITION_ALL,
strlen(FASTBOOT_PARTITION_ALL)) == 0) {
info.blksz = dev_desc->blksz;
info.size = dev_desc->lba;
info.start = 0;
} else if( strncmp(ptn->name, FASTBOOT_PARTITION_DATA,
strlen(FASTBOOT_PARTITION_DATA)) == 0) {
info.blksz = dev_desc->blksz;
info.size = dev_desc->lba;
info.start = 0;
} else {
if (part_get_info(dev_desc,
ptn->partition_index, &info)) {
printf("Bad partition index:%d for partition:%s\n",
ptn->partition_index, ptn->name);
return;
}
}
其中添加的内容为:
} else if( strncmp(ptn->name, FASTBOOT_PARTITION_DATA,
strlen(FASTBOOT_PARTITION_DATA)) == 0) {
info.blksz = dev_desc->blksz;
info.size = dev_desc->lba;
info.start = 0;
drivers/fastboot/fb_fsl/fb_fsl_partitions.c文件的修改如下:
enum {
PTN_GPT_INDEX = 0,
PTN_TEE_INDEX,
#ifdef CONFIG_FLASH_MCUFIRMWARE_SUPPORT
PTN_MCU_OS_INDEX,
#endif
PTN_ALL_INDEX,
PTN_USERDATA_INDEX,
PTN_BOOTLOADER_INDEX,
};
strcpy(ptable[PTN_ALL_INDEX].name, FASTBOOT_PARTITION_ALL);
ptable[PTN_ALL_INDEX].start = 0;
ptable[PTN_ALL_INDEX].length = dev_desc->lba;
ptable[PTN_ALL_INDEX].partition_id = user_partition;
strcpy(ptable[PTN_ALL_INDEX].fstype, "device");
/* Userdata boot */
strcpy(ptable[PTN_USERDATA_INDEX].name, FASTBOOT_PARTITION_DATA);
ptable[PTN_USERDATA_INDEX].start = bootloader_mmc_offset() / dev_desc->blksz;
ptable[PTN_USERDATA_INDEX].length = ANDROID_BOOTLOADER_SIZE / dev_desc->blksz;
ptable[PTN_USERDATA_INDEX].partition_id = user_partition;
strcpy(ptable[PTN_USERDATA_INDEX].fstype, "device");
/* Bootloader */
strcpy(ptable[PTN_BOOTLOADER_INDEX].name, FASTBOOT_PARTITION_BOOTLOADER);
ptable[PTN_BOOTLOADER_INDEX].start =
bootloader_mmc_offset() / dev_desc->blksz;
ptable[PTN_BOOTLOADER_INDEX].length =
ANDROID_BOOTLOADER_SIZE / dev_desc->blksz;
ptable[PTN_BOOTLOADER_INDEX].partition_id = boot_partition;
ptable[PTN_BOOTLOADER_INDEX].flags = FASTBOOT_PTENTRY_FLAGS_UNERASEABLE;
strcpy(ptable[PTN_BOOTLOADER_INDEX].fstype, "raw");
其中添加的内容为:
PTN_USERDATA_INDEX,
/* Userdata boot */
strcpy(ptable[PTN_USERDATA_INDEX].name, FASTBOOT_PARTITION_DATA);
ptable[PTN_USERDATA_INDEX].start = bootloader_mmc_offset() / dev_desc->blksz;
ptable[PTN_USERDATA_INDEX].length = ANDROID_BOOTLOADER_SIZE / dev_desc->blksz;
ptable[PTN_USERDATA_INDEX].partition_id = user_partition;
strcpy(ptable[PTN_USERDATA_INDEX].fstype, "device");
经过上述对mfgtools和u-boot fastboot模块的修改,测试发现已经能通过命令
uuu -b emmc_user bootloader
成功地将BootLoader程序数据烧录到eMMC用户区域空间中。