ACPI环境下Linux I2C驱动无法与设备绑定的排查求助
I2C Hwmon驱动ACPI绑定失败排查方案
问题概述
将仅支持设备树的hwmon驱动适配为兼容ACPI,采用_HID(DEVC1111)实现设备绑定,但驱动始终无法与ACPI设备建立绑定关系。经排查,故障点位于__acpi_match_device()函数的!device检查环节,该条件始终成立导致匹配失败。
已完成操作
- 修改DSDT添加
DEVC设备节点,包含_HID、_CRS(I2cSerialBusV2)、_DSD属性,且/sys/devices/LNXSYSTM:00/LNXSYBUS:00/下存在该设备条目 - 在内核
i2c_acpi_get_i2c_resource()中添加打印,确认已正常读取I2cSerialBusV2中的资源属性 - 驱动中添加ACPI设备ID匹配表,注册I2C驱动时指定
acpi_match_table i2cdetect -r -y 1可识别设备地址0x45;执行echo my_device 0x45 > /sys/bus/i2c/devices/i2c-1/new_device可触发驱动探测,但ACPI_HANDLE(&i2c_client->dev)返回false,且ACPI设备目录缺少physical_node条目
排查步骤
1. 检查I2C控制器的ACPI配置与关联
- 确认DSDT中I2C控制器节点(
I2C1)的_HID是否符合内核I2C ACPI驱动的匹配规则,比如是否为标准控制器HID(如INT344x系列),或是否有对应内核驱动支持该控制器的ACPI枚举 - 验证
DEVC节点_CRS中指定的控制器路径"\_SB.I2C1"是否与实际I2C控制器的ACPI路径完全一致,路径的节点名称、大小写必须严格匹配
2. 验证ACPI设备与I2C客户端的关联逻辑
- 查看内核启动日志(
dmesg),搜索DEVC1111或I2C1关键词,确认ACPI子系统是否正确枚举DEVC设备,并尝试将其关联到I2C总线 - 检查
/sys/bus/acpi/devices/下是否存在DEVC对应的设备目录,查看其路径是否指向正确的I2C控制器总线 - 手动触发ACPI设备与I2C总线的绑定:进入
/sys/bus/acpi/devices/[DEVC设备目录]/,执行echo -n i2c > drivers_autoprobe,观察是否生成对应的I2C客户端设备
3. 排查physical_node缺失的原因
physical_node缺失说明ACPI设备未正确关联到物理总线设备(I2C客户端),可从以下方面排查:
- 确认内核
CONFIG_ACPI_I2C配置项已开启,该选项负责ACPI与I2C设备的关联逻辑 - 尝试在DSDT的
DEVC节点中添加Name (_ADR, 0x45)属性,部分内核版本依赖_ADR标识设备在总线上的地址 - 临时在内核
i2c_acpi_register_device()函数中添加printk,确认是否成功为ACPI设备创建I2C客户端
4. 检查驱动匹配逻辑细节
- 尝试移除驱动中
acpi_match_table赋值时的ACPI_PTR宏,直接改为.acpi_match_table = device_acpi_match_table,,部分内核版本无需该宏包装 - 分析
__acpi_match_device()中!device的触发原因:该条件通常表示匹配时传入的device指针为NULL,或ACPI设备对应的物理设备未正确创建。可在驱动probe_new函数中添加打印,查看i2c_client->dev.parent是否指向I2C控制器,以及ACPI_HANDLE(dev.parent)是否有效
5. 验证ACPI _DSD属性正确性
- 确认
_DSD中使用的UUIDdaffd814-6eba-4d8c-8a91-bc9bbf4aa301为通用属性标准UUID,无需修改 - 将
_DSD中"reg"属性的值改为十六进制0x45,确认内核是否能正确解析设备地址(当前为十进制45,需匹配_CRS中的0x45)
内容的提问来源于stack exchange,提问作者PlasticGlass
相关产品推荐
相关产品推荐

