在u-boot移植过程中,由于u-boot烧录在SD卡中,因此老是加载内核失败,是什么原因呢?在加载内核的打印信息中有这样类似的信息:
reading kernel.. 1120, 10240
MMC read: dev # 1, block # 1120, count 10240 ...10240 blocks read: OK
completed
reading RFS.. 11360, 2048
MMC read: dev # 1, block # 11360, count 2048 ...2048 blocks read: OK
信息描述的意思是从MMC 设备1(这里是指SD卡)的1120块中去读取内核,从11360块中读取ramdisk,但由于此时的SD卡中相应的位置并没有写入kernel 和ramdisk,因此在后续的加载时会失败。那么可以怎么解决呢?这里使用两种方式,一种是让u-boot从eMMC中去读取kernel 和 ramdisk ,另一种是烧录kernel 和 ramdisk 到SD卡中,这里主要记录的是第二种方式的修改记录,对于第一种方式,相较之下比较简单,只要修改默认从eMMC中读取就可以了。
1、u-boot 使用sdfuse 命令烧录的实现过程
u-boot中烧录的镜像的命令格式是:
sdfuse flash [bootloader|kernel|ramdisk|system] xx.bin/img
当使用sdfuse进行烧录时,会调用 common/cmd_fastboot.c –> do_sdfuse()函数进行命令参数解析和处理;do_sdfuse() 函数会调用set_partition_table_sdmmc() 建立一个分区表,下面是do_sdfuse()部分代码:
int do_sdfuse (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
……
if (set_partition_table_sdmmc())
return 1;
……
/* 根据参数解析,判断进入哪种处理方式 */
if ((argc == 2) && !strcmp(argv[1], "info")){……
}else if ((argc == 2) && !strcmp(argv[1], "flashall")){……
}else if ((argc == 4) && !strcmp(argv[1], "flash"))
{
if (update_from_sd(argv[2], argv[3]))
goto err_sdfuse;
ret = 0;
}
else if ((argc == 3) && !strcmp(argv[1], "erase"))
{
……
}
……
}
do_sdfuse 函数通过调用update_from_sd()函数从SD卡中读取镜像进行烧录,update_from_sd()的部分代码:
static int update_from_sd (char *part, char *file)
{
int ret = 1;
/* 读取镜像 */
if (file != NULL){
……
sprintf(filename, "%s%s", CFG_FASTBOOT_SDFUSE_DIR, file);
offset = CFG_FASTBOOT_TRANSFER_BUFFER;