您的位置 首页 元件

根据嵌入式Linux下的I2C设备驱动的整体思路与结构规划

基于嵌入式Linux下的I2C设备驱动的总体思路与框架设计- 由于I2C总线的通用性,Linux作为一款优秀的嵌入式操作系统,也必须要对其要有很好的支持。在Linux内核源码中对I2C总线的驱动是基于总线设备驱动模型的,其驱动程序用到了特殊的几个数据结构,对I2C总线协议进行了更抽象更通用的定义,极大的增加了设备驱动的可移植性。要编写出自己的I2C 设备驱动程序,必须对这种内核I2C总线驱动的架构有深刻的理解。

0 导言

因为I2C总线的通用性,Linux作为一款优异的嵌入式操作体系,也有必要要对其要有很好的支撑。在Linux内核源码中对I2C总线的驱动是依据总线设备驱动模型的,其驱动程序用到了特别的几个数据结构,对I2C总线协议进行了更笼统更通用的界说,极大的添加了设备驱动的可移植性。要编写出自己的I2C 设备驱动程序,有必要对这种内核I2C总线驱动的架构有深入的了解。

1 I2C总线的硬件构成

I2C 总线协议只要两条总线线路,一条是串行数据线(SDA),一条是串行时钟线(SCL)。SDA 担任数据的传输,SCL 担任数据传输的时钟同步。I2C 设备经过这两条总线衔接到处理器的I2C总线操控器上,不同设备之间经过7 位地址来差异,并且数据的传输是双向的,方向的承认由1位二进制数承认,地址位加方向位是操作I2C 设备的专一标明,I2C 设备与CPU 的衔接如图1所示。

依据嵌入式Linux下的I2C设备驱动的整体思路与结构规划

I2C 总线上有3 品种型的信号,分别是:开端信号,完毕信号和应对信号。这些信号都是由SDA和SCL上的电平改变来表明的。

开端信号(S):当SCL为高电平时,SDA由高电平向低电平跳变,表明开端传输数据。

完毕信号(P):当SCL为高电平时,SDAY由低电平向高电平跳变,表明完毕传输数据。

相应信号(ACK):从机接纳到8位数据后,在第9个时钟周期,拉低SDA电平,表明现已接纳到数据。

当总线闲暇时,SDA 和SCL 都处于高电平,主机检测到总线闲暇就能够向从机发送数据。主机首要发送开端信号S,接着宣布8位数据(包含前7位的从机地址和1 为的方向位),然后等候从机发回承认信号ACK.

当第8位为0时,表明向从机传输数据,主机收到承认信号后就能够接连的向从机写入8 位数据;当第8 位为1时,表明向从读取数据,这时主机就能够接纳来自从机的一系列数据。最终当总个数据传输进程完结后,由主机发送完毕信号P,表明本次的数据传输完结。

2 Linux 的I2C设备驱动程序的层次结构

因为I2C设备的品种繁复,假如为每一款I2C设备都编写一个驱动程序,明显不太实践也不太可能做到。所以,Linux中是对I2C 设备驱动采取了层次化处理,分为总线层和设备层。将I2C设备驱动的一些一起特点笼统起来归结起来作为总线层,而将详细I2C设备特别操作作为设备层。在Linux中I2C设备驱动中用到的数据结构[4,7-8]的联系如图2 所示。关于这部分代码坐落Linux内核源码树的/driver/i2c中。

依据嵌入式Linux下的I2C设备驱动的整体思路与结构规划

了解这层次结构重点是要了解4个数据结构,分别是归于设备层的i2c_driver 与i2c_client,归于总线层的i2c_adapter与i2c_algorithm.下面分别对这四个数据结构做扼要的阐明。

struct i2c_driver:详细的每一个I2C设备都应该对应着的一个驱动,这个结构体里边界说了Linux设备模型中用于I2C 总线办理的一系列函数指针和I2C 设备的信息。其间最重要的两个成员是适配器检测函数指针at-tach_adapter,和设备ID表id_table.

struct i2c_client:一个衔接在SDA 和SCL 总线上的详细设备是由i2c_client结构体描绘的,界说了两个成员变量表明这个详细设备所对应的适配器和驱动。

struct i2c_adapter:此结构体表明CPU 里边详细的I2C操控器,本质上也是对应着一个物理设备,其间最要的成员变量是指向适配器驱动的程序的algo 结构体指针。

struct i2c_algorithm:里边界说了详细适配器驱动程序的函数指针。特别是master_xfer函数指针,这个函数完结了适配器最底层的操作办法,也是I2C设备驱动中总线层里边要编写的重要函数。

i2c_dev 里边界说了读写I2C 设备应用层的读写接口,但因为其短少通用性,一般很少用到所以并不做详细的介绍。

i2c_core在驱动结构中起到了承上启下的效果,里边界说了许多重要的函数。例如:adapter注册/刊出函数,添加/删去设备驱动函数,添加/删去I2C设备的函数,I2C传输,发送和接纳函数。这些函数都是在编写I2C设备驱动程序中有必要要用到的接口函数,正是因为这些通用的接口函数才使得代码具有很强的可移植性和重用性。

3 编写I2C设备驱动的思路

在了解Linux中I2C设备驱动的根本结构后,要编写自己的设备驱动首要要弄清楚的一个问题是究竟内核现已完结了那部分,需求完结的又是那部分。因为I2C设备驱动是依据总线设备驱动模型的,一般来说在移植Linux操作体系中,Linux内核现已对总线部分现已有了很好的完结,所以总线部分的驱动一般能够不用关怀。

在此需求完结的是设备层的i2c_driver与i2c_client结构体,并使用I2C 子体系供给的接口函数挂接到I2C 总线上。

每一个I2C设备驱动,有必要首要发明一个i2c_driver结构体目标,该结构体包含了I2C设备勘探和刊出的一些根本办法和信息。其间包含设备驱动的姓名,适配器的挂接/撤销函数指针等。一个比如如下所示,name字段标识本驱动的称号(不要超越31 个字符),at-tach_adapter和detach_client字段为函数指针,这两个函数在I2C设备注册的时分会主动调用,需求自己完结这两个函数。

依据嵌入式Linux下的I2C设备驱动的整体思路与结构规划

上面界说的i2c_driver目标,笼统为一个I2C的驱动模型,供给对I2C设备的勘探和刊出办法,接下来便是要界说i2c_client 结构体,其代表着一个详细的I2C 设备,该结构体有一个data指针,能够指向任何私有的设备数据,在复杂点的驱动中可能会用到。

每一个I2C设备芯片,都经过硬件衔接设定好了该设备的I2C设备地址。因而,I2C设备的勘探一般是靠设备地址来完结的。那么,首要要在驱动代码中声明你要勘探的I2C设备地址列表以及一个宏,示例如下:

依据嵌入式Linux下的I2C设备驱动的整体思路与结构规划

有了i2c_client结构体代表了详细的设备和设备ID后就能够完结attach_adapter 和detach_client 函数。这两个函数是体系主动调用的,它的完结是有必定的结构的,能够在linux内核源码的驱动比如中找到,因为代码过长这儿不做详细的剖析。针对不同的设备函数的完结会略有不同,一般attach_adapte需求完结的作业是对i2c_client结构体成员赋值和调用接口函i2c_attach_cli-ent把设备挂接到适配其间。而detach_client 函数则是完结相反的作业。

最终的一步是编写模块的初始化与退出函数把驱动加进I2C驱动子体系中,示例能够是:

依据嵌入式Linux下的I2C设备驱动的整体思路与结构规划

至此,I2C设备的驱动现已完结了,可是到了这一步本驱动并没有实践的用途,它只是供给的是一个设备驱动程序的办理结构,所以有必要还要进行两方面的弥补。

榜首方面是,使用I2C总线读写外部芯片的操控/状况寄存器;第二方面是,向应用层供给I2C设备的读写接口,令应用程序能够对设备节点的读写完结对I2C详细物理设备的读写。为了完结I2C 设备寄存器的读写操作,有必要要用到Linux的I2C子体系供给的读写接口函数:

依据嵌入式Linux下的I2C设备驱动的整体思路与结构规划

使用这两个函数依据芯片的读写时序进行封装,就能够读写芯片内部的寄存器,以写芯片寄存器为例,有必要写往总线上写寄存器的地址,然后写入要往寄存器里写入的数据,示例代码如下所示。读寄存器的时序则是则是先写入要读寄存器的地址,然后承受总线上的数据,差异不大,不做示例。

依据嵌入式Linux下的I2C设备驱动的整体思路与结构规划

要想向应用层供给读写接口,则有必要再对I2C设备驱动进行一次简略字符设备驱动的封装,将I2C设备作为一个简略字符设备,顺次完结字符设备文件操作函数结构体file_operation 里边的函数指针所对应的接口函数,这儿只给出了大体的结构,详细的完结关于不同的芯片有很大的不同。

界说一个字符设备结构体cdev,将I2C 设备作为一个一般的字符设备处理。

依据嵌入式Linux下的I2C设备驱动的整体思路与结构规划

界说一个文件操作函数结构体,填写里边函数指针,指出设备操作所对应的详细函数,一般的比如是:

依据嵌入式Linux下的I2C设备驱动的整体思路与结构规划

接着便是编写file_operaTIons所对应的详细函数。

最终一步是在模块的初始化和退出函数中添加对简略字符设备的注册和刊出操作,包含设备号申请与刊出,设备注册与刊出两方面。

至此,将编译好的模块加载进内核后就能够在用户空间使用文件体系的API对设备文件进行各种操作。

4 结语

I2C总线在电子体系规划中是非常遍及的一种接口技能,而Linux又是非常盛行的嵌入式操作体系。编写嵌入式Linux下I2C总线设备的驱动驱动程序是嵌入式开发中非常重要的一项技能,不容忽视。本文首要叙述了Linux体系I2C设备驱动程序的整体结构,然后给出了编写I2C设备驱动的整体思路与结构,期望给读者理清思路,加深对编写I2C设备驱动的了解。总而言之,使用I2C总线通讯能够到达很高的速率,并且总线上能够挂接多个节点,每个节点都由专一的地址承认。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/100605.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部