2021/04/11

WSL2で仮想I2C通信

  WSL2でLinuxカーネルのI2Cのテスト機能を使って仮想I2C通信をできるようにします。

●今回の環境

 Windows10


 ディストリビューション

 カーネルバージョン

 環境はこれまでと同じです。

 Linuxカーネルをビルドできる環境が必要です。下記を参考にしてビルド環境を用意してください。

●方法

 まず、I2C機能、I2Cスタブ機能を有効にしたカスタムカーネルをビルドします。
 カスタムカーネルができれば、あとはI2C通信のモジュールをロードし、仮想I2Cデバイスを作成すれば、I2Cデバイスが無くてもPC内でI2C通信ができるようになります。

●カスタムカーネルの設定手順

 menuconfigを立ち上げます。
$ make menuconfig

手順1:Device Drivers に入ります


手順2:I2C Support へ入る


手順3:I2C Support の3項目を有効にする


 I2C support を有効にすると、さらに項目が表示されるので、I2C device interface と I2C/SMBus Test Stub を有効にします。
 そのほか2つがデフォルトで有効ですが、そのままにします。

手順4:設定を保存して終了する

 ここまでできたら、忘れずに設定を保存して menuconfig を終了します。
 また、Linuxカーネル名を変えておくとよいでしょう

手順5:カーネルをビルドし、I2C通信のLKMをインストールする

$ make
$ sudo make modules_install
 → /lib/modules の下に、カーネル名でディレクトリができます。
  この下の kernel ディレクトリ以下にI2C通信に必要な*.ko ファイルが格納されます。

手順6:udevのルールにI2Cのアクセス権を設定する(必要な場合のみ)

 ※udevルールが無いと、I2Cデバイスのアクセス権が root:root になってしまいます。

 まず、i2cグループを作り、ユーザーをi2cグループへ追加します。
$ sudo groupadd i2c
$ sudo gpasswd -a %USER i2c

 /etc/udev/rules.d に 以下の内容のファイルを 99-i2c.rule のファイル名で保存します。
SUBSYSTEM=="i2c-dev", GROUP="i2c", MODE="0660"

手順7:カスタムカーネルでWSL2を起動する

 今作った vmlinux ファイルでWSL2を再起動します。
 やり方は、以下の手順6~を参考にしてください。

手順8:I2C通信を有効にしたカーネルで起動できていることを確認する

$ uname -a
Linux earth 5.4.72-microsoft-standard-WSL2-i2c #1 SMP Wed Apr 10 23:11:51 JST 2021 x86_64 x86_64 x86_64 GNU/Linux

 ここまでが、I2C通信を有効にしたカスタムカーネルの作り方でした。

手順9:udevを起動する(必要な場合のみ)

 ※udevルールが無いと、I2Cデバイスのアクセス権が root:root になってしまいます。
$ /etc/init.d/udev start


 ここまでが、I2C通信を有効にしたカスタムカーネルの作り方でした。

●仮想I2Cデバイスを作成する

以下のコマンドを実行します。
$ sudo modprobe i2c-dev
$ sudo modprobe i2c-stub chip_addr=(slave addr)
 ※slave addr にはI2Cスレーブデバイスのスレーブアドレスを指定します。
  スレーブアドレスは10個まで指定できます。
   chip_addr=0x20            0x20 のI2Cデバイスが接続
   chip_addr=0x20,0x55    0x20 0x55 の2つのI2Cデバイスが接続

 → /dev の下に、i2c-* の名前で仮想I2Cデバイスができます。


 あとは、ふつうにI2Cの通信ができます。
 I2C Tools も使えます。

 SMBus stub driver となっているのが、仮想I2Cデバイスです。


0 件のコメント:

コメントを投稿