私は(私の最初の)カーネルモジュールを作成して、パンダボードのgpioピンと割り込みを再生していました。
すでに「組み込み」で、(簡単に)できることに気づきました
cd /sys/class/gpio
echo 138 > export # a file gpio138 appears
echo out > gpio138/direction
echo 1 > gpio138/value
コネクタピンの電圧を高くまたは低くします。
同様に、カーネルモジュールにはモジュールパラメータがあり、たとえばecho 3 > /sys/module/my_module/parameters/delay_seconds
を実行できます。
私の質問:
/ sys/class/gpioを処理するものは何ですか?カーネルモジュール?ドライバー ?
1.が何であれ、いくつかのディレクトリ構造を使用して、カーネルモジュールにさらに複雑なモジュールパラメータを含めることは可能ですか?遅延のパラメータを含む「delays」ディレクトリのように、... /sys/module/my_module/parameters/delays/delay_led1_seconds
パス/ sys/module/my_module/parameters/...以外の場所にパラメーターを設定できますか? (/ sys/class/a_name/...など)
[un]export
に書き込むときに、gpioはどのようにして/ sys/class/gpioに新しいファイルを作成/削除しますか?
1)/ sys/class/gpioを処理するものは何ですか?カーネルモジュール?ドライバー ?
これは カーネルインターフェイス/proc
ディレクトリに似ています。
2)いくつかのディレクトリ構造で、カーネルモジュールにもっと複雑なモジュールパラメータを含めることは可能ですか?遅延のパラメータを含む「delays」ディレクトリのように
はい; /proc
および/sys
の一部は、ディレクトリ階層を使用します。ただし、それらを変更または拡張する場合は、カーネルを変更する必要があります。
#3にも同様の答えがあります。変更を加えるには、関連するカーネルコードを変更する必要があります。
4)[un] exportに書き込むと、gpioはどのようにして/ sys/class/gpioに新しいファイルを作成/削除しますか?
これらはディスク上のファイルではなく、単なるシステムインターフェイスです。1 procfsまたはsysfsファイルからデータを読み取る場合、実際に行っているのは、カーネルからの情報の要求です。次に、データがフォーマットされて返されます。一部はカーネルに格納されている可能性がありますが、表示されている形式ではおそらくどこにも格納されていません。
そのようなファイルに書き込むとき(すべてがこれを許可しているわけではありません)、特定のことを行うようにカーネルに要求を送信しています。これには、たとえば、GPIOインターフェースのアクティブ化または拡張が含まれます。
1. read
およびwrite
呼び出しは常に システムコール とにかく、通常のファイルは通常ディスク上にあり、ハードウェアにアクセスするにはカーネルが必要であるためです。したがって、ここでファイルシステムスタイルのAPIを使用するのは自然なことです。それらが「実際のファイル」でなくても、それらが表すリソースにアクセスするには、システムコールが必要です。
- パス/ sys/module/my_module/parameters/...以外の場所にパラメーターを設定できますか? (/ sys/class/a_name/...など)
パラメータには/ sys/class/module_name/*を使用しますが、非常に簡単に使用できます。例として http://lxr.free-electrons.com/source/drivers/gpio/gpiolib.c#L757 のコードを参照してください(読み取り専用属性の例もあります __ ATTR_RO )。
static struct class_attribute gpio_class_attrs[] = {
__ATTR(export, 0200, NULL, export_store),
__ATTR(unexport, 0200, NULL, unexport_store),
__ATTR_NULL,
};
static struct class gpio_class = {
.name = "gpio",
.owner = THIS_MODULE,
.class_attrs = gpio_class_attrs,
};
/*
* /sys/class/gpio/export ... write-only
* integer N ... number of GPIO to export (full access)
* /sys/class/gpio/unexport ... write-only
* integer N ... number of GPIO to unexport
*/
static ssize_t export_store(struct class *class,
struct class_attribute *attr,
const char *buf, size_t len)
{
// ...
ところで。論文を読むことをお勧めします PatrickMochelによるsysfsファイルシステム およびGreg Kroah-Hartmanによる短いブログ投稿 sysfsファイルを正しく作成する方法 。