linux内核中i2c子系统框架

发布时间:2026/11/2 19:04:35
linux内核中i2c子系统框架

目录

  • 前言
  • 内核框架
    • 1)重要的数据结构
    • 2)框架部分
  • 总结

前言

我们都知道Linux作为应用最为广泛的操作系统之一,它源码开放可修改,开放性高,丰富的硬件生态,适配性和可移植性强等等有点。关于硬件的可移植性,离不开Linux中丰富的子系统框架,但是为啥相同的内核代码可以适配不同的硬件呢,今天我们就以i2c子系统为例来唠唠这个事儿。

内核框架

1)重要的数据结构

i2c子系统框架可以分为三层,核心层i2c-core,控制器层adapter+algorithm,还有驱动层driver,client,其中核心层是统一抽象层,为特异性硬件提供统一的接口和统一管理,控制器层则是直接控制硬件i2c控制器的层次,它根据芯片上的i2c控制器的各种差异而不同,驱动则是需要驱动工程师编写适配一定i2c从设备的业务代码。
它们各有一个结构体来描述
(1)i2c_adapter
它就是总线控制器,一个i2c控制器,例如一个芯片的i2c1,i2c2就是由两个adapter描述的,它的存在主要是描述硬件信息和用来提供时序,实现底层写寄存器的工作
(2)i2c_algorithm
它是i2c控制器的一个成员,具体的算法是在里面实现,例如寄存器读写,初始化硬件,提供时序等等。
(3)i2c_client
它代表一个总线上挂的从设备
(4)i2c_driver
代表从设备驱动,写业务代码
(5)i2c_msg
它比较特殊,代表i2c传输数据最小数据单元,它描述要写的地址,方向,数据长度,还有要读写的缓冲区,也就是一段START+地址+数据

2)框架部分

只说数据结构无法将它们与我们之前学习的驱动总线设备模型联系起来,很突兀的感觉,这时候就需要研究研究。(具体函数实现需要看内核源码,有兴趣可自行去网上搜集,本例是来自rk3x的控制器源码)
(1)i2c_rk3x_probe
这个函数里填充了i2c_adapter的各种参数,完成对i2c控制器的注册
(2)of_i2c_register_devices
这里面遍历设备树节点,主要目标是把设备树信息读取出来,把总线上的设备,变成client从设备,它重要的是循环中一个函数of_i2c_register_device,它其实是下面两个函数的封装我们下面再讲。
(3)of_i2c_get_board_info
顾名思义就是获取设备树信息的,它获取的是reg和compatible信息
(4)i2c_new_device
根据adapter和上面获得的info俩参数,来创建client也就是从设备
其实到这里我们就已经比较明白了,这个就是我们驱动匹配的总线设备信息,我们写的i2cdriver就是匹配这些创建的client
至于后面iio,等更上层的封装,我们以后再细说

总结

总之呢,这就是Linux的魅力也是难点所在,一大堆结构体嵌套,函数从这个文件跳到另一个文件,内核极其庞大,想要全部通读内核是不现实的,我们要有框架性思维选择性的阅读内核代码,了解具体一个简单工作从上层到底层的工作流程,这样学习是真实有效的。