知识分享:linuxI2C驱动核心梳理
由于平台限制,这里只放文章的名字啦如果需要用到本文的图片,请标记出处谢谢啦~
参考文章 【linux iic子系统】i2c整体框图【精髓部分】(五)_bus_for_each_drv-CSDN博客
- linux设备驱动程序——i2c总线的添加与实现_如何填充i2c_client-CSDN博客
- 【linux iic子系统】i2c设备与驱动匹配过程(三)_i2c_add_driver 如何和clent匹配-CSDN博客
驱动和设备树以及各个结构体总的关系图如下所示:
下面根据图具体解释。
重要的几个结构体的关系
比较重要的是 i2c_adapter
i2c_client
i2c_driver
i2c_algorithm
i2c_adapter
对应的一个物理上的适配器,以tegra为例,在设备树中compitable = "nvidia,tegra210-i2c"
来指示适配器该怎么配置。并且在其对应的probe函数中会同时注册 i2c_algorithm
的方法用来控制如何发送i2c数据,以及发送i2c数据的函数
i2c_client
会通过对应设备树中的节点信息填充,然后挂到bus上统一被管理。client其实就是设备树信息。所以一个adapter可能会有多个client(=一个i2c总线上挂载多个设备)
i2c_driver
是用户所写的驱动程序,也会被统一挂载到bus上。由bus统一管理。
i2c bus部分
bus提供了注册和probe方法。并由于很多设备都依赖i2c,所以i2c bus的注册优先级很高
//i2c-core.c
postcore_initcall(i2c_init); // 2
在 i2c_init
中,会用bus_register
注册一个 i2c_bus_type
struct bus_type i2c_bus_type = {
.name = "i2c",
.match = i2c_device_match,
.probe = i2c_device_probe,
.remove = i2c_device_remove,
.shutdown = i2c_device_shutdown,
};
在这个总线类型中,会提供match方法和probe方法。match就是用来匹配总线上的设备树信息client
,和驱动设备文件driver
的。probe用来在driver的probe(就是"xx.ko"驱动文件里的probe!!)执行前做一些初始化,然后再去调用driver提供的probe函数。
adapter部分
adapter是控制实际的物理i2c适配器与外界设备通信的。
物理上的i2c1的设备树描述
i2c@7000c000 {
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c";
reg = <0x0 0x7000c000 0x0 0x100>;
interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
1. 自我介绍:高通、Oppo(sp)、vivo(sp)、小米(ssp)、荣耀(26k*12+80k)、华子(报批中)、美团、韶音、经纬恒润、乐鑫、中兴、TP 2. 内容: 1.嵌入式学习的资料和路径 2.所有面试的题目和解答(持续更新)、对评论的快速解答 3.各种碎碎念 3.整理不易,buy me coffee☕️,为了回馈牛客和各个粉丝,文章都会先试读几天,热度过了再收录~