【问题标题】:Kernel module probe function is never called从不调用内核模块探测函数
【发布时间】:2019-01-15 18:29:44
【问题描述】:

我尝试加载示例设备树驱动程序,但从未调用过探测函数。

dts 文件中的条目如下所示

dummy1 {
    compatible = "ti,dummy";
    reg = <0x9f200000 0x1000>,
        <0x9f201000 0x8>;
};

而相关的驱动代码是:

#define DRV_NAME  "dummy"
static const struct of_device_id dummy_of_match[] = {
{
.compatible = "ti,dummy",
}, {
},
};

static struct platform_driver dummy_driver = {
.driver = {
.name = DRV_NAME,
.of_match_table = dummy_of_match,
},
.probe   = dummy_probe,
.remove   = dummy_remove,
};
MODULE_DEVICE_TABLE(of, dummy_of_match);
module_platform_driver(dummy_driver);

我重新编译了 dtb 文件(dtdiff 显示它包含我的设备)并将其复制到目标,但是当我安装驱动程序时没有任何反应。 我在 /sys/firmware/devicetree/ 中也找不到它

【问题讨论】:

  • 复制到目标是什么意思?
  • @yashC 我在通过串行连接到主机的 beaglebone black 上运行内核。系统使用 Busybox/NFS 引导。复制到目标是指将重新编译的 am335x-boneblack.dtb 复制到 NFS 上的 /boot 文件夹。
  • 因为它在devicetree/ 中不存在,所以我们可以假设它与内核不解析它有关。你可以尝试一些事情。 1. 显式给出status=okay 2. 如果该节点被定义为某个其他节点的子节点,则检查该节点是否被禁用(如果它已经不是,则将其放在soc节点下)。
  • @yashC 我做到了,但没有丝毫改变。更重要的是 - 即使从 NFS 中删除了 dtb 文件,DT 也会成功加载!可以烘焙到 zImage 中吗?
  • 有可能是这种情况。您可以尝试删除 zimage 文件并添加新的内核映像文件。那么它应该可以工作了。

标签: linux-kernel linux-device-driver u-boot device-tree


【解决方案1】:

为了解决这个问题,我什至删除了 dtb 文件……神奇地内核继续启动,好像什么都没发生一样。我认为可以将 dtb 烘焙到 zImage 中,这可以通过一些额外的调整来实现,但事实并非如此。

解决方案: 最后发现uboot也是先检查emmc卡上的./boot目录!从那里删除 dtb 立即使 NFS 上的文件“可见”。

P.S.:如果您遇到类似问题,请尝试仔细阅读输出。当我在 NFS 上删除它时看到 .dtb 加载错误,我开始理解这个问题,但之后出现一条消息,它已成功加载到内存中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2014-10-19
    • 2012-06-04
    • 2016-05-31
    相关资源
    最近更新 更多