一.系统理论
1. I2C驱动体系概述
Linux I2C驱动体系结构主要由3部分组成,即I2C核心、I2C总线驱动和I2C设备驱动。I2C核心是I2C总线驱动和I2C设备驱动的中间枢纽,它以通用的、与平台无关的接口实现了I2C中设备与适配器的沟通。I2C总线驱动填充i2c_adapter和i2c_algorithm结构体。I2C设备驱动填充i2c_driver和i2c_client结构体。
2. 驱动工程师需要做的事
2.1总线层:根据核心板的芯片手册,编写总线层驱动,例如根据S3C2440中文手册中I2C总线接口一章实现总线层驱动的编写。总线层主要向内核注册一个适配器,并填充适配器的支持类型和方法,内核加载时,会生成一个总线驱动模块。
2.2设备层:设备驱动层主要是针对不同的I2C硬件设备编写驱动程序并为用户提供接口,内核加载时,会生成一个设备驱动模块。I2C子系统下设备驱动的编写有两种模式:一种是用户模式设备驱动这种驱动依赖I2C子系统中的i2c-dev这个驱动,我们需要在应用程序去封装数据,这需要应用程序的开发人员具备相当的硬件基础,另外一种是普通的设备驱动。
二.内核代码
1. 内核/drivers/i2c目录下文件分析
(1) i2c-core.c
这个文件实现了I2C核心的功能以及/proc/bus/i2c*接口。
(2)i2c-dev.c
实现了I2C适配器设备文件的功能,每一个I2C适配器都被分配一个设备。通过适配器访问设备时的主设备号都为89,次设备号为0~255。应用程序通过 “i2c-%d” (i2c-0, i2c-1, ..., i2c-10, ...)文件名并使用文件操作接口open()、write()、read()、ioctl()和close()等来访问这个设备。i2c-dev.c并没有针对特定的设备而设计,只是提供了通用的read()、write()和ioctl()等接口,应用层可以借用这些接口访问挂接在适配器上的I2C设备的存储空间或寄存器并控制I2C设备的工作方式。
(3)chips文件夹
这个目录中包含了一些特定的I2C设备驱动,如Dallas公司的DS1337实时钟芯片、EPSON公司的RTC8564实时钟芯片和I2C接口的EEPROM驱动等。
(4)busses文件夹
这个文件中包含了一些I2C总线的驱动,如S3C2410的I2C控制器驱动为i2c-s3c2410.c
(5)algos文件夹
实现了一些I2C总线适配器的algorithm。
|