从eMMc flash

时间:2018-02-20 21:09:40

标签: c bootloader u-boot

我想从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;

0 个答案:

没有答案