目录前言内核框架1)重要的数据结构2)框架部分总结前言我们都知道Linux作为应用最为广泛的操作系统之一它源码开放可修改开放性高丰富的硬件生态适配性和可移植性强等等有点。关于硬件的可移植性离不开Linux中丰富的子系统框架但是为啥相同的内核代码可以适配不同的硬件呢今天我们就以i2c子系统为例来唠唠这个事儿。内核框架1)重要的数据结构i2c子系统框架可以分为三层核心层i2c-core控制器层adapteralgorithm还有驱动层driverclient其中核心层是统一抽象层为特异性硬件提供统一的接口和统一管理控制器层则是直接控制硬件i2c控制器的层次它根据芯片上的i2c控制器的各种差异而不同驱动则是需要驱动工程师编写适配一定i2c从设备的业务代码。它们各有一个结构体来描述(1)i2c_adapter它就是总线控制器一个i2c控制器例如一个芯片的i2c1i2c2就是由两个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的魅力也是难点所在一大堆结构体嵌套函数从这个文件跳到另一个文件内核极其庞大想要全部通读内核是不现实的我们要有框架性思维选择性的阅读内核代码了解具体一个简单工作从上层到底层的工作流程这样学习是真实有效的。
阅读完成 · 觉得有帮助?