2011年2月22日火曜日

WinUSBを使ったSET_INTERFACEリクエスト

WinUSBを使って、SET_INTERFACEリクエストを発行する方法を調べてみた。

--(ここから)--

// デバイスインターフェース名を使ってUSBデバイスを開く。
HANDLE hFile = CreateFile();


// WinUSBハンドルで開く
WINUSB_INTERFACE_HANDLE hWinUSB;
WinUsb_Initialize(hFile, hWinUSB);

// 特定のインターフェースを指すWinUSBハンドルを得る
WINUSB_INTERFACE_HANDLE hInterface;
WinUsb_GetAssociatedInterface(hWinUSB, インターフェース番号, &hInterface);


// SET_INTERFACEを実行する
WinUsb_SetCurrentAlternateSetting(hInterface, alternate番号);

--(ここまで)--

エラー処理や後始末はすべて省いた。
最後のWinUsb_SetCurrentAlternateSetting()呼び出しで、実際にUSBバス上でSET_INTERFACEリクエストのトランザクションが発生するとは限らない。SET_CONFIGURATIONリクエストを実行した段階で、すべてのインターフェースは最初のオルタネートが選択された状態になっているので、現在と同じオルタネート番号を指定しようとしても実際にはトランザクションは発生せず、関数はTRUEを返すだけのようだ。

ちなみに、WinUsb_ControlTransfer()関数を使って同じようにSET_INTERFACEリクエストを実行してみようとしたが、何故かwIndexに指定したインターフェース番号の下位8ビットが00hに変更されて送信されるのでインターフェース=0以外にはSET_INTERFACEリクエストを送れなかった。

0 件のコメント:

コメントを投稿