P/ECE研究室〜S1C33分室


* Tue May 23 00:00:00 JST 2002 Naoyuki Sawa

前回に引き続き、LCD最下ラインに現れる、ゴミ・欠けの原因を調べて行きます。今回は、

2.仮想画面からLCDへの転送形式への変換コードの問題。転送形式の段階で、ゴミ・欠けが発生している。

という予想が正しいかどうかを、検証してみます。
これを確かめるためには、カーネルに、仮想画面からLCD転送形式への変換を行わせなければいいのです。
pceLCDTransDirect()に直接渡せる形式(以下、画面バッファ形式と呼ぶことにします)の描画を行い、
pceLCDTransDirect()で転送して、ゴミ・欠けが発生するかどうか、確かめてみましょう。
画面バッファ形式の描画には、スプライトライブラリを使うのが最適な方法ですが、
今回は簡単なラインパターンの描画だけなので、プログラムで直接描くことにしました。

画面バッファ形式の構造は、次のようになっています。

===============================================================
画面バッファのデータ並びについて:

横8ピクセル1ハーフワード(1ピクセル2ビット*8=16ビット=1ハーフワード)を一単位として、縦方向にデータが並んでいます。
よって、画面バッファの最初の88ハーフワードは、画面左端の(0,0)−(7,87)の領域のデータとなります。
次の88ハーフワードは、(8,0)−(15,87)のデータとなります。それ以降も同様です。

    X=0                             X=127
     ↓                               ↓
 Y=0→+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+
     |最|つ|つ|つ|つ|つ|つ|つ|つ|つ|つ|つ|つ|つ|つ|最|
     |初|ぎ|ぎ|ぎ|ぎ|ぎ|ぎ|ぎ|ぎ|ぎ|ぎ|ぎ|ぎ|ぎ|ぎ|後|
     |の|の|の|の|の|の|の|の|の|の|の|の|の|の|の|の|
     |8|8|8|8|8|8|8|8|8|8|8|8|8|8|8|8|
     |8|8|8|8|8|8|8|8|8|8|8|8|8|8|8|8|
     |ハ|ハ|ハ|ハ|ハ|ハ|ハ|ハ|ハ|ハ|ハ|ハ|ハ|ハ|ハ|ハ|
     |||||||||||||||||||||||||||||||||
     |フ|フ|フ|フ|フ|フ|フ|フ|フ|フ|フ|フ|フ|フ|フ|フ|
     |ワ|ワ|ワ|ワ|ワ|ワ|ワ|ワ|ワ|ワ|ワ|ワ|ワ|ワ|ワ|ワ|
     |||||||||||||||||||||||||||||||||
     |ド|ド|ド|ド|ド|ド|ド|ド|ド|ド|ド|ド|ド|ド|ド|ド|
Y=87→+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+−+

横8ピクセル1ハーフワードの構成は、次のようになっています。

上位ビット ← FEDCBA9876543210 → 下位ビット
        |||||||||||||||+−左から1番目のピクセルの色コードのビット1
        ||||||||||||||+−−左から2番目のピクセルの色コードのビット1
        |||||||||||||+−−−左から3番目のピクセルの色コードのビット1
        ||||||||||||+−−−−左から4番目のピクセルの色コードのビット1
        |||||||||||+−−−−−左から5番目のピクセルの色コードのビット1
        ||||||||||+−−−−−−左から6番目のピクセルの色コードのビット1
        |||||||||+−−−−−−−左から7番目のピクセルの色コードのビット1
        ||||||||+−−−−−−−−左から8番目のピクセルの色コードのビット1
        |||||||+−−−−−−−−−左から1番目のピクセルの色コードのビット0
        ||||||+−−−−−−−−−−左から2番目のピクセルの色コードのビット0
        |||||+−−−−−−−−−−−左から3番目のピクセルの色コードのビット0
        ||||+−−−−−−−−−−−−左から4番目のピクセルの色コードのビット0
        |||+−−−−−−−−−−−−−左から5番目のピクセルの色コードのビット0
        ||+−−−−−−−−−−−−−−左から6番目のピクセルの色コードのビット0
        |+−−−−−−−−−−−−−−−左から7番目のピクセルの色コードのビット0
        +−−−−−−−−−−−−−−−−左から8番目のピクセルの色コードのビット0

ピクセル位置の上位・下位方向と、カラーコードのビットの上位・下位方向が、感覚的に逆
(あるいは、ハーフワードの並びがモトローラ並びっぽい?)なので、注意してください。
===============================================================

ちょっとわかりづらいですね。
サンプルプログラムの、pset()関数のソースを見ていただいたほうが、はやいかもしれません。

	サンプルプログラムは こちら

サンプルプログラムの使い方は、前回とほぼ同じです。結果は、次のようになりました。

撮影
3(黒)
1(明るい灰色)
画面バッファ形式への文字描画はちょっと面倒なので、座標や色コードの表示は行っていませんが、 前回の実験で撮影したのと同じ位置にラインパターンを描いています。 ゴミ・欠け、どちらもありません。どうやら、原因は、 2.仮想画面からLCDへの転送形式への変換コードの問題。転送形式の段階で、ゴミ・欠けが発生している。 だったようです。シリアルコントローラの話に持っていけない…(^^; いや、本当に2.だけの原因とは、まだ断言できません。 pceLCDTrans()は、仮想画面全体を一度で画面バッファ形式に変換し、pceLCDTransDirect()を呼び出しているのではないのです。 88ハーフワードの単位で画面バッファ形式に変換し、転送。これを、16回繰り返しています。 転送の完了待ち〜次の変換開始のタイミングがかぶってしまっている可能性も、なきにしもあらず。 というわけで、次回以降、むりやりシリアルコントローラの話に持って行こうと思います。 まずは、カーネルのLCDまわりのコードの解読から。かなり気合入れて最適化されているようで、読みきれるかちょっと不安です。 そして、できれば、ゴミ・欠けの出ない、LCD転送ルーチンを作ってみたいと思います。 (続きます...)

nsawa@piece-me.org