私のLinuxデバイスに接続したい2つのI2Cデバイスがあります。温度センサTMP117を作成し、追加の加速度計/sys/bus/i2c/devices/i2c-x/new_device
ADXL343を追加したいと思います。ところで、TMP117のような方法を使用すると、割り込みのdmesg
GPIOが見つからないというエラーが発生します。これは、私のアプリケーションに割り込み信号が必要な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_device
2つのパラメータ(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),
},
...
};