当前位置: 首页> 科技> 数码 > 优秀个人主页_华辉矿建实业有限公司最新招聘_百度竞价是什么意思?_网站优化推广费用

优秀个人主页_华辉矿建实业有限公司最新招聘_百度竞价是什么意思?_网站优化推广费用

时间:2025/7/10 4:32:10来源:https://blog.csdn.net/weixin_42717961/article/details/144328216 浏览次数:2次
优秀个人主页_华辉矿建实业有限公司最新招聘_百度竞价是什么意思?_网站优化推广费用

目录

技术名词解释

整体架构流程

I2C控制器分析

I2C设备端分析

Linux内核自带的i2c-dev.c

总结


技术名词解释

I2C驱动在代码里分为i2c_adapter和i2c_client,即可以理解为I2C Master 和I2C Slave,也可以理解为I2C控制器和I2C设备。

后续以I2C控制器和I2C设备作为理解。

整体架构流程

I2C驱动分成两部分:I2C控制器,I2C设备。

先看设备树节点:

&i2c1 {
    clock_frequency = <100000>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2c2>;
    status = "okay";

    codec: wm8960@1a {
        compatible = "wlf,wm8960";
        reg = <0x1a>;
        clocks = <&clks IMX6UL_CLK_SAI2>;
        clock-names = "mclk";
        wlf,shared-lrclk;
   };
};

i2c1是I2C控制器节点,而子节点codec: wm8960@1a则是I2C设备节点。从设备树的子父节点大概猜想i2c_adapter与i2c_client应该是有一层隐射关系,在代码里i2c_client中就有i2c_adapter指针,这样以后就可以通过i2c_adapter指针去进行数据传输。

I2C控制器分析

I2C控制器用的是platform总线驱动用于设备树节点与I2C控制器驱动代码进行匹配。

在下图中platform device自然是从设备树中获取,platform driver我们用module_platform_driver或者platform_driver_register来注册。并通过设备树中的compatible属性匹配。最后进入到probe函数中做下一步处理

这里以i2c-imx.c(实现的是I2C控制器的驱动代码)代码分析:

当设备树匹配以后,调用i2c_imx_probe,在初始化硬件信息以后,调用函数如下:

i2c_add_numbered_adapter--->i2c_add_adapter----->i2c_register_adapter------>of_i2c_register_devices。

用一句话概括就是做了三件事:

1.创建i2c_adapter(对应着I2C控制器),这个结构体里的i2c_algorithm里的传输函数master_xfer有传输数据的实现。

2.解析出I2C控制器节点下的所有设备节点,创建i2c_client与每一个设备节点对应。

3.映射i2c_adapter与i2c_client关系,并初始化硬件信息,实现传输数据。

(这块的处理做法跟SPI很相似)

但是最重要的一点就是这块的驱动厂家写好以后,你几乎不需要去做改动。

I2C设备端分析

I2C设备使用的是I2C总线驱动,类似与platform总线。驱动代码使用i2c_add_driver注册i2c_driver,而i2c_client则在I2C控制器驱动代码里解析并与i2c_adapter形成映射关系,所以,当i2c_driver里的acpi_match_table与I2C设备节点的compatible相同,则会调用i2c_driver的.probe。如下图所示:

通过在Linux内核4.9.88里的at24.c、wm8960.c等这类声卡或者EEPROM存储类驱动代码来看,类似这些I2C设备端驱动代码并不像字符设备那样,创建类似/dev/i2cx.x设备文件。(那么是通过linux内核的什么机制去访问这些设备呢?需要等后续再分析了)。

那么如果是访问一些简单的I2C设备驱动,我们应该怎么做呢?目前我了解的有两种:

1.通过在后面介绍的i2c-dev.c代码在/dev目录下创建I2C控制器设备节点/dev/i2cx.x,然后在应用层通过open/read/write/ioctl通过I2C控制器去访问I2C设备。

2.自己通过module_i2c_driver或者i2c_add_driver创建i2c_driver,然后在.probe里下硬件初始化,以及实现file_operations结构体的open/read/write/ioctl,最后在应用层open/read/write/ioctl操作。

Linux内核自带的i2c-dev.c

i2c-dev.c的代码很好分析,是一个常见的字符设备驱动模型,i2c_dev_init里的i2cdev_attach_adapter会在/dev下创建设备树中的I2C控制器节点,这样应用程序就通过open/read/write/ioctl自己去看芯片手册实现I2C的访问。而应用程序应该怎么去写,可以参考做好了的程序I2C-Tools。

总结

个人认为:

通过I2C控制器与设备端的分析,可以认为I2C控制器的驱动模型会创建i2c_client,I2C设备的驱动模型通过设备树获取到i2c_client,那么两个模型之间就通过i2c_client建立起纽带。

I2C控制器的驱动代码其实厂家都已经实现好了,只要根据实际的硬件接口在设备树中对相应的I2C的节点添加status = "okay"即可。

只有少部分的I2C设备端才需要去自己实现驱动或者使用i2c-dev.c去访问。

关键字:优秀个人主页_华辉矿建实业有限公司最新招聘_百度竞价是什么意思?_网站优化推广费用

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: