2016-12-22 12 views
0

Linuxのi2c devインタフェースを使用しているユーザー空間プログラムがi2cデバイスを登録(インスタンス化)できる方法が混乱しています。この読み取ることで私の理解からLinux - i2cデバイスを使用する前に登録(インスタンス化)する必要がありますか?

https://www.kernel.org/doc/Documentation/i2c/instantiating-devicesを、私たちはどちらかを行う必要がありそうです:

  1. )(i2c_register_board_infoを行い、I2C デバイスの名前と住所をi2c_board_info構造体を定義し

  2. 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>; 
        }; 
    }; 
    
  3. インスタンス化デ:

    は、このようなdevicetreeエントリを持っていますi2c_board_info構造体を定義することによって明示的にVIEで、その後、I2Cデバイスドライバ


の初期化にi2c_new_device()を呼び出ししかし、これは、ここでhttps://www.kernel.org/doc/Documentation/i2c/dev-interface説明I2C-devのインターフェイスを使用してユーザー空間のプログラムのためにどのように行われていますか?

私はdevicetreeエントリを持っていませんし、i2c_board_info、i2c_register_board_info()、またはi2c_new_device()のコードをgrepすると何も見つかりません。しかし、下のコードはまだ動作します、どのように?

i2cデバイスを使用するためにデバイスを登録(インスタンス化)する必要はありませんか?これは、i2cドライバとi2c-devインタフェースを使用するユーザスペースプログラムの両方に適用されますか?

+0

I2C devは特殊な汎用ドライバです。これを生のデバイスアクセスと見なします。 – 0andriy

答えて

1

i2c-devドライバは、特定のi2cデバイス(i2c_client)ではなくバス(i2c_adapter)にバインドします。したがって、i2c-devを使用するためにバスデバイスを作成するだけで、クライアント用のデバイスを追加する必要はありません。実際には、I2C-devは、I2C_SLAVE_FORCE ioctlを使用しない限り、別のドライバにバインドされたI2Cアドレスを使用させません。

これは、バス全体ではなく、特定のSPIスレーブデバイスにバインドするspidevドライバの反対です。 I2Cは、現代のLinuxデバイスモデルに先行しており、いくつかのことは他の場所で行われるものとは異なります。

カーネルドライバでI2Cデバイスを制御する場合は、ドライバをバインドするデバイスが必要です。例外は、「古いスタイル」のI2Cドライバで、一連のアドレスを調査し、正しい種類のものが見つかった場合はデバイスにバインドします。

+0

非常によく説明、ありがとう。 – Splaty

関連する問題