在linux内核源代码中的drivers目录下有一个i2c目录,而在i2c目录下又包含了如下文件和文件夹。 1.i2c-core.c : 实现了I2C核心的功能以及/proc/bus/i2c*接口 2.i2c-dev.c : 实现了I2C适配器设备文件的功能,每一个I2C适配器都被分配一个设备。通过适配器访问设备时的主设备号都为89,次设备号为0-25
I2C总线的工作方式为:当SCL为高电平时,如果检测到SDA的下降沿,则启动数据的传输;在数据传输时,只要SCL为高电平时,SDA数据必须保持稳定,SDA数据可以在SCL的低电平时发生变化;当SCL为高电平时,如果检测到SDA的上升沿,则停止数据的传输。 (2)Core I2C内部结构 Core I2C的内部结构框图如图2所示。它主要由串行时钟发...
I2C core驱动详解 I2C core初始化 i2c-core-base.c负责I2C BUS创建,i2c_init->bus_register(&i2c_bus_type); struct bus_type i2c_bus_type = { .name = "i2c", .match =i2c_device_match, .probe =i2c_device_probe, .remove = i2c_device_remove, .shutdown = i2c_device_shutdown, }; EXPORT_...
在 I2C 核心层完成的是 I2C 设备和I2C 驱动的匹配过程。I2C 核心部分的文件是drivers/i2c/i2c-core.c...
(1)I2C核心(i2c-core):I2C核心提供了I2C总线驱动(适配器)和设备驱动的注册、注销方法,I2C通信方法(”algorithm”)上层的,与具体硬件无关的代码以及探测设备检测设备地址的上层代码等。。(2)I2C总线驱动(I2Cadapter):I2C总线驱动是I2C适配器的软件实现,提供I2C适配器与从设备间完成数据通信的能力。I2C总线驱动由i2c...
\kernel\drivers\i2c\i2c-core.c 这个文件实现了 I2C 核心的功能以及/proc/bus/i2c*接口。同时对I2C底层的收发函数进行封装。会调用i2c_transfer ,里面实现了adap->algo->master_xfer(adap, msgs, num) kernel\drivers\i2c\i2c-dev.c 该函数注册了一个设备文件的功能,也就是注册了一个字符设备驱动程序,可以通...
总线驱动最终会调用i2c-core接口i2c_register_adapter,生成i2c_client设备,并且绑定总线号相同的adapter。 归根到底并不是对adapter的注册,而是对绑定过adapter的i2c_client的注册。由于adapter已经依附给i2c_client,所以可以通过注册过的i2c_client找到对应的adapter。
I2C核心(i2c_core) I2C核心维护了i2c_bus结构体,提供了I2C总线驱动和设备驱动的注册、注销方法,维护了I2C总线的驱动、设备链表,实现了设备、驱动的匹配探测。此部分代码由Linux内核提供。 I2C总线驱动 I2C总线驱动维护了I2C适配器数据结构(i2c_adapter)和适配器的通信方法数据结构(i2c_algorithm)。所以I2C总线驱动可控...
i2c_driver注册的时候,i2c_core会在所有已经注册的i2c_adapter上探测address_list中的所有地址,硬件探测成功之后后调用i2c_driver的detect成员,然后根据detect填充的info建立一个i2c_client。 例如,MAX1668温度传感器的驱动实现,/drivers/hwmon/max1668.c 登录后复制staticstructi2c_driver max1668_driver = { ...
I2C核心即i2c-core.c,是Linux内核用来维护和管理的I2C总线的核心部分,实现了I2C总线驱动的框架。I2C核心为总线提供了统一的接口函数,实现了I2C总线驱动和设备驱动的注册、注销及通信等功能。I2C核心是I2C总线适配器驱动和设备驱动之间的桥梁。 (2)I2C总线适配器驱动 ...