I2C 드라이버는 HID PRP0001이있는 ACPI에서 어떻게 일치해야합니까?
장치 별 데이터를 사용하여 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 일치 테이블 추가) 해당 장치에서 기존 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) 일치하는 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)
입니까? 그 결과 정확한 드라이버 이름을 볼 수 있었습니까?
답변
위의 질문에 대한 답은 아니지만이 문제에 대한 한 가지 해킹 / 해결 방법은 드라이버에 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
수행 할 추가 구성이 없기 때문에이 드라이버에서 작동합니다.
그러나 이와 같은 일치하는 i2c 장치는 .NET Framework 도입에 대한 주석 및 패치에 따라 더 이상 사용되지 않는 것 같습니다 probe_new
.