u-boot学习笔记二:NXP mfgtools添加eMMC用户区烧录方式

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用户区域空间中。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值