Linux的i2c驱动分析

来源:互联网 发布:数据库中的事务是什么 编辑:程序博客网 时间:2024/05/16 06:05

本文针对的内核为友善提供的linux-3.0.31版本,从linux驱动模型的角度分析i2C驱动。 

一、linuxi2c驱动介绍。

 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,
                };


一、linuxi2c驱动实现流程

 

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


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


三、i2c与sys文件系统

  与i2c有关的sys文件系统有这么几个目录:

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

 

Linux的i2c驱动分析

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

 

Linux的i2c驱动分析

 /sys/bus/i2c”:i2c总线是由“i2c-core.c”中的“i2c-init”函数创建,向用户提供i2c总线视角。


0 0