個人用メモ USB基本構造とデバイスドライバのデバッグ

WinUSBで根本的に間違っている箇所をいくつか発見した.
しかし全部ではないので, 基本から学びなおすことにした.

http://www.picfun.com/usb02.htmlを参考に
USBの構造を覚える.非常にいいサイトです.

Initialize_Device関数でOpenDevice関数を呼び,
OpenDevice関数でGetDevicePath関数が呼ばれているようなので,
main関数ではInitialize_Device関数だけを呼べばいいみたい.

バイスパスの取得ができているか確認する.
∟printfでパスが取得できていることを確認した.

OpenDevice関数でデバイスのファイルハンドルの取得確認.
∟うまくいっているようだ.

Initialize_Device関数
∟この関数がWinUsb_Initialize関数を呼んでいる.
 ∟WinUsb_Initialize関数はTRUEを返しているので, ここはうまく行っているようだ.
  ∟同じようにして調べてみると, 関数の最後までうまくいっているようだ.

うーん.うまくいっているようには見えないんだがなぁ.
TRUEが帰ってきている=うまくいっているとは考えないほうがいいのかもしれない.
とりあえず引き続き奮闘してみる.

Main関数でInitialize_Device関数の動作確認→Trueが帰ってくる

WriteToDevice関数について調べてみる
∟WinUsb_ControlTransfer関数はうまく動いているようだ.
∟WinUsb_WritePipe関数を呼び出してみる→FALSEが帰ってきた.

WinUsb_WritePipeがうまく行っていないみたいだ.

WinUsb_WritePipeは何を行っているか

WinUsb_WritePipe関数はパイプにデータを転送します

InterfaceHandle

WinUsb_Initializeが返したインタフェースハンドル
∟チェックしてみたがここは問題ないみたいだ.

PipeID

8ビットの値と7ビットのアドレスと指示ビットから成ります.
このパラメータはエンドポイントの記述子のbEndpointAddressに対応しています.
∟0が帰ってきているこれがうまく行っていない原因のようだ.
∟bEndpointAddress使っても0が出力される.なんでだ.
  ∟違う!bEndpointAddressに1を代入するのかああああああああ

できたw
わーいw

Buffer

転送データを含むcallerによって割り当てられたバッファ
∟うまく動いている

BufferLength

転送バイト数. この数はBufferのバイトで表現されるサイズ以下である

LengthTransferred

パイプに書かれた実際のバイト数を受けるULONG変数へのポインタ

原因はPipeIDがうまく行っていないようだ.

bEndpointAddressについて調べてみる

それから, USBの基礎知識を復習しました.
http://www.picfun.com/usb02.htmlを参考に
USBの構造を覚える.非常にいいサイトです.

ホスト-今回の場合はPC
ノード-今回の場合はデバイス
まずはこれ

システムレベルでの通信

デフォルトパイプを準備する.
コントロール転送を使って, コンフィギュレーションを行う.
コンフィギュレーションを行って,デバイスの使い方の設定情報をPCとデバイス間で通信する.
これで使用するパイプの本数や、転送モードなどの設定情報をPCがデバイスに要求し、
それを元にしてホストがデバイスの使用条件を設定します.

ここから既に間違えているような気がする.
確認して, 次に進む.


修正したコードでもWinUsb_WritePipeが失敗しているようなので,
そこをチェックする.

アプリケーションレベルでの通信

パイプには, PC側から転送するOUTとINがある.
コントロール転送を行うデフォルトパイプは双方向通信となっている.
WinUSBでデバイスと通信するときにはバルク転送を使う.←ここで詰まってる気がする.

エンドポイントとパイプ

エンドポイント0でコントロール転送が行われる.
これはうまく行われているみたい.やはりコンフィギュレーションのところか?
エンドポイントの番号はPC側で指定できる.