sysfsを介して動的にI2Cデバイスを追加する場合。 I2Cデバイスに付属のGPIOピンも定義できますか?

sysfsを介して動的にI2Cデバイスを追加する場合。 I2Cデバイスに付属のGPIOピンも定義できますか?

私のLinuxデバイスに接続したい2つのI2Cデバイスがあります。温度センサTMP117を作成し、追加の加速度計/sys/bus/i2c/devices/i2c-x/new_deviceADXL343を追加したいと思います。ところで、TMP117のような方法を使用すると、割り込みのdmesgGPIOが見つからないというエラーが発生します。これは、私のアプリケーションに割り込み信号が必要なGPIO拡張にも影響します。

追加の信号(割り込みなど)を使用してI2Cデバイスを動的に追加できますか?

答え1

~からhttps://www.kernel.org/doc/Documentation/i2c/instantiating-devices次にできることはただI²C アドレスを引数として渡します。もしそうなら、カーネルは割り込みラインがどのGPIOラインに接続されているのかをどうやって知ることができますか?

したがって、I²Cデバイスよりも多くのハードウェアを含む複雑なドライバはこの方法では使用できません。

起動時にハードウェアの場所を知っている場合(または知らなくても、最近は実行時にデバイスツリーを変更できます)、「正しい」方法はおそらくデバイスツリーエントリ(上記のドキュメントの1b)を作成することです。 。これがオプションでない場合は、カーネルモジュールを作成する必要があります。

しかし、良いニュース:ADIのMichael Hennerich(いい人、会ったらコーヒー一杯買ってください)が書きました。adxl34xドライバー(アップストリームLinuxに含まれています)これは、実際にADXL34xを見つけるI²Cバスのアドレスと受信する割り込みラインをカーネルに通知します(再びデバイスツリーを介して)。

答え2

読みながら、Linuxは、I2Cデバイスをインスタンス化する4つの方法を提供します。

sysfsインタフェースは2つの属性ファイル(new_deviceおよびdelete_device)のみを提供し、new_device2つのパラメータ(I2Cデバイス名とI2Cデバイスアドレス)のみを許可するため、ユーザーモードではIRQを操作できません。

しかし、その後 i2c_board_info構造いくつかのIRQ設定を提供してください。次の説明に従って、バス番号でI2Cデバイスを宣言することをお勧めします。方法1a(最初のリンクを参照)特定の例のように構造を正確に定義できます。

static struct i2c_board_info h4_i2c_board_info[] __initdata = {
    {
        I2C_BOARD_INFO("isp1301_omap", 0x2d),
        .irq        = OMAP_GPIO_IRQ(125),
    },
...
};

関連情報