#elif defined(CFG_FASTBOOT_SDMMCBSP)
{
int start, count;
unsigned char pid;
pcount = 0;
#if defined(CONFIG_FUSED)
/* FW BL1 for fused chip */
strcpy(ptable[pcount].name, "fwbl1");
ptable[pcount].start = 0;
ptable[pcount].length = 0;
ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MOVI_CMD;
pcount++;
#endif
/* Bootloader */
strcpy(ptable[pcount].name, "bootloader");
ptable[pcount].start = 0;
ptable[pcount].length = 0;
ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MOVI_CMD;
pcount++;
/* Kernel */
strcpy(ptable[pcount].name, "kernel");
ptable[pcount].start = 0;
ptable[pcount].length = 0;
ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MOVI_CMD;
pcount++;
/* Ramdisk */
strcpy(ptable[pcount].name, "ramdisk");
ptable[pcount].start = 0;
ptable[pcount].length = 0x300000;
ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MOVI_CMD;
pcount++;
/* System */
get_mmc_part_info("0", 2, &start, &count, &pid);
if (pid != 0x83)
goto part_type_error;
strcpy(ptable[pcount].name, "system");
ptable[pcount].start = start * CFG_FASTBOOT_SDMMC_BLOCKSIZE;
ptable[pcount].length = count * CFG_FASTBOOT_SDMMC_BLOCKSIZE;
ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MMC_CMD;
pcount++;
/* Data */
get_mmc_part_info("0", 3, &start, &count, &pid);
if (pid != 0x83)
goto part_type_error;
strcpy(ptable[pcount].name, "userdata");
ptable[pcount].start = start * CFG_FASTBOOT_SDMMC_BLOCKSIZE;
ptable[pcount].length = count * CFG_FASTBOOT_SDMMC_BLOCKSIZE;
ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MMC_CMD;
pcount++;
/* Cache */
get_mmc_part_info("0", 4, &start, &count, &pid);
if (pid != 0x83)
goto part_type_error;
strcpy(ptable[pcount].name, "cache");
ptable[pcount].start = start * CFG_FASTBOOT_SDMMC_BLOCKSIZE;
ptable[pcount].length = count * CFG_FASTBOOT_SDMMC_BLOCKSIZE;
ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MMC_CMD;
pcount++;
/* fat */
get_mmc_part_info("0", 1, &start, &count, &pid);
if (pid != 0xc)
goto part_type_error;
strcpy(ptable[pcount].name, "fat");
ptable[pcount].start = start * CFG_FASTBOOT_SDMMC_BLOCKSIZE;
ptable[pcount].length = count * CFG_FASTBOOT_SDMMC_BLOCKSIZE;
ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MMC_CMD;
pcount++;
明白了。这个 kernel和u-boot 都是通过名字来确认自己的位置的。
下面这个函数决定了
int movi_set_ofs(uint last)
{
int changed = 0;
if (ofsinfo.last != last) {
ofsinfo.last = last - (eFUSE_SIZE / MOVI_BLKSIZE);
ofsinfo.bl1 = ofsinfo.last - MOVI_BL1_BLKCNT;
ofsinfo.env = ofsinfo.bl1 - MOVI_ENV_BLKCNT;
ofsinfo.bl2 = ofsinfo.bl1 - (MOVI_BL2_BLKCNT + MOVI_ENV_BLKCNT);
ofsinfo.kernel = ofsinfo.bl2 - MOVI_ZIMAGE_BLKCNT;
ofsinfo.rootfs = ofsinfo.kernel - MOVI_ROOTFS_BLKCNT;
changed = 1;
}
return changed;
}
------------在 do_movi 函数有如下可以接到上面
if (strcmp(argv[2], "u-boot") == 0) {
if (movi_emmc == 1) { /* eMMC_4.3 */
printf("eMMC Writing bootloader to sector %d (%d sectors).. ", ofsinfo.bl2, EMMC_BL_BLKCNT);
emmc_write((uint) addr, ofsinfo.bl2, EMMC_BL_BLKCNT);
} else { /* SD/MMC */
printf("Writing 1st bootloader to sector %d (%d sectors).. ", ofsinfo.bl1, MOVI_BL1_BLKCNT);
movi_write((uint) addr, ofsinfo.bl1, MOVI_BL1_BLKCNT);
printf("completed\nWriting 2nd bootloader to sector %d (%d sectors).. ", ofsinfo.bl2, MOVI_BL2_BLKCNT);
movi_write((uint) addr, ofsinfo.bl2, MOVI_BL2_BLKCNT);
}
printf("completed\n");
} else if (strcmp(argv[2], "kernel") == 0) {
if (movi_emmc == 1) { /* eMMC_4.3 */
printf("eMMC Writing kernel to sector %d (%d sectors).. ", ofsinfo.kernel, EMMC_KERNEL_BLKCNT);
emmc_write((uint) addr, ofsinfo.kernel, EMMC_KERNEL_BLKCNT);
} else { /* SD/MMC */
printf("Writing kernel to sector %d (%d sectors).. ", ofsinfo.kernel, MOVI_ZIMAGE_BLKCNT);
movi_write((uint) addr, ofsinfo.kernel, MOVI_ZIMAGE_BLKCNT);
}
printf("completed\n");
}
具体的东西就要看看S5PV210的irom 的文档才知道这个实际的位置了。
呵呵,总算明白一些了。很有意思的uboot ,和wince就是很大不同。