2010年02月

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 | driver

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)driver | WinUSB

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)driver | WinUSB

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)WinUSB | driver

2010年02月25日

WinUSB を使おう7~Infファイル編(4)最終~

たどり着いた最終章

; ================= Source Media Section =====================

[SourceDisksNames]
1 = %DISK_NAME%,,,\i386
2 = %DISK_NAME%,,,\amd64
3 = %DISK_NAME%,,,\ia64

[SourceDisksFiles.x86]
winusbcoinstaller2.dll=1
WdfCoInstaller01009.dll=1
WUDFUpdate_01009.dll=1

[SourceDisksFiles.NTamd64]
winusbcoinstaller2.dll=2
WdfCoInstaller01009.dll=2
WUDFUpdate_01009.dll=2

[SourceDisksFiles.ia64]
winusbcoinstaller2.dll=3
WdfCoInstaller01009.dll=3
WUDFUpdate_01009.dll=3 ・・・(1)
; =================== Strings ===================

[Strings]
ProviderName="MyWinUsbTest"
・・・(2)
USB\MyDevice.DeviceDesc="Test using WinUSB only" ・・・(3)
WinUSB_SvcDesc="WinUSB Test"
DISK_NAME="My Install Disk"
ClassName="MyDeviceClass" ・・・(4)

やっと完了。
[Source]セクション
(1)は先ほど準備したDLLたちの格納先を示しています。
[String]セクション
やっとここの説明ですね
今まで出てきた「%%文字列%%」はここで定義されているのです。

(2)ずばりディバイスマネージャーで[プロバイダ名]として出力する箇所です。
(3)このDriverの名称です。狭義の意味ではWinUSB Driverなんですけどね。このInfファイルも含めて広義の意味で自分で名前をつけられます(えっへん!)
(4)これが
ディバイスマ ネージャーで表示されちゃうClass名です。

その他Stringもレジストリエディタで表示されたりする名称だったりします。

やっとinfファイルから開放されました。


ayuthky_m at 16:21|PermalinkComments(0)TrackBack(0)driver | WinUSB