i2cサブシステムは、デバイスをドライバとどのように接続しますか?

i2cサブシステムは、デバイスをドライバとどのように接続しますか?

私はこれについてほとんど理解していませんのでご了承ください。これまで私が収集したものから、Linuxのi2cサブシステムは次のことを認識しています。装備取り付けてから、ロードされたドライバモジュールと何とか一致させます。一致するものを認識すると、そのドライバのプローブ機能を呼び出して実際にドライバの設定を開始します。

機能しないカメラをデバッグしようとしています。 i2cサブシステムは、カメラが存在することを発見し、そのカメラのディレクトリを構築したことを見ることができ、/sys/bus/i2c/i2c-7ドライバ.probe_new()の機能は次のとおりです。いいえ私はここに多くのデバッグメッセージを追加したので呼び出されました。そのため、デバイスをドライバに接続する手順が欠けているようですが、どのように動作するのかわかりません。

i2cサブシステムがデバイス - >ドライバマッチングを実行する方法を説明できる人はいますか?

編集する:

明確にするために、ドライバが名前を「ov2680」と宣言することを知っています。

static const struct i2c_device_id ov2680[] = {
    {"ov2680", 0},
    {},
};
MODULE_DEVICE_TABLE(i2c, ov2680_id);

私が知らないのは、i2cサブシステムがどのように起動するのかです。装備ドライバで宣言されたデバイスIDと一致させますか?

ベストアンサー1

I²C はデバイスの列挙をサポートしていないため、カーネルは以下を提供します。I²Cデバイスを初期化する4つの方法:

  • デバイスツリーにリストします(ワープi.MX7ボード)、ACPIテーブルまたはボードファイルの使用ov2680(後者を無視し、以前のバージョンとの互換性のためにのみ提供されます)
  • ハードウェアが存在を「認識」すると、それを明示的にインスタンス化します。これは、内部I²Cバスを使用してさまざまなコンポーネントを接続するテレビアダプタで一般的です。
  • バスの初期化中にプローブを調べます。
  • ユーザー空間で設定します。

後者を使用すると、バスのアドレスを知っている場合はデバイスを強制的に検索できます。

echo ov2680 0x50 > /sys/bus/i2c/devices/i2c-7/new_device

この方法が機能していることを確認したら、デバイスツリーまたはバスベースの検索を使用して、デバイスの自動初期化情報を追加する場所を見つけることができます。カーネル文書(上記の最初のリンクを参照)を参照すると、正しい方向に行くことができます。

あなたが言及したコメントによると、OVTI2680ここで問題は、2つのOmniVision OV2680ドライバがあることです。drivers/media/i2c/ov2680.cそしてdrivers/staging/media/atomisp/i2c/atomisp-ov2680.c。前者はデバイスツリーを使用して見つかり、後者はACPIを使用して見つかり、ディレクトリにOVTI2680ファイルがあるi2cことは後者がロードされていることを示します。

おすすめ記事