SH2で動作したので,再びH8をいじってみよう.というのはH8/3069Fボードは おまけで2MBのDRAMがついているのと,LANコントローラが載っていてLANコネクタも 実装済みなので,いじりがいがあるからだ. (この点,SH2のボードだと内蔵RAMも少ないし,外部デバイスもたいしたものは載って ない(LEDとスイッチくらい)し,いったん動いてしまうとあんましいじりがいが無い)
で,LANコントローラを動かすのも面白そうと思ったのだけど,とりあえずDRAMを 動かしてみよう.というのは,ethernetのフレーム送受信とかしたときに, やはりフレーム保存のためには内蔵RAMだと容量がちょっと足りないと思うので, その前にDRAMを動くようにしておきたいからだ.
このDRAMなのだけど,H8/3069Fボードのマニュアルを見ると 「もしも買ったボードに付いてたらラッキーくらいのおまけ」 というようなことが書いてある. 僕はこのボードはすでに2枚買ったのだけど(1枚は予備),とりあえず両方とも DRAMは載っているみたい.秋月電子のホームページを見る限りでは,DRAM付属と はっきり書いてあって,標準でついているのかおまけなのかちょっとよく わからんが,まあだいたいついているものと考えてもいいようだ.
ちなみにDRAMは,基板の裏側に実装されています.確かめたい人は基板裏の 電源アダプタの下付近ちょっと中央よりに1cm×2cmくらいのICチップがあるか 見てみてください(たぶんあるとおもうけど).
回路図を見ると,DRAMはCS2に接続されている.ということで 0x400000〜0x5fffff の2MBの空間が使えるようだ.ちなみに注意だけど, このDRAM,16Mと書いてあるのだけどこれって16Mbyteでなくて16Mbitなので, byteだと2MBということになる.CS2の空間は2MBなので実はちょうどなのだけど, 最初,これを誤解しててちょっと混乱した(こんなの勘違いするのって私だけか?).
ちなみにボード付属のマニュアルを読むと「CS1に接続されている」って書いてあるの だけど,回路図見るとCS2に繋がっている.回路図はたぶんパターン引きしたときの 電子データをそのまま持ってきているのだろうし,回路図のほうがあっているの だろうと思ってはいたのだが,やってみたところ,やっぱしそうだったようだ. なのでマニュアル読んでいるひとは気をつけてください.
で,なーんだCS2に繋がっているのならなにもしなくても0x400000以降を読み書きすれば もう使えるんじゃーないの? とか気楽に思っていたのだけど (動くようになったあとで冷静に考えてみると,そんなわけないよね.でもハードに 無知なソフトウエアプログラマの感覚ってこんなもんなのよ), 全然動かなかった.以下,動くようになるまでをちょっと説明.
まずCPUのモード設定なのだけど,今までディップスイッチの設定はボード付属の マニュアルに載っているままに使っているのだけど,これはCPUの「モード5」 というやつで使っていることになる.
このモード5ってやつがくせもので,3052Fとかだとモード5って1MBアクセスの モードなのよ.ところが3069Fだと16MBアクセスモードなのだな. 最初これを知らなくて,H8の書籍(3048や3052を使っている場合が多い)を読むと モード5だと1MBまでって書いてあるのでなんでこれで動いてるんだろうとか 別モードにする必要があるのかもとか思っていたのだけど,付属CD-ROMの3069Fの マニュアル見たらモード5は16MBになっていた.同じシリーズのCPUなのでモードの 意味は同じだと思っていたのだけど,うーんこういうことってあるんだなあ. 要注意だ.
で,3069FのマニュアルのCPUのモードの説明のところを読むとわかるのだけど, 内蔵ROM有効でアドレスは16MB空間で,さらに外部メモリを使うにはモード5でないと ならない.ということでCPUモードは従来通り,モード5のままでいい.
あとチップセレクトであるCS2がI/Oポートとピンが共通になっているので, たぶんピン指定をしないといけないだろーなと思って調べたら, P8DDRというので指定するようだ.
で,このへんを指定して0x400000以降に適当な値を書き込んで読んで比較するような メモリチェックを実装してためしてみたんだけど,うまく読み書きできてない.
いろいろマニュアル調べているうちに,設定するのはP8DDRだけでは不十分で, DRCRAとかDRCRBとかRTMCSRといったレジスタをいろいろ設定しないとならないようだ. DRAMのウエイトとかリフレッシュ関連とか設定しないとならんらしい (まあそりゃそうだよね). このへんはマニュアルの「I/Oポート」の章と「バスコントローラ」の章 (とくに,「DRAMインタフェース」の節)とあと回路図をよく見て, 設定値を考えなければならない.
でもこのへんってちょっとよくわからなくて,とりあえず上記の章で目につく レジスタをひととおり適当に設定してみたのだけどダメ.ほんとならDRAMの データシート見てちゃんと調べるべきで,付属CD-ROMにデータシートがあったので ちょろっと見てみたのだけど,よくわからんしこれを真剣に読みだしたらかなり 先の長い話になってしまうのでとりあえずこれは保留.
で,ネットで検索してみた.もっともこのへんはボードや搭載するDRAMや回路接続の 方法によっても設定値が変わってくるだろうから,まさに同じボードでDRAM使って いるという例でないとダメなのだけど,運良く以下のサイトがサクッと見つかった.
「soukz理研 AKI-H8 > 3069F LANボードのDRAM増設あまり」
こちらはDRAMをさらに増設して使っているようなのだけど,とりあえず同じ秋月の ボードでDRAMを使えるようにしていて,上記レジスタの設定内容とその理由が ひととおり書いてある.とりあえず上記サイトの設定例を参考に,CS2(エリア2) のみを使うようにしてレジスタの設定をしてみた.まあ設定値とその理由については 上記サイトを参考にしてほしい.いやー,ありがたいありがたい.
で,動かしてみたらちゃんと読み書きできた.ほんとは設定値をもっとちゃんと 調べて細かくチューニングすべきかもしれないけど,まあ動いたしべつに速度を 追求する必要もないので,気にしない.
ということで以下,修正したソース.
OSにDRAM関連の処理として dram.c を追加.さらにOSのinit()で,dram_init()を 呼ぶことでDRAM関連の初期設定を行っている.これ以降,0x400000〜0x5fffffに DRAMが見えるようになる.
さらに command.c にメモリチェックコマンドを追加した.OS起動して ramchk を 実行することで,メモリチェックを行う.メモリチェックはそのアドレスの値と 0x00000000 と 0xffffffff を,1バイト単位,2バイト単位,4バイト単位で 書き込んで読み出して,値の比較を行うというもの. 16ビットCPUなので4バイト単位は実際には意味無いような気がするが, とりあえず最初に全領域全パターンチェックをしておきたいので, なんとなくいちおう4バイトでのチェックも入れといた. まあ修正点に関しては,前回との差分をみてちょうだい.今回はブートローダーの 修正は無し.(将来的にはDRAMの初期化はブートローダーで行って,OSはDRAM上に ロードするようにしてもいいかもしれない)
実際には上記チェック処理を2MBの全アドレスに渡って行うので,それなりに時間が かかる.僕のボードでやってみたところ,1時間くらいだったかなあ.
以下,チェックの実行結果.
kzboot> run starting from entry point: ffc120 kozos boot succeed! command> echo OK command> echo aaa aaa OK command> ramchk DRAM checking... 005ffffc all check OK. OK command>ramchk実行でチェック開始し,正常終了している.問題無いようだ.
今回わかったことだが,たとえCS2に繋がっているからといってなにも考えずに そのアドレスにアクセスすれば読み書きできるというものではない. これはCS1に接続されているLANコントローラでも同じことで,いきなりその コントローラのレジスタを読み書きできるわけではなく,まずは最低限, CS1のピン設定は(たぶん他のピンと共用になっているので)絶対に必要だと思われる.
ほかにもアドレスピンとかもI/Oとピンが共通化されているので, このへんもアドレス信号を出すようにピン設定しなければならない (これは後になって考えると当り前なのだけど,上記サイトでそのような設定を 行っているのを見たときは非常に意外でびっくりした.アドレス線はなにもしないで ほっといてもアドレス信号が出ているもんだと思っていた). で,それらの設定をして,ようやくLANコントローラのレジスタが見えるようになる. 使うためにはさらにその後,LANコントローラのレジスタ設定を行わなければならない わけだ.
今回は運良く上記のサイトが見つかって,参考にして設定したらあっさり動いたけど, これってなにも参考にできずにマニュアルとデータシートだけ見て自分一人でやって たら,ハマリにハマッただろうな〜としみじみ思う. だってアドレス線までピン設定しなきゃならんとは思わなかったもん. いやー,ありがたや,ありがたや.
それにしても,DRAM動くようにするだけでもこんなにいろんなレジスタ設定しなきゃ ならんのね.H8ってすげー簡単と思っていたけど,それは今まで内蔵デバイスだけを 使っていたからで,外部デバイス使うとなるとそれなりに設定は必要だっつーことだ.
ソフトウエア・プログラマの視点だとDRAMなんて使えて当り前で最初っから 必ず使えるものっつーイメージがあるけど,そんなことはなくて, 使うためにはメモリコントローラの設定がいろいろ必要だということだ (それも,接続されているハードや回路接続のしかたに合わせた設定が必要なので, 本に載っているような値をそのまま設定すればいいというわけではなく, ボードに合わせて考えなければならない). 何もしなくても動くのでは?なーんて考えていた自分が恥ずかしい.
今回の僕の場合はたまたま同じボードでのサンプルがあったのでよかったけど, 新規ハードでまったくサンプルの無い状態だと,回路図とかデバイスのデータシートを 見ながら自分で設定値を選ぶわけだから,そりゃードライバ作る人が苦労するわけ だよねえ.