I2C设备驱动介绍

合集下载

Linux下I2C驱动介绍

Linux下I2C驱动介绍

1、I2C概述I2C是philips公司提供的外设总线,I2C有两条数据线,一条是串行数据线SDA、一条是时钟线SCL,使用SDA和SCL实现了数据的交换,便于布线。

I2C总线方便用在EEPROM、实时钟、小型LCD等与CPU外部的接口上。

2、Linux下的驱动思路Linux系统下编写I2c驱动主要有两种方法:一种是把I2C当做普通字符设备来使用;另一种利用Linux下驱动的体系结构来实现。

第一种方法:优点:思路比较直接,不用花费大量时间去了解Linux系统下I2C体系结构缺点:不仅对I2C设备操作要了解,还有了解I2C的适配器操作不仅对I2C设备器和设备操作需要了解,编写的驱动移植性差,内核提供的I2C设备器都没有用上。

第二种方法:第一种的优点就是第二种的缺点,第一种的缺点就是第二种的优点。

3、I2C框架概述Linux的I2C体系结构分为3部分:1)I2C核心I2C核心提供了I2C总线驱动和设备驱动的注册和注销的方法,I2C 通信方法(algorithm)上层,与具体适配器无关的代码,检测设备上层的代码等。

2)I2C总线驱动I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可以直接受CPU来控制。

3)I2C设备驱动I2C设备驱动是对I2C硬件体系结构中设备端的实现,设备端挂在受CPU控制的适配器上,通过I2C适配器与CPU交换数据。

Linux下的I2C体系结构:1)Linux下的I2C体系结构4、I2C设备驱动编写方法首先让我们明白适配器驱动的作用是让我们能够通过它发出标准的I2C时序,在linux内核源代码中driver/I2C/buss包含一些适配器的驱动,例如s3c2410的驱动I2C-s3c2410.c,适配器被加载到内核中,接下的任务就是实现设备驱动的编写。

编写设备驱动的方法主要分为两种方法:第一种:利用设备提供的I2C-dev.c来实现I2C适配器设备文件,然后通过上层应用程序来操作I2C设备器来控制I2C设备。

详细讲解RT-Thread I2C设备驱动框架及相关函数

详细讲解RT-Thread I2C设备驱动框架及相关函数

详细讲解RT-Thread I2C设备驱动框架及相关函数本应用笔记以驱动I2C接口的6轴传感器MPU6050为例,说明了如何使用I2C设备驱动接口开发应用程序,并详细讲解了RT-Thread I2C设备驱动框架及相关函数。

1 本文的目的和结构1.1 本文的目的和背景I2C(或写作i2c、IIC、iic)总线是由Philips公司开发的一种简单、双向二线制(时钟SCL、数据SDA)同步串行总线。

它只需要两根线即可在连接于总线上的器件之间传送信息,是半导体芯片使用最为广泛的通信接口之一。

RT-Thread中引入了I2C设备驱动框架,I2C 设备驱动框架提供了基于GPIO模拟和硬件控制器的2种底层硬件接口。

1.2 本文的结构本文首先描述了RT-Thread I2C设备驱动框架的基本情况,然后详细描述了I2C设备驱动接口,并使用I2C设备驱动接口编写MPU6050的驱动程序,并给出了在正点原子STM32F4探索者开发板上验证的代码示例。

2 I2C设备驱动框架简介在使用MCU进行项目开发的时候,往往需要用到I2C总线。

一般来说,MCU带有I2C 控制器(硬件I2C),也可以使用MCU的2个GPIO自行编写程序模拟I2C总线协议实现同样的功能。

RT-Thread提供了一套I/O设备管理框架,它把I/O设备分成了三层进行处理:应用层、I/O 设备管理层、底层驱动。

I/O设备管理框架给上层应用提供了统一的设备操作接口和I2C 设备驱动接口,给下层提供的是底层驱动接口。

应用程序通过I/O设备模块提供的标准接口访问底层设备,底层设备的变更不会对上层应用产生影响,这种方式使得应用程序具有很好的可移植性,应用程序可以很方便的从一个MCU移植到另外一个MCU。

本文以6轴惯性传感器MPU6050为例,使用RT-Thread I2C设备驱动框架提供的GPIO模拟I2C控制器的方式,阐述了应用程序如何使用I2C设备驱动接口访问I2C设备。

I2C设备与驱动的关联

I2C设备与驱动的关联

I2C设备与驱动的关联作者:leeoo 联系方式:neu_linuxer@在Linux操作系统中,驱动程序的加载分为两种:内核启动时自动加载和用户手动加载;硬件设备也可以采用两种方式添加到系统中:在系统启动前及系统运行时的热插拨。

下面,我们以arm体系结构下的at91处理器中的I2C控制器为例,介绍一下硬件设备及相关的驱动程序是如何绑定及松绑的。

1.平台驱动注册过程1.1 at91_i2c_init()函数在文件drivers/i2c/busses/i2c-at91.c中,定义了结构体struct platform_driver并进行了初始化,通过使用module_init()宏进行声明,当模块被加载到内核时会调用 at91_i2c_init()函数。

在此函数中,调用了platform_driver_register()函数来完成注册。

static struct platform_driver at91_i2c_driver = {.probe = at91_i2c_probe,.remove = __devexit_p(at91_i2c_remove),.suspend = at91_i2c_suspend,.resume = at91_i2c_resume,.driver = {.name = "at91_i2c",.owner = THIS_MODULE,},};static int __init at91_i2c_init(void){return platform_driver_register(&at91_i2c_driver);}1.2 platform_driver_register()函数在文件drivers/base/platform.c中,实现并导出了platform_driver_register()函数,以便使其他模块中的函数可以调用此函数。

i2c驱动传入probe的参数解释

i2c驱动传入probe的参数解释

I2C驱动传入probe的参数解释在进行I2C设备的驱动开发过程中,常常会涉及到I2C驱动的probe 函数。

probe函数是Linux内核驱动中的一种特殊函数,它在驱动被加载并且设备被检测到时被调用,用于初始化设备并注册设备驱动。

在编写I2C驱动的probe函数时,通常需要传入不同的参数进行配置和初始化。

本文将对I2C驱动传入probe的参数进行解释和说明,帮助读者更好地理解和使用I2C设备驱动。

1. struct i2c_client *client在I2C驱动的probe函数中,通常需要传入一个指向structi2c_client结构体的指针作为参数。

这个结构体是I2C设备在内核中的表示,包含了I2C设备的位置区域、总线信息、驱动信息等。

通过这个参数,我们可以获取I2C设备的各种信息,并进行相应的初始化和配置。

2. const struct i2c_device_id *id另一个常见的参数是一个指向const struct i2c_device_id结构体的指针,用于指定要注册的设备驱动的ID信息。

这个结构体中通常包含了设备的厂商ID、设备类型、设备名称等信息,用于匹配加载指定的设备驱动。

在probe函数中,我们可以使用这个参数来判断当前检测到的I2C设备是否匹配当前的驱动,从而进行相应的初始化和注册操作。

3. int (*probe)(struct i2c_client *client, const struct i2c_device_id *id)最后一个重要的参数是probe函数本身。

这个参数是一个函数指针,用于指定实际的probe函数的位置区域。

在probe函数中,我们可以根据传入的client和id参数,进行设备的初始化、资源的申请、注册设备驱动等操作。

通过这个函数指针参数,内核可以在加载驱动并检测到设备时正确地调用对应的probe函数。

I2C驱动传入probe的参数包括指向I2C设备结构体的指针、指向设备ID信息的指针以及probe函数的函数指针。

TI-I2C驱动

TI-I2C驱动

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()相反的功能。

全志公司对i2c的讲解

全志公司对i2c的讲解

1. 几个基本概念1.1. 设备模型由总线(bus_type)+ 设备(device)+ 驱动(device_driver)组成,在该模型下,所有的设备通过总线连接起来,即使有些设备没有连接到一根物理总线上,linux为其设置了一个内部的、虚拟的platform总线,用以维持总线、驱动、设备的关系。

因此,对于实现一个linux下的设备驱动,可以划分为两大步:1、设备注册;2、驱动注册。

当然,其中还有一些细节问题:1、驱动的probe函数2、驱动和设备是怎么进行绑定的。

1.2. i2c设备驱动的几个数据结构i2c_adapter:每一个i2c_adapter对应一个物理上的i2c控制器,在i2c总线驱动probe函数中动态创建。

通过i2c_add_adapter注册到i2c_core。

i2c_algorithm:i2c_algorithm中的关键函数master_xfer(),以i2c_msg为单位产生i2c访问需要的信号。

不同的平台所对应的master_xfer()是不同的,需要根据所用平台的硬件特性实现自己的xxx_xfer()方法以填充i2c_algorithm的master_xfer指针;在A31上即是sun6i_i2c_algorithm函数。

i2c_client:代表一个挂载到i2c总线上的i2c从设备,包含该设备所需要的数据:该i2c从设备所依附的i2c控制器 struct i2c_adapter *adapter该i2c从设备的驱动程序struct i2c_driver *driver该i2c从设备的访问地址addr, name该i2c从设备的名称name。

2. i2c总线驱动2.1. 功能划分从硬件功能上可划分为:i2c控制器和i2c外设(从设备)。

每个i2c控制器总线上都可以挂载多个i2c外设。

Linux中对i2c控制器和外设分开管理:通过i2c-sun6i.c 文件完成了i2c控制器的设备注册和驱动注册;通过i2c-core.c为具体的i2c外设提供了统一的设备注册接口和驱动注册接口,它分离了设备驱动device driver和硬件控制的实现细节(如操作i2c的寄存器)。

I2C设备驱动介绍

I2C设备驱动介绍

I2C设备驱动介绍I2C(Inter-Integrated Circuit)是一种串行通信协议,用于连接并使多个外部设备与主控制器进行通信。

在嵌入式系统中,I2C设备驱动起着至关重要的作用,负责将操作系统与I2C总线上的设备进行通信,促进数据的传输和交互。

1.初始化:驱动程序需要初始化I2C控制器,包括设置时钟频率、地址范围等。

2.设备注册:设备驱动需要在操作系统中注册I2C设备,以便操作系统能够识别和管理设备。

3.读写操作:驱动程序需要实现读写设备寄存器的功能,包括发送开始和停止信号、以及发送、接收数据等。

4.错误处理:驱动程序需要处理I2C通信过程中可能出现的错误,例如传输失败、设备无响应等情况。

5.中断处理:驱动程序需要支持I2C设备的中断机制,以便及时处理设备的状态变化或数据传输完成的中断信号。

6.电源管理:驱动程序需要支持设备的电源管理功能,包括设备的唤醒、睡眠等操作。

7.设备控制:驱动程序需要实现设备特定的控制功能,例如设置传感器的采样率、配置设备的工作模式等。

8. 虚拟文件系统接口:在Linux系统中,驱动程序通常通过虚拟文件系统接口(如/dev)与用户空间进行交互,提供读写设备寄存器的功能。

1.确定设备:首先,开发者应该确定需要驱动的I2C设备。

这可能包括传感器、EEPROM、显示器等。

2.确定硬件连接:确定I2C设备与主控制器之间的硬件连接和电气特性。

这包括设备的I2C地址、I2C总线上的物理接口等。

3.编写驱动程序:在操作系统中,开发者可以根据设备的文档或芯片厂商提供的驱动程序框架,编写自己的I2C设备驱动程序。

驱动程序需要实现上述提到的功能,并且根据设备的特点进行相应的适配和优化。

4.编译和测试:完成驱动程序的编写后,需要将其编译成与操作系统内核匹配的模块或静态链接库。

然后,通过加载驱动模块或重新编译内核来使驱动程序生效。

最后,进行测试,确保驱动程序在各种场景下的正常运行。

I2C总线性能介绍(疑问解答)二

I2C总线性能介绍(疑问解答)二
[问:lbgy]
I2C总线的传输速度有多高它的数据完整性和安全性如何
[答:Bruce]
I2C总线理论上传输速度可以为100KHz(标准)、400KHz(快速)和(高速)。目前还没有成熟的速率的产品。I2C总线是板内总线,总线内部有地址管理和仲裁机制,在总线容量、slave地址等技术指标正确的情况下,数据的完整性和安全性是有保证的
I2C的layout时,对线长、线宽、线距有没有要求
[答:Timothy]
Just remember the max C value on the bus is 400pf.
[问:applebig]
PCA9512对正在使用状态的器件拔出时有什么保护吗比如主发状态的期间拔出时,由谁来发出stop信号
[答:Paul]
[答:Paul]
I2C protocol define each chip one unique slaveif you communicate to several identical ICs, I2C address should be different.If not, the same address ICs will be replied at the same time.
[问:qihong]
请问lpc系列单片机的iic接口是否支持热插拔
[答:Alex]
不支持,I2C总线上的热插拔需要专门的器件支持,比如PCA9511
[问:chenhezhi]
I2C总线在连续写EEPROM时容易出现什么问题,100K的传输速率。
[答:Alex问:david_liao]
I2C总线为同步总线,对抖动性能没有要求
[问:zmyf]
请问高速I2C一般使用多少的波特率呢我们一般使用80K/100Kbits/S,有最优值吗
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

盈量而知芯,方行天下
I2C总线
盈量而知芯,方行天下
I2C总线
盈量而知芯,方行天下
I2C总线
盈量而知芯,方行天下
I2C总线
盈量而知芯,方行天下
I2C子系统
I2C子系统
盈量而知芯,方行天下
I2C子系统
为了方便i2c 设备驱动的开发,避免因为I2C 控制器的硬件差异而导致设备驱动的差异 性,linux 对I2C 总线进行了封装。为 I2C 设备、控制器、及驱动提供了统一的注册平台, 同时为数据传输提供了统一的接口。 I2C 总线作为一类抽象的总线模型,具体的通信由总线控制器 i2c_adapter 所提供的总 线驱动算法i2c_algorithm 来完成。与用户空间的交互由设备驱动完成,由 i2c-dev 结构维 护。i2c_driver 结构维护了一类设备的驱动方法,i2c_client 结构维护i2c 子系统中独立的i2c 设备。另外,设备只完成与I2C-core 的数据交互,不能与适配器直接通信,真正数据的传 输由i2c-core 调用相应的i2c 控制器完成。
盈量而知芯,方行天下
I2C子系统
struct i2c_adapter { struct module *owner; unsigned int id; unsigned int class; /* classes to allow probing for */ const struct i2c_algorithm *algo; /* the algorithm to access the bus */ void *algo_data; /* data fields that are valid for all devices */ struct rt_mutex bus_lock; int timeout; /* in jiffies */ int retries; struct device dev; /* the adapter device */ int nr; char name[48]; struct completion dev_released; struct list_head userspace_clients; };
盈量而知芯,方行天下
I2C设备驱动
● 构建i2c_driver static struct i2c_driver pca953x_driver = { .driver = { .name= "pca953x", }, .probe= pca953x_probe, //当有i2c_client和i2c_driver匹配时调用 .remove= pca953x_remove,//注销时调用 .id_table= pca953x_id,//匹配规则 }; ● 注册i2c_driver static int __init pca953x_init(void) { return i2c_add_driver(&pca953x_driver); } module_init(pca953x_init);
盈量而知芯,方行天下
I2C设备驱动
I2C设备驱动
盈量而知芯,方行天下
I2C设备驱动
编写I2C设备驱动有两种方法。一种是利用系统给i2c-dev.c来实现一个i2c适配器的设 备文件,然后通过在应用层操作i2c适配器来控制i2c设备。 另一种是为i2c设备,独立编写一个设备驱动。在这种情况下,是不需要使用i2c-dev.c 的。通常我们为i2c设备在内核层编写驱动程序。 目前内核支持两种编写i2c驱动程序的方式,分别称这两种方式为“Adapter方式 (LEGACY)”和“Probe方式(new style)”。两者流程上基本相似,而前者属于旧式驱 动开发方式,就不作讨论。这里关注现在流行使用的Probe方式。
盈量而知芯,方行天下
I2C子系统
Linux的I2C体系结构分为3个组成部分: • I2C核心 I2C 核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(即 “algorithm”)上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代 码等。 • I2C总线驱动 I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至直 接集成在CPU内部。 I2C总线驱动主要包含了I2C适配器数据结构i2c_adapter、I2C适配器的algorithm数据结 构i2c_algorithm和控制I2C适配器产生通信信号的函数。 经由I2C总线驱动的代码,我们可以控制I2C适配器以主控方式产生开始位、停止位、 读写周期,以及以从设备方式被读写、产生ACK等。 • I2C设备驱动 I2C设备驱动是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C 适配器上,通过I2C适配器与CPU交换数据。 I2C设备驱动主要包含了数据结构i2c_driver和i2c_client,我们需要根据具体设备实现 其中的成员函数。
盈量而知芯,方行天下
I2C子系统
盈量而知芯,方行天下
I2C子系统
在Linux内核源代码中的drivers目录下包含一个i2c目录,而在i2c目录下又包含如下文件和 文件夹: • i2c-core.c : 这个文件实现了I2C核心的功能以及/proc/bus/i2c*接口。 • 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设备的工作方式。 • chips文件夹 : 这个目录中包含了一些特定的I2C设备驱动,如Dallas公司的DS1337实时钟 芯片、EPSON公司的RTC8564实时钟芯片和I2C接口的EEPROM驱动等。 • busses文件夹:这个文件中包含了一些I2C总线的驱动,如S3C2410的I2C控制器驱动为i2cs3c2410.c。 • algos文件夹 : 实现了一些I2C总线适配器的algorithm。 此外,内核中的i2c.h这个头文件对i2c_driver、i2c_client、i2c_adapter和i2c_algorithm这 4个数据结构进行了定义。理解这4个结构体的作用十分关键,分别给出了它们的定义。
Jiawen.Liang
Shanghai Info TM Microelectronics Co., Ltd.
目录
一.I2C总线
二.I2C子系统
三.I2C设备驱动盈量而知芯,方行天下 Nhomakorabea2C总线
I2C总线
I2C总线
I2C总线
盈量而知芯,方行天下
I2C总线
I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用 于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。 它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小, 通信速率较高等优点。 I2C 总线支持任何IC 生产过程(NMOS CMOS、双极性)。两线――串行数据(SDA) 和串行时钟 (SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一的地 址识别(无论是微控制器——MCU、LCD 驱动器、存储器或键盘接口),而且都可以 作为一个发送器或接收器(由器件的功能决定)。很明显,LCD 驱动器只是一个接 收器,而存储器则既可以接收又可以发送数据。主机是初始化总线的数据传输并产 生允许传输的时钟信号 的器件;MCU一般作为主机,而其他与其连接的外设都被认 为是从机。
盈量而知芯,方行天下
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 *); void (*alert)(struct i2c_client *, unsigned int data); int (*command)(struct i2c_client *client, unsigned int cmd, void *arg); struct device_driver driver; const struct i2c_device_id *id_table; /* Device detection callback for automatic device creation */ int (*detect)(struct i2c_client *, struct i2c_board_info *); const unsigned short *address_list; struct list_head clients; }; 盈量而知芯,方行天下
相关文档
最新文档