您的位置:首页 > 运维架构 > Linux

Linux的i2c驱动分析

2016-02-01 15:45 246 查看
本文针对的内核为友善提供的linux-3.0.31版本,从linux驱动模型的角度分析i2C驱动。

一、linux的i2c驱动介绍。
Linux下编写I2C设备驱动有两种方法,一种是利用系统给我们提供的i2c-dev.c来实现一个i2c适配器的设备文件。然后通过在应用层操作i2c适配器来控制i2c设备。另一种是利用I2C驱动体系结构为i2c设备,独立编写一个设备驱动。
1、利用i2c-dev.c操作适配器,进而控制i2c设备
i2c-dev.c并没有针对特定的设备而设计,只是提供了通用的read()、write()和ioctl()等接口,应用层可以借用这些接口访问挂接在适配器上的i2c设备的存储空间或寄存器,并控制I2C设备的工作方式。
2、利用I2C驱动体系结构,在内核里直接为i2c设备编写驱动
目前linux提供两种编写i2c设备驱动,分别为“Adapter方式(LEGACY)”和“Probe方式(new style)”,其核心数据结构为“structi2c_driver”即i2c设备驱动,核心函数为“i2c_add_driver”即添加i2c设备驱动。
● Probe方式(newstyle),如:

staticstruct i2c_driver pca953x_driver = {

.driver= {

.name= "pca953x",

},

.probe= pca953x_probe,

.remove= pca953x_remove,

.id_table= pca953x_id,

};
● Adapter方式(LEGACY),如:

staticstruct i2c_driver pcf8575_driver = {

.driver= {

.owner= THIS_MODULE,

.name= "pcf8575",

},

.attach_adapter= pcf8575_attach_adapter,

.detach_client= pcf8575_detach_client,

};



一、linux的i2c驱动实现流程

本文选择以mma7660三轴重力加速度传感器I2C驱动作为学习对象,来帮助学习i2c设备驱动的编写。其驱动实现流程如下图所示:



其中关键数据结构逻辑关系图如下所示:



三、i2c与sys文件系统
与i2c有关的sys文件系统有这么几个目录:
“/sys/class/i2c-adapter”:i2c-adapter”类是由“i2c-core.c”中的“i2c-init”函数创建,每个i2c适配器的注册都会在该目录下创建自己的目录,该目录仅提供用户观察i2c适配器的视角,没有读写操作意义。







“/sys/class/i2c-dev”:“i2c-dev”类是由2c-dev.c文件中“i2c_dev_init”函数创建,每个i2c适配器的注册都会在该目录下创建自己的目录,该目录不仅提供用户观察i2c适配器的视角,而且创建了具体i2c适配器设备,具备读写操作意义。







“/sys/bus/i2c”:i2c总线是由“i2c-core.c”中的“i2c-init”函数创建,向用户提供i2c总线视角。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: