Linux驱动学习笔记-I2C设备与驱动的匹配代码分析

1.I2C设备与驱动的总匹配过程

我们可以通过I2C驱动的注册函数来分析I2C设备与驱动的匹配流程总调用过程:i2c_add_driver->i2c_register_dirver->driver_register -> bus_add_driver -> driver_attach -> bus_for_each_dev -> __driver_attach -> driver_match_device -> i2c_device_match -> driver_probe_device -> really_probe -> i2c_device_probe

include/linux/i2c.h

#define i2c_add_driver(driver) \
	i2c_register_driver(THIS_MODULE, driver)

drivers/i2c/i2c-core-base.c

int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
{
int res;

/* add the driver to the list of i2c drivers in the driver core */
driver->driver.owner = owner;
driver->driver.bus = &i2c_bus_type;
INIT_LIST_HEAD(&driver->clients);

/* When registration returns, the driver core
* will have called probe() for all matching-but-unbound devices.
         */
res = driver_register(&driver->driver);

pr_debug("driver [%s] registered\n", driver->driver.name);

/* Walk the adapters that are already present */
i2c_for_each_dev(driver, __process_new_driver);

return 0;
}
EXPORT_SYMBOL(i2c_register_driver);

该函数用来注册一个i2c驱动,实际是往i2c_driver的;链表上添加一个i2c驱动,且驱动类型为i2c_bus_type

drivers/i2c/i2c-core-base.c
struct bus_type i2c_bus_type = {
    .name       = "i2c",
    .match      = i2c_device_match,
    .probe      = i2c_device_probe,
    .remove     = i2c_device_remove,
    .shutdown   = i2c_device_shutdown,
    .pm     = &i2c_device_pm_ops,
};


由图中可知,通过比较I2C驱动中的of_match_tableid_table以及ACPI方式进行设备与驱动的匹配
详解我对driver_register的理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值