模块驱动调试记录 ——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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python模拟键盘输入_python控制鼠标键盘

    python模拟键盘输入_python控制鼠标键盘win32api.keybd_event该函数原型:keybd_event(bVk,bScan,dwFlags,dwExtraInfo)第一个参数:虚拟键码(键盘键码对照表见附录);第二个参数:硬件扫描码,一般设置为0即可;第三个参数:函数操作的一个标志位,如果值为KEYEVENTF_EXTENDEDKEY则该键被按下,也可设置为0即可,如果值为KEYEVENTF_KEYUP则该按键被释放;…

    2022年10月11日
    0
  • maven本地仓库配置文件_maven默认仓库地址

    maven本地仓库配置文件_maven默认仓库地址maven配置本地仓库

    2022年9月23日
    0
  • pycharm如何调试代码_pycharm怎么分段运行代码

    pycharm如何调试代码_pycharm怎么分段运行代码最全Pycharm教程(1)——定制外观  最全Pycharm教程(2)——代码风格  1、准备工作  (1)Python版本为2.7或者更高版本  (2)已经创建了一个python工程并且添加了内容,具体参考: GettingStartedtutorial  2、第一步——运行代码  打开之前编写的Solver.py文件,在编辑框中右键,选

    2022年8月27日
    4
  • phpstudy nginx配置_phpstorm配置php环境

    phpstudy nginx配置_phpstorm配置php环境前言:首先来了解一下nginx工作原理:https://blog.csdn.net/hguisu/article/details/8930668一.nginx实现php动态解析原理nginx是一个高性能的http服务器和反向代理服务器。即nginx可以作为一个HTTP服务器进行网站的发布处理,也可以作为一个反向代理服务器进行负载均衡。但需要注意的是:nginx本身并不会对php文…

    2022年9月22日
    1
  • flocked翻译_physicked翻译

    flocked翻译_physicked翻译FleckisaWebSocketserverimplementationinC#.BranchedfromtheNuggetproject,Fleckrequiresnoinheritance,container,oradditionalreferences.ExampleThefollowingisanexamplethatwillecho…

    2025年6月21日
    0
  • servlet的基本原理_简述arp的工作原理

    servlet的基本原理_简述arp的工作原理Web技术成为当今主流的互联网Web应用技术之一,而Servlet是JavaWeb技术的核心基础。因而掌握Servlet的工作原理是成为一名合格的JavaWeb技术开发人员的基本要求。本文将带你认识JavaWeb技术是如何基于Servlet工作,以Tomcat为例了解Servlet容器是如何工作的?一个Web工程在Servlet容器中是如何启动的?

    2022年10月4日
    1

发表回复

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

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