我正在尝试实例化这个传感器 https://elixir.bootlin.com/linux/v5.2/source/drivers/iio/proximity/vl53l0x-i2c.c在 ACPI 中使用设备特定数据,即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 匹配表),并且可以使用司机。然而,这似乎只是部分正确。由于内核中的此检查,传感器无法探测i2c-core-base.c https://elixir.bootlin.com/linux/v5.2/source/drivers/i2c/i2c-core-base.c#L345:
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) 匹配的 OF 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)
并查看司机的正确姓名?