嵌入式Linux系统下I2C设备驱动程序的开发
发布时间:2008/5/27 0:00:00 访问次数:1251
i2c (inter-integrated circuit)总线是一种由philips公司开发的两线式串行总线,用于连接微控制器及其外围设备。i2c总线最主要的优点就是简单性和有效性。
1.1 i2c总线工作原理
i2c总线是由数据线sda和时钟scl构成的串行总线,各种被控制器件均并联在这条总线上,每个器件都有一个唯一的地址识别,可以作为总线上的一个发送器件或接收器件(具体由器件的功能决定) [1]。i2c总线的接口电路结构如图1所示。
图1 i2c总线接口电路
1.2 i2c总线的几种信号状态
1. 空闲状态:sda和scl都为高电平。
2. 开始条件(s):scl为高电平时,sda由高电平向低电平跳变,开始传送数据。
3. 结束条件(p):scl为低电平时,sda由低电平向高电平跳变,结束传送数据。
4. 数据有效:在scl的高电平期间, sda保持稳定,数据有效。sda的改变只能发生在scl的底电平期间。
5. ack信号: 数据传输的过程中,接收器件每接收一个字节数据要产生一个ack信号,向发送器件发出特定的低电平脉冲,表示已经收到数据。
1.3 i2c总线基本操作
i2c总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(scl),同时控制总线的传输方向,并产生开始和停止条件。
数据传输中,首先主器件产生开始条件,随后是器件的控制字节(前七位是从器件的地址,最后一位为读写位 )。接下来是读写操作的数据,以及 ack响应信号。数据传输结束时,主器件产生停止条件[1]。具体的过程如图2所示。
图2 完整的i2c数据传输过程
2 linux下i2c驱动程序的分析
2.1 linux系统i2c驱动的层次结构
linux系统对i2c设备具有很好的支持,linux系统下的i2c驱动程序从逻辑上可以分为3个部分:
1. i2c总线的驱动 i2c core :实现对i2c总线、i2c adapter及i2c driver的管理。
2. i2c控制器的驱动 i2c adapter :针对不同类型的i2c控制器 ,实现对i2c总线访问的具体方法。
3. i2c设备的驱动 i2c driver :针对特定的i2c设备,实现具体的功能,包括read, write以及ioctl等对用户层操作的接口。
这三个部分的层次关系如图3和图4所示。
2.2 i2c 总线驱动 i2c core
i2c core是linux内核用来维护和管理的i2c的核心部分,其中维护了两个静态的list,分别记录系统中的i2c driver结构和i2c adapter结构。i2c core提供接口函数,允许一个i2c adatper,i2c driver和i2c client初始化时在i2c core中进行注册,以及退出时进行注销。同时还提供了i2c总线读写访问的一般接口(具体的实现在与i2c控制器相关的i2c adapter中实现),主要应用在i2c设备驱动中。
2.3 i2c控制器的驱动 i2c adapter
i2c adapter是针对不同类型i2c控制器硬件,实现比较底层的对i2c总线访问的具体方法。i2c adapter 构造一个对i2c core层接口的数据结构,并通过接口函数向i2c core注册一个控制器。
i2c adapter主要实现对i2c总线访问的算法,iic_xfer() 函数就是i2c adapter底层对i2c总线读写方法的实现。同时i2c adpter 中还实现了对i2c控制器中断的处理函数。
2.4 i2c设备的驱动 i2c driver
i2c driver中提供了一个通用的i2c设备的驱动程序,实现了字符类型设备的访问接口,对设备的具体访问是通过i2c adapter来实现的。i2c driver构造一个对i2c core层接口的数据结构,通过接口函数向 i2c core注册一个i2c设备驱动。同时i2c driver 构造一个对用户层接口的数据结构,并通过接口函数向内核注册为一个主设备号为89的字符类型设备。
i2c driver实现用户层对i2c设备的访问,包括open,read,write,ioctl,release等常规文件操作,我们可以通过open函数打开 i2c的设备文件,通过ioctl函数设定要访问从设备的地址,然后就可以通过 read和write函数完成对i2c设备的读写操作。
通过i2c driver提供的通用方法可以访问任何一个i2c的设备,但是其中实现的read,write及ioctl等功能完全是基于一般设备的实现,所有的操作数据都是基于字节流,没有明确的格式和意义。为了更方便和有效地使用i2c设备,我们可以为一个具体的i2c设备开发特定的i2c设备驱动程序,在驱动中完成对特定的数据格式的解释以及实现一些专用的功能。
3 一个具体的i2c设备驱动程序的开发
ds1307是一款小巧的i2c接口的实时时钟芯片,具有低功耗,全bcd码时钟和日历输出, 12 /24小时工作模式,时分秒、星期、年月日计时
i2c (inter-integrated circuit)总线是一种由philips公司开发的两线式串行总线,用于连接微控制器及其外围设备。i2c总线最主要的优点就是简单性和有效性。
1.1 i2c总线工作原理
i2c总线是由数据线sda和时钟scl构成的串行总线,各种被控制器件均并联在这条总线上,每个器件都有一个唯一的地址识别,可以作为总线上的一个发送器件或接收器件(具体由器件的功能决定) [1]。i2c总线的接口电路结构如图1所示。
图1 i2c总线接口电路
1.2 i2c总线的几种信号状态
1. 空闲状态:sda和scl都为高电平。
2. 开始条件(s):scl为高电平时,sda由高电平向低电平跳变,开始传送数据。
3. 结束条件(p):scl为低电平时,sda由低电平向高电平跳变,结束传送数据。
4. 数据有效:在scl的高电平期间, sda保持稳定,数据有效。sda的改变只能发生在scl的底电平期间。
5. ack信号: 数据传输的过程中,接收器件每接收一个字节数据要产生一个ack信号,向发送器件发出特定的低电平脉冲,表示已经收到数据。
1.3 i2c总线基本操作
i2c总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(scl),同时控制总线的传输方向,并产生开始和停止条件。
数据传输中,首先主器件产生开始条件,随后是器件的控制字节(前七位是从器件的地址,最后一位为读写位 )。接下来是读写操作的数据,以及 ack响应信号。数据传输结束时,主器件产生停止条件[1]。具体的过程如图2所示。
图2 完整的i2c数据传输过程
2 linux下i2c驱动程序的分析
2.1 linux系统i2c驱动的层次结构
linux系统对i2c设备具有很好的支持,linux系统下的i2c驱动程序从逻辑上可以分为3个部分:
1. i2c总线的驱动 i2c core :实现对i2c总线、i2c adapter及i2c driver的管理。
2. i2c控制器的驱动 i2c adapter :针对不同类型的i2c控制器 ,实现对i2c总线访问的具体方法。
3. i2c设备的驱动 i2c driver :针对特定的i2c设备,实现具体的功能,包括read, write以及ioctl等对用户层操作的接口。
这三个部分的层次关系如图3和图4所示。
2.2 i2c 总线驱动 i2c core
i2c core是linux内核用来维护和管理的i2c的核心部分,其中维护了两个静态的list,分别记录系统中的i2c driver结构和i2c adapter结构。i2c core提供接口函数,允许一个i2c adatper,i2c driver和i2c client初始化时在i2c core中进行注册,以及退出时进行注销。同时还提供了i2c总线读写访问的一般接口(具体的实现在与i2c控制器相关的i2c adapter中实现),主要应用在i2c设备驱动中。
2.3 i2c控制器的驱动 i2c adapter
i2c adapter是针对不同类型i2c控制器硬件,实现比较底层的对i2c总线访问的具体方法。i2c adapter 构造一个对i2c core层接口的数据结构,并通过接口函数向i2c core注册一个控制器。
i2c adapter主要实现对i2c总线访问的算法,iic_xfer() 函数就是i2c adapter底层对i2c总线读写方法的实现。同时i2c adpter 中还实现了对i2c控制器中断的处理函数。
2.4 i2c设备的驱动 i2c driver
i2c driver中提供了一个通用的i2c设备的驱动程序,实现了字符类型设备的访问接口,对设备的具体访问是通过i2c adapter来实现的。i2c driver构造一个对i2c core层接口的数据结构,通过接口函数向 i2c core注册一个i2c设备驱动。同时i2c driver 构造一个对用户层接口的数据结构,并通过接口函数向内核注册为一个主设备号为89的字符类型设备。
i2c driver实现用户层对i2c设备的访问,包括open,read,write,ioctl,release等常规文件操作,我们可以通过open函数打开 i2c的设备文件,通过ioctl函数设定要访问从设备的地址,然后就可以通过 read和write函数完成对i2c设备的读写操作。
通过i2c driver提供的通用方法可以访问任何一个i2c的设备,但是其中实现的read,write及ioctl等功能完全是基于一般设备的实现,所有的操作数据都是基于字节流,没有明确的格式和意义。为了更方便和有效地使用i2c设备,我们可以为一个具体的i2c设备开发特定的i2c设备驱动程序,在驱动中完成对特定的数据格式的解释以及实现一些专用的功能。
3 一个具体的i2c设备驱动程序的开发
ds1307是一款小巧的i2c接口的实时时钟芯片,具有低功耗,全bcd码时钟和日历输出, 12 /24小时工作模式,时分秒、星期、年月日计时