【驱动】linux下I2C驱动架构全面分析
2013-09-03 00:05
531 查看
I2C 概述
I2C是philips提出的外设总线.I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线。
因此,I2C总线被非常广泛地应用在EEPROM,实时钟,小型LCD等设备与CPU的接口中。
linux下的驱动思路
在linux系统下编写I2C驱动,目前主要有两种方法,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux下I2C驱动体系结构来完成。下面比较下这两种方法:第一种方法:
优点:思路比较直接,不需要花很多时间去了解linux中复杂的I2C子系统的操作方法。
缺点:
要求工程师不仅要对I2C设备的操作熟悉,而且要熟悉I2C的适配器(I2C控制器)操作。
要求工程师对I2C的设备器及I2C的设备操作方法都比较熟悉,最重要的是写出的程序可以移植性差。
对内核的资源无法直接使用,因为内核提供的所有I2C设备器以及设备驱动都是基于I2C子系统的格式。
第一种方法的优点就是第二种方法的缺点,
第一种方法的缺点就是第二种方法的优点。
I2C架构概述
Linux的I2C体系结构分为3个组成部分:I2C核心:I2C核心提供了I2C总线驱动和设备驱动的注册,注销方法,I2C通信方法(”algorithm”)上层的,与具体适配器无关的代码以及探测设备,检测设备地址的上层代码等。
I2C总线驱动:I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至可以直接集成在CPU内部。
I2C设备驱动:I2C设备驱动(也称为客户驱动)是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。
linux驱动中i2c驱动架构
//增加/删除i2c_adapter int i2c_add_adapter(struct i2c_adapter *adapter) int i2c_del_adapter(struct i2c_adapter *adap) //增加/删除i2c_driver int i2c_register_driver(struct module *owner, struct i2c_driver *driver) void i2c_del_driver(struct i2c_driver *driver) //i2c_client依附/脱离 int i2c_attach_client(struct i2c_client *client) //增加/删除i2c_driver int i2c_register_driver(struct module *owner, struct i2c_driver *driver) void i2c_del_driver(struct i2c_driver *driver) //i2c_client依附/脱离 int i2c_attach_client(struct i2c_client *client) int i2c_detach_client(struct i2c_client *client) //I2C传输,发送和接收 int i2c_master_send(struct i2c_client *client,const char *buf ,int count) int i2c_master_recv(struct i2c_client *client, char *buf ,int count) int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
View Code
I2c_transfer这个函数实现了core与adapter的联系。
代码调用层次图
[b] 有时候代码比任何文字描述都来得直接,但是过多的代码展示反而让人觉得枯燥。这个时候,需要一幅图来梳理一下上面的内容上面这些代码的展示是告诉我们:linux内核和芯片提供商为我们的的驱动程序提供了 i2c驱动的框架,以及框架底层与硬件相关的代码的实现。
剩下的就是针对挂载在i2c两线上的i2c设备了device,而编写的即具体设备驱动了,这里的设备就是硬件接口外挂载的设备,而非硬件接口本身(soc硬件接口本身的驱动可以理解为总线驱动)
编写驱动需要完成的工作
编写具体的I2C驱动时,工程师需要处理的主要工作如下:1).提供I2C适配器的硬件驱动,探测,初始化I2C适配器(如申请I2C的I/O地址和中断号),驱动CPU控制的I2C适配器从硬件上产生。
2).提供I2C控制的algorithm, 用具体适配器的xxx_xfer()函数填充i2c_algorithm的master_xfer指针,并把i2c_algorithm指针赋给i2c_adapter的algo指针。
3).实现I2C设备驱动中的i2c_driver接口,用具体yyy的yyy_probe(),yyy_remove(),yyy_suspend(),yyy_resume()函数指针和i2c_device_id设备ID表赋给i2c_driver的probe,remove,suspend,resume和id_table指针。
4).实现I2C设备所对应类型的具体驱动,i2c_driver只是实现设备与总线的挂接。
上面的工作中前两个属于I2C总线驱动,后面两个属于I2C设备驱动。
参考文章
http://blog.csdn.net/ghostyu http://blog.chinaunix.net/uid-25906157-id-3376728.html相关文章推荐
- linux下I2C驱动架构全面分析
- linux下I2C驱动架构全面分析
- linux下I2C驱动架构全面分析
- linux下I2C驱动架构全面分析
- Linux下I2C驱动架构全面分析
- linux下I2C驱动架构全面分析
- linux下I2C驱动架构全面分析
- linux下I2C驱动架构全面分析
- linux下I2C驱动架构全面分析
- linux下I2C驱动架构全面分析
- linux下I2C驱动架构全面分析
- Linux下I2C驱动架构全面分析
- Linux下I2C驱动架构全面分析
- 【驱动】linux下I2C驱动架构全面分析
- Linux 下I2C 驱动架构全面分析
- 【驱动】linux下I2C驱动架构全面分析
- linux下I2C驱动架构全面分析
- linux下I2C驱动架构全面分析
- linux下I2C驱动架构全面分析【转自http://www.cnblogs.com/lcw/p/3297889.html】
- linux下I2C驱动架构全面分析