I2C的基本原理和linux中I2C架构的实现
2012-07-25 10:27
232 查看
1. I2C 协议
1.1 I2C总线工作原理
I2C总线是由数据线SDA和时钟SCL构成的串行总线,各种被控制器件均并联在这条总线上,每个器件都有一个唯一的地址识别,可以作为总线上的一个发送器件或***件(具体由器件的功能决定)
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响应信号。数据传输结束时,主器件产生停止条件
linux中I2C的源文件结构:
目录结构:
$ tree kernel_2.3.5/drivers/i2c/
kernel_2.3.5/drivers/i2c/
├── algos
│ ├── i2c-algo-bit.c
│ ├── i2c-algo-pca.c
│ ├── i2c-algo-pcf.c
│ ├── i2c-algo-pcf.h
│ ├── Kconfig
│ └── Makefile
├── busses
│ ├── i2c-acorn.c
│ ├── i2c-ali1535.c
│ ├── i2c-ali1563.c
│ ├── i2c-ali15x3.c
│ ├── i2c-amd756.c
│ ├── i2c-amd756-s4882.c
│ ├── i2c-amd8111.c
│ ├── i2c-at91.c
│ ├── i2c-au1550.c
│ ├── i2c-bfin-twi.c
│ ├── i2c-cpm.c
│ ├── i2c-davinci.c
│ ├── i2c-designware.c
│ ├── i2c-elektor.c
│ ├── i2c-gpio.c
│ ├── i2c-highlander.c
│ ├── i2c-hydra.c
│ ├── i2c-i801.c
│ ├── i2c-ibm_iic.c
│ ├── i2c-ibm_iic.h
│ ├── i2c-imx.c
│ ├── i2c-iop3xx.c
│ ├── i2c-iop3xx.h
│ ├── i2c-isch.c
│ ├── i2c-ixp2000.c
│ ├── i2c-mpc.c
│ ├── i2c-mv64xxx.c
│ ├── i2c-nforce2.c
│ ├── i2c-nforce2-s4985.c
│ ├── i2c-nomadik.c
│ ├── i2c-ocores.c
│ ├── i2c-octeon.c
│ ├── i2c-omap.c
│ ├── i2c-parport.c
│ ├── i2c-parport.h
│ ├── i2c-parport-light.c
│ ├── i2c-pasemi.c
│ ├── i2c-pca-isa.c
│ ├── i2c-pca-platform.c
│ ├── i2c-piix4.c
│ ├── i2c-pmcmsp.c
│ ├── i2c-pnx.c
│ ├── i2c-powermac.c
│ ├── i2c-pxa.c
│ ├── i2c-s3c2410.c
│ ├── i2c-s6000.c
│ ├── i2c-s6000.h
│ ├── i2c-sc8800.c
│ ├── i2c-sc8810.c
│ ├── i2c-scmi.c
│ ├── i2c-sh7760.c
│ ├── i2c-sh_mobile.c
│ ├── i2c-sibyte.c
│ ├── i2c-simtec.c
│ ├── i2c-sis5595.c
│ ├── i2c-sis630.c
│ ├── i2c-sis96x.c
│ ├── i2c-stu300.c
│ ├── i2c-stub.c
│ ├── i2c-taos-evm.c
│ ├── i2c-tiny-usb.c
│ ├── i2c-versatile.c
│ ├── i2c-via.c
│ ├── i2c-viapro.c
│ ├── i2c-xiic.c
│ ├── Kconfig
│ ├── Makefile
│ ├── scx200_acb.c
│ └── scx200_i2c.c
├── chips
│ ├── ds1682.c
│ ├── Kconfig
│ ├── Makefile
│ ├── mecs.c
│ ├── mecs.h
│ ├── mmc31xx.c
│ ├── mxc622x.c
│ ├── pca963x.c
│ └── tsl2550.c
├── i2c-boardinfo.c
├── i2c-core.c
├── i2c-core.h
├── i2c-dev.c
├── i2c-smbus.c
├── Kconfig
└── Makefile
3 directories, 91 files
i2c_core.c : I2C核心
其中维护了两个静态的List,分别记录系统中的I2C
driver结构和I2C adapter结构。提供了
i2c_master_send()
i2c_master_recv()
i2c_transfer()
等函数。
i2c-pxa.c : 实现了 i2c_adapter 和 i2c_algorithm (struct i2c_adapter和struct
i2c_algorithm)
总线驱动的职责,是为系统中每个I2C总线增加相应的读写方法。但是总线驱动本身并不会进行任何的通讯,它只是存在在那里,等待设备驱动调用其函数。
在系统开机时,首先装载的是I2C总线驱动。一个总线驱动用于支持一条特定的I2C总线的读写。一个总线驱动通常需要两个模块,一个struct
i2c_adapter和一个struct i2c_algorithm来描述。
i2c-dev.c : I2C设备驱动的实现
I2C的device是有两个模块来描述的,struct i2c_driver和struct
i2c_client。
i2c-dev.c中提供了一个通用的I2C设备的驱动程序,实现了字符类型设备的访问接口,对设备的具体访问是通过I2C adapter来实现的。构造一个对I2C core层接口的数据结构,通过接口函数向 I2C Core注册一个I2C设备驱动。同时构造一个对用户层接口的数据结构,并通过接口函数向内核注册为一个主设备号为89的字符类型设备。
该文件提供了用户层对I2C设备的访问,包括open,read,write,ioctl,release等常规文件操作,我们可以通过open函数打开 I2C的设备文件,通过ioctl函数设定要访问从设备的地址,然后就可以通过 read和write函数完成对I2C设备的读写操作。
注:通过I2C driver提供的通用方法可以访问任何一个I2C的设备,但是其中实现的read,write及ioctl等功能完全是基于一般设备的实现,所有的操作数据都是基于字节流,没有明确的格式和意义。为了更方便和有效地使用I2C设备,我们可以为一个具体的I2C设备开发特定的I2C设备驱动程序,在驱动中完成对特定的数据格式的解释以及实现一些专用的功能。
在chips目录下包含着各种device 的driver,完成各种从设备的注册。作为一般的I2C设备,使用i2c-dev.c里的操作足够完成操作了。
1.1 I2C总线工作原理
I2C总线是由数据线SDA和时钟SCL构成的串行总线,各种被控制器件均并联在这条总线上,每个器件都有一个唯一的地址识别,可以作为总线上的一个发送器件或***件(具体由器件的功能决定)
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响应信号。数据传输结束时,主器件产生停止条件
linux中I2C的源文件结构:
目录结构:
$ tree kernel_2.3.5/drivers/i2c/
kernel_2.3.5/drivers/i2c/
├── algos
│ ├── i2c-algo-bit.c
│ ├── i2c-algo-pca.c
│ ├── i2c-algo-pcf.c
│ ├── i2c-algo-pcf.h
│ ├── Kconfig
│ └── Makefile
├── busses
│ ├── i2c-acorn.c
│ ├── i2c-ali1535.c
│ ├── i2c-ali1563.c
│ ├── i2c-ali15x3.c
│ ├── i2c-amd756.c
│ ├── i2c-amd756-s4882.c
│ ├── i2c-amd8111.c
│ ├── i2c-at91.c
│ ├── i2c-au1550.c
│ ├── i2c-bfin-twi.c
│ ├── i2c-cpm.c
│ ├── i2c-davinci.c
│ ├── i2c-designware.c
│ ├── i2c-elektor.c
│ ├── i2c-gpio.c
│ ├── i2c-highlander.c
│ ├── i2c-hydra.c
│ ├── i2c-i801.c
│ ├── i2c-ibm_iic.c
│ ├── i2c-ibm_iic.h
│ ├── i2c-imx.c
│ ├── i2c-iop3xx.c
│ ├── i2c-iop3xx.h
│ ├── i2c-isch.c
│ ├── i2c-ixp2000.c
│ ├── i2c-mpc.c
│ ├── i2c-mv64xxx.c
│ ├── i2c-nforce2.c
│ ├── i2c-nforce2-s4985.c
│ ├── i2c-nomadik.c
│ ├── i2c-ocores.c
│ ├── i2c-octeon.c
│ ├── i2c-omap.c
│ ├── i2c-parport.c
│ ├── i2c-parport.h
│ ├── i2c-parport-light.c
│ ├── i2c-pasemi.c
│ ├── i2c-pca-isa.c
│ ├── i2c-pca-platform.c
│ ├── i2c-piix4.c
│ ├── i2c-pmcmsp.c
│ ├── i2c-pnx.c
│ ├── i2c-powermac.c
│ ├── i2c-pxa.c
│ ├── i2c-s3c2410.c
│ ├── i2c-s6000.c
│ ├── i2c-s6000.h
│ ├── i2c-sc8800.c
│ ├── i2c-sc8810.c
│ ├── i2c-scmi.c
│ ├── i2c-sh7760.c
│ ├── i2c-sh_mobile.c
│ ├── i2c-sibyte.c
│ ├── i2c-simtec.c
│ ├── i2c-sis5595.c
│ ├── i2c-sis630.c
│ ├── i2c-sis96x.c
│ ├── i2c-stu300.c
│ ├── i2c-stub.c
│ ├── i2c-taos-evm.c
│ ├── i2c-tiny-usb.c
│ ├── i2c-versatile.c
│ ├── i2c-via.c
│ ├── i2c-viapro.c
│ ├── i2c-xiic.c
│ ├── Kconfig
│ ├── Makefile
│ ├── scx200_acb.c
│ └── scx200_i2c.c
├── chips
│ ├── ds1682.c
│ ├── Kconfig
│ ├── Makefile
│ ├── mecs.c
│ ├── mecs.h
│ ├── mmc31xx.c
│ ├── mxc622x.c
│ ├── pca963x.c
│ └── tsl2550.c
├── i2c-boardinfo.c
├── i2c-core.c
├── i2c-core.h
├── i2c-dev.c
├── i2c-smbus.c
├── Kconfig
└── Makefile
3 directories, 91 files
i2c_core.c : I2C核心
其中维护了两个静态的List,分别记录系统中的I2C
driver结构和I2C adapter结构。提供了
i2c_master_send()
i2c_master_recv()
i2c_transfer()
等函数。
i2c-pxa.c : 实现了 i2c_adapter 和 i2c_algorithm (struct i2c_adapter和struct
i2c_algorithm)
总线驱动的职责,是为系统中每个I2C总线增加相应的读写方法。但是总线驱动本身并不会进行任何的通讯,它只是存在在那里,等待设备驱动调用其函数。
在系统开机时,首先装载的是I2C总线驱动。一个总线驱动用于支持一条特定的I2C总线的读写。一个总线驱动通常需要两个模块,一个struct
i2c_adapter和一个struct i2c_algorithm来描述。
i2c-dev.c : I2C设备驱动的实现
I2C的device是有两个模块来描述的,struct i2c_driver和struct
i2c_client。
i2c-dev.c中提供了一个通用的I2C设备的驱动程序,实现了字符类型设备的访问接口,对设备的具体访问是通过I2C adapter来实现的。构造一个对I2C core层接口的数据结构,通过接口函数向 I2C Core注册一个I2C设备驱动。同时构造一个对用户层接口的数据结构,并通过接口函数向内核注册为一个主设备号为89的字符类型设备。
static struct i2c_driver i2cdev_driver = { .driver = { .name = "dev_driver", }, .id = I2C_DRIVERID_I2CDEV, .attach_adapter = i2cdev_attach_adapter, .detach_adapter = i2cdev_detach_adapter, .detach_client = i2cdev_detach_client, }; struct i2c_dev { struct list_head list; struct i2c_adapter *adap; struct device *dev; }; |
static const struct file_operations i2cdev_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .read = i2cdev_read, .write = i2cdev_write, .ioctl = i2cdev_ioctl, .open = i2cdev_open, .release = i2cdev_release, }; |
在chips目录下包含着各种device 的driver,完成各种从设备的注册。作为一般的I2C设备,使用i2c-dev.c里的操作足够完成操作了。
相关文章推荐
- I2C的基本原理和linux中I2C架构的实现 .
- Linux下I2C设备驱动开发和实现
- Linux设备驱动之I2C架构分析
- linux之i2c子系统架构---总线驱动
- linux运维进阶-基于RHCS+iSCSI+CLVM实现Web服务的共享存储集群架构
- Linux的I2C驱动架构
- Linux虚拟化: 虚拟 Linux 虚拟化方法、架构和实现概述
- Linux I2C驱动分析(一)----I2C架构和总线驱动
- Linux的I2C驱动架构
- Linux I2C驱动分析(一)----I2C架构和总线驱动
- linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析
- Linux设备驱动之I2C架构分析
- linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析
- Linux设备驱动程序架构分析之I2C Spec摘要
- linux下I2C驱动架构全面分析
- Linux I2C驱动分析与实现--例子
- Linux下I2C设备驱动开发和实现
- linux I2C架构全面分析
- Linux下I2C设备驱动开发和实现
- Linux下I2C驱动架构全面分析