/ / Linux、ARM:I2C GPIO Expanderが起動時にのみgpiochip <num>が作成されるのはなぜですか? - linux、linux-kernel、embedded-linux、gpio、i2c

Linux、ARM:I2C GPIO Expanderが起動時にのみgpiochip <num>が作成されるのはなぜですか? - linux、linux-kernel、embedded-linux、gpio、i2c

imx6sxハードウェアプラットフォーム(NXP組み込みARM)でのLinux 3.14.52の使用

問題は、PCF8575 I2C GPIOエクスパンダ/ sys / class / gpio構造内のデバイスとしてインスタンス化されません。デバイスは、 /sys/bus/i2c/devices/i2c-1 (i2cバス1)の構造体にはgpiochipは与えられていません /sys/class/gpio 構造。

これらのデバイスをシステムに追加すると、起動後にこれらのデバイスをgpiochipとして割り当てる方法はありますか?

以前の(PowerPC)プラットフォームでは、すべてのデバイスカーネルの起動時にデバイスのツリーに表示されていたgpiochipに割り当てられていましたが、ARMプラットフォームではカーネルの起動時にデバイスを利用できるようにしなければなりません。カーネルのi2c / gpioオプション(.config)可能な限り以前のプラットフォームに近いものとして、これは効果がないようです。

回答:

回答№1は1

カーネルは、2.6カーネルブランチのsysfs私も同様の問題を経験しました。これは、デバイスツリーの処理と関係しています。デバイスツリーは平坦化されませんが、これはデバイスの実際の発見を始めるだけです。デバイスが実際に存在しない場合、デバイスは調査されず、sysfsで作成されたエントリはありません。

デバイスツリーの使用

Linuxボードのサポートコード呼び出しof_platform_populate(NULL、NULL、NULL、NULL) ツリーのルートにあるデバイスの発見を開始する。ザ パラメータはすべてNULLです。なぜなら、 ツリーでは、開始ノード(最初のNULL)、a 親struct device(最後のNULL)であり、一致を使用していない テーブル(まだ)。デバイスの登録だけが必要なボードでは、 .init_machine()は、 of_platform_populate()呼び出し。

したがって、デバイスツリーはカーネルに何を発見するかを伝えるだけで、見つからなければ何も追加しません。

私はgpiochipがあなたのデバイスのプローブでのみ追加されていることを確認できます:

gpio-pcf857x.c

397行目の呼び出しが gpiochip_add

私がお勧めするのは、gpioエキスパンダーをモジュールとしてコンパイルし、実際に接続した後にinsmodを実行することです。