buildroot uboot saveenv到emmc胖分区

时间:2018-12-06 10:06:26

标签: raspberry-pi3 u-boot buildroot

我正在尝试将uboot环境保存到CM3 rpi模块上的mmc设备的FAT分区中。该操作系统是在buildroot中构建的,我可以使用printenv,并且它以二进制形式显示了内置的env。 saveenv命令被识别,首先指出它正在保存为fat,文件名是uboot-env.bin。该文件已存在并已找到,但是函数bcm2835_transfer_block_pio似乎什么也没写,并反复吐出fsm 1, hsts 000001。在buildroot中将mmc选择为dev0 partition1(0:1)。任何人都遇到此错误,知道如何解决吗?

mmc驱动程序的来源:

static int bcm2835_transfer_block_pio(struct bcm2835_host *host, bool is_read)
{
    struct mmc_data *data = host->data;
    size_t blksize = data->blocksize;
    int copy_words;
    u32 hsts = 0;
    u32 *buf;

    if (blksize % sizeof(u32))
        return -EINVAL;

    buf = is_read ? (u32 *)data->dest : (u32 *)data->src;

    if (is_read)
        data->dest += blksize;
    else
        data->src += blksize;

    copy_words = blksize / sizeof(u32);

    /*
     * Copy all contents from/to the FIFO as far as it reaches,
     * then wait for it to fill/empty again and rewind.
     */
    while (copy_words) {
        int burst_words, words;
        u32 edm;

        burst_words = min(SDDATA_FIFO_PIO_BURST, copy_words);
        edm = readl(host->ioaddr + SDEDM);
        if (is_read)
            words = edm_fifo_fill(edm);
        else
            words = SDDATA_FIFO_WORDS - edm_fifo_fill(edm);

        if (words < burst_words) {
            int fsm_state = (edm & SDEDM_FSM_MASK);

            if ((is_read &&
                 (fsm_state != SDEDM_FSM_READDATA &&
                  fsm_state != SDEDM_FSM_READWAIT &&
                  fsm_state != SDEDM_FSM_READCRC)) ||
                (!is_read &&
                 (fsm_state != SDEDM_FSM_WRITEDATA &&
                  fsm_state != SDEDM_FSM_WRITESTART1 &&
                  fsm_state != SDEDM_FSM_WRITESTART2))) {
                hsts = readl(host->ioaddr + SDHSTS);
                printf("fsm %x, hsts %08x\n", fsm_state, hsts);

                if (hsts & SDHSTS_ERROR_MASK)
                    break;
            }

            continue;
        } else if (words > copy_words) {
            words = copy_words;
        }

        copy_words -= words;

        /* Copy current chunk to/from the FIFO */
        while (words) {
            if (is_read)
                *(buf++) = readl(host->ioaddr + SDDATA);
            else
                writel(*(buf++), host->ioaddr + SDDATA);
            words--;
        }
    }

    return 0;
}

0 个答案:

没有答案