USBを試してみたのですがなぜかEHCIのレジスタが見えないので、気分を変えてSPIを試してみました。
FreeBSDのSPIドライバーはコマンドとデータのバイト列を送受信する関数一本で実装されています。
おそらSPIドライバはSPI Flash(mx25l)と一緒に開発されたので、そうなったのだと思います。
Flashを認識するためのIdentはコマンドの送受信だけで処理されて、データの読み込みは、コマンドとデータの送受信で処理されます。
BCM3383のコードを探してみたところ、AtherosやMediatekと同じように古いタイプの仕組みと新しいFIFOを使った処理がありました。
FIFOは512バイトと非常に大きいです。おそらくこれはMX25などのFlashのセクターサイズに合わせたものと思われます。
設定レジスタやFIFOは複数用意されていていますが、あまりうまい使い方が思いつかないし、Broadcom自身のコードでも1本しか使っていません。チップ屋さんとドライバ屋さんは永久に分かり合えないのだと思います。
チップ屋さんはいろいろ機能考えたけど、ドライバ屋さんが使ってくれないと思ってるし、ドライバ屋さんはチップや屋さんは無駄なもの作ってと思ってる。
レジスタの定義でPINGPONGというのがあったのですが、SPIは送信と受信を一緒にするので、そう定義したのだと思われます。
とりあえず書いてみたら、一日でIdentが拾えるようになってうまくいったと思ったらデータの読み込みが出来ていませんでした。
いろいろ試したところBCM3383の転送は一つの処理を複数に分けて処理する事が出来ないようです。
なので、他のドライバーではコマンドとデータの処理を別々にしていたのをまとめて1回で処理するようにしました。
これだと、flashの処理に依存したSPIドライバになるので、あまり塩梅がよくないのですが、ぼちぼち調べてみたいと思います。
1回の転送がFIFOの長さの512バイト以上出来ないのは、ありえないようなきするのだが。
FreeBSDのFlashアクセスでは512以上の読み込み処理があったので、512を繰り返してよむようにしました。
BCM3383のSPIモジュールは、BCM6816,BCM6362と同様のようです。
BCM3383の処理はbcmHsSpi.cで行われていて、BCM3380はbcmLegSpi.cで行われていました。