WinUSB で USB デバイスと通信 1 - 概要

Posted Sun Sep 16 2012

今回から何回かに渡って,WinUSB を使用して USB デバイスと通信する方法ついて書きます.

実は7月の初めから,部署が移りまして組込み系のことをやっています.最初はH8のプログラムとかをちょろっと見てたんだけど,7月の終わりに上司にWindows 7 64bit 用のUSBドライバを作ってって言われ,その時に1週間ほど調査 & 実装などしました.

組込み経験もほぼ無く,デバイスドライバなんてもちろん作成したことがなかったので,どうなることかと思ったんだけど,意外と動かすだけなら簡単にいけました.

その時の覚書です.最終的に WinUSB を使用し,バルク転送ができるところまで確認しました.根本的なデバイスドライバ開発の知識は無いのでところどころ適当ですが,ご参考になれば幸いです.

意外と日本語の資料が少なく,動かす上で何をしなくてはいけないか明確に書いてある資料があまりなかったので,その辺について書いておきます.

デバイスドライバの作成とは

まず,いきなり USB のデバイスドライバを作ってくれと言われてイメージがわきませんでした.通常マウスとかキーボードとかを USB 接続するとOS 側で認識してくれるのですが,独自仕様の通信を行う場合には,OS側で勝手に認識してくれません.これを OS に認識させ,デバイスと通信を行うことが目的です.

こういった概念をいきなり突き付けられると,何をしたらいいか,わからなくなってしまうんだけど,結局のところデバイス間で通信を行うんです.だから他の通信にならって,デバイス間でプロトコル(通信規約)に従って通信方法を提供してあげればいいんですね.

USB の転送モードとしては,コントロール転送,バルク転送,インタラプト転送,アイソクロナス転送があります.それぞれのモードで転送速度や使用される分野が異なります.これらの転送モードを USB 機器側で実装するとと共に,接続する PC 側で同様の転送モードでアクセスする方法を提供すればいいんです.

デバイスドライバの作成方法について

Windows でデバイスドライバを作成する場合に,昔は WDM(Windows Driver Model) というフレームワークを使用していました.しかし現在は WDF(Windows Driver Foundation) というツールキットを使用しドライバを作成します.

WDF でドライバを作成する方法は下記の3種類があります

  1. WDF Kernel-Mode Driver Framework (KMDF)
  2. WDF User-Mode Driver Framework (UMDF)
  3. WinUsb.sys and WinUSB API

1 -> 3 に行くに連れてドライバの作成は簡単になりますが,できることが少なくなります.今回は3の WinUSB でデバイスドライバを作成します.

WinUSB の現在サポートしている転送モードと OS は下記のようになっています.下記以外の場合のモードや OS で実装する場合には KMDF, UMDF で作成する必要があります.

転送モード:

  • コントロール転送,バルク転送,インタラプト転送 (アイソクロナス転送はサポート外です)

OS:

  • Windows XP sp2 以降, Windows Vista 以降

行わなければならない作業をまとめると下記のようになります.

  1. USB デバイスでコントロール転送 or バルク転送 or インタラプト転送を実装
  2. WinUsb.sys をデバイスのファンクションドライバとしてインストール
  3. WinUSB API を使って通信を行います

今回の私の仕事で1はバルク転送で実装してあったのでとばします.なので次回から2,3について記述します.