東陽テクニカ社の CC/7700用 USB アダプタを Windows でテストするために 汎用 USB driver UUSBD を用いた。これは、その覚え書きである。
CC/7700用 USB アダプタの利用目的の一つに、 手軽に PC の USB ポートに差してCAMAC モジュールが扱えるという点が ある。そこで、Windows で手軽に扱える手段を探していたが、 柏野 政弘氏 による汎用 USB driver UUSBD なるものを見つけた。 筆者が実際に使用したのは、CQ出版社のインターフェース増刊 TECH-I Vol.8 "USBハード&ソフト開発のすべて"(2001年4月)に付属 していた Version 1.13 である。
このドライバはドライバのインストールには、CC/7700 USB アダプタの VendorID と ProductID が 必要である。CC/7700 USB アダプタの
ドライバー情報の確認は、Windows2000/XP の場合は、regedit を起動して、
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_0be3&Pid_0020を見ればよい。
ドライバーをインストールすれば、原理的にはアプリケーションプログラムから 使用可能になるが、デバイス名の指定が面倒なので、支援ライブラリが DLL (Dynamic Link Library) の形でドライバーと一緒に提供されている。 このライブラリ(uusbd.dll)を Windows のシステムフォルダに置くか、 または実行プログラムと同じフォルダに置く。 また、プログラム開発のためには、パッケージ内にある、
ドライバがあるので、この USB デバイス中にある各エンドポイントは、 最終的には Windows のファイルとして扱うことができるわけであるが、
例えば、CC/7700 USB アダプタには ID を示すロータリースイッチがついて いるが、この ID はエンドポイントの 2(0 基点、東陽テクニカのマニュアルでは OUT1)に対し、0x0e の1バイトのデータを送って、エンドポイントの 0 (東陽テクニカのマニュアルでは IN1)を読むと1バイトのID を示すデータが 読める(ことになっている)。
これを Microsoft Visual C++ で書くと、例えば、まず流れだけを示すために エラーチェック抜きで書くと
#include <stdio.h> #include "uusbd.h" #include "USB100.h" void main() { HUSB hUsb; HANDLE hIPipe; HANDLE hOPipe; DWORD lWritten; DWORD lRead; BYTE bOdat[2]; BYTE bIdat[2]; int i; for( i = 0; i < 2; i++ ) bOdat[i] = bIdat[i] = 0; hUsb = Uusbd_Open(); hIPipe = Uusbd_OpenPipe( hUsb, 0, 0 ); hOPipe = Uusbd_OpenPipe( hUsb, 0, 2 ); bOdat[0] = 0x0e; WriteFile( hOPipe, bOdat, 1, &lWritten, NULL ); ReadFile( hIPipe, bIdat, 1, &lRead, NULL ); printf( "Id is 0x%02x.\n", bIdat[0] ); CloseHandle( hIPipe ); CloseHandle( hOPipe ); Uusbd_Close( hUsb ); }のようになるだろう。一応実際に使うことを考えて、エラーチェックも つけるならば、
#include <stdio.h> #include "uusbd.h" #include "USB100.h" void main() { HUSB hUsb; HANDLE hIPipe; HANDLE hOPipe; DWORD lWritten; DWORD lRead; BYTE bOdat[2]; BYTE bIdat[2]; int i; for( i = 0; i < 2; i++ ) bOdat[i] = bIdat[i] = 0; if( (hUsb = Uusbd_Open()) == INVALID_HANDLE_VALUE ) { fprintf( stderr, "Cannot open UUSB device\n" ); return; } if( Uusbd_Check( hUsb ) != UU_CHECK_OK ) { Uusbd_Close( hUsb ); fprintf( stderr, "UUSB IOCTL error\n" ); return; } if( (hIPipe = Uusbd_OpenPipe( hUsb, 0, 0 )) == INVALID_HANDLE_VALUE ) { Uusbd_Close( hUsb ); fprintf( stderr, "Input pipe open error.\n" ); return; } if( (hOPipe = Uusbd_OpenPipe( hUsb, 0, 2 )) == INVALID_HANDLE_VALUE ) { CloseHandle( hIPipe ); Uusbd_Close( hUsb ); fprintf( stderr, "Output pipe open error.\n" ); return; } bOdat[0] = 0x0e; if( WriteFile( hOPipe, bOdat, 1, &lWritten, NULL ) ) { if( ReadFile( hIPipe, bIdat, 1, &lRead, NULL ) ) { if( lRead == 1) printf( "Id is 0x%02x.\n", bIdat[0] ); else fprintf( stderr, "Read Length mismatch. %d\n", lRead ); } else fprintf( stderr, "Read Error.\n" ); } else fprintf( stderr, "Write Error.\n" ); CloseHandle( hIPipe ); CloseHandle( hOPipe ); Uusbd_Close( hUsb ); }のように書けるだろう。 これを idcheck.c というファイルに書き出し、 コンパイル、リンクするには、 uusbd.lib を同一フォルダに置いてある場合は、
cl /W3 idcheck.c uusbd.libとする(uusbd.lib が別の場所にある場合は、環境変数 LIB で 指定しておくこと)。