Dreamcast Serial Port & FT232BM


ドリームキャストのシリアルポートに FT232BM を接続して 1.5Mbps の高速通信


■ FT232BM ベース回路
■ RS-232C アダプター
■ Dreamcast シリアルポートアダプター (1.5Mbps)
■ FT232BM のビットバングモード
■ Dreamcast シリアルポートの応用(汎用入出力ポート)
ENC28J60 LAN Adapter interface for DC Serial
SD Card interface for DC Serial
Dreamcast SD Loader
Dreamcast SD Rip
■ Dreamcast シリアルポートの不明な端子について
□ home



■ FT232BM ベース回路

FT232BM のベース回路は FTDI 社のアプリケーションノートそのままですが、クロック回路周りだけ少し変更してあります。 それからアダプター形式で RS-232C や Dreamcast に対応するため FT232BM の I/O 端子と USB からの電源 (5V) をそのまま外部インターフェース用の 14pin コネクターに引き出します。

クロック部分は普通 6MHz の水晶発信子又はセラミック発信子を使いますが Dreamcast の外部ボーレート用クロックの為に 24MHz のクロックを使用し、その 1/4 分周した 6MHz を FT232BM に供給しています。(24MHz のクロック信号は 14pin コネクタに出力)

(回路図にもあるように京セラの EXO3 シリーズの 24MHz 発信器を使うとシンプルになります。 分周回路に IC 使うくらいなら素直に 6MHz の水晶と 24MHz の発信器を付けた方がスマートですが設計時手持ちのパーツの関係でこうなりました。)




■ RS-232C アダプター

汎用の RS-232C インターフェース用アダプターです。RS-232C 変換には 3個のドライバーと 5個のレシーバーが入った MAX3243 を 使用しています。(オートパワーダウンモードは未使用)



■ Dreamcast シリアルポートアダプター (1.5Mbps)

RS-232C の規格のままでは 230.4kbps 辺りまでですが、それ以上の通信スピードではロジックレベルで行ないます。 本来なら差動型のインターフェースを使用したいところですが FT232BM <=> Dreamcast 間の距離を短くする事を前提で ロジックレベルのまま使用します。

FT232BM の信号は 5V 系 なので Dreamcast の 3.3V 系 と接続するためレベル変換とバッファーを兼ねて VHC244 を使用しました。 回路図中ドリームキャストのリセット信号がアクティブの間バッファーをフローティングしていますが、その理由は こちら を参照。


物理的にはこれで OK ですが、問題は FT232BM と Dreamcast の通信スピードの設定です。

Dreamcast は最大 1.56Mbps、FT232BM は最大 3Mbps ですが残念な事に互いに誤差ほぼゼロで設定できる最大のボーレートはかなり低い 57600bps という値になります。但し誤差があってもとりあえず通信が出来る 500Kbps がいちようの最大ボーレートという事になります。

(Dreamcast の場合は 50MHz から 50MHz / (32 * bps) - 1 の計算式で、FT232BM の場合は基本的に 3MHz からの分周比ですが内部的には 48MHz をベースに目的のボーレートに対する分周比を算出するため互いに誤差ゼロでスピードを合わせるのが難しくなります。)

そこで 外部ボーレート端子 の登場です。
外部ボーレート端子は DC シリアルポートの 2番ピン にあります。(外部ボーレート端子発見に関しては こちら を参照)
使い方は使用したい ボーレートの16倍 のクロックを供給するだけです。

ソフトウエア上の設定は SCI インターフェースの SCSCR2 レジスタの CKE1 (bit 1) ビットを ON にするだけですが、以下に外部ボーレート使用時 の SCI インターフェース初期化ルーチンのサンプルを示します。 scif_init() 関数の引数は使用したいボーレート値で 0 以外の値では内部 ボーレートの設定 になり、0 の時は外部ボーレート に初期化します。

// ----  example scif_init() ----- 
  
void scif_init(int bps) 
{
    int i;

    *SCSCR2 = bps ? 0x0 : 0x02;      //////// clear TE and RE bits / if (bps == 0) CKE1 on (bit 1)
    *SCFCR2 = 0x6; 
    *SCSMR2 = 0x0; 

    if (bps) *SCBRR2 = (50 * 1000000) / (32 * bps) - 1;   //////// if (bps != 0) set internal baudrate 

    for (i = 0; i < 100000; i++); 

    *SCFCR2 = 12; 
    *SCFCR2 = 0x8; 
    *SCSPTR2 = 0; 
    *SCFSR2 = 0x60; 
    *SCLSR2 = 0; 
    *SCSCR2 = bps ? 0x30 : 0x32;   //////// set TE and RE bits / if (bps == 0) CKE1 on (bit 1)

    for (i = 0; i < 100000; i++); 
}

// sci init and set external baudrate 
    scif_init(0);

今回 FT232BM のベース回路には 1.5Mpbs x 16 = 24Mhz のクロックを内蔵させています。

なぜ 2Mbps : 32MHz あるいは最大の 3Mbps : 48MHz にしなかったかというと実際に試してみた結果ケーブルの影響もありますが DC本体のマザーボード内のパターンがかなり長い距離を引き回しているのと EMI 対策の部品の影響で 24MHz が限界でした。
(普通は数10メガのクロックをロジック信号のまま外部からケーブルで供給するという事はしません。本来なら DC 本体に搭載すべきですね。)

恐らく SH4 の SCI インターフェース自体は 3Mbps (48MHz) でも動作するのではないかと思われます。


■ FT232BM のビットバングモード

FT232BM は通常のシリアルインターフェース以外にビットバングモードというインターフェースモードがあり I/O 端子 8本をそれぞれビット単位で入出力 に設定してパラレルポートのように扱う事が出来ます。

ビットバングモードのテストに LCD を 4 ビットバスモードで接続してみました。




■ Dreamcast シリアルポートの応用(汎用入出力ポート)

ドリームキャストのシリアルポートは通常のシリアルインターフェース以外に汎用の入出力ポートとして使用することが出来ます。
但し若干の制約があります。CTSRTS 端子は入出力どちらにも設定できますが、TX は出力のみ RX は入力のみという制約です。

それからシリアルポート内部には EMI 対策と思われるコンデンサ(容量は分かりません)が挿入されています。
通常のシリアルインターフェースとして使用する場合は問題ありませんが、汎用入出力ポートとして高速に動作させる場合 に影響が出てきます。
もし期待通り働かない場合該当するコンデンサを除去してみてください。
私は SD カードアダプターの実験で経験しました。海外向けあるいはロットによってもコンデンサの容量が違う可能性があります。


dcpprip では RX は同期クロック入力 残りの3本をデータビットとして双方向に設定して使いますが、TX が出力のみなので出力時 3bit
入力時 2bit という変則的なビットバスで 通信 を行なっています。
(この図面は DC本体の リセット時の問題 を考慮していない簡易版の回路図です。)


JoyPad USB Wheel Mouse for Dreamcast では USBN9603 を SPI モードにして 4本の信号でコントロールしています。
(この図面は DC本体の リセット時の問題 を考慮していない簡易版の回路図です。)


ENC28J60 LAN Adapter interface for DC Serial (SPI I/F)

SPI インターフェースの LAN コントローラ ENC28J60 を接続してみました。
ソフト SPI ではクロック 5.2MHz 位が限界ですが dcload-ip 移植して動作しています。(規格では 8MHz 以上)
MACアドレスは格納するハードが無い為クローズした環境で使う事を前提に適当なアドレスを使用しています。
(EEPROM のCSが正論理なので ENC28J60 とパラに接続する事も出来ますが、ソフト側に持たせることにしました)

lan adapter circuit: enc28j60_dcs.gif 10baset_trans
dcload-ip 1.0.4 target binary (ENC28J60 LAN Adapter only):
 2010/1/23 1st_read.bin (flat binary) -- default IP 192.168.1.234 / use fixed MAC address 00:bd:3b:12:34:56
transfer speed: upload - 290Kbytes/sec : download - 500Kbytes/sec
reference picture: pic1 pic2 pic3 pic4 pic5


SD Card interface for DC Serial


上の SPI インターフェースの応用例として SD カードを接続することも出来ます。 但し電源制御や書き込み禁止スイッチの検出等を省略した簡易版ですが特に問題無く使えます。

試しに DC の BIOS ROM 2MBytes を SDカードにファイル出力すると 4秒台(500Kbytes/sec)で書くことが出来ます。 GD-ROM 吸出しに換算すると BBA リップと同等かそれ以上のスピードになりますが、ファイル書きこみの信頼性を 上げる為に CRC エラーチェック等エラーリカバリーを強化すると少しスピードが落ちるかもしれません。
(写真の現物では手持ちの VHC244 を使ってますが回路的には同じです。)

追記: 以前の回路 でバッファーに HC126 を使用していましたが、バッファーの遅延がスピードに影響 するため バッファー無しの回路 に変更しました。 pic

SD カードのデモソフトをここに置いておきます。 screen shot sdcard_test.bin
実行バイナリは ip-upload 用で、起動すると SD Card set and hit CR key !! とメッセージが出るので SD カード
をセットしてキャリッジリターンキーを押すとスタートします。特にエラーメッセージが無ければ bios.binflash.bin
のファイルが書き込まれます。ファイルのタイムスタンプには Dreamcast の時計を使っています。
(注:対象は SD カードのみです。場合によっては認識しないとか書き込めない SD カードがあるかもしれません)


Dreamcast SD Loader (ELF / motorola hex / bin (normal/scrambled))

dcsdload ver1.0: dcsdload.lzh ... pic ... (ELF: It corresponds to SHT_NOBITS used for the BSS initialization.)
dcsdload.lzh:
ip.bin ... for make CD
1st_read.bin ... for make CD (scrambled)
usage: Please connect the controller with port A.

Dreamcast SD Rip ver1.0 ... (DATA track: raw binary / for file division / for Bad CRC Dreamcast)

dcsdrip version 1.1: (dcsdrip11.lzh) (2008/12/31 disc.gdi few bug fix: add last parm " 0")
ver1.0 => ver1.1: add ISO mode rip / SD card dir ... pic

dcsdrip.lzh: ... (see SD card circuit)
ip.bin ... for make CD
1st_read.bin ... for make CD (scrambled)
dcsdrip.bin .. original binary

usage: Please connect the controller with port A.
Please remove the capacitor of EMI measures if the writing error occurs. (see circuit & pic)

The speed has about 650KBytes/sec.
Time to ripping GD-ROM is about 35 minutes in total.

SD card to confirm the operation:
HAGIWARA.SYS-COM / SD / 128M
Transcend / SD / 1G
A DATA / microSD / 1G
Kingston / microSD / 2G
A DATA / SDHC / 4G (but slow because of FAT32 Problem of this SD card?)
Transcend / SDHC / 8G



■ Dreamcast シリアルポートの不明な端子について

外部ボーレート端子発見の経緯について質問を受ける事があったのでここに書いておきます。

これまでドリームキャストのシリアルポート端子には 3つの不明な端子 がありました。
私は不明な端子のうち 8番ピンは GND9番ピンは負論理のリセット出力信号であるという事に早くから気がついていました。

8番ピンは基板のパターンを見れば明白、9番ピンはオシロで見た時にリセット信号だと確認できました。
なぜそれがリセット信号だと思ったかというと SCI インターフェースに多重化された機能をコントロールする為にリセット信号がシリアルポートに必要だという事を知っていたからです。 (組込み系で SH4 を使っている人ならご存知ですね。)

多重化された機能の詳細は SH4 のドキュメントを見てもらうとして、とにかくリセット期間中は SCI インターフェースの各端子をフローティングにする必要があるという事です。 なぜなら CPU や周辺の動作モード(クロックに関係する)の設定用にプルアップ・プルダウン抵抗が SCI インターフェースの各端子に接続されていてリセット期間中にこの設定を CPU が取り込むためです。

(確認はしてませんが対戦ケーブルの箱の中にはリセット期間中にシリアルポートの信号をフローティングにするための回路が入っているはずです。 ちなみに私はこの手の対戦ケーブルを持っていなかった為 ドリームキャスト本体から直に 線を引き出して使っています。)

問題の2番ピン ですが、これは確信が持てませんでしたが SCI インターフェースの ブロックダイヤグラム で唯一行き先の無い端子が SCK2 だったのでひょっとしたらという検討はついていました。 但しその時点ではまだ確認するまでにはいたりませんでした。

それからしばらくしてある掲示板でシリアルポートの 2番ピンに関してモデムの DCD 信号らしいという話を聞きそのページを見に行ったところ、 なんと 2pはCPU(SH-4)のA16:SCK2(SCIクロック2)と繋がっており と書いてあるではありませんか!

(残念ながらそのページに書いてあるモデムの DCD 信号というのは間違いです。でも外部ボーレートを確認するきっかけになった事を感謝します。 ちなみにモデムとの通信は ATコマンドで行なっていれば最悪 RX と TX 信号だけで行なえます。 実際に私も外部モデムに繋いでみましたが 2番ピンの状態に関係無くドリームパスポート3でインターネットに接続できました。)

もしこれが本当に SH4SCK2 と繋がっているなら 外部ボーレート での動作が可能という事になります。
早速シリアルポートの 2番ピンに 1.8432MHz (115200bps * 16 = 1.8432MHz) のクロックを接続、SCI を外部ボーレート用に初期化してエコーバックするだけの簡単なテストプログラムを作り外部ボーレートの実験をしてみました。
結果は予想通り外部ボーレートで通信が出来ました。
本当に外部ボーレートで動作しているのか確認する為、動作中にクロックの配線を切ると見事に通信不能になりました。

これが外部ボーレート端子発見の経緯です。

余談ですが外部ボーレートの件を海外のあるフォーラムで公開したところ henzenmann さん (ドイツの方) が 追試され DC-tool に外部ボーレートオプションを追加したパッチを作りメーリングリストに投稿したそうです。(dcload serial 1.0.4 から外部ボーレートに対応しています)

ちなみに SCI ポートに多重化されたもう一つの機能は汎用の入出力ポートです。
USBN9603 SPI 接続dcpprip で応用しています。




ネオジオポケット<=>ドリームキャスト接続ケーブルを入手、小さいプラスチックケースに
10pin コネクタを付けた汎用ケーブルを作成。 これで DC に尻尾を作らなくて済みます。

home