So-net無料ブログ作成
検索選択

USBプロジェクト - ファームウェアに立ち返る (13) [USB]このエントリーを含むはてなブックマーク#

1475712

USB処理のためのステートマシンを設計します。 昨日の図を全面的に見直し、書き直しました。

状態遷移図

UsbControlHandlerState.png

Tsuneoさんに書いてもらった、プログラムの断片から、状態遷移図を書いてみました。 しまった、初期状態が無いや。

IDLE状態で、SETUPトランザクションを検出したら、SETUPパケット解析を行い、リクエストの種類によって三つの状態に分岐します。 ここでは、HIDに最低限必要なリクエストだけを扱います。

コントロール読み出し転送

UsbControlInTransferSequence.png

GET_DESCRIPTORGET_REPORTなどのコントロール読み出し転送の場合、ep0InStart()で返送データを準備してから、READ_DATA状態に遷移します。 そして、全てのデータを送り終えたことをep0InCompleteで確認したら、READ_STATUS状態に遷移します。 STATUS-OUTトランザクションが終わった事をep0OutReadyによって確認したら、IDLE状態にもどります。

データ無しコントロール転送

UsbControlNoDataTransferSequence.png

SET_ADDRESSSET_CONFIGURATIONなどのデータ無しコントロール転送の場合、ep0InStart()でSTATUSデータを準備し、NODATA_STATUS状態に遷移します。 そして、STATUS-INトランザクションの終了を待ちます。 STATUS-INトランザクションが終わったら、アドレス設定などの実際の処理を行い、IDLE状態に戻ります。

コントロール書き込み転送

UsbControlWriteTransferSequence.png

SET_REPORTなどのコントロール書き込み転送の場合、WRITE_DATAに遷移します。 この状態では、ep0OutReadyがポーリングされます。 すべてのデータを転送しおえたら、ep0InStart()でSTATUSデータを準備し、WRITE_STATUS状態に遷移します。 この状態では、STATUS-INトランザクションの終了時に発行されるep0InCompleteがポーリングされます。 STATUS-INトランザクションの終了を確認したら、受信したデータを使った実際の処理を行い、IDLE状態に戻ります。

このシーケンス図では、SETUPパケットの解析に時間がかかりすぎたために、解析中に次のDATA-OUTトランザクションが到着しています。 SETUPDATA-INは、別のバッファを持たせるつもりなので、このぐらいのタイミングであれば、正常に転送が行われるはずです。


こんなもんで、いいかな?

付録 : USBプロジェクト索引

参考文献

USBハード&ソフト開発のすべて―USBコントローラの使い方からWindows/Linuxドライバの作成まで (TECHI―Bus Interface)

USBハード&ソフト開発のすべて―USBコントローラの使い方からWindows/Linuxドライバの作成まで (TECHI―Bus Interface)

  • 作者: インターフェース編集部
  • 出版社/メーカー: CQ出版
  • 発売日: 2006/07
  • メディア: 単行本

nice!(0)  コメント(1)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 1

Tsuneo

>こんなもんで、いいかな?
いいとも! って、古い...

とりあえずバッファ組んでデータ転送のシーケンスをコードしちゃいましょう。
SETUPデータは実バッファを、
INエンドポイント用にはポインタとデータカウンタを充てておけばOKです。
SETUPのパーサー・実行はサブルーチンを呼ぶだけに止め、中身は後回しということで。
コントロール転送の種類の判別は、bmRequestTypeのMSBとwValueでできます。

データ転送のシーケンスが仕上がったら、付加的処理を組み付けていきます。
1) NAKing
2) STALL
3) ZLP

Tsuneo
by Tsuneo (2008-04-05 19:20) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。