I2C设备树匹配注册详解

需积分: 50 33 下载量 120 浏览量 更新于2024-09-10 收藏 2KB TXT 举报
"本文将详细解释I2C总线在设备树中的匹配注册过程,以及如何通过设备树描述实现I2C设备与驱动程序的连接。" 在Linux内核中,I2C总线(Inter-Integrated Circuit)是一种用于连接微控制器和其他设备的简单两线接口。在设备树中,I2C设备的配置和驱动注册是通过一系列步骤完成的,以确保正确识别和初始化硬件。 首先,我们需要理解设备树在I2C系统中的作用。设备树是一个描述硬件结构的数据结构,它定义了系统中的所有硬件组件及其属性。对于I2C设备,设备树包含每个设备的地址、类型和兼容性信息,这些信息用于匹配相应的驱动程序。 在内核中,`struct bus_type`定义了总线类型,如I2C。在示例中,`i2c_bus_type`结构体包含了I2C总线的各种操作函数,例如`match`(匹配)、`probe`(探测)、`remove`(移除)等。`i2c_device_match`函数用于比较驱动程序的`id_table`与设备的兼容性。 当I2C驱动程序被注册到内核时,通常会调用`i2c_add_driver`或`i2c_register_driver`。这两个函数将驱动程序挂载到I2C总线上,并将驱动的`bus`成员设置为`i2c_bus_type`。这使得驱动可以处理I2C设备的注册、探测和移除。 驱动注册过程由`driver_register`启动,它会调用`bus_add_driver`,然后遍历总线上的每个设备。在`driver_attach`阶段,内核尝试将驱动与设备进行匹配。`bus_for_each_dev`循环遍历设备,`__driver_attach`函数负责实际的匹配和探测过程。 `driver_match_device`函数根据设备树中的兼容性字符串与驱动的`id_table`进行比较。如果设备的`compatible`属性与驱动的`id_table`匹配,`driver_probe_device`将被调用,进而执行`really_probe`,最终调用`driver->probe`,这里是`i2c_device_probe`,驱动的`probe`函数会进一步处理I2C设备的初始化。 `i2c_device_match`是I2C总线类型的匹配函数,它可能使用`of_driver_match_device`和`of_match_device`来比较设备树中的节点与驱动的匹配表。`of_match_node`和`__of_device_is_compatible`则用于检查设备的`compatible`属性是否与驱动的兼容性列表匹配。 总结一下,I2C在设备树下的匹配注册过程大致包括以下步骤: 1. 驱动程序注册到I2C总线。 2. 内核遍历总线上的设备。 3. 比较设备的`compatible`属性与驱动的`id_table`。 4. 调用驱动的`probe`函数,执行设备初始化。 这个过程确保了I2C设备能够在正确的驱动程序下正确工作,实现了驱动程序与硬件的动态绑定,增强了系统的灵活性和可扩展性。