現在ではUSBはパソコンの標準インターフェイスとなっています。もうUSBがついていないパソコンを探す方が大変かもしれません。
また、周辺機器側も、キーボード、プリンタ、USBメモリ、HDD、CD/DVD、デジタルカメラ等ほとんどの周辺機器がUSBインターフェイスを持っています。
以前では、デジタルカメラやUSBメモリをパソコンに接続した際に、「ドライバをインストールしてください」と言ったメッセージが表示されるものがありましたが、現在ではドライバをインストールすることなく、ほとんどのUSBデバイスがそのまま使えるようになっていると思います。メーカーが違ってもUSBメモリやたいていのUSBデバイスはわざわざドライバをインストールすることなしで使用できます。
そういった現在においても、USBデバイスを接続した際に、ドライバインストールのメッセージが表示される機器があります。
そこでどういったものがドライバのインストールが不要で、どういったものが必要なのかというと、ドライバのインストールが不要なものは、既にWindowsにインストール済みだからであり、ドライバのインストールが必要なものはWindowsにインストールされていないものだからです。
では、USBメモリ等は各メーカーからいろいろ発売されていますが、各メーカーのドライバがそれぞれWindowsにインストールされているのかというと、そうではありません。
USBの規格では各デバイスに応じて、通信プロトコルが規定 (
http://www.usb.org) されています。規定されているプロトコルはWindowsに最初からインストールされています。
USBデバイス側の設計者はそのプロトコルに沿ってUSBデバイスを開発することで、Windowsと通信して使用することが可能となります。つまり、規定されているデバイスのプロトコルに沿って作れば、Windows側のドライバの開発は必要ないのです。
しかし、すべてのデバイスのプロトコルが規定されているわけではありません。標準的な周辺機器であればたいていは規定されていますが、特殊な機能を組み込んだ周辺機器や、一般ユーザーが使わないような機器の場合には、自前でプロトコルを決めドライバを開発する必要があります。
では、どういったものが規定されていて、どういったものが規定されていないのかというと、それはUSB機器ごとにデバイスクラスとして定義されており、次のようなものが規定されています。
表 1 デバイスクラス
| クラス |
説明 |
| Hub |
ハブ |
| Audio Device |
音声と関連する制御を転送するデバイス |
| Chip/Smart Card Interface Device |
接触型ICカード/スマートカード(ISO/IEC 7816)仕様に適合するデバイス |
| Communications Device |
電話、モデムなど |
| Content Security |
デジタルコンテンツの保護や制御された配布をサポートする |
| Device Firmware Upgrade |
デバイス中のプログラム更新用 |
| Human Interface Upgrade(HID) |
キーボード、マウス、ジョイスティックなど |
| IrDA Bridge Device |
マザーボードにマウントしたIrDA(赤外線通信規格)トランシーバに代わるまたは補うもの |
| Mass Storage |
マスストレージ(CD/DVD、リムーバブルディスク) |
| Printer |
プリンタ |
| Imaging |
デジカメ、スキャナ |
上述のように表 1 デバイスクラスに規定されているようなデバイスであれば規格に沿って開発することで、ドライバ開発は必要ありません。しかし、ここにないようなデバイスを作る場合には、ドライバを別途開発する必要があります。
具体的には、競合メーカーとの差別化のため特別な処理を組み込み、標準プロトコルを拡張したデジカメやプリンタ、その他にはPLC(Programmable Logic Controller)やICE(In-Circuit Emulator)等、特殊なものを制御する機器などがあげられます。
RS-232Cで通信している既製品をUSBへ移行する場合には、USBドライバを開発する必要がある場合があります。弊社で開発したUSBドライバを例としてあげてみます。
以前にモーター制御を行うデバイスがあり、そのデバイスの制御/設定をWindowsソフトから行う既製品のリニューアルがありました。
主な目的は新機能追加と、デバイスとWindowsソフト間をRS-232Cで接続されていたものをUSBに置き換えるというものです。
RS-232CをUSBに置き換えるとなるといってもいろいろな方法がありますが、その開発では、新規機能追加のためデバイス側の基板再設計、Windowsソフトの再開発が決定していたため、デバイス側へ新規にUSBコントローラ搭載し、Windowsソフト側も新規に作成することとしました。
2.1 RS-232CのUSB化の種類
既製のPCとDevice間のRS-232C通信をUSB化するために考えられる方法は以下のものなどがあげられます。
表 2 RS-232CのUSB化
| No |
方法 |
内容 |
メリット |
デメリット |
| 1 |
RS-232C-USB
変換ケーブル |
PCとDevice間をRS-232C-USB変換ケーブルで接続する
<経路>
PC(USB)<-変換ケーブル->Device(RS-232C) |
| ・ |
Device側のソフト/ハード変更が不要 |
| ・ |
PC側もベンダ供給のドライバによってUSBポートがCOMポートと見えるためソフト変更が不要 |
|
| ・ |
変換ケーブル購入コストが高い |
| ・ |
RS-232C/USB変換で速度ロスが発生 |
|
| 2 |
RS-232C-USB
変換IC |
Device側のUARTをUSB UARTへ変換する
<経路>PC(USB)<-USBケーブル->Device(USB/RS-232C) |
| ・ |
Device側のソフト変更が不要 |
| ・ |
PC側もベンダ供給のドライバによってUSBポートがCOMポートと見えるためソフト変更が不要 |
| ・ |
変換ケーブル購入よりIC購入の方が安価 |
|
| ・ |
Device側のハード変更が必要
|
| ・ |
変換IC購入分コストUP |
| ・ |
RS-232C/USB変換で速度ロスが発生 |
|
| 3 |
再開発 |
Device側のソフト/ハードの再開発
<経路>PC(USB)<-USBケーブル->Device(USB) |
| ・ |
Device側の製作費が安価
|
| ・ |
RS-232C/USB変換が不要 |
|
| ・ |
Device側のソフト/ハード開発費が発生
|
| ・ |
PC側でカスタムドライバが必要な場合はその開発費が発生 |
| ・ |
デバイスマネージャーでUSB機器として表示される |
|
他にもいろいろ方法はあると思いますが、それぞれメリット、デメリットを見極めて、それぞれの案件に合ったものを採用することになります。
今回はモーター制御を行うデバイスですので、表 1 デバイスクラスのような標準的なデバイスクラスには当てはまりませんし、単純なマスストレージとしての使用のみであればよいのですが、それでは製品仕様を満たすことができなかったため、Windows側でもドライバを作成することになりました。
ここで、Windows側の開発においてUSB通信とRS-232Cとでは大きな違いがあります。
RS-232Cの場合だと、WindowsではRS-232Cとデータの送受信を行うドライバがAPIとして標準で用意されているため、ドライバの開発は必要ありません。そのためアプリケーションプロトコルの実装は簡単に行えます。
しかし、USBは上述のようにデバイスクラスが規定されているものでなければ、たいていはドライバやAPIが用意されておらず、まして独自のアプリケーションプロトコルを用いる場合には必ずなんらかのUSBドライバを用意する必要があります。
よって、今回はRS-232Cとほぼ同じAPIを提供するUSBドライバを作成し、既存アプリケーションプロトコルの実装を簡単に行うという方法で進めました。
2.2 WDMドライバの開発環境
Windowsのデバイスドライバ作成の仕方にはいくつかありますが、今回はWindows XPや2000で採用されているWDM(Windows Driver Model)として作成しました。
2.2.1 ドライバ構成
USBに関するWDMの階層は下図のようになります。
図 1 WDN USBドライバ階層構造
|
 |
以下に各ドライバの役割、流れについて簡単に説明します。
| A: |
(2)ホストコントローラドライバが(1)USBコントローラの制御を行います。 |
| B: |
(3)USBクラスドライバは、(2)ホストコントローラドライバを使って、バスの割り振りやプロトコルの解析等を行います。 |
| C: |
(4)USBHUBドライバはポートの初期化を行います。 |
| D: |
(5)Windows内蔵ドライバや(6)カスタムドライバは(4)USBHUBを経由してUSBデバイスと通信することになります。
標準でWindowsにインストールされている、デバイスクラスに規定されたドライバは(5)Windows内臓デバイスドライバの部分になり、規定されず、開発する必要があるドライバは、(6)カスタムドライバとなります。 |
| E: |
アプリケーションからは、Windows内蔵デバイスドライバ、カスタムデバイスドライバを呼び出すことによって、USBの機能を使用することが可能となっています。 |
2.2.2 開発環境
WDMドライバの開発は、Windows DDK(Driver Development Kit)やサードパーティ製のツールを使って作る必要があります。Visual
Basicでは作れません。(*.Visual C++ではコンパイル/リンクのみは可能。デバッグは不可)
今回はDDK、デバッガにはWinDbg(Microsoft製)を使っています。
開発にはドライバ実行用のターゲットPCと、デバッガ用のホストPCが必要となります。このPC間をシリアルケーブルで接続し、ターゲットPCでドライバを実行させ、ホストPCでそれをデバッグします。
Windowsのソフトといってもドライバ作成となると、組み込み系と同じようにクロス環境を用意する必要があります。
ドライバはカーネルモードで動作するので、ホストPCにてブレークを行うと、ターゲットPCのWindows自体が止まります。
ドライバに不具合があるとアプリケーションエラーではなく、ブルースクリーンが発生しますし、原因を特定できない時にはデバッグ版のWindowsをターゲットPCにインストールし、その上でドライバを実行させることもあります。
ここではWDMの詳しい説明については省略させていただきますが、ドライバ開発は、デスクトップアプリケーション開発に比べ手間がかかり、難易度もぐっとあがります。
しかし、一度汎用的なUSBドライバを開発すれば、別ソフトにもそのまま使用することが可能となります。
また、今回は既製品のデバイスと、新規Windowsソフトを接続させるという目的があり、そのため、RS-232CとUSBを設定ファイルから切り替えて使える汎用ライブラリの開発も同時に行うことも可能となりました。このことによって、既存デバイスを使ってのアプリケーションプロトコルのデバッグが可能となり、全体の開発効率を上げることにも貢献しました。