2017-11-07 15 views
0

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のように、コールバックを「検出」を提供しなければならないと思いましたありがとう。

+0

短い回答:ドライバの '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を取得する方法)を参照してください。 –

+0

あなたの答えをありがとう、 "synaptics_i2c.c"はデバイスツリーに依存していますか?私は'of_match_table = of_match_ptr(synaptics_i2c_of_match)、 'を宣言しません。 "synaptics_i2c.c"では、私を混乱させる点は、CONFIG_OFを定義していないと、互換性がないと宣言していないようです。 –

+0

[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)機能をサポートしています。 –

答えて

0

i2cデバイスの宣言は、デバイスツリーから開始します。

デバイスツリーでi2cデバイスを宣言します。

例:

i2c1: [email protected] { 
    /* ... master properties skipped ... */ 
    clock-frequency = <100000>; 

    [email protected] { 
     compatible = "atmel,24c256"; 
     reg = <0x50>; 
    }; 

    pca9532: [email protected] { 
     compatible = "nxp,pca9532"; 
     gpio-controller; 
     #gpio-cells = <2>; 
     reg = <0x60>; 
    }; 
}; 

1)400a000 I2Cバスアドレス 2)pca9532及びフラッシュドライバ名 3でありさ)が50 @ 60 @)は、スレーブアドレス 4でありますドライバとデバイスを見つけてマッピングするための属性 "compatible" 5)各エントリの内部セルであるその他の属性は、プローブ中のデバイスの初期化に使用されるドライバに固有です。

https://www.kernel.org/doc/Documentation/i2c/instantiating-devices

+0

あなたの返答をありがとう、私は以前にその文書を読んでいました。 "synaptics_i2c.c"はデバイスツリーに依存していますか?私を混乱させる点は、CONFIG_OFを定義していないと、互換性があると宣言していないようです。この場合、どのように動作するのでしょうか? –

0

私は最終的に私の質問を理解しました。
http://www.embedded-bits.co.uk/2009/i2c-in-the-2632-linux-kernel/
私のI2Cデバイスをカーネルのi2c_new_probed_device()またはi2c_new_deviceに登録して、スレーブアドレスとデバイス名に関するマッピングテーブルを作成する必要があります。