【汎用USBドライバ】
USBをパソコン側で使うには、デバイスを認識し、制御するためのデバイス
ドライバが必要になります。
このデバイスドライバは自分で作るにはちょっと大事になりますので、ここは
先人の開発されたものを使わせて頂くこととします。
使用するのは、すでにあちこちの雑誌で紹介されている、柏野 政弘氏作の
「汎用USBドライバ」です。
このデバイスドライバ自身は下記からダウンロードできます。
★ USBD.DLLの概要(開発者である柏野さんのホームページ)
★ インターフェース2000年3月号(CQ出版社のホームページ)
また紹介記事は下記に詳細があります。
★ TECHI 「USBハード&ソフト開発のすべて」 インターフェース増刊
CQ出版社
【汎用USBドライバの概要】
USBドライバは、通常デバイス毎に開発が必要なデバイスドライバですが
汎用USBドライバは、それを単純化して、アプリケーションからのRead/Write
をそのままデバイスへのUSBの送受信コマンドとして送り出すものです。
つまり、ドライバは、デバイスに依存した処理は何もせず、単純にUSB通信
を実行しますので、私たちが自分で作成したデバイス用のドライバとして使い、
機能はすべてアプリケーション側で実現すれば、どのようなデバイスにでも
対応できることになります。
この汎用USBドライバは下記のようなモジュールで構成されています。
(1) 汎用デバイスドライバ UUSBD.SYS
デバイスドライバ本体で、これで実際のUSB通信を行いますが、デバイス
に依存した処理を含まない透過なドライバです。
(2) デバイス情報ファイル UUSBD.INF
デバイスをセットアップする際に必要となるデバイス情報ファイルで、ここに
作成したデバイスの、ベンダIDとプロダクトIDを追加記述する必要があり
ます。
追加の仕方はUUSBD.INFファイル中にコメントで説明してあります。
(3) API提供ライブラリ UUSBD.DLL
実際にアプリケーションからUSBデバイスドライバを使うときに便利なAPIを
提供するDLLで、Win32の標準的なDLLとなっているので、Visual Basic、
Visual C++、Delphi など色々なアプリケーション開発ツールから使うことが
可能です。
【提供API】
汎用USBドライバとUUSBD.DLLで提供されるアプリケーション用の関数の
中で、通常使用するAPIは下記となっています。
機 能 API 関数の形式 機 能 詳 細 USBデバイス
のオープンUusbd_Open( ) USBデバイスをオープンしてハンドルを取得する
汎用USBデバイスドライバを使っているデバイス
が見つからないときは、−1を返す。USBデバイス
のオープン
検索機能つきUusbd_Open_mask(flag、Class、
SubClass、Vendor、Product、
bcdDevice)検索条件に該当するUSBデバイスをオープンして
ハンドルを取得する。該当するデバイスが見つから
ないときは、−1を返す。
《検索パラメータ》
flag:以下のどれを検索条件にするか指定する
ORで複数条件指定可能
UU_MASK_CLASS、UU_MASK_SUBCLASS、
UU_MASK_VENDOR、UU_MASK_PRODUCT
UU_MASK_BCDDEVICE、UU_MASK_NO
Class:デバイスのクラスコード
SubClass:デバイスのサブクラスコード
Vendor:ベンダID
Product:プロダクトID
bcdDevice:デバイスリリース番号USBデバイス
のクローズUusbd_Close(husb) husbで指定されたハンドルのUSBデバイスを
クローズしシステムからはずす。パイプの
オープンUusbd_OpenPipe(husb、
interface_num、pipe_num)husbで指定されたUSBデバイスのエンドポイントに
アクセスするためのファイルハンドルを
取得する。
エンドポイントとパイプの番号は異なるので注意。
指定したエンドポイントが無い時は−1を返す。
このハンドルを使ってReadFile、WriteFileを行えば
USBデバイスにアクセスできる。
【インストール方法】
汎用USBドライバをインストールするには、下記の手順で行います。
(1) デバイス情報ファイルにユーザーのデバイスを追加する。
uusbd.inf ファイルがデバイス情報ファイルです。追加方法はこの
ファイルのコメントに記述されています。
追加個所は2ヶ所あります。それぞれ同じベンダーID、プロダクトIDと
します。このIDは個人使用であれば何でも構いませんが、デバイスで
設定しているものに合わせます。
(2) デバイスドライバのインストール
USBデバイスを接続すると、はじめて接続した場合には、ドライバ検索の
ウィザードが起動しますので、それに従ってインストールします。
途中で、要求されるINFファイルとUUSBD.SYSファイルの所在場所には、
実際に両ファイルがあるディレクトリを指定します。
あとはドライバが自動的にインストールされUSBデバイスがデバイスマネ
ージャに登録されます。
(3) UUSBD.DLLをWindows\system32にコピーする。
【使い方】
実際にアプリケーションから、USBドライバにアクセスする方法は下記のように
します。
これで、あたかもファイルシステムと同じような扱いでUSBデバイスが扱える
ことになります。
《基本的な使い方》
(1) USBデバイスをオープンする
Uusbd_Open( )関数か、Uusbd_opne_mask( )関数を使って目的のUSBデバイ
スをオープンし、デバイスハンドラ番号(husb)を取得します。
(2) パイプをオープンする
上記で取得したデバイスハンドラを使って、Uusbd_OpenPipe( )関数でパイプ
をオープンしパイプのハンドラ(handle)を取得します。
必要なパイプをすべてオープンしておきます。
(3) パイプハンドラを使ってUSBデバイスにアクセスする
ファイルシステムと同じあつかいとなりますので、下記のようにVBなどの
標準関数を使ってアクセスします。
・USBデバイスの指定パイプからのInput
ReadFile(handle、Buffer、Number、pNumber、pOverlap) 関数でアクセス
します。入力したNumberバイトのデータはBufferに格納されます。
・USBデバイスの指定パイプへのOutput
WriteFile(handle、Buffer、Number、pNumber、pOverlap) 関数でアクセス
します。
データはBufferからNumberバイトだけ送信されます。
(4) 終了時にはUSBデバイスをクロースする
Uusbd_Close( )関数を使って全てのパイプとデバイスをクローズします。
《実際の使用例》
下記は、USB接続のデータロガ-で使用した実際の例です。
(1) USBデバイスのオープン処理
まず、検索付きデバイスオープンでUSBデバイスを検索しデバイスハンドラ
を取得します。発見できなければ−1が返されるのでエラー処理をします。
発見出来たときには、4つのパイプをオープンしハンドラ値を取得します。
それぞれオープン出来なければ−1が返されるのでエラー処理をします。
パイプのハンドラには後で区別が付きやすい変数名を使います。
このデバイスのパイプはすべてバルク転送モードになっています。
(2) USBデバイスへのアクセス
実際にパイプがオープンできれば、そのハンドラを使ってデバイスにアクセス
します。
下記の例では、まずOUTパイプ1にコマンドを出力し、そのコマンドに対する
デバイスからの応答をINパイプ4から入力しています。
ReadFile、WriteFile関数はエラーが発生すると、0が返されるのでエラー処理
をしています。
(3) USBデバイスのクローズとプログラム終了
プログラム終了時点でUSBデバイスもクローズして、他で使えるようにフリー
の状態にします。
パイプを全部クローズしてから、デバイスをクローズします。
パイプのクローズには、VB標準関数のCloseHandle( )関数を使います。