私はLinuxシステムにロードされ動作する/ dev / i2c-1マスタードライバを使用してi2cスレーブデバイスと通信しています。スレーブデバイスには、同時書き込みおよび読み出しに複数のアドレスオフセットが必要です。
これを行うには、i2c_transfer()とi2c_msg配列を使用する必要があると確信しています。私は以前にカーネル空間でコーディングしたことがなく、カーネル空間を取得する方法についての指示が必要です。「ドライバインスタンスのデバイス構造へのポインタ」i2cマスタードライバが自分のシステムにロードされ、ユーザースペースでi2c_transfer()関数を呼び出すことができます。以下は、i2c_transfer() の使用方法についてオンラインで見つけたいくつかのヒントへのリンクです。 https://docs.zephyrproject.org/apidoc/latest/group__i2c__interface_ga540f88fd7f8f85eaad7872fe24a00267.html
i2c_masterドライバは私のシステムのバス1に登録されています。スレーブアドレスは0x6cで、コマンドラインからi2c_setおよびi2c_getコマンドを使用して手動で読み書きできます。
このc関数を参照できるように、システムに現在登録されているデバイス/ドライバ構造へのポインタをどのように見つけることができますか?
答え1
1つの方法は、i2cデバイスドライバ内に構造体ポインタを作成し(登録されたデバイスタイプを指し、struct i2c_client *のようです)、ドライバがロードされると(プローブ機能で)デバイスポインタを使用してロードすることです。
次に、ロード可能なカーネルモジュールからアクセスできる構造ポインタをエクスポートする必要があります。特定の方法と機能を使用してデバイスに書き込む(i2c.hで見つける必要があります)
しかし、この方法はあまり良くありません。これは、このポインタを誤って処理するとカーネルパニックが発生する可能性があるためです。