Skip navigation.
ホーム
BLOG-ROMMER 日高のブログ

WinUSB と UWP の今後

古いUSBドライバーをWindows 10 で使いたい にも書いたが、WinUSB の問い合わせが今でも結構ある。それで先日、WinUSBの最新情報がどうなっているのかを見たところ、本家の内容の多くが Windows 8.1 時代のもので、チュートリアル・サンプルが手順通り進めてもビルドできないことを確認した。今回これをデバッグして、Issue を上げたのをきっかけに関連情報とともに記事にする。

デバッグ済 WinUSBサンプルプロジェクトはこちら

 



WinUSB Architecture and Modules

WinUSB は 2006年にWindows Vistaとともに導入されたWindows用の汎用USBドライバーである。今でもインストールパッケージを用意すれば、Windows XP SP2以降で利用できる。次の通り何回かインターフェース誌の記事でも取り上げてセミナーも実施している。しかし先日も「独自仕様のUSBの指紋認証ドライバーを開発するのは大変か?」などと聞かれたので、認知度はそれほど高く無いかも知れない。余談だが、Windows Hello で使うビジネス用指紋認証デバイスを作るにはWindows Hello for BusinessWindows Biometric Framework の知識が必要だが、質問者はそれらを知っていても、WinUSBを知らなかった。

過去のインターフェース誌の記事

過去のセミナー

WinUSBを使用すれば、独自の新しいUSBデバイスであっても、独自Windowsデバイスドライバーを開発せずに、アプリケーションからそのデバイスを利用できる。ただし実際のUSBエンドポイントとの入出力操作は、そのアプリケーションで記述する必要がある。汎用ドライバーの実体は、Windows 10では標準で入っているWinUSB.sysで、これをWinUSB.dllなどのAPIから操作する。

UWP

Windows PC 用のデスクトップ アプリの構築 のページによると、デスクトップ アプリのプラットフォームは、UWP, Win32, WPF, Windows Forms に分けられる。この中でUWPは、Windows 10 IoT Coreや HoloLens 等のUniversal Windows環境が唯一サポートしているアプリケーションアーキテクチャである。しかしながら .NET Core 3.x と.NET 5を含むフルの.NETではサポートされない。

UWP はMS-DOSから始まる互換性を重視するWindows アプリケーションの構造の歴史において、過去のしがらみを排除した異端児である。Windows 10 IoT Coreで大幅に拡充されたWindows.Devices Namespaceのクラスライブラリを使えばCOMポート番号無しでシリアルポートを使うことができるし、I2CやSPI等に接続するデバイスやUSBターゲット・バスのAPIがサポートされている。USBホスト機能は、内部構成上は WinUSB を採用しているのだが WinUSBのAPIではなく、windows.devices.usb を使用する。これを使用した UWPのUSBサンプルプログラムは下記で入手できる。

Custom USB device sample

以下が実際にこのサンプルUWPアプリを動作させた画面だ。

UWP には最近まで DeviceIoControl がサポートされていなかったため、従来のドライバーの多くが書き換えが必要であった。実質的にはPCIドライバーとほとんどの個別デバイスのUSBドライバーが利用できなかった。UWPでDeviceIoControl が使えるようになったのは、10.0.17763 Redstone 5 (RS5) 1809 からである。

.NET 5

.NET Core 3.1 ではすでにシリアル(UART)、GPIO, I2C, SPI, PWM等の IoT ライブラリ がGitHubで公開されている。先日公開された.NET 5 Preview と同じツリーなので共有されることになる。この中でUSB関係は、GPIOターゲットIFのFT4222 しか見当たらない。今後どうなるかが楽しみではある。

参考資料: .NET Core 3.1でハードウェアを制御する