Загрузка u-boot с флэш-памяти eMMc

Я хотел бы загрузить образ U-boot из раздела пользовательских данных флэш-памяти eMMC, сделал некоторые изменения в spl(второй загрузчик программ) исходного кода u-boot, чтобы добавить эту поддержку. Я имею в виду, что fsbl(загрузчик первой стадии) загружает u- загрузочный образ с emmc flash на DRAM и загрузитесь оттуда и должен получить приглашение u-boot.

Перед этим инициализируйте раздел пользовательских данных eMMC и загрузку при загрузке и начните с определенного адреса, определенного как CONFIG_SYS_TEXT_BASE= 0x60000000. Использование инструмента прошивки, способного прошить образ u-boot в раздел пользовательских данных emmc.

Возможность просмотра содержимого u-boot в ячейке памяти 0x60000000 в окне памяти ds5 с помощью jtag с простым приложением, которое будет считывать данные с флэш-памяти emmc в ячейку памяти DDR 0x60000000. Мое сомнение: нужно ли нам копировать образ u-boot из флэш-памяти пользовательских данных emmc в папку DRAM 0x60000000?

2-е сомнение:

Я изменил приведенный ниже код, чтобы заставить 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;

}

Внутри этой функции: mmc_load_image_raw_sector() под u-boot-src/common/spl/spl_mmc.c

   count = blk_dread(mmc_get_blk_desc(mmc), sector, 1, header);

счетчик всегда равен нулю. Внутри blk_dread вызывает CMD16(установить длину блока), а CMD17(чтение блоков) происходит сбой. Для CMD16 установите длину блока =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 .....

3-е сомнение:

Могу ли я использовать этот код для копирования образа 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 ответов

Другие вопросы по тегам