HTTP/1.1 200 OK Date: Sun, 24 Jul 2011 15:49:53 GMT Server: Apache/1.3.34 (Unix) PHP/4.3.11 mod_gzip/1.3.26.1a mod_layout/3.2.1 X-Powered-By: ModLayout/3.2.1 Connection: close Content-Type: text/html
The G2 bus was examined from the following doubts.
以下の疑問点から G2 バスを調べました。
1) Is byte alignment possible ?
バイトアライメントは可能か?
2) Is the long word access possible ?
ロングワードアクセスは可能か?
3) Can the access time be controlled ?
アクセスタイムはコントロールできるのか?
4) Possibility of BBA clone
BBA クローンの可能性
G2 バス上で新たに判明した信号や既に判明している信号名称を変更した部分について少し説明します。 更にこれらの解析内容をを反映させた G2 バス上のインタフェース設計例を別項で掲載します。 /DRQ1, /DRQ2, /DRQ3: 9pin, 8pin, 7pin (DMA request input: active low) G2 バスの DMAコントローラをハードウエアトリガモードに設定した時の各チャンネル CH1/CH2/CH3 に対応した DMAリクエスト端子です。(CH0 は SPU 用) DMA の実験等詳細はここを見てください。 /MODEMCS: 5pin (modem enable: active low) この信号は以前にも観測していましたが、他の動作とかなり違っていたので SPU 側をアクセスした時の動作だと 考えていました。結局 modem や lan adaptor [HIT-0300] の為の簡易バスモード用信号である事がわかりました。 0xa0600000 - 0xa06007ff の範囲をアクセスするとこの信号がアクティブになりシンプルバスモードになります。 (名前はモデムアダプター用チップセレクト端子という事で /MODEMCS と名付けました) /IRQA, /IRQB: 6pin, 13pin (interrupt input: active low) modem adapter や lan adapter [HIT-0300] に使われている割り込み信号はすでに DanPotter 氏が /IRQA (6pin) であると解析されていたので、他の割り込み入力信号がないか以下の方法で探しました。 G2 バス上の割り込み入力信号の状態は 0xa05f6904 番地の interrupt bit map register に反映されています。 このレジスタの状態をループで表示する簡単なプログラムを走らせた状態で G2 バス上の未解明の端子に 1KΩの抵抗を介して GND に接続する方法でレジスタの値が変化する場所を探しました。 数ヶ所調べたところで BBA [HIT-0400] が使用する /IRQB (13pin) を発見する事ができました。 他にも無いか調べましたが今の所この /IRQA /IRQB の 2本だけのようです。 (ちなみに /IRQA /IRQB という名称は私が区別する為勝手に付けた名前です) /LBE /WR: 14pin (lower byte enable output: active low / direction output) この信号は bITmASTER 氏が dir と名づけた信号ですが、direction 情報以外に下位バイトのイネーブル信号も 兼ねている事が分かりました。(偶数か奇数番地に対するバイトアクセスをした時のこの信号の変化から分かります) 但し、0xa0600000 ベースのアドレス空間だけはバイトアクセスが禁止されているので信号の意味が変化します。 /MODEMCS がアクティブの時は簡易バスモードになり /WR ライトイネーブル信号の働きをします。 /UBE /RD: 16pin (upper byte enable output: active low) この信号は bITmASTER 氏が /dataen と名づけた信号ですが、上位バイトのイネーブル信号である事が分かりました。 (偶数か奇数番地に対するバイトアクセスをした時のこの信号の変化から分かります) 但し、0xa0600000 ベースのアドレス空間だけはバイトアクセスが禁止されているので信号の意味が変化します。 /MODEMCS がアクティブの時は簡易バスモードになり /RD リードイネーブル信号の働きをします。 /BTA, /BTB: 22pin, 20pin (access time control / burst transfer input: active low) この信号の説明は少し長くなります。 まず bITmASTER 氏ベースの回路を弄っている時の最初の疑問がバスのアクセス時間の長さです(1uSEC 以上もあります)。 G2 バスのスピードはもっと速いはずです。当初は 0xb4000000 ベースのアドレス空間だけが特別低速用に設定されている と解釈しましたが BBA で使われるアドレスに変更してもバスのアクセス時間は変化しませんでした。 何処かにアクセススピードを制御する信号があると判断して BBA の動作中の信号を観察するとこの /BTA /BTB (22pin 20pin) 信号が怪しいことが分かりました。 実験した結果この /BTA /BTB にアクノリッジパルスを返す事でバスサイクルが終了する事が分かりました。 バイトかワードアクセス時はこの /BTA /BTB 端子へ同時に同じ長さのパルスを返しますが、ロングワード時は ワード転送2回分のバスサイクルの為少し複雑なシーケンスが必要になります。 さらに DMA 転送時はロングワードのシーケンスを繰り返すバースト転送になります。 結果的にロングワードアクセスや DMA 転送に対応するには適切に /BTA /BTB 信号をコントロールする必要があります。 ちなみに bITmASTER 氏ベースの回路で観測した 1.2uSEC のバスアクセス時間は /BTA /BTB 信号を返さない時の G2 バス側のバスアクセスタイムアウト時間と言う事になります。 (この信号名称は bus termination と burst transfer から /BTA /BTB と命名しました) /RESET: 46pin (reset output: active low) 電源(3.3v) の立ち上がりとこの信号の立ち上がりの時間を比較すると負論理のリセット信号である事が分かります。 (このリセット信号はシリアルポートの 9番ピンにも接続されています) これらの解析結果から 1) - 3) の疑問は解決できました。 まだ 4) に関しては現在実験中です。 BBA 内の用途不明なレジスタが多くある事も原因の一つですが RTL8139C の為に PCI バスインターフェースが 必要である事がさらに問題を複雑にしています。(PCI バスに関してはフリー IP を利用する事も考えましたが 仕事にも役立つので勉強も兼ねて一から作っています) 仮に BBA クローンが完成しても LAN コントローラのインターフェースだけの為に FPGA が必要になるというのは かなりオーバースペックでコスト的にも見合わないと考えています。 (セガの BBA クローンを作らせない為の G2 <=> PCI ブリッジ IC はかなり成功していると言えるでしょう。) 追記:モデムで使われるアドレス空間のバスの挙動についてはまだ謎が残っています。 少なくともアドレス空間によってバスの動作は異なります。 これまで調べてきたバスの動作は下の 1) のアドレス空間です。 1) 0xa1001400 - use BBA (HIT-0400) 0xb4000000 - G2 ex. device area 2) 0xa0600400 - modem / lan adaptor (HIT-0300) この空間にアクセスした時 /AEN 信号は出ません。/LBE /UBE 信号の動作も異なります。 また /BTA /BTB 信号も使われていないようです。 (発売当初からモデムは付属していたことからモデムのアドレスデコードがらみの回路を簡略化 出来るような専用のバスモードになっているのではないかと考えられます。) 追記:実験した結果やはりこの modem / lan adaptor [HIT-0300] に使われる空間は簡易バスモードになっていました。 この空間にアクセスすると /AEN は使われず /MODEMCS (5pin) が使用されます。データバスは多重化されず AD[15:8] は 8 bit のアドレス専用バス、AD[7:0] は 8 bit のデータ専用バスになります。 この時 /UBE 信号は /RD リードイネーブル /LBE 信号は /WR ライトイネーブル の働きをします。 この空間は byte/word/long アクセスが可能ですが、ロングワード境界でアクセスする必要がありアクセスサイズに かかわらず常に最下位バイトのみが有効になります。(8bit データバス) この空間の範囲は狭く 0xa0600000 - 0xa06007ff の 2K バイトでした。 (ロングワード境界に配置する為 512 バイトになりますがアドレスラインが 8本なので実質 256 バイトの空間) アクセスタイム (/MODEMCS の幅) は約 200nSEC あります。 (分かってしまえば単純なバスモードですが、この結論に達するまで随分長い時間が掛かってしまいました) この簡易バスモードの検証に lan adaptor HIT-0300 クローンを作ってみました。 実は他の通常の G2 バスモードのアドレス空間では動作していましたが本来の 0xa0600400 ベースのアドレス空間 ではバスモードの違いから動かせずしばらく放置していました。 オリジナルの HIT-0300 では MB86967 が使われていますが、同系列の MB86964 を使用しました。 LAN コントローラ周りを一から配線するのが面倒なので MB86964 を使った PCカード (FMV-J182A) を流用しています。 (ID コードの違いと serial EEPROM インターフェースが無い部分は CPLD 側で補っています。 ちなみに MB86964 は既にディスコン、MB86967 は現状入手困難{事実上のディスコン}なのでその石が 使われている LAN カード等の製品から流用するしかないようです。) 動作検証は今のところ ip-upload 1.0.4 と KOS network sample soft のみです。 追記:MB86967 が使われている REX-R280 という LAN カードを入手したので MB86967 版の HIT-0300 クローンも検証してみました。 (MB86967 を使用した場合リセットポートレジスタを追加するだけなので CPLD 内の回路は 非常に簡単になります。ついでに汎用ロジック IC のみを使用した回路も検証しました。) MB86967/MB86964 10Base-T のトランスについて質問があったのでここに書いておきます。 MB86967 の場合は一般的なフィルター内臓の 20F001N 等が使えますが、MB86964 の場合フィルターは送受信ともに LANコン側に内蔵されており、さらに送信側のトランスの巻線比が 1 対 1.4 と特殊になっています。 実際に使われているトランスを覗いて見ると受信側 10T:10T 送信側 10T:14T でトロイダルコアにまかれていました。 MB86964 の場合トランスが特殊ですがフィルター無しセンタータップ無しの簡単なトランスなので自作する事も可能です。 (ライン側のセンタータップはサージノイズ対策で高耐圧のコンデンサ(2KV/0.01u)をフレームグランドに 接続する為にありますが、工場のようなよほどの電磁気ノイズのある環境でなければ省略しても問題ありません。 ノートPC(PCカード)等有効なフレームグランドが確保できない場合も省略されている事が多いです) 追記:簡易バスモードについて、まだ疑問が残っています。 システムクロックに同期した通常の G2 バスモード(同期バスモード)では /BTA /BTB 信号によってバスの アクセスタイムをコントロールできますが、簡易バスモード(非同期バスモード)では今のところアクセスタイムを ハード的にコントロールする方法が見つかっていません。恐らく簡易バスモード用のウエイトコントロール端子が G2 バスの未解明の端子の中に存在していると思われます。 (G2 バスに関係する何処かのレジスタを設定しないとウエイトコントロールが有効にならないのかもしれません) 私は本物の lan adapter HIT-0300 を所有していませんが、恐らく LAN コントローラからのバスウエイト信号は G2 バスの何処かの端子へ接続されていると考えています。現状の HIT-0300 クローンでは LAN コントローラから のバスウエイト信号を使用していませんが、今のところ特に問題はありません。(個人的には納得していませんが) BBA clone その後: これなら入るだろうと以前仕事で使って余った EPF6016AQC-208 を搭載し、パケットバッファー用に高速キャッシュメモリーを 積んで始まった BBA クローンですが、HIT−0300 クローンで中断して以来仕事が忙しくて PCI バス周りの配線が手付かずでした。 現在再開して PCI バス周りの配線 が終わり、デバッグ用に設けたコンフィグ用ポートを通してコンフィグレーションレジスタへの 読み書きが出来ています。 ここで現時点で推測する BBA 内の構造と私が考えているクローンの違いについて少し書いておきます。 私の推測ですが、BBA の場合パケットバッファー(32KBytes)へのアクセスは全て PCI バス経由でアクセスしていると考えています。 それは例のマジックコードによる RTL8139C のコンフィグレーションが終了しないとパケットバッファーのメモリ空間が現れない という事から来ています。 (コンフィグが終了するまで PCI バスのアクセスを禁止している?もちろん RTL8139C のベースアドレスを設定しなければ RTL8139C は見えませんが、バッファーメモリは見えても良いはずです。) 私が作ろうとしているクローンの場合、RTL8139C がバスマスターになって DMA 転送する為の PCI バスから見えるバッファー空間 と G2 バス側から見えるメモリー空間のために 2ポートメモリ構成を採っています。 この場合のメリットは、RTL8139C がパケットバッファーへバースト転送をしている間 RTL8139C へのレジスタアクセスにより 一時バースト転送は中断しますが、パケットバッファーへのアクセスは PCI バスのバスサイクルを中断することなくアクセス することが出来ます。 デメリットは 2ポートメモリ構成の為回路が複雑になることです。 (PCI バス上でのバースト転送も 2ポートメモリに同期させる必要がある) 本当は 32bit幅のバッファーメモリーがあれば回路的にはすっきりしますが、現状は 8bit x 32768 の SRAM を 2つで 16bit 幅 で使っています。RAM ビット 32KBytes 分のメモリが確保できる FPGA という選択肢もありますが、実験としてはそちらの方が楽 ですがなるべく現実的な構成にしています。 それとは別に、相変わらず用途不明のレジスタについては謎のままです。 KOS や NetBSD のソースから読み解こうとしていますが、どうもブラックボックスへ定数を設定しているだけのように見えます。 最終的には KOS や NetBSDでは動くけど、BBA 対応の正規のソフトでは動かないかもしれません。 (希望的観測として 2ポートメモリ構成が、それら不明なレジスタを必要としない事になるのではないかと?あまい?) 現在 FPGA の 70%前後の LE 使用量でフィッティングに時間が掛かかる為、一時 2ポートメモリ構成を止めて PCIバス経由でのみ パケットバッファーへのアクセスが出来る 構成 で 実験 しています。 PCI マスターも PCI スレーブ側もいちよう期待通り動いているようですが、RTL8139C がバスマスターになってパケットバッファー をアクセスする辺りに問題があるのか、現状で dc-load を起動すると BBA と認識、MACアドレスも正しく 認識 され idle 状態に なっていますが ping や dctool -r 等に反応出来ない状態。RTL8139C がバスマスターになってパケットバッファーへ盛んに アクセスしている事はオシロで確認できますが、まだ PCI バス周りに問題があるかもしれません。 現在実装している BBA のレジスタマップ (0x010016xx 番地のレジスタは現在未実装) // device map: (physical address) // 0x01001400-0x0100140f: "GAPSPCI_BRIDGE_2" strings {read only} (16bytes) // 0x01001410-0x01001413: 0x0c003000 ??? {read only} (4bytes} // 0x01001418-0x0100141b: magic code register {long access only} (4bytes) {RTL8139C config sequence} // write: 0x5a14a501 {config start} / read: bit[31:1] '0', bit[0] - config done bit // 0x01001420-0x01001423: register ??? (4bytes) {register only} // 0x01001424-0x01001427: register ??? (4bytes) {register only} // 0x01001428-0x0100142b: register ??? (4bytes) {register only} // 0x0100142c-0x0100142f: register ??? (4bytes) {register only} // 0x01001700-0x010017ff: {PCI} RTL8139C registers (256bytes) {after config} // *0x01001800-0x01001803: pci_ad[31:0] {read only} (4bytes) {for debug} // *0x01001804-0x01001805: pci_cbe[3:0] {read only} (2bytes) {for debug} // *0x01001806-0x01001807: configuration address register (2bytes) {for debug} // *0x01001808-0x0100180b: {PCI} configuration data register (4bytes) {for debug} // 0x01840000-0x01847fff: {PCI} packet buffer (32Kbytes) 現状の問題点: dc-load を走らせた状態でしばらく放置すると RTL8139C がバスマスターの状態で frame:hi irdy:low で パケットバッファーからの応答待ち状態のまま PCI バスが固まる。これは PCI スレーブ(packet buffer 側) が fast back to back に正式に対応していなかった為、バスアービターの切り替えのタイミングによって はバスアイドル状態のない連続バスアクセスでスレーブ側が応答できなかった。(これは修正) 現在それなりに動き出してはいますが、何回か大きなファイル送受信している内に動作がおかしくなります。 こける直接の原因は G2 バス側のバスタイムアウト 1.2uSEC にあります。 そのタイムアウトになるまえに要求された PCI バスアクセスを終わらせなければいけませんが、その為 PCI バスアービターで 2つのマスターを切り替えるタイミング(RTL8139Cではマスタレイテンシの値) や packe buffer のスレーブ側から disconnect 要求でバスを一時開放させるタイミング等を調整して ますが、なかなか思うようにいかないというのが現状です。 (何かまだ根本的な問題が隠れているのかもしれません。 FPGA のフィッティングに時間が掛かるのも デバッグが進まない要因、もっと大きな FPGA 使えば良かったかな。) BBA clone circuit について: 回路図といっても G2 bus / PCI bus / SRAM が FPGA に繋がっているだけですが、いつも の癖でまだ全体の回路図は書いていません。(いちよう大雑把な 回路 は書きました) (PCI バスの配線をした時は何所かで見つけた PCI コネクタ図を参考にしてました) クロックはスキューの問題があるので G2 バスのクロック 25MHz をバッファーは使わず ダンピング抵抗のみで FPGA と PCI バスへ分配しています。 リセットは G2 バスのリセットと FPGA の CONF_DONE 信号を CR の時定数で少し遅らせた 信号とで OR して PCI バスのリセット信号と FPGA で使うリセット信号にしています。 高速 SRAM は 3.3V 用が手持ちに無かったため 5V 用(KM688257AJ-10) を使っています。 PCI バスは 5V/3.3V 兼用のピン配置を使っているため電源には 5V を供給しています。 (I/O 電源として 3.3V もいちよう配線してあります。RTL8139C を搭載した多くの LAN カードでは 5V 電源からレギュレータで 3.3V に落としているようです) PCI バスでは実質パリティー回路は無くても問題無いと思いますが、自身が出すべきパリティ の為にいちよう出力はしてますが、相手の出すパリティは未チェック、それに伴って PCI バスの perr# serr# ピンは未使用(プルアップ抵抗のみ、RTL8139C コンフィグ時にコマンド レジスタの parity error response / serr ビットはオフにしています)。 magic code register (0x01001418) について: このレジスタは RTL8139C に対してコンフィグレーションを行なう為にあります。 このレジスタへ 0x5a14a501 のマジックコードを書き込むと内部でコンフィグレーションの シーケンスが始まります。コンフィグが終了したかどうかは同じレジスタを読んで bit0 が '0' ならコンフィグ中 '1' ならコンフィグ終了です。 (きっぱり書いてますが、BBA を調べた時 KOS や NetBSD のソースコードを見て RTL8139C に対するコンフィグレーションが何所で行なわれているかみつけられなかった為、もうこの マジックコードレジスタへのアクセスしかないと思いました。カスタム IC 内部の動作ですが BBA を開けて RTL8139C の frame(PCI) 端子でも観測すれば確かめられると思います。 ちなみにこのコンフィグ終了のフラグは BBA 内部で PCI バスへのアクセスを有効にするか無効に するかを制御しているようです。恐らくコンフィグシーケンス中、他の PCI バスへのアクセスと 衝突しないようにする配慮だと考えられます。) (追記:ハブのリンクランプの挙動から気がつきましたが、単なる PCI バスアクセスの有効無効だけではなく マジックコードを受け付けるまで PCI バス上のリセット信号はアクティブになったままのようです。 但し BBAクローンでは汎用 PCI バスとしても使いたいので現状のパワーオンと FPGA の CONFIG_DONE だけで PCI バスのリセット信号とします。) 私の場合はコンフィグレーション空間にある マスタレイテンシ値 / メモリベースアドレス / コマンド のレジスタを設定しています。(ちなみにデバッグ用に使われていないと思われる 0x01001806-0x0100180b 番地にコンフィグ空間への窓口を設けてあります。) A part of Fitter report under experiment. (under experiment: bba_clone.gif bba_clone.v / 0 1 2 3 4 5 6 7 8) +----------------------------------------------------------------------+ ; Fitter Summary ; +-----------------------+----------------------------------------------+ ; Fitter Status ; Successful - Tue Apr 22 18:19:45 2008 ; ; Quartus II Version ; 4.1 Build 208 09/10/2004 SP 2 SJ Web Edition ; ; Revision Name ; bba_clone ; ; Top-level Entity Name ; bba_clone ; ; Family ; FLEX6000 ; ; Device ; EPF6016AQC208-3 ; ; Timing Models ; Production ; ; Total logic elements ; 928 / 1,320 ( 70 % ) ; ; Total pins ; 121 / 171 ( 70 % ) ; +-----------------------+----------------------------------------------+ +--------------------------------------------------------------------------------------------------------------------------+ ; Fitter Resource Utilization by Entity ; +-----------------------------+-------------+---------+------+--------------+--------------+-------------+-----------------+ ; Compilation Hierarchy Node ; Logic Cells ; LC Regs ; Pins ; LUT-Only LCs ; Reg-Only LCs ; LUT/Reg LCs ; Carry Chain LCs ; +-----------------------------+-------------+---------+------+--------------+--------------+-------------+-----------------+ ; |bba_clone ; 928 (557) ; 337 ; 121 ; 591 (356) ; 22 (2) ; 315 (199) ; 30 (0) ; ; |g2_bus:g2bus| ; 112 (112) ; 40 ; 0 ; 72 (72) ; 1 (1) ; 39 (39) ; 15 (15) ; ; |pci_arbitration:pciarb| ; 5 (5) ; 3 ; 0 ; 2 (2) ; 0 (0) ; 3 (3) ; 0 (0) ; ; |pci_master:pcimas| ; 83 (83) ; 47 ; 0 ; 36 (36) ; 2 (2) ; 45 (45) ; 0 (0) ; ; |pci_prity:pcipar| ; 12 (12) ; 1 ; 0 ; 11 (11) ; 0 (0) ; 1 (1) ; 0 (0) ; ; |pci_slave:pcisla| ; 159 (159) ; 45 ; 0 ; 114 (114) ; 17 (17) ; 28 (28) ; 15 (15) ; +-----------------------------+-------------+---------+------+--------------+--------------+-------------+-----------------+ FPGA configuration: 最近コンフィグレーションROM は安くなっていますが、FLEX6000 の場合対応する ROM がワンタイムで 書き換えが出来ない為、安価な ANALOG DEVICES 社の ADuC7021 (ARM CPU) を使ったコンフィグレータ を考えました。 (実験では ADuC7019 を使ってますが、回路図では ADuC7021 にしてあります。ADuC7021 にした理由は シリーズで一番安価な為。7019 と7021 ではアナログピン周りのピン配置が若干違っています。) とりあえずこんな感じ。I2C ポート以外に念の為 JTAG 端子と予備に4本の GPIO ポートを引き出してあります。 拡張子 .rbf のコンフィグレーションバイナリ−ファイルを I2CW で書き込みます。 (ADuC7021 のプログラムコードや FPGA コンフィグデータを書込む専用のプログラムにしました。fcnfw I2C ケーブルにブートモードをコントロールする信号を追加。 i2c_cable(simple version)) FPGA configurator: resource: circuit i2c_cable(simple version) fcnfw pic 1st step: fcnfw -x ... write configuration program (ADuc7021) write configuration data: altera: fcnfw filename.rbf ... .rbf LSB first format (altera) (xilinx: fcnfw filename.bin ... .bin MSB first format (xilinx)) monitor LED: (FPGA configuration) normal: turning off at normal termination. error: internal error or connected error with FPGA when blinking.
[G2 bus 50pin]
1 : +5V
2 : +5V
3 : +5V
4 : +5V
5 : /MODEMCS * modem enable {output} (modem / lan adaptor [HIT-0300] area enable)
6 : /IRQA * interrupt request A {input} (used modem unit / lan adapter [HIT-0300])
7 : /DRQ3 * DMA request CH3 {input} (G2 DMA request for CH3 (when hardware trigger mode))
8 : /DRQ2 * DMA request CH2 {input} (G2 DMA request for CH2 (when hardware trigger mode))
9 : /DRQ1 * DMA request CH1 {input} (G2 DMA request for CH1 (when hardware trigger mode))
10 : GND
11 : GND
12 : GND
13 : /IRQB * interrupt request B {input} (used BBA [HIT-0400])
14 : /LBE /WR * lower byte enable {output} (direction / lower byte enable / write enable (when active /MODEMCS))
15 : ???
16 : /UBE /RD * upper byte enable {output} (upper byte enable / read enable (when active /MODEMCS))
17 : +3.3V
18 : +3.3V
19 : +3.3V
20 : /BTB * bus termination B {input} (access time control / burst transfer)
21 : /AEN * address enable {output} (address enable / bus cycle start)
22 : /BTA * bus termination A {input} (access time control / burst transfer)
23 : GND
24 : GND
25 : AD15 *
. . * AD[15:0] {output/input} (address / data multiplexed 16bit bus)
. . * 25pin to 40pin (AD[15:8] 8 bit address bus / AD[7:0] 8 bit data bus (when active /MODEMCS))
40 : AD0 *
41 : GND * (guard GND of system clock)
42 : GND * (guard GND of system clock)
43 : CLK * system clock {output} (25MHz)
44 : GND
45 : GND
46 : /RESET * system reset {output}
47 : GND
48 : GND
49 : ???
50 : ???
thank's bITmASTER and Dan Potter
1) G2 bus mode
byte or word access:
/AEN -__--------------
/BTA -------_---------
/BTB -------_---------
ADxx aADDDDD D: byte data (AD[15:8] or AD[7:0]) or word data (AD[15:0])
/xBE -_______--------- /LBE and /UBE (lower byte enable / upper byte enable)
long word access:
/AEN -_______---------
/BTA -------_----_----
/BTB -------______----
ADxx aAdddddDDDDD d: low word data D: high word data
/xBE -____________---- /LBE and /UBE (lower byte enable / upper byte enable)
-: one step equal one system clock cycle (40nSEC)
a: low word address (A[15:1] lsb 1bit alway '0' {A[0]})
A: high word address (A[28:16] msb 3bit always '0' {A[31:29]})
(There is a possibility that the address overlaps when the SPU side is accessed
when the decipherment is done only with low word address.)
G2 bus 22pin / 20pin ('/BTA' and '/BTB') controls the access time. (see concept circuit)
If this control is not used, it ends automatically by the time-out (1.2uSEC).
When a long word is accessed, it is always necessary.
(It becomes only the bus cycle of lower word if it doesn't control.)
direction information of '/LBE': (read / write operation)
read operation:
CLK __--__--__--__--_
/AEN --________-------
/LBE ------___________ direction (read) / lower byte enable
/UBE ------___________
write operation:
CLK __--__--__--__--_
/AEN --________-------
/LBE --_______________ direction (write) / lower byte enable
/UBE ------___________
* this timing is word access
2) simple bus mode (modem / lan adaptor [HIT-0300] area {0xa0600000 - 0xa06007ff})
byte/word/long read access:
AD[15:8] aaaaaaaaaaaaa a: 8 bit address bus (AD[15:8])
/MODEMCS ---__________----
/UBE(/RD) -----_______-----
/LBE(/WR) -----------------
AD[7:0] DDDDDDDDD D: 8 bit data bus (AD[7:0])
byte/word/long write access:
AD[15:8] aaaaaaaaaaaaa a: 8 bit address bus (AD[15:8])
/MODEMCS ---__________----
/UBE(/RD) -----------------
/LBE(/WR) -----_______-----
AD[7:0] DDDDDDDDD D: 8 bit data bus (AD[7:0])
access is long word alignment.
only the lowest byte is valid though byte/word/long can be accessed. (In fact 8bit bus)
spec of 'g2usb': (G2 bus <=> USBN9603 interface version 3) device address mapping: (byte align) 0xB4000000: USBN9603 data register 0xB4000002: USBN9603 adrs register 0xB4000001: GPIO port register (6bit GPIO port (read/write)) 0xB4000003: CONTROL register bit[7] 'irqen' enable flag (read/write) bit[6] 'intp' status (read) bit[5:0] GPIO direction IN:1 / OUT:0 (read/write) interrupt: use /IRQA device access time: 160nSEC (use /BTA /BTB control) device enable/disable logic: (for internal reset) enable: write word MAGIC code disable: write long word MAGIC code magic code: 0x4b46 (my initial name 'KF')g2usb circuit: g2usbn9603_3.gif
about USBN9603: USBN9603 is a slave controller of USB. (It is not possible to use it as a host controller.) example of USB device: USBN9603 slave controller SPI/parallel interface SL811HST host/slave controller parallel interface MAX3421 host/slave controller SPI interface (The bus interface of SL811HST is also almost the same as the case of USBN9603.)
spec of RTL8019AS LAN Adapter:
device mapping: (byte access only)
0xb4000040 - 0xb400007e: RTL8019AS registers {even address} (lower byte mapping)
0xb4000041: ID code 1 register '0x80' {read only} (upper byte mapping)
0xb4000043: ID code 2 register '0x19' {read only} (upper byte mapping)
0xb400007f: control register {read/write} (upper byte mapping)
bit[7] interrupt enable {active high} (read/write)
bit[6] interrupt status {active high} (read only)
bit[5:1] not use {read always '00000'}
bit[0] reset {active high} (read/write)
interrupt: use /IRQA
device access time: 200nSEC (use /BTA /BTB control)
(When RTL8019AS is accessed, it is extended by the state of 'IOCHRDY' terminal.)
lan adapter circuit: lanadp8019.gif 10baset_transWhy 8bit bus (RTL8019AS) ? Wiring can be a little. Lan adapter (HIT-0300) is 8bit bus base. Low cost. Why RTL8019AS ? Because there was a stock.
spec of AX88796BLF LAN Adapter:
device mapping: byte mapping (word access is only in the Remort DMA port)
0xb4000100 - 0xb400013f: AX88796 registers (80186 bus mode)
0xb4000140: ID code 1 register '0x87' {read only}
0xb4000141: ID code 2 register '0x96' {read only}
0xb4000142: control register {read/write}
bit[7] interrupt enable {active high} (read/write)
bit[6] interrupt status {active high} (read only)
bit[5:1] not use {read always '00000'}
bit[0] reset {active high} (read/write)
interrupt: use /IRQA
AX88796BLF LANモジュールについて問い合わせがあったのでここに書いておきます。
これは仕事で作った物ですが、本番の基板が出来るまで DREAMCAST の G2バスに接続して
ドライバーのテストをしていました。残念ながら回路図書いてませんが、LANモジュール
自体は ASIX のユーザマニュアルそのままで G2バスとの接続はアドレスデコードに CPLD
(G2バスステートマシーン&アドレスデコード)、データバスはバッファー入れずに 16bit
直結(3.3V系)です。それから LANコン側の設定は 80186バスモードです。
(当初間違ってDMAポートをバイトアクセスして若干はまりましたが、問題なく動作しました。
ちなみに AX88796BLF に対応した DCTOOL も移植しました。)
回路図を書くのが面倒なので CPLD のソースだけ乗せておきます。
(AX88796BLF の SA0 は G2バスの LBE(14pin: lower byte enable)に接続)
追記: AX88796BLF LAN アダプターの転送速度について
残念ながらせっかくの 100BASE-TX 接続時でも 10BASE-T 時とほぼ同じくらいの転送速度でした。
(BBA(HIT-400) 使用時の約 1/2 のスピード)
ある程度予想はしてましたが、G2バス上のデバイスへのプログラムループによるデータ転送
は制御されたアクセスタイムとは別にサイクルタイムの周期が約 1uSEC あるためです。
(サイクルタイムの 1uSEC は恐らくSH4 <=> G2bus バス回路に存在する速度差吸収の FIFO
バッファー、DMA等バス使用権を獲得するまでの待ち時間だと思われます。ちなみに DMA時の
転送バイト数、32バイトの倍数というのは恐らく FIFOの段数に起因していると思われます)
BBAとの転送速度の違いは、AX88796BLFへのデータポートが16bit幅なのに対してBBAの場合
内部PCI上のメモリをG2バス上に写像させた空間に1回のバスアクセスでロングワード32bit
幅で転送(memcpy)できる為です。(BBA使用時のdc-toolはDMA未使用)
ちなみにG2バスの転送速度 50Mbytes/SEC という値は一回のバスアクセスでウエイト無しの
バースト転送ができる DMA転送を行った時のスピードになります。
これも回路図を書く元気がでない原因でもあります^^;
追記:
別件のいたずらでこの CPLD のコード眺めてたら思いっきりミスってました。
end pulse を出してるつもりがデータステートからエンドステートに移行する際
bus_end <= 1'b0; の一行書き忘れてました。
(最低速なバススピード!しっかりオシロで確認しなかった初歩的なミス。
目的がパケット送受信の基本動作で、スピード気にしてなかった。)
一行書き加えて転送速度見ると BBA に負けてますが 8割程度のスピードでした。
このままでは面白くないので Remort DMA port をロングワードアクセスで
2回のワードアクセスに変換する改造を加えたところ BBAより1割ほど高速でした^^;
ちなみにこれは IDEインターフェースの PIO転送の高速化にも応用できます。
(劇的なスピードアップにならないのはこの辺りがソフト転送の限界です)
あとは本物の DMAに対応するアイデアもあるんですが、今度時間が空いたときに
でも試してみようと思います。
追記:
AX88796BLF LAN adapter for G2 bus を DMA対応に出来ました。
SA5 FIFO に対して直接デバイスアドレス固定のDMAが出来ればベストでしたが
SH4側のDMAコントローラはBIOS初期化の状態のまま使いたかったので1パケット
分の架空のメモリ空間を設定して、その空間へのDMAをLANコン側のバースト転送
にすりかえる方法をとりました。(トグルラインは SA1 を使用)
(アドレスオートインクリメントか固定かをSH4側でしか設定できないのか
それともG2バス側のDMAコントローラでも設定できるのか不明。
どちらの方法でもCPLD側の回路はそれ程変わりません)
DMA転送のスピードはライトでは問題ありませんがリードでエラーが出たので
1ウエイトいれて2クロック分の80nSECにしました。結局 25MBytes/sec です。
(バスバッファー入れると1clockでもいけるかもしれません)
// Speed-up of software data transfer. (Long word access to DMA port register)
// (Other registers except the DMA port are the byte accesses.)
// Word access:
// ---__---- AX88796BLF csn/rdn/wrn {word(80nSEC)}
// -_------- aen
// ----_---- btan/btbn
// 013226000 state number
// Long access: (convert long access => 2times word access)
// ---__-__- AX88796BLF csn/rdn/wrn {low word(80nSEC),separator(40nSEC),high word(80nSEC)}
// -____---- aen
// ----_--_- btan
// ----____- btbn
// 013223226 state number
//
// G2 DMA transfer. (AX88796BLF SA5 FIFO burst transfer)
// (The DMA transfer to a specific memory space is converted into the burst transfer to AX88796BLF.
// specific memory space: 0xb4000180 - 0xb40007ff (Only the space is reserved.))
// --________ ______- AX88796BLF csn/rdn/wrn (data(80nSEC)*n words (25MBytes/SEC))
// __-------- ------_ AX88796BLF SA5 (hi: enable FIFO burst transfer)
// ____--__-- --__--_ AX88796BLF SA1 (toggle)
// -_________ ____--- aen
// ---_-_-_-_ -_-_-_- btan
// ---_______ ______- btbn
// 0145454545 4545456 state number
それにしてもG2バスのDMAコントローラについては、まだ分からない事
だらけです。
以下に私が確認しているDMA転送について少し書いておきます。
G2バスのDMAについて
私が理解しているG2バス上のデバイスに対するDMAの方法です。
但しG2バス上の未解明の端子にあると思われるDMAリクエスト端子は使わず
ソフトウエアトリガでDMAを実行します。
(G2バス上のデバイスは long access / burst transfer に対応するため
BTA/BTB (22pin/20pin) 信号の制御が必要です。)
下のコードはG2バス上にメモリを置いてDMAを実験した時の物です。
(BBAクローンで実験していた基板です)
元は bitmaster氏が書いた SPU側への DMAを行うサンプルコードを参考に
必要最小限のコードにしてあります。
(SH4 側のDMAコントローラは BIOSが初期化した状態のままです。
G2バス側のDMAコントローラもなにやら MAGICコードがありますが
特にいじらなくても問題ありません)
各レジスタ G2バス側のアドレス/システムアドレス/サイズ/ディレクション
(各アドレスレジスタは32バイトのアライメントでサイズは32の倍数)
DMA_MODE には 0 でソフトウエアトリガと解釈しました。
DMA_ENABLE を ON にしてから
DMA_START を ON にする事で DMA が開始します。
DMA の終了は DMA_START の同じビットが 0 になるのを待ちます。
(DMA_SIZE の MSB を 1 にしておくとDMA 終了時 DMA_ENABLE は 0)
#define G2_DEV 0xb4000000 // G2バス上に置いた64KbytesのSRAM
// G2 DMA (CH0) control register
#define DMA_CONT_BASE 0xa05f7800
#define DMA_EXT_ADRS (*((volatile ulong *)(DMA_CONT_BASE+0)))
#define DMA_SYS_ADRS (*((volatile ulong *)(DMA_CONT_BASE+4)))
#define DMA_SIZE (*((volatile ulong *)(DMA_CONT_BASE+8)))
#define DMA_DIR (*((volatile ulong *)(DMA_CONT_BASE+12)))
#define DMA_MODE (*((volatile ulong *)(DMA_CONT_BASE+16)))
#define DMA_ENABLE (*((volatile ulong *)(DMA_CONT_BASE+20)))
#define DMA_START (*((volatile ulong *)(DMA_CONT_BASE+24)))
static void dma_transfer(uchar *buf, int len, int dir)
{
DMA_EXT_ADRS = G2_DEV & 0x1fffffe0; // G2 device address
DMA_SYS_ADRS = (ulong)buf & 0x1fffffe0; // buffer address
DMA_SIZE = ((ulong)(len + 31) & ~31) | 0x80000000; // length / auto dma disable
DMA_DIR = dir; // direction (0:sys to dev / 1: dev to sys)
DMA_MODE = 0; // software trigger
DMA_ENABLE = 1; // enable dma
DMA_START = 1; // start dma
while (DMA_START & 1) // wait DMA end
;
}
G2バスのDMAチャンネルは全部で4つありますが、残りの3つのチャンネルでも
同じようにソフトウエアトリガで DMA転送可能です。恐らくDMA_MODEに対して5を
設定するとそれぞれチャンネル毎に割り当てられたハードウエアリクエストに対応
してDMAが可能になると想像してます。チャンネル0 は SPU用で、あとは未解明の
G2バスのDMAリクエスト端子です。
(恐らく G2バス<=>SPU や G2バス<=>BBA(PCIbridge)のバスインターフェースには
FIFO バッファーがあり、その FIFO バッファーが空かどうかのフラグが DMAリクエスト
信号として使われていると思います。)
追記: 2011/6/28
G2 バス上の DMAリクエスト端子が判明しました。
G2バスで未解明の端子は残り少ないですが、3個所並んで空いてるピンで外部トリガの
実験してみたところビンゴでした。
7pin: /DRQ3 * DMA request CH3 {input} (G2 DMA request for CH3 (when hardware trigger mode))
8pin: /DRQ2 * DMA request CH2 {input} (G2 DMA request for CH2 (when hardware trigger mode))
9pin: /DRQ1 * DMA request CH1 {input} (G2 DMA request for CH1 (when hardware trigger mode))
実験は AX88796BLF lan adapter 用に移植した dc-load-ip を改造して試しました。
CPLDに DMAリクエスト信号を出力するポートを追加してトリガモードをハードトリガモードで
各チャンネル毎に端子を変更、対応するチャンネルで DMA転送が動作する事を確認しました。
以下のリストはその時の DMA転送部分の関数です。
上記のソフトウエアトリガモードと違う点は
DMA_MODE モードを 5 に設定
DMA_ENABLE を ON にしてから
DMA_START を ON にしてチャンネルに対応したG2バス上の /DRQX 端子が low になると
DMA が開始します。
DMA の終了は DMA_START の同じビットが 0 になるのを待ちます。
DMA 終了後 /DRQX 端子を hi にします。
(DMA転送中 /DRQX 端子は low を維持する必要があります。今回の実験ではソフト側で
/DRQX をコントロールしていますが、実際は DMAリクエストを要求するハード側から必要な
データ数に達するまで /DRQX 端子を low に維持するという動作になります)
(注: DMA転送はキャシュと実メモリとの不整合を防ぐ為システムメモリをキャッシュの
効かない P2エリアで使うか DMA実行前にキャッシュをフラッシュする操作が必要です)
#define DMA_CH 1 // G2 DMA channel (0 - 3)
#define DMA_CONT_BASE (0xa05f7800+(DMA_CH * 32)) // G2 DMA (DMA_CH) base address
#define DMA_EXT_ADRS (*((volatile ulong *)(DMA_CONT_BASE+0))) // external memory address
#define DMA_SYS_ADRS (*((volatile ulong *)(DMA_CONT_BASE+4))) // system memory address
#define DMA_SIZE (*((volatile ulong *)(DMA_CONT_BASE+8))) // dma count
#define DMA_DIR (*((volatile ulong *)(DMA_CONT_BASE+12))) // dma direction
#define DMA_MODE (*((volatile ulong *)(DMA_CONT_BASE+16))) // dma trigger mode
#define DMA_ENABLE (*((volatile ulong *)(DMA_CONT_BASE+20))) // dma enable
#define DMA_START (*((volatile ulong *)(DMA_CONT_BASE+24))) // dma start
static void dma_transfer(uchar *buf, int len, int dir)
{
DMA_EXT_ADRS = DMA_AREA & 0x1fffffe0; // CPLD DMA area address
DMA_SYS_ADRS = (ulong)buf & 0x1fffffe0; // buffer address
DMA_SIZE = ((ulong)(len + 31) & ~31) | 0x80000000; // length / auto dma disable
DMA_DIR = dir; // direction (0:sys to dev / 1: dev to sys)
DMA_MODE = 5; // hardware trigger mode
DMA_ENABLE = 1; // enable dma
DMA_START = 1; // start dma
DMAREQ &= ~1; // LOW: DMA request CH1 (DRQ1: 9pin)
while (DMA_START & 1) // wait DMA end
;
DMAREQ |= 1; // HI: DMA request CH1 (DRQ1: 9pin)
}
■ design example: LAN Adapter HIT-0300 clone (use MB86964) ▲
spec of LAN Adapter HIT-0300 clone:
used device:
XC9572XL-VQ44: G2 bus (simple bus mode) interface logic
MB86964: lan controller (an original lan adaptor uses MB86967)
TC55257: buffer SRAM 32kbytes
93C46: serial EEPROM (for MAC address)
device mapping: (long word alignment mapping (simple bus mode))
0xa0600400 - 0xa060043c: MB86964 lan controller device
(change DLCR7 register ID code. MB86964{'01'} => MB86967{'10'})
0xa0600440: EEPROM control port (BMPR16){EECS/EESK} (for MB86967 compatibility)
bit[7] not use (read/write)
bit[6] EESK (read/write)
bit[5] EECS (read/write)
bit[4:0] not use (read/write)
0xa0600444: EEPROM data in/out port (BMPR17){EEDO/EEDI} (for MB86967 compatibility)
bit[7] read:EEDO write:EEDI
bit[6:0] not use {read always '0000000'}
0xa0600480: reset port register
bit[7:1] not use {read always '0000000'}
bit[0] reset {active high} (read/write)
interrupt: use /IRQA
lan adapter circuit: hit0300_clone.gif transformer noteVerification software: IP-upload 1.0.4 -- pic KOS 1.1.9 network samples NetBSD 3.1 -- pic1 pic2 httpd-ack (v20070720) -- pic (It is necessary to set ISP by using BBA.)
spec of LAN Adapter HIT-0300 clone:
used device:
XC9572XL-VQ44: G2 bus (simple bus mode) interface logic
MB86967: lan controller
TC55257: buffer SRAM 32kbytes
93C46: serial EEPROM (for MAC address)
device mapping: (long word alignment mapping (simple bus mode))
0xa0600400 - 0xa060047c: MB86967 lan controller device
0xa0600480: reset port register
bit[7:1] not use {read always '0000000'}
bit[0] reset {active high} (read/write)
interrupt: use /IRQA
lan adapter circuit: hit0300_clone_2.gif (non CPLD version: hit0300_clone_21.gif pic)Verification software: It is the same as the HIT-0300 clone that uses MB86964.