USB と EHCI
EHCI の日本語資料が少ない。Intel の資料を見れば英語だけどだいたいわかるか。
出版されている本ではなかなかそもそも USB の概略がわからない。一番良い資料は インタフェースの 2014 年の 12 月号の「USB 探偵団」なるものがわかりやすい。
世の中で EHCI をどうしたらよいか解説しているものはない。だいたい USB のホストのソフトも Linux 以外は見当たらない。
USB ルートハブ
通常の USB のチップは1つのコントローラに複数のポートがある。それらは(1つのコントローラの配下にあるから)1つの USB のネットワーク(?とはいわないかも)の集まりになる。複数のポートをまとめるのが USB のルートハブ。ハブだけど、インタフェースは個々のコントローラとのやり取りになる。ポートが一つだとハブとはいわないかもしれない。
USB ハブ
複数の USB を容易につなげるために、USB ハブの機能は必須。ハブの先のポートへのデバイスの挿抜に対応する必要がある。
セットアップ・パケット(パケットというのか?トランザクション?)
通常のパケットと違い、セットアップを受信したデバイスは動作中であってもそのセットアップに応答しなければならない。restart がかかったようなものだ。まぁなんだよくわからんが最初からみたいなことが USB ではできるようになっている。いいのか悪いのか知らないが。
EHCI の FS/LS
Full と Low のデバイスは EHCI で管理されているポートに接続されると通常、未接続になる。そこで、コントローラは EHCI ではなく OHCI か UHCI のインタフェースで USB1.1 相当のデバイスと通信をするような設計になっている。ただし、EHCI なのに FS/LS に接続可能なコントローラも存在する。
EHCI の Asynchoronous Schedule
ASYNCLISTADDR につながった HQ で管理される要求を一つ一つ実行していく。つながったリストは循環するようにできていて、終了すると済のマークがつく。このリストに対して要求をインサートやリムーブをすることで処理を実行する。コントローラはすべてのリストに済マークがつくと一旦、処理をやめてしまう"Complete" な状態になってしまうので、自転車操業的にインサートしていくことで処理が進む。処理の効率化のためには済んでしまった HQ を取り除くことが望ましい。処理をインサートした時はすでに Complete しているとスケジュールがなされないので、その際にはキックしてやらないといけない。インサート、リムーブはポインタを使うので ECHI の資料にある手順で行う必要がある。
この情報でとりあえず bulk 転送はできる気がする。
なんちゃって USB ホストを作る
目標。
- ポートの活性化
- アドレスの設定
- コンフィギャーの設定
- 各種情報の取得設定
先送り項目
- ルートハブ(使うのは1ポートに限定)
- ハブ(ハブはつながない)
- 割り込みも使わない
そのあとなんちゃって CDC をつくる。