i2c设备驱动分析

平台设备模型

i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned len)
该函数会注册board device总线设备链表 ,在平台init函数中运行

.compatible = “fsl,imx1-i2c”,
platform_driver_register(&i2c_imx_driver);
i2c_imx_probe(pdev)

device端的流程:
1、构建adapt
strlcpy(i2c_imx->adapter.name, pdev->name, sizeof(i2c_imx->adapter.name));
i2c_imx->adapter.owner = THIS_MODULE;
i2c_imx->adapter.algo = &i2c_imx_algo;
i2c_imx->adapter.dev.parent = &pdev->dev;
i2c_imx->adapter.nr = pdev->id;
i2c_imx->adapter.dev.of_node = pdev->dev.of_node;
i2c_imx->base = base;
2、注册i2c设备的adapt
i2c_add_numbered_adapter(&i2c_imx->adapter);
3、注册并生成i2c-0等i2c总线操作节点
dev_set_name(&adap->dev, “i2c-%d”, adap->nr);
device_register(&adap->dev);
4、遍历挂在i2c总线上的设备
if (adap->nr < __i2c_first_dynamic_bus_num)
i2c_scan_static_board_info(adap);
5、注册各条总线遍历到的设备通过busNum来判断
list_for_each_entry(devinfo, &__i2c_board_list, list) {
if (devinfo->busnum == adapter->nr
&& !i2c_new_device(adapter,
&devinfo->board_info))
}
6、注册总线上的i2c设备
i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
7、构建i2c_client 结构
client->flags = info->flags;
client->addr = info->addr;
client->irq = info->irq;
client->dev.bus = &i2c_bus_type;
client->dev.type = &i2c_client_type;
8、注册总线上挂载的设备 device_register(&client->dev); 后面会通过contain_of将client取出

driver端的流程:
1、注册i2c总线上的设备driver
i2c_add_driver(&wm8983_i2c_driver);
i2c_register_driver(THIS_MODULE, driver)
driver->driver.bus = &i2c_bus_type;
driver_register(&driver->driver);
bus_add_driver(drv);
driver_attach(drv);
__driver_attach
2、调用driver->driver.bus = &i2c_bus_type; 的match函数找到id_table中name和device_client name匹配的ID,遍历总线设备拿到dev并调用设备的driver probe
static inline int driver_match_device(struct device_driver *drv,
struct device *dev)
{
return drv->bus->match ? drv->bus->match(dev, drv) : 1;
}
if (!dev->driver)
driver_probe_device(drv, dev);
really_probe(dev, drv);
if (dev->bus->probe) {
ret = dev->bus->probe(dev);
if (ret)
goto probe_failed;

3、调用i2c_bus_type的probe函数,得到client结构
*client = i2c_verify_client(dev);
4、调用driver->probe(client, i2c_match_id(driver->id_table, client));将client结构传入

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值