u-boot sdfuse命令烧录分析----从SD卡加载内核

在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;
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值