Загрузка 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;