谁调用了驱动程序的probe()

iSe*_*ult 35 linux-device-driver linux-kernel

如何probe()调用电话?谁叫它?根据我的理解,__init()寄存器driver然后以某种方式probe()被调用到register设备数据irq等.它究竟发生了什么?

我正在研究触摸屏驱动程序及其__init注册本身i2c driver.然后探测期望i2c_client数据返回null.我想跟踪它被填满的地方.

Mir*_*cea 37

长话短说:驱动程序的probe()函数是为调用该register_driver特定总线而调用的.更确切地说,它是由被称为probe()是的bus_type结构.在你的情况下:i2c_bus_type.

这是I2C情况下的调用链:

  • i2c_register_driver
  • driver_register
  • bus_add_driver
  • driver_attach
  • __driver_attach(适用于您的设备)
  • driver_probe_device
  • really_probe
  • i2c_device_probe(这是dev-> bus-> probe用于i2c驱动程序)
  • your_probe_function


Sun*_*ahu 12

我准备了一个跟踪平台驱动器探测功能的图表.您正在使用I2C驱动程序,其中AFAIK是一个平台驱动程序.我希望这可以帮助您追踪问题.

在此输入图像描述

另外,请查看以下链接以查看有关kernelnewbies的讨论.

https://www.mail-archive.com/kernelnewbies%40kernelnewbies.org/msg12423.html


小智 7

让我们考虑一个例子platform device driver

  1. driver->probe()回调的起始触发函数是module_init()加载驱动程序时调用的宏;这macro在 中定义include/linux/module.h

  2. module_init(my_driver_init)有回调my_driver_init()函数。my_driver_init()函数应该调用platform_driver_register(my_driver)

  3. platform_driver_register(my_driver)my_driver -> probe()句柄分配给泛型drv -> probe()并调用该driver_register(my_driver)函数。

  4. driver_register(my_driver)函数添加my_driver到平台总线和调用driver_attach()函数。

  5. 同理,甚至platform_device需要附加到平台总线上。

  6. 最后,只有在driver_match_device()基于回报的成功.name.id_table对的driver在从来自要么平台的设备列表匹配ACPI/DTS,那么driver_probe_device()被称为具有drv->probe()回调。