P/ECE研究室〜S1C33分室


* Sun Jun 02 22:00:00 JST 2002 Naoyuki Sawa

今回は、CPU・メインメモリ・高速DMAC・シリアルコントローラが協調して、
LCDCにコマンドを送り込む様子を、図にしてみました。
サンプルとして、グレイスケールレジスタ変更コマンドを取り上げます。

※シリアルコントローラや高速DMACのセットアップなど、細部は省きました。
※注意:S1C33のシリアルコントローラは、ビット0〜7の順で送出しますが、
※   LCDCは、ビット7〜0の順で送られてくることを想定しています。
※   シリアルコントローラに書き込む前、メインメモリ上にバイト列を用意する時点で、
※   各バイトのビット並びを反転しておく必要があります。(図では省略しました)

通常、色番号と表示色の対応は、次のようになっています。

	0: 白
	1: 明るい灰色
	2: 暗い灰色
	3: 黒

この対応は、LCDCのグレイスケールレジスタを操作して、自由に変更することができます。
例えば、色番号3を黒から白に変更するには、次のようなコマンドをLCDCに送り込みます。

	0x8E, 0x00, 0x8F, 0x00

上記4バイトのコマンドをLCDCに送り込む手順は、次のようなものです。

1.まずCPUが、コマンドのバイト列をメインメモリ上に用意します。

	   CPU−−+−−+−−+−−+
	        ↓  ↓  ↓  ↓
	       +−−+−−+−−+−−+
	メインメモリ |8E|00|8F|00|
	       +−−+−−+−−+−−+

2.CPUが、最初のコマンドバイトをシリアルコントローラに書き込みます。
  もう、CPUはやることがなくなったので、シリアルコントローラを監視して待ちます(手順7参照)。

	       +−−+−−+−−+−−+
	メインメモリ |8E|00|8F|00|
	       +−−+−−+−−+−−+
	         |
	     CPU +−−+
	            ↓
	           +−−+−−+
	シリアルコントローラ |8E|    |
	           +−−+−−+

3.シリアルコントローラは、書き込まれたバイトをビット単位に分解し、LCDCに送信します。

	       +−−+−−+−−+−−+
	メインメモリ |8E|00|8F|00|
	       +−−+−−+−−+−−+
	         |
	         +−−+
	            ↓
	           +−−+−−+          +−−−−+
	シリアルコントローラ |  |8E|−01110001→|LCDC|
	           +−−+−−+          +−−−−+

4.シリアルコントローラが送信を開始すると、すぐに次のバイトの受け付けができます。
  シリアルコントローラが次のバイトを受け付けられる状態になると、
  高速DMACが、メインメモリから次のバイトをシリアルコントローラに書き込みます。

	       +−−+−−+−−+−−+
	メインメモリ |8E|00|8F|00|
	       +−−+−−+−−+−−+
	            |
	     高速DMAC |
	            ↓
	           +−−+−−+          +−−−−+
	シリアルコントローラ |00|8E|−01110001→|LCDC|
	           +−−+−−+          +−−−−+

5.シリアルコントローラが、CPUによって書き込まれた最初のバイトを送信完了したら、
  自動的に、先ほど高速DMACによって書き込まれた二つ目のバイトの送信を開始します。
  また、シリアルコントローラは次のバイトの受け付けが可能になるので、
  高速DMACが、メインメモリから次のバイトをシリアルコントローラに書き込みます。

	       +−−+−−+−−+−−+
	メインメモリ |8E|00|8F|00|
	       +−−+−−+−−+−−+
	              |
	     高速DMAC +−+
	            ↓
	           +−−+−−+          +−−−−+
	シリアルコントローラ |8F|00|−00000000→|LCDC|
	           +−−+−−+          +−−−−+

6.この繰り返しで、高速DMACが最後のバイトまでシリアルコントローラに書き込むと、
  もう、高速DMACはやることがなくなったので、高速DMACは停止します。

	       +−−+−−+−−+−−+
	メインメモリ |8E|00|8F|00|
	       +−−+−−+−−+−−+
	                 |
	     高速DMAC +−−−−+
	            ↓
	           +−−+−−+          +−−−−+
	シリアルコントローラ |00|8F|−11110001→|LCDC|
	           +−−+−−+          +−−−−+

7.CPUはシリアルコントローラの状態を監視して、最後のバイトが送信完了するまで待っています。

	    CPU
	     |
	   監視|
	     ↓     +−−+−−+          +−−−−+
	シリアルコントローラ |  |00|−00000000→|LCDC|
	           +−−+−−+          +−−−−+

8.完了です。

	    CPU
	     |
	   監視|
	     ↓     +−−+−−+          +−−−−+
	シリアルコントローラ |  |  |−−−−−−−−−→|LCDC|
	           +−−+−−+          +−−−−+

ちょっと短いですが、今回はここまでです。
次回は、シリアルコントローラとLCDCのやりとりの部分に注目してみたいと思います。

(続きます...)

nsawa@piece-me.org