tmp102温度センサー用のカーネルドライバを作成したいとします。 1つのプロジェクトでは、他の2つのセンサーに1つのセンサーしかありません。カーネルモジュールが固定数ではなくN個のセンサーをサポートできるようにしたい。私は1つ以上のstruct i2c_clientを管理し、それぞれのsysfsエントリを作成することに問題があります。ここで私はそれをやっている方法は次のとおりです。1つのドライバモジュールで複数のi2c_clientsを処理する(sysfsを使用)
私は私が
I2C_BOARD_INFO()
を提供するデバイスごとにstruct i2c_client*
を取得probe()
機能で。次に、モジュールのメインディレクトリをsysfsにするために、
kobject_create_and_add("tmp102", kernel_kobj)
を取得します。静的属性を作成するためのポインタを取得し、私はsysfs_create_group()
を作成していた各デバイスに対して。属性は、
(*show)()
と(*store)()
ポインタが静的関数に設定されています。私はI2C経由で読みたい本機能でstatic ssize_t tmp102_sysfs_thigh_get_one(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
。問題は、私は何とかこののsysfsエントリにリンクされなければならないデバイスのためのstruct i2c_client *
を取得する方法がわからない、とI2Cアドレスがある...です!
i2c_clientをsysfsのエントリに正しくリンクすると、関数内にI2Cアドレスを取得できますか?
理想的には、私は機能のほんの一組(属性ごとに1つ)を持っていると思います。 のsysfsツリーはそのようになります。
/sysfs/kernel/tmp102
|
|-> <hex i2c address, e.g. /48>
| |
| |-> temperature
|
|
|-> /49
|
|-> temperature
私は両方の「温度」は、それが書くべき先のI2Cアドレスを、決定することができる同じ機能を、使用する属性たいです。
多分私のアーキテクチャは間違っていますか?その場合、複数のi2c_client
を処理する必要があるドライバの場合はどうすればよいでしょうか?
EDIT:
私はstruct device_attribute
の代わりに、定期的なattribute
Sを使用することにしました。私の理解では、struct i2c_client
と同じ、通常の属性を使用するときにstruct device
ポインタを取得することは容易ではありません。それらは簡単にkobject
の/sys/kernel
からリンクされていません。私はこのプロジェクトで自分の属性を持つ必要があります。 device_attribute
sが/sys/devices
で見つけることができます - 私はsysfs_create_group
を使用して、私のデバイスのkobject
device_attribute
グループとをリンクさ。 sysfs_create_link
を使用し、デバイスのkobject
を/sys/kernel/tmp102
にリンクしました。このようにして、各デバイスのフォルダ(リンク)を作成して、元の属性フォルダ(/sys/devices
)をポイントすることができます。
ドライバ内のボード情報を作成して埋め込むことは、Linuxカーネルで使用されるモデルとは異なります。あなたは、(アドレスへの)無関係なドライバを作成し、ACPI、デバイスツリー、またはレガシープラットフォームのデータとなるボード情報の別のソースを提供する必要があります。 – 0andriy
I2C_BOARD_INFOがドライバにないことがわかりません。これは、ビルドプロセスの前にカーネルに適用されるパッチ内にあります。このカーネルはまだデバイスツリーをサポートしていません。モジュール自体はアドレスに依存しません。私はここに何かを逃していますか – Bart
あなたの投稿を誤読したようです。 – 0andriy