linux I2C设备驱动

原创 2013年12月05日 17:25:00

linux I2C设备驱动主要包括两部分:设备注册、驱动程序

1、设备注册主要涉及到一个结构体和一个注册函数:

struct i2c_board_info {
char type[I2C_NAME_SIZE];
unsigned shortflags;
unsigned shortaddr;
void *platform_data;
struct dev_archdata*archdata;
int irq;
};

使用例子:

static struct i2c_board_info i2c_info[] = {
        {
                I2C_BOARD_INFO("tlv320aic3x", 0x18),//I2C地址值貌似不是很重要,及时错误,也能成功注册设备,和找到相应的驱动程序。但我估计后面的I2C的读写操作收到影响
        },
        {
                I2C_BOARD_INFO("s35390a", 0x30),
        },

}

注册函数:

i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info));//表示将上面tlv320aic3x、s35390a挂载到适配器编号为‘1’的I2C总线上,一般一个设备上只有一个I2C适配器,不过还有些设备是提供了两个I2C总线接口,所以适配器应该要有两个才对,具体适配器编号,可以通过如下命令查看红色部分:

ls -l /dev

.................

drwxr-xr-x    2 root     root           60 Aug  8 00:12 i2c
lrwxrwxrwx    1 root     root            5 Aug  8 00:12 i2c-1 -> i2c/1

...............

通过上面方法,就可以完成将I2C设备挂载在I2C总线上了。


2、下面我我们讲解I2C设备对应的驱动程序:

主要结构体:

struct i2c_driver {
unsigned int class;

int (*attach_adapter)(struct i2c_adapter *);
int (*detach_adapter)(struct i2c_adapter *);

/* Standard driver model interfaces */
int (*probe)(struct i2c_client *, const struct i2c_device_id *);
int (*remove)(struct i2c_client *);


/* driver model interfaces that don't relate to enumeration  */
void (*shutdown)(struct i2c_client *);
int (*suspend)(struct i2c_client *, pm_message_t mesg);
int (*resume)(struct i2c_client *);

.........................

}

这个结构体中,基本可以分为两部分,这两部分可以在不同的情况下独立使用于I2C设备驱动程序中:

第一种:

/* Standard driver model interfaces */
int (*probe)(struct i2c_client *, const struct i2c_device_id *);
int (*remove)(struct i2c_client *);
使用例子:

static const struct i2c_device_id s35390a_id[] = {
{ "s35390a", 0 },
{ }
};

static struct i2c_driver s35390a_driver = {
.driver = {
.name = "rtc-s35390a",
},
.probe = s35390a_probe,
.remove = s35390a_remove,
.id_table = s35390a_id,
};


static int __init s35390a_rtc_init(void)
{
return i2c_add_driver(&s35390a_driver);
}

在这种情况下,如果想要s35390a_probe函数被调用,则需要向系统注册I2C设备到I2C总线上,方法就是上面讲到的第一点内容。


第二种:

int (*attach_adapter)(struct i2c_adapter *);
int (*detach_adapter)(struct i2c_adapter *);

使用实例:

static struct i2c_driver thermostat_driver = {
.driver = {
.name = "therm_adt746x",
},
.attach_adapter= attach_thermostat,
.detrach_client = client_thermostat,
};

 i2c_add_driver(&thermostat_driver);

在这种模式中,系统加载i2c_add_driver函数后,attach_adapter指向的函数会得到立即调用,完成相关I2C设备的初始化等工作。这个相比第一种方式,就可以省去了I2C设备注册的步骤了。


其实这些东西使用很灵活,这里我在介绍另外一种使用情况:

static const struct i2c_device_id therm_adt746x_id[] = {
{ "therm_adt746x", 0 },
{ }
};


static struct i2c_driver thermostat_driver = {
.driver = {
.name = "therm_adt746x",
},
.attach_adapter= attach_thermostat,
.probe = probe_thermostat,
.remove = remove_thermostat,
.id_table = therm_adt746x_id,
}; 

i2c_add_driver(&thermostat_driver);

这种情况下,一般是在attach_adapter指向的函数被调用中,完成设备的注册工作,设备被注册到I2C总线上后,probe 指向的函数被立即调用,完成后续初始化工作。


好吧,I2C驱动先暂时介绍到这里。后续有补充再添加。






Linux系统I2C设备驱动编写方法

硬件平台:飞思卡尔IMX6 内核版本:kernel3.0.35 Linux的I2C子系统分为三层,I2C核心层,I2C总线驱动层和I2C设备驱动层。I2C核心层由内核开发者提供,I2C总线...
  • BorntoX
  • BorntoX
  • 2016年07月11日 08:56
  • 2050

Linux设备驱动篇——[I2C设备驱动-1]

Linux 设备驱动篇之I2c设备驱动 fulinux 一、I2C驱动体系 虽然I2C硬件体系结构和协议都很容易理解,但是Linux I2C驱动体系结构却有相当的复杂度,它主要由3部分组成,...
  • luoyouren
  • luoyouren
  • 2015年04月24日 12:13
  • 1129

Linux I2C设备驱动编写(一)

在Linux驱动中I2C系统中主要包含以下几个成员: I2C adapter 即I2C适配器 I2C driver 某个I2C设备的设备驱动,可以以driver理解。 I2C client 某个I2...
  • airk000
  • airk000
  • 2014年03月16日 23:24
  • 33679

Linux驱动之I2C设备驱动完全解析

上一节介绍了I2C的相关协议,本节主要讲I2C的设备驱动的创建 在内核iTop4412_Kernel_3.0\Documentation\i2c\instantiating-devices这个文档介...
  • cmh477660693
  • cmh477660693
  • 2017年02月11日 10:47
  • 673

Linux3.5下I2C设备驱动程序

一、驱动框架       以4412+linux3.5平台为例,说明Linux下I2C设备驱动程序。这里先介绍框架的原因在于如果一条I2C总线上只连接一个I2C设备,比如本文将要用到的示例EEPR...
  • fengel_cs
  • fengel_cs
  • 2016年01月15日 11:54
  • 1353

linux I2C设备驱动编写

实例解析linux内核I2C体系结构   http://blog.csdn.net/hongtao_liu/archive/2009/12/08/4964244.aspx   http://blo...
  • hanmengaidudu
  • hanmengaidudu
  • 2013年08月12日 12:54
  • 2621

Linux 设备驱动篇之-------I2c设备驱动(待续)

Linux 设备驱动篇之-------I2c设备驱动   虽然I2C硬件体系结构和协议都很容易理解,但是Linux I2C驱动体系结构却有相当的复杂度,它主要由3部分组成,即I2C设备驱动、I2C...
  • sonbai
  • sonbai
  • 2013年05月31日 22:12
  • 4220

编写i2c驱动-基于Linux3.10

很多芯片的控制方法均使用了i2c的方式,EEPROM,音频芯片AK4951,索尼、松下、豪威的图像传感器、电机驱动等均采用i2c的控制方式。彻底的弄懂i2c设备驱动,对于理解其它驱动非常有帮助,从投入...
  • shichaog
  • shichaog
  • 2014年11月16日 08:52
  • 1929

Linux i2c子系统(一) _动手写一个i2c设备驱动

i2c总线是一种十分常见的板级总线,本文以linux3.14.0为参考, 讨论Linux中的i2c驱动模型并利用这个模型写一个mpu6050的驱动, 最后在应用层将mpu6050中的原始数据读取出来 ...
  • jianglibo1024
  • jianglibo1024
  • 2017年03月08日 11:15
  • 111

Linux的I2C 设备驱动 -- mini2440 上i2c接口触摸屏驱动

本篇记录在友善之臂 mini2440 平台上挂载I2C接口触摸屏的驱动开发过程。 内核版本linux-2.6.32.2, 平台是ARM9 S3C2440+I2C接口的触摸屏 如上篇Li...
  • SUKHOI27SMK
  • SUKHOI27SMK
  • 2013年09月29日 06:47
  • 857
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux I2C设备驱动
举报原因:
原因补充:

(最多只允许输入30个字)