// Copyright 2005 Doi Shigeki // list301.cpp LEDの点滅〜USB_IOを使った外部制御の基礎 // #include #include int VendorRequest(HANDLE , // デバイスドライバのハンドル BYTE, // データの方向 BYTE, // recepientパラメータ BYTE, // リクエストコード WORD, // Valueパラメータ WORD, // Indexパラメータ BYTE * , // データバッファへのポインタ int , // データバッファの大きさ DWORD * ); // 実際に転送されたバイト数が入る // 変数へのポインタ int SetPortConfig( HANDLE , // デバイスドライバのハンドル BYTE, // 動作モード BYTE, // ビットレート BYTE, // PEの設定 BYTE, // PDの設定 BYTE, // PCの設定 BYTE, // PBの設定 BYTE ); // PAの設定 int PIOWrite(HANDLE , // デバイスドライバのハンドル BYTE , // ポート指定 BYTE ); // 出力データ main() { HANDLE husb; int r; int i; printf("CQ_USBのテスト\n"); husb = CreateFile( "\\\\.\\Ezusb-0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); printf("ハンドル値 = %d \n",husb ); if( (int)husb < 0 ){ printf("USBデバイスがオープンできません\n"); return 0; } r = SetPortConfig( husb, 0, // PIOモード 0, 0,0,0,1,0); // PBのみ出力 printf("コンフィグレーション結果 = %d( 0以外:ok) \n", r); for( i = 0 ; i< 10 ; i++ ){ // 10回点滅,周期1秒 printf( "%d \n", i ); PIOWrite( husb, 1, 0x0f ); // ポートB へ 0xf を出力 Sleep( 500 ); // 時間待ち 500ミリ秒 PIOWrite( husb, 1, 0 ); // ポートB へ 0 を出力 Sleep( 500 ); // 時間待ち 500ミリ秒 } CloseHandle( husb ); } // // 動作モードの設定 // int SetPortConfig( HANDLE h, // デバイスドライバのハンドル BYTE Mode , BYTE Brate , // 動作モード,ビットレート BYTE PE , BYTE PD , BYTE PC , // 各ポートの設定 BYTE PB , BYTE PA ) { BYTE dat[2]; DWORD xfrlen; WORD IMode ; // 16ビット IMode = 0x4000 * (Mode & 3); IMode = IMode + (Brate & 7) * 0x400 + (PE & 3) * 0x100 + (PD & 3) * 0x40 + (PC & 3) * 0x10 + (PB & 3) * 0x4 + (PA & 3); return VendorRequest( h, 1, // 方向は 1 (device to host) 0, // recepientは 0 0, // PortConfigのコードは 1 IMode, 0, // パラメータ dat, 2, // データバッファ &xfrlen ); } // // ポート出力 // int PIOWrite( HANDLE h, BYTE Port , BYTE data ) // ハンドル,ポート指定,出力データ { BYTE dat[2]; DWORD xfrlen; Port = Port & 0x7; return( VendorRequest( h, 1, // 方向は 1 (device to host) 0, // recepientは 0 2, // 出力動作のコードは 2 data, Port, // パラメータ dat, 2, // データバッファ &xfrlen)); } // // ベンダリクエストの発行 // int VendorRequest(HANDLE h , // デバイスドライバのハンドル BYTE Dir_In , // データの方向 BYTE recepient , // recepientパラメータ BYTE bRequest , // リクエストコード WORD wValue , // Valueパラメータ WORD wIndex , // Indexパラメータ BYTE * buffer , // データバッファへのポインタ int dataLen , // データバッファの大きさ DWORD * NofXfr ) // 実際に転送されたバイト数が入る // 変数へのポインタ { // 以下の設定は ezusbsys.h にある.必要な部分を抜き出す. DWORD Ezusb_IOCTL_INDEX = 0x800; // EZUSB用IOCTL INDEX DWORD IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST = 0x220000 + METHOD_IN_DIRECT + (Ezusb_IOCTL_INDEX + 22) * 4; // ベンダ/クラスリクエスト用コード // ベンダリクエスト用の構造体 typedef struct _VENDOR_OR_CLASS_REQUEST_CONTROL { // transfer direction (0=host to device, 1=device to host) UCHAR direction; // request type (1=class, 2=vendor) UCHAR requestType; // recipient (0=device,1=interface,2=endpoint,3=other) UCHAR recepient; // paramaters. UCHAR requestTypeReservedBits; UCHAR request; USHORT value; USHORT index; } VENDOR_OR_CLASS_REQUEST_CONTROL; VENDOR_OR_CLASS_REQUEST_CONTROL myRequest ; myRequest.direction = Dir_In; myRequest.requestType = 2; myRequest.recepient = recepient; myRequest.request = bRequest; myRequest.value = wValue; myRequest.index = wIndex; return DeviceIoControl( h, // デバイス、ファイル、ディレクトリいずれかのハンドル IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST, // 実行する動作の制御コード (LPVOID)&myRequest, // 入力データを供給するバッファへのポインタ sizeof(myRequest), // 入力バッファのバイト単位のサイズ buffer, // 出力データを受け取るバッファへのポインタ dataLen, // 出力バッファのバイト単位のサイズ NofXfr, // バイト数を受け取る変数へのポインタ 0); // 非同期動作を表す構造体へのポインタ }