汎用 USB driver UUSBD と TOYO CC/7700 USB adapter

(c) Copyright 2003 by Hirofumi Fujii
(10-July-2003)

はじめに

東陽テクニカ社の 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 アダプタは USB バルク転送のみなので、これが そのまま使用できる。

ドライバのインストール

ドライバのインストールには、CC/7700 USB アダプタの VendorID と ProductID が 必要である。CC/7700 USB アダプタの

である。UUSBD パッケージに含まれている uusbd.inf のファイル中にある これらを指定している箇所を上の値に変更する(各3箇所)。 この書き換えたuusbd.infuusbd.sys を 同一フォルダに入れて、管理者権限のあるアカウントで logon して CC/7700 USB アダプタをつなぐと、Windows がドライバを要求してくるので、このフォルダ を指定してインストールする。

ドライバー情報の確認は、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 で 指定しておくこと)。