「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
ソフテックだより 第5号 2005年11月2日 技術レポート「USBとRS232C・RS422との比較」では他の規格との比較、そしてソフテックだより 第7号 2005年12月7日 技術レポート「USB通信 プロトコル〜接続手順」ではUSBのプロトコルについて取り上げました。
今回は、USBに関連する技術として、WindowsのUSBドライバ、RS-232CからUSBへの移行について取り上げます。
現在では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機器ごとにデバイスクラスとして定義されており、次のようなものが規定されています。
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. デバイスクラス
上述のように表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ソフト側も新規に作成することとしました。
既製のPCとDevice間のRS-232C通信をUSB化するために考えられる方法は以下のものなどがあげられます。
No | 方法 | 内容 | メリット | デメリット |
---|---|---|---|---|
1 | RS-232C-USB 変換ケーブル |
PCとDevice間をRS-232C-USB変換ケーブルで接続する <経路> |
|
|
2 | RS-232C-USB 変換IC |
Device側のUARTをUSB UARTへ変換する <経路> |
|
|
3 | 再開発 | Device側のソフト/ハードの再開発 <経路> |
|
|
他にもいろいろ方法はあると思いますが、それぞれメリット、デメリットを見極めて、それぞれの案件に合ったものを採用することになります。
今回はモーター制御を行うデバイスですので、表1 デバイスクラスのような標準的なデバイスクラスには当てはまりませんし、単純なマスストレージとしての使用のみであればよいのですが、それでは製品仕様を満たすことができなかったため、Windows側でもドライバを作成することになりました。
ここで、Windows側の開発においてUSB通信とRS-232Cとでは大きな違いがあります。
RS-232Cの場合だと、WindowsではRS-232Cとデータの送受信を行うドライバがAPIとして標準で用意されているため、ドライバの開発は必要ありません。そのためアプリケーションプロトコルの実装は簡単に行えます。
しかし、USBは上述のようにデバイスクラスが規定されているものでなければ、たいていはドライバやAPIが用意されておらず、まして独自のアプリケーションプロトコルを用いる場合には必ずなんらかのUSBドライバを用意する必要があります。
よって、今回はRS-232Cとほぼ同じAPIを提供するUSBドライバを作成し、既存アプリケーションプロトコルの実装を簡単に行うという方法で進めました。
Windowsのデバイスドライバ作成の仕方にはいくつかありますが、今回はWindows XPや2000で採用されているWDM(Windows Driver Model)として作成しました。
USBに関するWDMの階層は下図のようになります。
図1. WDN USBドライバ階層構造
以下に各ドライバの役割、流れについて簡単に説明します。
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を設定ファイルから切り替えて使える汎用ライブラリの開発も同時に行うことも可能となりました。このことによって、既存デバイスを使ってのアプリケーションプロトコルのデバッグが可能となり、全体の開発効率を上げることにも貢献しました。
以上のように、USBのドライバがどのように分かれていて、どういった場合にドライバ開発を行う必要があるかをまとめてみました。
また、RS-232CからUSBに移行する方法がいくつかあります。今回紹介した方法以外にもいろいろ方法はあると思いますが、それぞれメリット、デメリットを見極めて、それぞれの案件に合ったものを採用することが必要です。
(H.K.)
関連ページへのリンク
関連するソフテックだより