关于U-boot驱动模型

About U-boot driver model

我有一个关于 U-boot 驱动程序模型的简单问题。我想知道何时以及如何触发驱动程序的功能操作。

例如,对于以太网驱动程序,这些是定义的操作:

static const struct eth_ops designware_eth_ops = {
    .start                  = designware_eth_start,
    .send                   = designware_eth_send,
    .recv                   = designware_eth_recv,
    .free_pkt               = designware_eth_free_pkt,
    .stop                   = designware_eth_stop,
    .write_hwaddr           = designware_eth_write_hwaddr,
};

现在,这些 eth_ops 是在探测函数之后的初始化阶段被调用,还是仅当某些命令是 运行 来自 u-boot 提示符(如 ping 、 tftp 等)时才被调用?

初始化阶段只会探测设备并将其移动到下一个子系统?

这取决于 u-boot 设置。如果 bootcmd 和 bootargs 环境变量定义了一些与网络相关的东西,比如从 tftp 服务器加载内核,它将首先调用启动回调,然后在发送和接收 send/rec 回调时调用。如果内核是从闪存加载的,则不需要 u-boot 网络,并且如果您没有在 uboot shell 上使用网络命令,则不会调用任何回调 Uboot 驱动程序模型与 Linux 模型非常相似,实际上它们之间有很多共同的代码。唯一的"big"区别是uboot使用物理寻址而Linux使用MMU将物理地址转换为虚拟地址space