模块驱动调试记录 ——platform_driver_register

模块驱动调试记录 ——platform_driver_register当前module_init中使用platform_driver_register(&dev_driver)注册了设备驱动,在 /sys/bus/platform/drivers生

大家好,又见面了,我是你们的朋友全栈君。

当前module_init中使用 platform_driver_register(&dev_driver)注册了设备驱动,在 /sys/bus/platform/drivers 生成了以dev_driver->driver.name命名的驱动分支;

但是发现没有调用probe函数;

了解一下platform_driver_register 驱动注册的流程;

驱动注册的时候platform_driver_register()->driver_register()->bus_add_driver()->driver_attach()->bus_for_each_dev()
对每个挂在虚拟的platform bus的设备作match操作;
如果相符就调用platform_drv_probe()->driver->probe(),如果probe成功则绑定该设备到该驱动.

具体platform驱动和设备是如何match的呢?

当前platform_driverde 结构如下:
static struct platform_driver hisi_poe_driver = {
    .probe = xxx_poe_probe,
    .remove = xxx_poe_remove,
    .driver = {
        .name = XXX_POE_DRV_NAME,
        .of_match_table = xxx_poe_match,
        .acpi_match_table = ACPI_PTR(xxx_poe_acpi_ids),
    },
};

有name、of_match_table、acpi_match_table三个字段;总线上的device和driver进行匹配的时候会调用bus的match函数,对于platform bus而言就是platform_match: 

static int platform_match(struct device *dev, struct device_driver *drv) 
{ 
    struct platform_device *pdev = to_platform_device(dev); 
    struct platform_driver *pdrv = to_platform_driver(drv); 

    /* Attempt an OF style match first */ 
    if (of_driver_match_device(dev, drv)) 
        return 1; 

    /* Then try ACPI style match */ 
    if (acpi_driver_match_device(dev, drv)) 
        return 1; 

    /* Then try to match against the id table */ 
    if (pdrv->id_table) 
        return platform_match_id(pdrv->id_table, pdev) != NULL; 

    /* fall-back to driver name match */ 
    return (strcmp(pdev->name, drv->name) == 0); 
} 

很明显,先匹配of_match_table,再是acpi_match_table,然后是id_table,最后才是匹配name;

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154342.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月4日 下午3:16
下一篇 2022年7月4日 下午3:16


相关推荐

  • Unity协程认知

    Unity协程认知协程使用之前请注意以下几点:1.协程只需要调用一次,只需要调用一次,只需要调用一次!2.yieldreturn表示挂起,挂起的意思是协程里的变量会被保留,直到达到return的条件才会执行return以下的代码片段。举个例子:yieldreturnnewWaitForSeconds(0.9f);//执行到这儿,等待0.9s,继续执行这句代码以下的代码片段3.开启协程的方式:a.Sta

    2022年6月28日
    27
  • java python哪个好_java和python哪个更好用?(一)[通俗易懂]

    java python哪个好_java和python哪个更好用?(一)[通俗易懂]JavaJava是世界上最古老,功能最强大的编程语言之一。它是一种通用的静态类型的语言。这意味着任何人都可以使用它。使用此编程语言没有特定的目的。Java还是一种面向对象的编程语言。这使其成为易于使用的编程语言之一。Java还是一种可移植的编程语言,可以在WORA上运行(一旦在任何地方运行,编写一次)。这意味着您可以在特定计算机上编写Java程序,并在任何平台上使用它。您需要拥有Java虚拟机(…

    2022年7月8日
    23
  • KeyError: ‘accuracy’、KeyError: ‘val_acc’、KeyError: ‘acc’等报错信息的解决方法

    KeyError: ‘accuracy’、KeyError: ‘val_acc’、KeyError: ‘acc’等报错信息的解决方法首先 之所以会出现 KeyError accuracy KeyError acc KeyError val acc 等报错信息 是由于 keras 库 一个开源人工神经网络库 版本不同所造成的 下面分别就其进行简述之 Index 目录索引报错信息之 KeyError accuracy 报错信息之 KeyError val acc 和 KeyError acc Conclusion

    2026年3月17日
    1
  • Win10(Windows)系统中窗口切换 最大最小化窗口等快捷键

    Win10(Windows)系统中窗口切换 最大最小化窗口等快捷键一 窗口视图相关的快捷键最小化当前窗口 Alt 空格键 N 显示桌面 Win 键 D 再次按 Win D 则恢复显示原来的所有窗口 锁屏 Win 键 L 最大化当前窗口 将窗口大小还原等 Win 键 四个方向键 Win 键 上箭头 最大化当前窗口到全屏模式 Win 键 向下箭头 恢复窗口的大小 然后最小化窗口 Win 键 左箭头 捕捉当前窗口到屏幕的左半边 Win 键 右箭头 捕捉当前窗口到屏幕的右半边 切换窗口 Alt Tab 先按住 Alt 再点按 Tab 可按顺序往下切换窗口 继续按住 Al

    2026年3月17日
    1
  • 云原生核心技术之Istio服务网格核心理论概念(一)

    云原生核心技术之Istio服务网格核心理论概念(一)Istio 服务网格基本理论概念 1 ServiceMesh 基本概念 1 1 什么是 ServiceMesh 服务网格在熟悉和使用 Istio 之前首先要了解什么是 ServiceMesh ServiceMesh 即为 服务网格 是用于处理服务与服务之间通信的基础设施层 主要负责为复杂构建的云原生应用提供一个可靠网络传递请求 并为微服务通信实现了基本的功能 例如服务发现 负载均衡 监控 流量管理 访问控制等等 服务网格通常是将一个应用程序与一个代理程序部署在一起 并进行关联 对于应用程序来说是透明的

    2026年3月17日
    2
  • COleVariant与常用基本数据类型之间的转换

    COleVariant与常用基本数据类型之间的转换COleVariant是数据库常用到的数据类型。它可以是字串,整型值,日期等。知道怎样将它转换为CString很有用处。设有CStringA;COleVariantB;来看看怎样将COleVariant转换为CString:switch(B.vt){caseVT_BSTR:   A=V_BSTRT(&B);break;//COleVariant是一个字串

    2022年7月18日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号