driver

2010年03月01日

WinUSB を使おう12~API編(4)最終~

あとはほとんどユーザ固有の使い方になってくると思うので特に記載するない様ではないと思いますが。

とりあえず
Control Transferと
Bulk/Interrupt Transferの使い方だけ

[Control Transfer]
BOOL __stdcall
  WinUsb_ControlTransfer (
    IN WINUSB_INTERFACE_HANDLE  InterfaceHandle,
    IN WINUSB_SETUP_PACKET  SetupPacket,
    IN PUCHAR  Buffer,
    IN ULONG  BufferLength,
    OUT PULONG  LengthTransferred,
    IN LPOVERLAPPED  Overlapped
  );

WinUSBだとPIPE制御系のは別APIで用意されてるので
使うとしたらVendorRequestを使う場合になるのでしょうかね

<引数の説明>
(1)WINUSB_INTERFACE_HANDLE・・・これは初期化で取得した「WinUSB Interface Handle」
(2)WINUSB_SETUP_PACKET・・・これが設定の要です。

typedef struct _WINUSB_SETUP_PACKET {
  UCHAR  RequestType;
  UCHAR  Request;
  USHORT  Value;
  USHORT  Index;
  USHORT  Length;
} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET;
もともとUSBのSETUP PACKET構造体をラッパーしてるようなものなので入れる内容は準拠してる。
Vendor Requestを送ると仮定すると重要なのは

a)RequestType
・・・これには送受信の向き(Host to Device)や
  タイプStandard、Class、Vendorなのかなどを入れる
  
b)Request
・・・Vendor固有のIOCTLとか入れられるとこと
 
c)Value
d)Index
・・・まぁまぁ設定に必要なものを入れますよ

e)Length
・・・設定するデータがある場合はその送るデータ長になる

3)Buffer・・・設定するデータのポインタ

4)BufferLength・・・設定するデータ長

5)LengthTransferred・・・戻りデータ長

6)Overlapped・・・非同期待ち設定構造体
これはWindows SDKのRead/Writeと同じように使うただし待っているのは
WinUsb_GetOverlappedResultを使う。あとCreateFileのところでFILE_FLAG_OVERLAPPEDにしとかないと使えません

という感じで。

[
Bulk/Interrupt Transfer]
BOOL __stdcall
  WinUsb_ReadPipe (
    IN WINUSB_INTERFACE_HANDLE  InterfaceHandle,
    IN UCHAR  PipeID,
    IN PUCHAR  Buffer,
    IN ULONG  BufferLength,
    OUT PULONG  LengthTransferred,
    IN LPOVERLAPPED  Overlapped
  );

BOOL __stdcall
  WinUsb_WritePipe (
    IN WINUSB_INTERFACE_HANDLE  InterfaceHandle,
    IN UCHAR  PipeID,
    IN PUCHAR  Buffer,
    IN ULONG  BufferLength,
    OUT PULONG  LengthTransferred,
    IN LPOVERLAPPED  Overlapped
  );

(1)InterfaceHandle
(3)Buffer
(4)BufferLength
(5)LengthTransferred
(6)Overlapped
・・・・上のはControl Transferと同じ

(2)PipeID
・・・・は初期化したときにWinUsb_QueryPipeで取得したPipeIDですね

これでInとOutを使い分けするとよいでしょう。

こんなアバウトな感じでWinUSBの忘却メモはおしまいです

苦情は平謝りするしかないので受け付けられませんが、
何かの助けになれば幸いです。


ayuthky_m at 11:30|Permalink

2010年02月26日

WinUSB を使おう11~API編(3)~

いやはややっと<初期化>できますよこれで

「CreateFile」で取得した「Device Object Handle」を
初期化API関数「WinUsb_Initialize」に食べさせてあげればいいわけです。

そして他のAPI関数はこの初期化関数で取得できた「WinUSB Interface Handle」(Device Object Handleとはちがいまっせ)
を食べさせてあげるしくみになっています。

これで違うDeviceがWinUSB Driverを使っても混線しないというわけですね。

あとはAPI編(2)で記載した
[初期化後 WinUSBと連携してるDevice情報を取得する関数]
たちをつかって情報を取得してあげて準備OKです。

ちなみに<終了>は
「WinUSB Interface Handle」を「WinUSB_Free」で
「Device Object Handle」を「CloseHandle」でさようならします。


ayuthky_m at 15:09|PermalinkComments(0)TrackBack(0)

WinUSB を使おう10~番外SetupAPI編~

なんでいきなり番外編かというと
ここでも実は難関が待ち構えているのです。

バイブル「WinUsb_howto.docx」の「Obtain a Handle to the Device and Initialize WinUSB」にもあるんですが

「infファイルで設定したDeviceinterfaceGUIDをつかってね」
ってな感じです。

いったいどうやるんだよって話で「SetupAPI」が出てきます。
Deviceは接続した時点でPnP Manegerが認識しています。
PnP ManegerからGUIDでお目当てのDevice情報を引っ張ってくる役目なのがこの「SetupAPI」ぽいですね。
そんなことが書いてあるのがこちら

ちなみDriverなしでもUSBの状態は「USBView.exe」で見れたりします。「WINDDK\BuildNumber\Debuggers」
使い方はこちらにかいてあるので参照ください。

手順的にはこうなります
(1)Setupapi.libをリンク
「WINDDK\BuildNumber\lib\OS別
(2)Setupapi.hをインクルード
「WINDDK\BuildNumber\inc\api」
(BuildNumberはDDKのVersionのことです)
この記事記載時は7600.16385.0です。


これで「DevicePath」が得られるわけです。

まっこれはバイブルのSampleコードかあるいはDDKのSampleコードを参考に作りましょう。

必ず必要ならいワンコールでOKなAPIを作ってほしいですよね。。。。(ぶつぶつ)なんだか面倒ですよこれ。
WDM時代からの負の遺産なのかな。

この「DevicePath」を「CreateFile」に渡してやっと「Device Object Handle」ができます!!!

ここの話はWindows Device Driver 共通の話ですね。




ayuthky_m at 14:48|PermalinkComments(0)TrackBack(0)

WinUSB を使おう9~API編(2)~

これでやっとWinUSBのAPIが使えるようになる準備完了

APIのリファレンスは
WinUSB User-Mode Client Support Routines
をきちんと読んで使いましょう。

ここではカテゴリ別に概要だけ

[初期化関数]
WinUsb_Initialize

[終了関数]
WinUsb_Free

[初期化後 WinUSBと連携してるDevice情報を取得する関数]
WinUsb_QueryDeviceInformation(Speedを取得)
WinUsb_QueryInterfaceSettings(interface descriptorsを取得)
WinUsb_QueryPipe(Endpointの情報を取得)

[bulk / interrupt pipe 読み書き関数]
WinUsb_ReadPipe
WinUsb_WritePipe

[control endpoint 制御関数]
WinUsb_ControlTransfer

[bulk / interrupt pipe 設定参照関数]
WinUsb_AbortPipe
WinUsb_FlushPipe
WinUsb_ResetPipe
WinUsb_GetPipePolicy
WinUsb_SetPipePolicy

[電源系の 設定参照関数]
WinUsb_SetPowerPolicy
WinUsb_GetPowerPolicy

<Deviceの戻りを非同期で待つ関数>
[Overlapped関数]
WinUsb_GetOverlappedResult

<Deviceに複数Interface だけ使うんじゃないかと思われる関数>
[Interface Descriptorの要素の設定参照関数]
WinUsb_SetCurrentAlternateSetting
WinUsb_GetCurrentAlternateSetting

[Deviceに複数Interface ある場合に明示的に参照する関数]
WinUsb_GetAssociatedInterface
[DeviceのDescriptorを明示的に参照する関数]
WinUsb_GetDescriptor

ここの記載はリファレンスをよんで自分的にカテゴリわけしたので
保障はしませんのでごめんなさい。



ayuthky_m at 14:48|PermalinkComments(0)TrackBack(0)

WinUSB を使おう8~API編(1)~

やっとWinUSBのインストールから開放された!
これからUSER.DLLを作成する準備です。

構成編で説明したように

実はまだWinUSB Driverは使えないのです。

WinUsb.lib(.dll)というUSER-MODE Driverを取り入れないといけません。

基本的にはバイブル「WinUsb_howto.docx」の「How to Use the WinUSB API」のパクリです。

では必要な手順
(1)WinUsb.libをリンク
XPは「WINDDK/BuildNumber/lib/wxp/i386」
Vista以降「WINDDK/BuildNumberl/ib/wlh」

(2)WinUsb.hをインクルード
「WINDDK/BuildNumber/inc/ddk」

(3)Usb100.hをインクルード
「WINDDK/BuildNumber/inc/ddk」
(BuildNumberはDDKのVersionのことです)
この記事記載時は7600.16385.0です。

とりあえずこれをおさえておけばWinUSBのAPIが使えるようになるはずです。


ayuthky_m at 14:42|PermalinkComments(0)TrackBack(0)