USBプロジェクト - ファームウェアに立ち返る (13) [USB]
USB処理のためのステートマシンを設計します。 昨日の図を全面的に見直し、書き直しました。
状態遷移図
Tsuneoさんに書いてもらった、プログラムの断片から、状態遷移図を書いてみました。 しまった、初期状態が無いや。
IDLE状態で、SETUPトランザクションを検出したら、SETUPパケット解析を行い、リクエストの種類によって三つの状態に分岐します。 ここでは、HIDに最低限必要なリクエストだけを扱います。
コントロール読み出し転送
GET_DESCRIPTORやGET_REPORTなどのコントロール読み出し転送の場合、ep0InStart()で返送データを準備してから、READ_DATA状態に遷移します。 そして、全てのデータを送り終えたことをep0InCompleteで確認したら、READ_STATUS状態に遷移します。 STATUS-OUTトランザクションが終わった事をep0OutReadyによって確認したら、IDLE状態にもどります。
データ無しコントロール転送
SET_ADDRESSやSET_CONFIGURATIONなどのデータ無しコントロール転送の場合、ep0InStart()でSTATUSデータを準備し、NODATA_STATUS状態に遷移します。 そして、STATUS-INトランザクションの終了を待ちます。 STATUS-INトランザクションが終わったら、アドレス設定などの実際の処理を行い、IDLE状態に戻ります。
コントロール書き込み転送
SET_REPORTなどのコントロール書き込み転送の場合、WRITE_DATAに遷移します。 この状態では、ep0OutReadyがポーリングされます。 すべてのデータを転送しおえたら、ep0InStart()でSTATUSデータを準備し、WRITE_STATUS状態に遷移します。 この状態では、STATUS-INトランザクションの終了時に発行されるep0InCompleteがポーリングされます。 STATUS-INトランザクションの終了を確認したら、受信したデータを使った実際の処理を行い、IDLE状態に戻ります。
このシーケンス図では、SETUPパケットの解析に時間がかかりすぎたために、解析中に次のDATA-OUTトランザクションが到着しています。 SETUPとDATA-INは、別のバッファを持たせるつもりなので、このぐらいのタイミングであれば、正常に転送が行われるはずです。
こんなもんで、いいかな?
付録 : USBプロジェクト索引
- USBプロジェクト - ファームウェアに立ち返る (1)
- USBプロジェクト - ファームウェアに立ち返る (2)
- USBプロジェクト - ファームウェアに立ち返る (3)
- USBプロジェクト - ファームウェアに立ち返る (4)
- USBプロジェクト - ファームウェアに立ち返る (5)
- USBプロジェクト - ファームウェアに立ち返る (6)
- USBプロジェクト - ファームウェアに立ち返る (7)
- USBプロジェクト - ファームウェアに立ち返る (8)
- USBプロジェクト - ファームウェアに立ち返る (9)
- USBプロジェクト - ファームウェアに立ち返る (10)
- USBプロジェクト - ファームウェアに立ち返る (11)
- USBプロジェクト - ファームウェアに立ち返る (12)
- USBプロジェクト - ファームウェアに立ち返る (13)
- USBプロジェクト - HIDデバイス(1)
- USBプロジェクト - HIDデバイス(2)
- USBプロジェクト - HIDデバイス(3)
- USBプロジェクト - 複合デバイスを考えた
- USBプロジェクト - HIDデバイス(4)
- USBプロジェクト - HIDデバイス(5)
参考文献
USBハード&ソフト開発のすべて―USBコントローラの使い方からWindows/Linuxドライバの作成まで (TECHI―Bus Interface)
- 作者: インターフェース編集部
- 出版社/メーカー: CQ出版
- 発売日: 2006/07
- メディア: 単行本
USBターゲット機器開発のすべて―各種USBコントローラの使い方と基本ソフトウェアの作成法 (TECHI―Bus Interface)
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2005/08
- メディア: 単行本
>こんなもんで、いいかな?
いいとも! って、古い...
とりあえずバッファ組んでデータ転送のシーケンスをコードしちゃいましょう。
SETUPデータは実バッファを、
INエンドポイント用にはポインタとデータカウンタを充てておけばOKです。
SETUPのパーサー・実行はサブルーチンを呼ぶだけに止め、中身は後回しということで。
コントロール転送の種類の判別は、bmRequestTypeのMSBとwValueでできます。
データ転送のシーケンスが仕上がったら、付加的処理を組み付けていきます。
1) NAKing
2) STALL
3) ZLP
Tsuneo
by Tsuneo (2008-04-05 19:20)