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总线视角。
一、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总线视角。
相关文章推荐
- Linux的spi驱动分析
- Linux的USB驱动分析
- Linux的input子系统分析
- Linux的IRQ中断子系统分析
- Linux学习笔记之<让进程在后台可靠运行的几种方法>
- linux screen 命令详解
- 优化系统资源ulimit《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
- linux常用命令的英文单词缩写
- java开发需要掌握的linux命令
- LINUX的一些常用操作
- 优化Linux内核参数/etc/sysctl.conf sysctl 《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
- Linux内核OOM机制的详细分析(转)
- linux-vi命令
- linux笔记
- Linux下安装MySql(多实例+主备)
- 快速检测Linux服务器性能
- liunx之echo和unset的用法(centos7)
- Linux安装中文man手冊
- linux usb boot
- 在centos上配置python3.4环境(哎,痛苦的一天啊!)