linux i2c总线驱动

来源:互联网 发布:嵌入式linux面试题 编辑:程序博客网 时间:2024/05/01 17:11

技术就是这样,看一百遍不如做十遍。

在对i2c做了一个简单的记录之后发现比单看要理解更深刻,当然在记录完i2c驱动之后,最希望自己能够坚持自己实现AT24C02的读写驱动与测试应用程序。

1. linux i2c驱动框架


1.1 i2c模块结构理解

由于是做记录,少不了借用网络各种优秀资源,下图是某博客中找到的i2c框架。


图中结构画的非常清晰,由下至上我的理解是(欢迎批评指正):

1)Hardware层,CPU的i2c adapter作为主控设备可以挂载多个i2c设备,这是设备与CPU的物理理解,在我的平台上就是S3C6410与AT24C02

2)Kernel层,不好理解,暂时写下目前的理解

* Adapter specific code :特定的adapter驱动,在我这对应于i2c-s3c2410.c文件,实现了具体的数据传输接口以及向内核申请中断资源

* Algorithm :Adapter提供给i2c core的通信接口,static const struct i2c_algorithm s3c24xx_i2c_algorithm

* Adapter :对应特定的Adapter资源,对应我内核代码中的dev-i2c0.c,定义了struct platform_device s3c_device_i2c0

* i2c-core :承上启下的一层,与具体的平台或硬件无关,给adapter驱动提供适配器注册机制,给device提供驱动注册接口

* i2c-dev :实现了适配器的设备文件功能,为应用程序提供open/write/read/ioctl/close文件操作接口,操作的是挂接在该适配器上的设备

* driver :具体的i2c设备驱动,如我这里的AT24.c,是AT24C02的驱动,提供了对设备的读写操作接口

3)Usr Space,应用层程序,通过设备文件名以及底层驱动提供的读写驱动实现对设备的读写或其他控制

1.2 i2c驱动程序功能划分

一直喊总线,却不知总线为何物。粗糙的理解就是这根通信连接上可以挂接很多设备,形成一个有序的系统。
i2c总线驱动应该总体可以分为两部分,即总线驱动与设备驱动,也可以理解为i2c总线驱动的开发分为总线驱动开发与设备驱动开发两块。

1.2.1 总线驱动

我把总线驱动与适配器驱动理解为一种,不知是否正确。适配器驱动要初始化i2c适配器(申请IO地址、中断号等),并产生控制信号实现对总线设备的控制与访问;同时还要提供适配器对应的algorithm接口,实现底层的数据传输接口。

1.2.2 设备驱动

设备驱动主要实现设备挂接、离开适配器,设备读/写/控制等操作。