個人用メモ 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側で指定できる.