Linux下I2C设备驱动开发和实现
发布时间:2008/8/20 0:00:00 访问次数:662
i2c总线具有结构简单使用方便的特点。本文描述了linux下i2c驱动的结构,并在此基础上给出了i2c设备驱动和应用的实现。
1 引言
i2c (inter-integrated circuit)总线是一种由philips公司开发的两线式串行总线,用于连接微控制器及其外围设备。i2c总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此i2c总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。i2c总线最初为音频和视频设备开发,现已应用于各种服务与管理场合,来实现配置或掌握组件的功能状态,如电源、系统风扇、系统温度等参数,增加了系统的安全性,方便了管理。
2 i2c总线概述
i2c总线是由数据线sda和时钟scl构成的串行总线,可发送和接收数据,每个器件都有一个惟一的地址识别。i2c 规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(scl)控制总线的传输方向,并产生起始和停止条件。sda线上的数据状态仅在scl为低电平的期间才能改变,scl为高电平的期间,sda状态的改变被用来表示起始和停止条件。
i2c总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
开始信号:scl为高电平时,sda由高电平向低电平跳变,开始传送数据。
结束信号:scl为低电平时,sda由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的ic在接收到8bit数据后,向发送数据的ic发出特定的低电平脉冲,表示已收到数据。cpu向受控单元发出一个信号后,等待受控单元发出一个应答信号,cpu接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
linux中i2c总线的驱动分为两个部分,总线驱动(bus)和设备驱动(device)。其中总线驱动的职责,是为系统中每个i2c总线增加相应的读写方法。但是总线驱动本身并不会进行任何的通讯,它只是存在那里,等待设备驱动调用其函数,参见图。
设备驱动则是与挂在i2c总线上的具体的设备通讯的驱动。通过i2c总线驱动提供的函数,设备驱动可以忽略不同总线控制器的差异,不考虑其实现细节地与硬件设备通讯。
linux内核i2c总线驱动程序构架
在我们的linux驱动的i2c文件夹下有algos,busses,chips三个文件夹,另外还有i2c-core.c和i2c-dev.c两个文件。其中i2c-core.c文件实现了i2c core框架,是linux内核用来维护和管理的i2c的核心部分,其中维护了两个静态的list,分别记录系统中的i2c driver结构和i2c adapter结构。i2c core提供接口函数,允许一个i2c adatper,i2c driver和i2c client初始化时在i2c core中进行注册,以及退出时进行注销。同时还提供了i2c总线读写访问的一般接口,主要应用在i2c设备驱动中。
busses文件夹下的i2c-mpc.c文件实现了powerpc下i2c总线适配器驱动,定义描述了具体的i2c总线适配器的i2c_adapter数据结构,实现比较底层的对i2c总线访问的具体方法。i2c adapter 构造一个对i2c core层接口的数据结构,并通过接口函数向i2c core注册一个控制器。i2c adapter主要实现对i2c总线访问的算法,iic_xfer() 函数就是i2c adapter底层对i2c总线读写方法的实现。同时i2c adpter 中还实现了对i2c控制器中断的处理函数。
i2c-dev.c文件中实现了i2c driver,提供了一个通用的i2c设备的驱动程序,实现了字符类型设备的访问接口,实现了对用户应用层的接口,提供用户程序访问i2c设备的接口,包括实现open,release,read,write以及最重要的ioctl等标准文件操作的接口函数。我们可以通过open函数打开 i2c的设备文件,通过ioctl函数设定要访问从设备的地址,然后就可以通过 read和write函数完成对i2c设备的读写操作。
通过i2c driver提供的通用方法可以访问任何一个i2c的设备,但是其中实现的read,write及ioctl等功能完全是基于一般设备的实现,所有的操作数据都是基于字节流,没有明确的格式和意义。为了更方便和有效地使用i2c设备,我们可以为一个具体的i2c设备开发特定的i2c设备驱动程序,在驱动中完成对特定的数据格式的解释以及实现一些专用的功能。
4 linux下i2c具体驱动开发
tmp75是ti公司推出的基于i2c总线的数字温度传感器,具有低的功耗,高数字分辨率,广泛应用于电源温度监控,计算机外设保护,笔记本和蜂窝电话中。针对该设备开发驱动程序,由于linux系统下已经实现了i2c core框架,i2c总线适配
i2c总线具有结构简单使用方便的特点。本文描述了linux下i2c驱动的结构,并在此基础上给出了i2c设备驱动和应用的实现。
1 引言
i2c (inter-integrated circuit)总线是一种由philips公司开发的两线式串行总线,用于连接微控制器及其外围设备。i2c总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此i2c总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。i2c总线最初为音频和视频设备开发,现已应用于各种服务与管理场合,来实现配置或掌握组件的功能状态,如电源、系统风扇、系统温度等参数,增加了系统的安全性,方便了管理。
2 i2c总线概述
i2c总线是由数据线sda和时钟scl构成的串行总线,可发送和接收数据,每个器件都有一个惟一的地址识别。i2c 规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(scl)控制总线的传输方向,并产生起始和停止条件。sda线上的数据状态仅在scl为低电平的期间才能改变,scl为高电平的期间,sda状态的改变被用来表示起始和停止条件。
i2c总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
开始信号:scl为高电平时,sda由高电平向低电平跳变,开始传送数据。
结束信号:scl为低电平时,sda由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的ic在接收到8bit数据后,向发送数据的ic发出特定的低电平脉冲,表示已收到数据。cpu向受控单元发出一个信号后,等待受控单元发出一个应答信号,cpu接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
linux中i2c总线的驱动分为两个部分,总线驱动(bus)和设备驱动(device)。其中总线驱动的职责,是为系统中每个i2c总线增加相应的读写方法。但是总线驱动本身并不会进行任何的通讯,它只是存在那里,等待设备驱动调用其函数,参见图。
设备驱动则是与挂在i2c总线上的具体的设备通讯的驱动。通过i2c总线驱动提供的函数,设备驱动可以忽略不同总线控制器的差异,不考虑其实现细节地与硬件设备通讯。
linux内核i2c总线驱动程序构架
在我们的linux驱动的i2c文件夹下有algos,busses,chips三个文件夹,另外还有i2c-core.c和i2c-dev.c两个文件。其中i2c-core.c文件实现了i2c core框架,是linux内核用来维护和管理的i2c的核心部分,其中维护了两个静态的list,分别记录系统中的i2c driver结构和i2c adapter结构。i2c core提供接口函数,允许一个i2c adatper,i2c driver和i2c client初始化时在i2c core中进行注册,以及退出时进行注销。同时还提供了i2c总线读写访问的一般接口,主要应用在i2c设备驱动中。
busses文件夹下的i2c-mpc.c文件实现了powerpc下i2c总线适配器驱动,定义描述了具体的i2c总线适配器的i2c_adapter数据结构,实现比较底层的对i2c总线访问的具体方法。i2c adapter 构造一个对i2c core层接口的数据结构,并通过接口函数向i2c core注册一个控制器。i2c adapter主要实现对i2c总线访问的算法,iic_xfer() 函数就是i2c adapter底层对i2c总线读写方法的实现。同时i2c adpter 中还实现了对i2c控制器中断的处理函数。
i2c-dev.c文件中实现了i2c driver,提供了一个通用的i2c设备的驱动程序,实现了字符类型设备的访问接口,实现了对用户应用层的接口,提供用户程序访问i2c设备的接口,包括实现open,release,read,write以及最重要的ioctl等标准文件操作的接口函数。我们可以通过open函数打开 i2c的设备文件,通过ioctl函数设定要访问从设备的地址,然后就可以通过 read和write函数完成对i2c设备的读写操作。
通过i2c driver提供的通用方法可以访问任何一个i2c的设备,但是其中实现的read,write及ioctl等功能完全是基于一般设备的实现,所有的操作数据都是基于字节流,没有明确的格式和意义。为了更方便和有效地使用i2c设备,我们可以为一个具体的i2c设备开发特定的i2c设备驱动程序,在驱动中完成对特定的数据格式的解释以及实现一些专用的功能。
4 linux下i2c具体驱动开发
tmp75是ti公司推出的基于i2c总线的数字温度传感器,具有低的功耗,高数字分辨率,广泛应用于电源温度监控,计算机外设保护,笔记本和蜂窝电话中。针对该设备开发驱动程序,由于linux系统下已经实现了i2c core框架,i2c总线适配