// Copyright 2005 Doi Shigeki // list302.h USB関連の関数 //#include // // ベンダリクエストの発行 // 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); // 非同期動作を表す構造体へのポインタ } // // 動作モードの設定 // 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 PIORead( HANDLE h, BYTE Port , BYTE * data) { BYTE dat[2]; DWORD xfrlen; int sts ; Port = Port & 0x7; sts = VendorRequest(h, 1, 0, 3, 0, Port, dat, 2, &xfrlen); *data = dat[0]; return sts; }