FR60 マイコン基板 (5)
FR60 基板に LCD を接続する前に、内蔵の OSDC (On-Screen Display Controller) を利用して PC 用ディスプレイに表示させることを試してみました。
PPG を利用して HSYNC/VSYNC 信号を作るところまでは順調に行ったのですが、肝心の OSDC を動作させることができず、ちょっとハマってしまいました。
結局、その原因は判明して、解決しました。
結論から言えば、OSDC は CPU から見れば「外部バス」に接続されているデバイスなので、
- 外部バスが使える CPU 動作モードで立ち上げる
- 外部バスのコントローラを初期設定する
ことが必要です。
OSD のサンプル・プログラム自体は、ちゃんと動作しました。
その動作する OSD プログラムから OSDC レジスタの設定部分のコードをそのままコピーしてきて、貼り付けているのに、どうにも動かないという状態でした。
OSD のサンプル・プログラムでは、「startup.asm」の中で、外部バスインターフェースの初期設定をしており、C 言語の main() 関数以降の部分を見ているだけでは分かりませんでした。
それに気づいて、「startup.asm」の設定部分もコピーしましたが、それでも動きませんでした。
リセット時に読み込まれるモードベクタの値も違っていたので、もしかして、と思って変えてみたら、動き出しました。
具体的には動かない状態のモードベクタは「0x07000000」で、シングルチップ・モードで、外部バスへのアクセス機能のないモードになります。*1
この状態では、それ以降、何をやっても外部バスにつながるデバイスにはアクセスできません。
動く状態のモードベクタは「0x05000000」で、16 ビット外部バスが使えるモードになります。
外部バスインターフェースの初期設定は、必ずしも「startup.asm」の中で行う必要はなく、C の main() 関数から呼ばれる C の関数として実装することもできます。
*1:「MB91310 シリーズ ハードウェアマニュアル」pp.61 「3.9 動作モード」参照