« 2007年5月 | トップページ | 2007年10月 »

2007年6月19日 (火)

USB入門

COMデバイス

ポチポチと Tiny2313 USB ファームの Windows ドライバを書いている。前回は(と言っても1月以上前になってしまったが)ほとんど「WindowsXPデバイスドライバプログラミング」のサンプル通りテストドライバを書いて見き動作を確認して見た。が、サンプル通りのコードを書いて見ても、今ひとつ WDM を自分の物にした気がしない。なので、1から自分で設計してみたい。

Usb04

 

 

 

 

 

 

 

 
作る物は Tiny2313 のBポートを USB を通して PC から入出力出する汎用 I/O みたいな物を作って見ようと思う。アプリケーションから WriteFile で出力した内容を Tiny2313のBポートに出力し、Bポートの内容を ReadFile で読み出す事が出来るシステム。
たったこれだけの事なのだが、実装を考えると意外とめんどくさい。まず、Write/Read するにはデバイスのハンドルを得る必要があり、ハンドルを得るにはデバイス名を指定して CreateFile を実行する必要がある。USB の様に同一デバイスが同時に接続される場合、デバイス名の重複やそれぞれの識別を考慮する必要がある。一般的には GUID を用いて、Windows側でデバイス名を作成し、アプリケーション側はこの GUID を用いてデバイス名に辿り着くコードを書く。

が、自分で書いてて何がなにやらよく解んない。

UUSBD や USBLIB などの汎用 USB デバイスドライバは、専用ライブラリを用意して、アプリケーション側でこのライブラリをリンクする事で、めんどくさそうなデバイス名の取得の問題を解決している。流石です。

が、もう少し簡単にデバイス名を取得できる方法を泥臭く考えて見る。
仮想COMデバイスである。かなりレガシーだし、アプリケーション側からどの COM?? なのか判別する方法はないが、GUID からデバイス名を生成するよりは簡単な気がする。

ということで、デバイスオブジェクトに COM ポートへのシンボリックリンクを張る方法を調べる。INF ファイルにデバイスをポートクラスとして記述する。この INF ファイルでデバイスをインストールするとレジストリのハードウェアキーに COM 名が作成されるので、この名前をこのデバイスオブジェクトの物理デバイスオブジェクトにリンクする。あとは、レジストリの

\HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOM

にデバイス名をキーとして、COM 名を登録すればいいらしい。

Usb05  

 

 

 

 

 

 

 
取り敢えず COM デバイスとして認識したようだ。
実際の Read/Write ルーチンはこれから書くよー。 

| | コメント (0) | トラックバック (0)

« 2007年5月 | トップページ | 2007年10月 »