Linux I2Cカーネルドライバの開発方法を学び、以下のWebサイトから学びます。
How to instantiate I2C devices
I2C Driver for Linux Based Embedded System
...
次は、私はI2Cのタッチパッドドライバ、を実装する方法を示すサンプルを見つけましたが、それは本当に私にを混同しました。
linux/drivers/input/mouse/synaptics_i2c.c
Linux I2Cカーネルドライババインド
私の質問は、どのようにLinuxカーネルがこのデバイスを正しくデバイスにバインドするのですか?
このドライバは '検出'コールバックを提供せず、i2c_driver.address_listを介してI2Cスレーブアドレスを指定することもなく、アドレス情報を登録するためにi2c_board_infoを呼び出す人もいません(私はLinuxコードベース全体をgrepします)。
私は、私が逃したものを教えてください
(それがi2c_board_infoによって登録されます)ドライバーがスレーブ・アドレスを指定するか、単に
drivers/hwmon/adc128d818.c
または linux/drivers/rtc/rtc-ds1307.cのように、コールバックを「検出」を提供しなければならないと思いましたありがとう。
短い回答:ドライバの 'compatible'文字列が、デバイスツリーファイル(' .dts')の対応する 'compatible'文字列と一致しています。次に、一致が起こり、 'probe()'関数が呼び出されます。 [this](https://stackoverflow.com/questions/38641710/mcp23017-i2c-device-driver-probe-function-is-not-called)と[this](https://stackoverflow.com/questions/)を参照してください。 40262148/ive-added-a-max7320-i2c-output-chip-how-can-get-the-kernel-to-the-load-the-driveを取得する方法)を参照してください。 –
あなたの答えをありがとう、 "synaptics_i2c.c"はデバイスツリーに依存していますか?私は'of_match_table = of_match_ptr(synaptics_i2c_of_match)、 'を宣言しません。 "synaptics_i2c.c"では、私を混乱させる点は、CONFIG_OFを定義していないと、互換性がないと宣言していないようです。 –
[i2c_device_match()](http://elixir.free-electrons.com/linux/v4.14-rc8/source/drivers/i2c/i2c-core-base.c#L98)の機能をご覧ください。最初のデバイスツリーマッチ(OF)、次にACPIマッチ、そして両方が失敗した場合はI2Cマッチの3種類のマッチを試みます。したがって、デバイスツリーまたはACPIを使用しない場合、[i2c_device_table-> name](http:// elixir。[i2c_match_id()](http://elixir.free-electrons.com/linux/v4.14-lib/)で、 rc8/source/drivers/i2c/i2c-core-base.c#L83)機能をサポートしています。 –