SSブログ

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

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。