2016-05-11 6 views
3

Linux 3.14.52をimx6sxハードウェアプラットフォーム(NXP組み込みARM)で使用する。Linux、ARM:gpiochip <num>は、起動時にI2C GPIO Expanderが存在する場合にのみ作成されるのはなぜですか?

デバイスツリーで指定されたPCF8575 I2C GPIOエクスパンダは、カーネルブート中に存在しない限り、/ sys/class/gpio構造内のデバイスとしてインスタンス化されません。デバイスは/sys/bus/i2c/devices/i2c-1(i2cバス1)構造体にリストされていますが、/sys/class/gpio構造体にはgpiochipがありません。

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

以前の(PowerPC)プラットフォームでは、デバイスツリーにリストされているすべてのデバイスは、カーネルブート中にオンになっているかどうかにかかわらず、gpiochipに割り当てられました。しかし、ARMプラットフォームでは、カーネルの起動時にデバイスを使用できるようにする必要があります。私はカーネルのi2c/gpioオプション(.configを介して)をできるだけ以前のプラットフォームに近いものに変更しようとしましたが、これは効果がないようです。

+1

カーネルのバージョンは変更されていますか?新しいカーネルは、デバイスが実際に探査されたときにsysfsエントリを作成するだけです。おそらくソースを調べて、GPIOエクスパンダのプローブ機能中に何が起こるかを確認してください。 – bodangly

+0

はい、カーネルが変更されました。 PowerPCは2.6.37.6だったので、かなり異なったバージョンです。合意したことは、おそらく変更の理由です。私はカーネルソースを掘り下げようとするかもしれないが、プローブがどこにあるのかわからないと思う。おそらくgpiolib.c?カーネルを変更せずにこれを処理するポストブート方法があることを期待していました。 – Bruce

+0

私の答えでわかるように、デバイスがプローブすれば追加されることを確認できます。 – bodangly

答えて

1

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

Device Tree Usage

のLinuxボード・サポート・コードは、ツリーのルートにあるデバイスの発見をキックオフするof_platform_populate(NULL、NULL、NULL、NULL) を呼び出します。 のパラメータはすべてNULLです。 ツリーのルートから開始する場合は、開始ノード(最初のNULL)、 親構造体デバイス(最後のNULL)を指定する必要はないため、一致するテーブルは (まだ)です。デバイスを登録する必要があるボードの場合、 .init_machine()は、 of_platform_populate()コールを除き、完全に空にすることができます。

デバイスツリーはカーネルに何を発見するかを通知するだけで、見つからなければ実際に何も追加しません。私はgpiochipは、あなたのデバイスのプローブに追加されていることを確認することができます

:私が推薦する何gpiochip_add

にライン397上の呼び出しはしてカーネルをコンパイルしようとすることです

gpio-pcf857x.c

お知らせgpio expanderはモジュールとして設定され、実際に接続された後にinsmodされます。

+0

ありがとう!それが確認されているのは良いことです。あなたの提案はうまくいくかもしれませんが、デバイスツリーからデバイスを削除し、gpioチップとしてアクセスしないことにしました。代わりに、私は単純なI2Cデバイスとしてそれらにアクセスしているだけで、これらの単純なエクスパンダで動作します。 – Bruce

+0

@Bruce問題ありません!これがあなたの質問に答えるなら、それを次のようにマークしてください:) – bodangly

関連する問題