WSL2でLinuxカーネルのgpio-mockup機能を使って仮想GPIOを使えるようにします。
今回の環境はまっさらなWSLで説明しますが、前回の仮想CANのカスタムカーネルの環境でもできます。
Linuxカーネルをビルドできる環境が必要です。下記を参考にしてビルド環境を用意してください。
●方法
GPIO機能、GPIO-MOCKUP機能を有効にしたカスタムカーネルをビルドします。
カスタムカーネルができれば、あとはgpio-mockupモジュールをロードし、仮想GPIOデバイスを作成すれば、GPIOが無いPC上でGPIO操作ができるようになります。
●カスタムカーネルの設定手順
menuconfigを立ち上げます。
$ make menuconfig
手順1:Device Drivers に入ります
手順2:GPIO Support を有効にする
Device Drivers 内へ入り(リターンで入る)、GPIO Support を有効にします。
手順3:GPIO Testing Driver を有効にする
GPIO Support 内へ入り、GPIO Testing Driver を有効にする。
GPIO Testing Drivber が仮想GPIOドライバです。
また、GPIOのsysfsインターフェースが必要なら、「/sys/class/gpio/... (sysfs interface)」も選択します。
利用できるGPIOの数は「Maximum nuber of GPIOs for fast path」で設定します。
手順4:設定を保存して終了する
ここまでできたら、忘れずに設定を保存して menuconfig を終了します。
また、Linuxカーネル名を変えておくとよいでしょう。
手順5:カーネルをビルドし、仮想GPIOのLKMをインストールする
$ make
$ sudo make modules_install
→ /lib/modules の下に、カーネル名でディレクトリができます。
この下の kernel ディレクトリ以下に仮想GPIOの gpio-mockup.ko ファイルが格納されます。
手順7:GPIOを有効にしたカーネルで起動できていることを確認する
$ uname -a Linux earth 5.4.72-microsoft-standard-WSL2-gpio #1 SMP Wed Mar 2 20:32:16 JST 2021 x86_64 x86_64 x86_64 GNU/Linux
ここまでが、GPIOを有効にしたカスタムカーネルの作り方でした。
●仮想GPIOデバイスを作成する
gpio-mockupドライバをmodprobeコマンドで読み込みます。
書式:
# modprobe gpio-mockup gpio_mockup_ranges=[x,y](,…,[x,y]) (gpio_mockup_named_lines)
x:lineの開始番号、または、-1
y:lineの終了番号、または xが-1のときlineの個数
※x = -1 のとき、割り当ては後ろからになるので注意
例1:gpio0~gpio7 の8つのGPIOを割り当てる
$ sudo modprobe gpio-mockup gpio_mockup_ranges=0,8
→ /dev の下に、gpiochip0 ができ、8line が使用できる
また、sysfsインターフェースがある場合は、gpio0~7 までexportできる
例2:gpiochip0に4つ、gpiochip1に8つのGPIOを割り当てる
$ sudo modprobe gpio-mockup gpio_mockup_ranges=0,4,8,16
→ /dev の下に、gpiochip0 と gpiochip1 ができ、それぞれ 4line と 8line が使用できる
また、sysfsインターフェースでは、gpio0~3 と gpio8~15 までexportできる
例3:gpiochip0とgpiochip1に後ろから8つずつGPIOを割り当てる
$ sudo modprobe gpio-mockup gpio_mockup_ranges=-1,8,-1,8
→ /dev の下に、gpiochip0 と gpiochip1 ができ、それぞれ 8line が使用できる
また、sysfsインターフェースでは、gpio504~511 と gpio496~503 までexportできる
例4:各ラインにラベルを付ける
$ sudo modprobe gpio-mockup gpio_mockup_ranges=0,8,8,16 gpio_mockup_named_lines
→ 各ラインにラベル名が gpio-mockup-A-*、gpio-mockup-B-* という名前が付く
また、sysfsインターフェースでは、gpio-mockup-A-*、gpio-mockup-B-*というような名前でexportされる
以上で仮想GPIOが使えるようになります。
libgpiod tools も普通に使えます。
●sysfsインターフェースのアクセス権について
WSLでは、initプロセスが動いていないので、udevが動作していないため、/sys/class/gpio 以下のアクセス権がすべて root:root になってしまいます。
これらの対処法は次回まとめます。
0 件のコメント:
コメントを投稿