我想从eMMC flash用户数据分区启动一个U-boot镜像,在你的u-boot源代码的spl(第二个程序加载器)中做了一些更改来添加这个支持我的意思是 fsbl (第一阶段引导加载程序)将u-boot映像从emmc flash加载到DRAM并从那里启动,并且应该得到u-boot提示符。
在此初始化之前,eMMC用户数据分区和U-boot加载并从 CONFIG_SYS_TEXT_BASE = 0x60000000定义的特定地址开始。使用闪存工具将u-boot映像闪存到emmc用户数据分区。
在jtag的帮助下,能够在ds5的内存窗口中看到内存位置0x60000000的u-boot内容,简单的应用程序将读取数据从emmc flash到DDR位置0x60000000。 我怀疑:我们是否需要将u-boot映像从emmc userdata flash复制到DRAM位置0x60000000?
第二个疑问:
我修改了下面的代码,使fsbl将u-boot映像从eMMC flash加载到DRAM并从那里启动。
spl_mmc_load_image(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev)
{
struct mmc *mmc = NULL;
u32 boot_mode;
int err = 0;
__maybe_unused int part;
err = spl_mmc_find_device(&mmc, bootdev->boot_device);
if (err)
return err;
err = mmc_init(mmc);
if (err) {
#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
printf("spl: mmc init failed with error: %d\n", err);
#endif
return err;
}
boot_mode = spl_boot_mode(bootdev->boot_device);
err = -EINVAL;
switch (boot_mode) {
case MMCSD_MODE_EMMCBOOT:
/*
* We need to check what the partition is configured to.
* 1 and 2 match up to boot0 / boot1 and 7 is user data
* which is the first physical partition (0).
*/
part = (mmc->part_config >> 3) & PART_ACCESS_MASK;
if (part == 7)
part = 0;
if (CONFIG_IS_ENABLED(MMC_TINY))
err = mmc_switch_part(mmc, part);
else
err = blk_dselect_hwpart(mmc_get_blk_desc(mmc), part);
if (err) {
#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
puts("spl: mmc partition switch failed\n");
#endif
return err;
}
/* Fall through */
case MMCSD_MODE_RAW:
debug("spl: mmc boot mode: raw\n");
if (!spl_start_uboot()) {
err = mmc_load_image_raw_os(spl_image, mmc);
if (!err)
return err;
}
err = mmc_load_image_raw_partition(spl_image, mmc,
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION);
if (!err)
return err;
#ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
err = mmc_load_image_raw_sector(spl_image, mmc,
CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR);
if (!err)
return err;
}
在此函数内:uc-boot-src / common / spl / spl_mmc.c下的mmc_load_image_raw_sector()
count = blk_dread(mmc_get_blk_desc(mmc), sector, 1, header);
计数始终为零。 Interanlly blk_dread正在调用CMD16(设置块长度)并且CMD17(读取块)失败。 对于CMD16设置块lenght = 512并且读取块数=一些没有xxx手动给出通过计数值。 我的主要意图是fsbl加载u-boot并启动,得到u-boot提示符。 最后到达u-boot-src / common / spl / spl_mmc.c下面的代码
debug("loaded - jumping to U-Boot...");
spl_board_prepare_for_boot();
jump_to_image_no_args(&spl_image);
After this fsbl reseting .....
第三个疑问:
我可以使用此代码将u-boot映像从emmc flash复制到RAM,这是在u-boot源中预设的吗?
function name void copy_uboot_to_ram(void)
目前在arch / arm / mach-exynos / spl_boot.c
下ifdef CONFIG_SUPPORT_EMMC_BOOT
case BOOT_MODE_EMMC:
/* Set the FSYS1 clock divisor value for EMMC boot */
emmc_boot_clk_div_set();
copy_bl2_from_emmc = get_irom_func(EMMC44_INDEX);
end_bootop_from_emmc = get_irom_func(EMMC44_END_INDEX);
copy_bl2_from_emmc(BL2_SIZE_BLOC_COUNT, CONFIG_SYS_TEXT_BASE);
end_bootop_from_emmc();
break;