エンベデッドチーム 久保田です。
開発環境をWSL2 (Windows Subsystem for Linux)へ移行しました。 タイミングよく、「WSL2でUSBデバイスを使ってみよう」という記事が出回っていたので、aptpod CAN-USB Interface (AP-CT2A) もWSL2で動かせるのではないかという期待からintdash Edge Agent 含めて動作環境を整えてみましたのでご紹介します。
元記事
Adding USB support to WSL2
https://github.com/rpasek/usbip-wsl2-instructions
USB support to WSL2
http://ktkr3d.github.io/2020/07/06/USB-support-to-WSL2/
intdash Edge Agent とは
intdash Edge Agentは、intdash Edgeの基本機能を提供するエッジデバイス用のエージェントソフトウェアです。ユーザーは、接続するデバイスに応じたプラグインであるDevice Connectorを実装するだけで、様々なデバイスをintdashに接続することができます。このソフトウェアを使用すれば、intdash Edge が提供する自動再送、データ流量の制御といった、エッジ側の基本機能を利用したクライアントアプリケーションを、最小限の追加実装で開発することが可能となります。
aptpod CAN-USB Interface - AP-CT2A とは
CANバスをターミナルアプライアンスに接続し、CAN、J1939などの制御信号を取得するためのインターフェイスデバイス
- 分岐線を使用して同時に2チャンネルのCANバスに接続可能
- CANデータに対する高精度なハードウェアタイムスタンピングが可能
- クロックの共有機構により、複数のCAN-USB Interface間のタイムスタンプを同期
- 外部計測装置などへの同期信号の出力が可能
動作構成
WSL2 (Ubuntu 20.04)には、intdash Edge Agent, AP-CT2A device driverをbuild, installします。
WSL2は現時点(2020/10)で、残念ながらUSBデバイスの直接接続をサポートしていませんので、USB over IP経由でWindows側のAP-CT2Aを接続してみます。
WSL2とは
WSL2は、Linux 用 Windows サブシステムが Windows 上で Linux バイナリを実行できるようにしたLinux 用 Windows サブシステム アーキテクチャの新しいバージョンです。 WSL1との違いは、ファイル システムのパフォーマンスを向上すること、システム コールの完全な互換性を追加することです。
WSL2 の初期リリースでは、ハードウェア アクセスのサポートが制限され、GPU、シリアル、USB デバイスに直接アクセスすることはできません。
「WSLのアーキテクチャ https://roy-n-roy.github.io/Windows/WSL%EF%BC%86%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A/Architecture/ 」から
USB over IPとは
USB over IPは、USBコマンドをIPパケットによってカプセル化するデバイス制御方法です。
「USB/IP PROJECT http://usbip.sourceforge.net/」から
手順
Windows側
USB/IPのstubドライバを配布サイト (https://github.com/cezanne/usbip-win) からダウンロードします。
https://github.com/cezanne/usbip-win/releases/tag/v0.1.0
PS C:\usbip-win\0.1.0> dir ディレクトリ: C:\usbip-win\0.1.0 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2020/07/11 14:05 551472 usb.ids -a---- 2020/07/11 14:05 1434112 usbip.exe -a---- 2020/07/11 14:07 1364992 usbipd.exe -a---- 2020/07/11 14:05 762 usbip_stub.cer -a---- 2020/07/11 14:05 1951 usbip_stub.inx -a---- 2020/07/11 14:07 58384 usbip_stub.sys -a---- 2020/07/11 14:05 2486 usbip_test.pfx -a---- 2020/07/11 14:05 2316 usbip_vhci.cat -a---- 2020/07/11 14:05 762 usbip_vhci.cer -a---- 2020/07/11 14:05 1960 usbip_vhci.inf -a---- 2020/07/11 14:05 87344 usbip_vhci.sys
バイナリをダウンロードしたディレクトリでstubドライバをインストールします。
PS C:\usbip-win\0.1.0> .\usbip.exe install
AP-CT2AをWindowsのUSBポートに接続すると、usbipコマンドでUSB接続が表示されます。
PS C:\usbip-win\0.1.0> .\usbip.exe list -l - busid 1-123 (32b2:0100) unknown vendor : unknown product (32b2:0100) <= これ - busid 1-138 (8087:0a2b) Intel Corp. : unknown product (8087:0a2b) - busid 1-99 (093a:2510) Pixart Imaging, Inc. : Optical Mouse (093a:2510) - busid 1-236 (5986:111c) Acer, Inc : unknown product (5986:111c)
usbipコマンドでUSB/IPの接続登録を実行します。
PS C:\usbip-win\0.1.0> .\usbip.exe bind -b 1-123 usbip: info: bind_device: bind device on busid 1-123: complete
usbipdコマンドでWSL2側からの接続待ちにします。
PS C:\usbip-win\0.1.0> .\usbipd.exe -d -4 usbipd: info: starting usbipd (usbip 1.0.0) usbip: debug: C:\work\usbip-win\userspace\src\usbipd\usbipd_sock.c:38:[build_sockfd] opening 0.0.0.0:3240 usbip: info: listening on 0.0.0.0:3240
WSL2側
Windows側で待ち受けているポートへ接続します。
$ sudo usbip attach --remote=192.168.1.8 --busid=1-123
接続が完了すると、WSL2側にAP-CT2Aが現れます
$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 32b2:0100 aptpod, Inc. AP-CT2A Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
動作結果
CANを流してみると、無事受信できました。
USB/IP経由することでCPU負荷が大きくなるかと考えていましたが、PCがCore i7なので余裕でした。
・・・が、何かのきっかけで受信が0になります。エラーとなるわけではないので、USB/IPドライバの不具合かと。正常に動かすには調整が必要なようです。
まとめ
WSL2でのintdash Edge Agentの動作手順を簡単に紹介しました。
結果AP-CT2Aは正常に継続動作しませんでしたが、intdash Edge Agentの動作は問題ありません。
CPUがパワフルなので、AP-CT2AのWindowsネイティブドライバがあれば、CANデータをTCPで転送してDevice Connectorで回収する手段も取れなくはなさそうです。
WSL2のUSBデバイス正式対応に期待しましょう。
参考 (WSL2の導入)
WSL2導入|WinアップデートからWSL2を既定にするまでのスクショ
https://qiita.com/tomokei5634/items/27504849bb4353d8fef8
WSL2におけるVcXsrvの設定
https://qiita.com/ryoi084/items/0dff11134592d0bb895c
WSL2によるホストのメモリ枯渇を防ぐための暫定対処
https://qiita.com/yoichiwo7/items/e3e13b6fe2f32c4c6120