【问题标题】:where is the mmc write command data source from?mmc 写入命令数据源来自哪里?
【发布时间】:2026-01-13 19:30:01
【问题描述】:

我是引导加载程序世界的新手,我有一个问题,当我们发送写入命令时,我们如何分配 数据源,这与函数参数 *src?我跟踪了源代码,但我找不到它在 c 代码中分配数据源的位置。

自己回答:我发现当我们执行 #mmc write 1 0x4 2 时,参数的意思是 dev # 1, block # 4, count 2 如下函数的参数 mmc->block_dev.block_write(curr_device, blk, cnt, addr);

但是,我还是想知道,是否可以直接分配一个外部数据源?

mmc 写入或 mmc 读取是否只能从内部存储器写入/读取?

是否可以分配外部数据源,例如来自 USB 端口或 SD 卡?

最好的和尊重。

static unsigned long mmc_bwrite(int dev_num, unsigned long start, lbaint_t blkcnt, const void *src){
int err;
struct mmc *mmc = find_mmc_device(dev_num);

if (!mmc) {
    printf("MMC Device %d not found\n", dev_num);
    return 0;
}

if (blkcnt > 1)
    return mmc_bwrite_multi(mmc, start, blkcnt, src);
else if (blkcnt == 1)
    return mmc_bwrite_single(mmc, start, src);

return 0;

}

我应该如何跟踪如下代码?

mmc->block_dev.block_write = mmc_bwrite;

【问题讨论】:

    标签: linux embedded u-boot


    【解决方案1】:

    src 是指向文件系统内部的内存块的指针,如果您希望将数据从设备流式传输到 MMC,那么您将需要中间代码将该流缓冲到内存中并将其传递给高级文件系统写入函数。你不应该直接访问mmc_write()

    我应该如何跟踪如下代码?

    mmc->block_dev.block_write = mmc_bwrite;

    这只是一个赋值,而不是函数调用。 mmc_bwrite 是指向函数的指针:

    mmc_bwrite(int dev_num, unsigned long start, lbaint_t blkcnt, const void *src)
    

    这是一种在运行时将设备驱动程序实现挂钩到文件系统的方法,而不是通过静态链接。在文件系统中,mmc_bwrite() 将通过mmc->block_dev.block_write 而不是直接调用。所以

    mmc->block_dev.block_write(curr_device, blk, cnt, addr);
    

    实际上是对mmc_bwrite()的调用。

    【讨论】:

    • 亲爱的 Clifford,非常感谢您的回复。正如您所提到的“如果您希望将数据从设备流式传输到 MMC,那么您将需要中间代码来将该流缓冲在内存中并将其传递给高级文件系统写入函数。”我真正想要的是原始编写固件代码来更新 eMMC。在这种情况下,我们还没有文件系统。所以我需要在 mmc 子系统中发送命令。如您所说,我需要先将流数据从外部设备加载到内部缓冲区中。