buildroot uboot saveenv в раздел emmc fat - PullRequest
       59

buildroot uboot saveenv в раздел emmc fat

0 голосов
/ 06 декабря 2018

Я пытаюсь сохранить среду загрузки в разделе FAT устройства mmc на модуле CM3 rpi.ОС была встроена в buildroot, я могу printenv, и это показывает встроенный env в двоичном файле.Команда saveenv распознается, во-первых, говорится, что она сохраняется в формате fat, а имя файла - uboot-env.bin.Файл существует и найден, но функция bcm2835_transfer_block_pio, кажется, ничего не пишет и многократно выплевывает fsm 1, hsts 000001.Mmc выбирается как dev0 partition1 (0: 1) в buildroot.Кто-нибудь сталкивался с этой ошибкой и знает, как ее исправить?

Источник для драйвера 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;
}
...