Bagaimana cara mencocokkan driver I2C di ACPI dengan HID PRP0001

Aug 21 2020

Saya mencoba memberi contoh sensor ini di ACPI menggunakan data khusus perangkat, yaitu, dengan Name (_DSD, ...)dan dengan string yang kompatibel, misalnya, dengan kutipan ASL berikut:

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"},
        }
    })
}

Saya mendapat kesan bahwa jika saya menentukan perangkat saya seperti yang saya miliki di ASL di atas, saya tidak perlu memodifikasi driver (misalnya, dengan menambahkan tabel pertandingan ACPI) dan dapat mencocokkan perangkat menggunakan tabel pencocokan OF yang ada di sopir. Namun, ini tampaknya hanya sebagian yang benar. Sensor gagal untuk menyelidiki karena pemeriksaan ini di kernel di 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;

Interpretasi saya atas pernyataan ini adalah bahwa driver perangkat harus memiliki (i) tabel ID atau (ii) tabel ACPI ID yang cocok atau (iii) tabel ID yang cocok. VL53L0X tidak memiliki tabel ID atau tabel pertandingan ACPI, jadi saya mengandalkan pencocokan menggunakan tabel OF.

Nah, ada dua hal yang membuat saya bingung di sini. Pertama, saya dapat printk(KERN_ERR "%s", dev->driver->driver.name)dan melihat bahwa saya memang sudah mencari driver yang benar, jadi mengapa sebenarnya kita memeriksa apakah driver tersebut cocok lagi?

Kedua, jika i2c_of_match_device(dev->driver->of_match_table, client)gagal untuk mencocokkan, apa yang dicocokkan di urutan pertama sehingga dapat printk(KERN_ERR "%s", dev->driver->driver.name)dan melihat nama yang benar dari pengemudi?

Jawaban

1 allsey87 Aug 21 2020 at 12:06

Sebenarnya bukan jawaban untuk pertanyaan di atas, tetapi salah satu cara untuk mengatasi masalah ini adalah dengan menambahkan tabel ID ke driver.

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);

Hal ini menyebabkan cek di pertanyaan dilewati. Ini bukan solusi yang bagus karena tabel ID I2C tidak diteruskan probe_new, namun, ini berfungsi untuk driver ini karena tidak ada konfigurasi lebih lanjut yang harus dilakukan.

Namun tampaknya perangkat i2c yang cocok seperti ini sudah tidak digunakan lagi sesuai dengan komentar dan tambalan di sekitar pengenalan probe_new.