在ACPI中,I2C驱动器应如何与HID PRP0001匹配 [英] How should I2C drivers be matched in ACPI with HID PRP0001
本文介绍了在ACPI中,I2C驱动器应如何与HID PRP0001匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用特定于设备的数据在ACPI中实例化this sensor,即使用Name (_DSD, ...)
和兼容的字符串,例如,使用以下ASL摘录:
Device (TOF1) {
Name (_HID, "PRP0001")
Name (_DDN, "STMicroelectronics VL53L0X laser rangefinder")
Name (_CRS, ResourceTemplate () {
I2cSerialBus (
0x29,
ControllerInitiated,
I2C_SPEED,
AddressingMode7Bit,
"\_SB.PCI0.I2C1.MUX2.CH01",
0x00,
ResourceConsumer,,)
})
Name (_DSD, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () {"compatible", "st,vl53l0x"},
}
})
}
我的印象是,如果我像在上面的ASL中那样指定我的设备,我将不需要修改驱动程序(例如,通过添加ACPI匹配表),并且可以使用驱动程序中现有的OF匹配表来匹配设备。然而,这似乎只是部分正确的。由于i2c-core-base.c中的内核检查:,传感器无法探测
if (!driver->id_table &&
!i2c_acpi_match_device(dev->driver->acpi_match_table, client) &&
!i2c_of_match_device(dev->driver->of_match_table, client))
return -ENODEV;
我对这句话的理解是,设备驱动程序必须具有(I)ID表或(Ii)匹配的ACPI ID表或(Iii)匹配的ID表。VL53L0X既没有ID表,也没有ACPI匹配表,因此我依赖使用OF表进行匹配。
现在,有两件事让我感到困惑。首先,我可以printk(KERN_ERR "%s", dev->driver->driver.name)
并看到我确实已经在查看正确的驱动程序,那么我们到底为什么要检查该驱动程序是否再次匹配?
其次,如果i2c_of_match_device(dev->driver->of_match_table, client)
不匹配,首先究竟是什么匹配导致能够printk(KERN_ERR "%s", dev->driver->driver.name)
并查看驱动程序的正确名称?
推荐答案
实际上不是上述问题的答案,但解决此问题的一个办法是只将ID表添加到驱动程序。
static const struct i2c_device_id vl53l0x_id[] = {
{ "vl53l0x", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, vl53l0x_id);
static struct i2c_driver vl53l0x_driver = {
.driver = {
.name = "vl53l0x-i2c",
.of_match_table = st_vl53l0x_dt_match,
},
.probe_new = vl53l0x_probe,
.id_table = vl53l0x_id,
};
module_i2c_driver(vl53l0x_driver);
这会导致跳过问题中的检查。这不是一个很好的解决方案,因为I2C ID表不会传递给probe_new
,但是,它确实适用于此驱动程序,因为不需要进行进一步的配置。
然而,根据probe_new
的介绍周围的评论和补丁,似乎不建议使用像这样匹配的i2c设备。
这篇关于在ACPI中,I2C驱动器应如何与HID PRP0001匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文