I2CドライバーをACPIでHIDPRP0001とどのように一致させる必要がありますか

Aug 21 2020

デバイス固有のデータを使用して、つまり、互換性のある文字列を使用して、たとえば次のASLの抜粋を使用して、ACPIでこのセンサーをインスタンス化しようとしていますName (_DSD, ...)

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)一致するOFIDテーブルのいずれかを持っている必要があるということです。VL53L0XにはIDテーブルもACPI一致テーブルもないため、OFテーブルを使用した一致に依存しています。

さて、ここで私が混乱していることが2つあります。まず、私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)で、ドライバーの正しい名前を確認できるようになりましたか?

回答

1 allsey87 Aug 21 2020 at 12:06

上記の質問に対する実際の答えではありませんが、この問題の1つのハック/回避策は、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デバイスは、の導入に関するコメントとパッチに従って非推奨になっているようですprobe_new