首页 理论教育深入剖析Linux内核设备驱动

深入剖析Linux内核设备驱动

【摘要】:DM 3730的I2C控制器框架如图7-4所示。图7-4引自《DM 3730芯片手册》中第2798页的框图。关于DM 3730I2C的驱动部分,主要分析相关初始化和总线传输的操作。由于I2C作为控制和获取状态信息,数据量并不大,而且相关的操作频率并不高,这样在中断中进行相关的处理,对系统的影响并不大。

DM 3730的I2C控制器框架如图7-4所示。图7-4引自《DM 3730芯片手册》中第2798页的框图。

从图7-4可见,作为I2C控制器即可以做master也可以做slave,在Linux内核中主要是实现master的功能;FIFO用于进行数据缓冲,可以通过处理器读写,也可以通过DMA读写。

关于DM 3730I2C的驱动部分,主要分析相关初始化和总线传输的操作。

1.初始化

先来看看初始化部分,作为SoC片内的控制器,相应的驱动都是作为platform driver存在的,在系统初始化时会注册相应的platform device,而在platform driver的probe函数中则会根据platform device的信息进行初始化。这个初始化是十分重要的,现在就来详细了解其内容。

978-7-111-49426-3-Chapter07-35.jpg

图7-4 DM 3730 I2C控制器框图

978-7-111-49426-3-Chapter07-36.jpg

978-7-111-49426-3-Chapter07-37.jpg

978-7-111-49426-3-Chapter07-38.jpg

978-7-111-49426-3-Chapter07-39.jpg

probe中需要的platform device是在omap2_i2c_add_bus中进行初始化的,主要内容如下:

978-7-111-49426-3-Chapter07-40.jpg

978-7-111-49426-3-Chapter07-41.jpg

这里是与I2C控制器相关的初始化,总线设备的初始化是由DM 3730提供相应的接口,通过omap_register_i2c_bus来实现的,具体细节如下:

978-7-111-49426-3-Chapter07-42.jpg

关于I2C总线的频率,TI为其提供了启动参数设置的接口,可以在bootargs中加入命令i2c_bus=bus_id,clkrate(inkHz)来进行总线频率的设置,具体的总线频率设置是在omap_i2c_init中进行的。提供参数设置的好处是:一些硬件问题可以通过调整总线频率验证或者解决,有了参数设置接口,就可以避免代码的修改和编译等费时的工作。

2.总线传输

总线传输是由omap_i2c_algo描述的,细节如下:

978-7-111-49426-3-Chapter07-43.jpg(www.chuimin.cn)

978-7-111-49426-3-Chapter07-44.jpg

主要是传输接口omap_i2c_xfer,下面对传输过程进行详细分析:

978-7-111-49426-3-Chapter07-45.jpg

msg的传输是通过omap_i2c_xfer_msg来完成的,下面来看看具体实现过程:

978-7-111-49426-3-Chapter07-46.jpg

978-7-111-49426-3-Chapter07-47.jpg

978-7-111-49426-3-Chapter07-48.jpg

978-7-111-49426-3-Chapter07-49.jpg

这里主要是根据msg的属性进行控制器的基本设置,实际的数据操作在中断处理函数中执行。详细分析如下:

978-7-111-49426-3-Chapter07-50.jpg

978-7-111-49426-3-Chapter07-51.jpg

978-7-111-49426-3-Chapter07-52.jpg

978-7-111-49426-3-Chapter07-53.jpg

978-7-111-49426-3-Chapter07-54.jpg

从代码中可见,主要的数据操作都是在中断中进行处理的。由于I2C作为控制和获取状态信息,数据量并不大,而且相关的操作频率并不高,这样在中断中进行相关的处理,对系统的影响并不大。

在中断处理中涉及的FIFO阈值以及使能的中断都是在omap_i2c_init中进行操作的,相关代码如下:

978-7-111-49426-3-Chapter07-55.jpg

这样整个的传输从设置到实际操作就完整了。