TI-I2C驱动

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

TI-I2C驱动

一、与I2C驱动相关的文件分成两部分:

1)应用层接口部分:

程序在svn中的路径如下:

在https://dareglob-971006/svn/eocOS/branches/eocOS_v4/branches/bsp/user/i2c目录下,i2ctest.c文件,提供了lm75a_temp_read()方法,用来读取LM75A设备温度寄存器中的温度信息的功能。

2)内核驱动部分:

内核位于svn中的路径如下:

https://dareglob-971006/svn/eocOS/branches/eocOS_v4/branches/bsp/kernel

(1)总线驱动:

i2c-davinci.c:在内核目录中driver/i2c/busses目录下,适用于TI的I2C总线驱动程序。I2C总线驱动是对I2C硬件体系结构中适配器端的实现。

(2)I2C驱动代码核心:

i2c-core.c:在内核目录中driver/i2c/目录下,是I2C代码的核心,用于沟通虚拟文件系统与底层实现。该文件提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。

(3)I2C设备驱动:

lm75.c:在内核目录中driver/hwmon目录下,是针对LM75A以及其他能兼容的温度传感器的设备驱动。I2C设备驱动是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。二、I2C简要工作流程

1)在总线驱动初始化时候,当通过Linux内核源代码/driver/base/platform.c文件中定义platform_driver_register()函数注册platform_driver结构体时,其中probe指针指向的davinci_i2c_probe()函数将被调用,以初始化适配器硬件。

2)而davinci_i2c_remove()函数则完成与davinci_i2c_probe()相反的功能。用于内存和中断等系统资源的释放和注销。

3)总线驱动i2c-davinci.c中,定义了i2c_davinci_xfer函数。该函数是I2C总线通信传输函数。并且I2C适配器对应的i2c_algorithm结构体实例为i2c_davinci_algo,其中的master_xfer函数指针指向i2c_davinci_xfer函数。

4)当设备被打开,并且用户开始读操作时,会调用设备驱动lm75.c中show_temp()函数,该函数会调用i2c-core.c中的i2c_smbus_xfer()函数,i2c_smbus_xfer()函数会检查适配器对应的i2c_algorithm结构体中是否注册了smbus_xfer函数(目前i2c_davinci_algo中未注册smbus_xfer函数),程序会调用i2c_smbus_xfer_emulated()函数,最终,还是会调用标准的I2C总线通信函数master_xfer(),由于master_xfer 已经指向i2c_davinci_xfer函数,所以会调用总线驱动i2c-davinci.c中的i2c_davinci_xfer函数来读取信息。

三、接口函数

1)应用层接口:

Int lm75a_temp_read(float *temp) 读取lm75a 温度

2)内核中:lm75.c文件

static ssize_t show_temp(struct device *dev, struct device_attribute *da,char *buf)

当应用层开始读操作时,内核中会调用show_temp()函数,该函数最终会调用master_xfer()函数来获取数据。

四、修改记录

1)i2c-davinci.c:davinci_i2c_remove函数中,

- free_irq(IRQ_I2C, dev);

+ free_irq(dev->irq, dev);

2)lm75.c:

-static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c,

-0x4d, 0x4e, 0x4f, I2C_CLIENT_END };

+ static const unsigned short normal_i2c[] = { 0x48,I2C_CLIENT_END };

+ #define LM75A_ID 0xA1

lm75_detect()函数中,主要增加了对LM75A的检查,

if (i2c_smbus_read_byte_data(new_client, 7) == LM75A_ID) {

/* LM75A returns 0xff on unused registers so

just to be sure we check for that too. */

if (i2c_smbus_read_byte_data(new_client, 4) != 0xff

|| i2c_smbus_read_byte_data(new_client, 5) != 0xff

|| i2c_smbus_read_byte_data(new_client, 6) != 0xff)

return -ENODEV;

is_lm75a = 1;

hyst = i2c_smbus_read_byte_data(new_client, 2);

os = i2c_smbus_read_byte_data(new_client, 3);

}

3)lm75.h:

- return ((s16)reg / 128) * 500;

+ return reg;

3)kernel根目录下,.config文件:

+ CONFIG_HWMON=y

+ CONFIG_SENSORS_LM75=y

相关文档
最新文档