Mini210S 開発キットOSなしのプログラム開発手順連載(25)

Mini210S/Tiny210等開発ボード関連のフォラーム

Mini210S 開発キットOSなしのプログラム開発手順連載(25)

投稿記事by dwtechadm » 金 5 10, 2013 6:14 pm

Mini210S 開発キット詳細URL




第XIX章 点線を描画
第二節 プログラム説明


<1> 各フレームの送信処理は、次のとおりです。:
1)VSYNC信号は有効な場合、信号幅は(VSPW+1)個HSNC信号周期、すなわち(VSPW +1)の無効ラインです。
2)VSYNC信号パルスには、前の(VBPD +1)のHSYNC信号サイクルを通過した後、有効なラインデータが得ます。だから、VSYNC信号が有効後、また(VSPW+1+VBPD+1)の無効ラインを通過します;
3)(LINEVAL+1)行の有効データを送信します;
4)最後には、(VFPD+1)行の無効ラインです;
<2> 各行のピクセルの送信処理プロセス::
1)HSNC信号が有効な場合、1行のデータの先頭を表示し、信号幅は(HSPW +1)個のVCLK信号サイクル、すなわち(HSPW+1)個の無効ピクセル;
2)HSYNC信号パルスが通過後、(HBPD+1)のVCLK信号サイクルを通過後、有効画素データが得ます;
3)(HOZVAL+1)ピクセルの有効データを送信します;
4) 最後には、(HFPD+1)個の無効ピクセルです;
上記の知識があれば、タイミング相関のレジスタ VIDTCON0、VIDTCON1 と VIDTCON2を設定できます、コード:
#define HSPW 0
#define HBPD (40 - 1)
#define HFPD (5 - 1)
#define VSPW 0
#define VBPD (8 - 1)

#define VFPD (8 - 1)
// タイミング設定
VIDTCON0 = VBPD<<16 | VFPD<<8 | VSPW<<0;
VIDTCON1 = HBPD<<16 | HFPD<<8 | HSPW<<0;
//長と幅設定
VIDTCON2 = (LINEVAL << 11) | (HOZVAL << 0);


先ずレジスタ VIDTCON0について、下記図ご参照ください:

画像
レジスタ VIDTCON0

画像

LCDチップマニュアル・タイミング図
2) VFPD VFPD:Vertical front porch、単位は行。LCD チップマニュアル・タイミング図で、VSYNC front porch はVFPD+1、Th は1行の VCLKの数を表示して、VFPD=8-1 行(Th);
3) VBPD:Vertical back porch、単位は行。LCD チップマニュアル・タイミング図で、 VSYNC back porch は VBPD+1、Th は1行の VCLKの数を表示して、VBPD=8-1 行(Th);
4) VSPW:Vertical sync pulse width、単位は行。LCD チップマニュアル・タイミング図で、その値を直接出していませんので、自己計算は必要です。公式は:VSPW= VSYNC period time - VSYNC display area - VSYNC back porch - VSYNC
front porch=288-272-8-8=0、VSPWは 0と設定します;
次はレジスタ VIDTCON1、下記図ご参照ください:

画像
VIDTCON1 レジスタ

画像

LCD チップマニュアル・タイミング図
• HBPD:Horizontal back porch、単位は VCLK。LCD チップマニュアル・タイミング図で、HSYNC back porch は HBPD +1、 HBPD=40-1(VCLK);
• HFPD:Horizontal front porch、単位は VCLK。LCD チップマニュアル・タイミング図で、HSYNC front porchは HFPD +1、HFPD=5-1(VCLK);
• HSPW:Horizontal sync pulse width、単位は VCLK。LCD 芯チップマニュアル・タイミング図で、その値を直接出していませんので、自己計算は必要です。:HSPW+1 = HSYNC display area - HSYNC display area - HSYNC back porch- HSYNC front porch=525-480-40-5=0、 HSPW は 0と設定します;
最後はレジスタ VIDTCON2、下記図ご参照ください:

画像

• HOZVAL:HOZVAL = (Horizontal display size) -1=480-1=479
• LINEVAL:LINEVAL = (Vertical display size) –1=272-1=271
ステップ 6 WINCON0コンフィグ、window0のデータ形式を設定します;
S5PV210 LCDコントローラはoverlay機能があります、5つの windowをサポートします。ここでは1つ、 window0を生成します、コード:
WINCON0 |= 1<<0;
WINCON0 &= ~(0xf << 2);
WINCON0 |= 0xB<<2;
本章の機能を実現するには、下記のbitを設定すれば十分です:
• ENWIN_F=1、 オン;
• BPPMODE_F= 1011、24bpp;

ステップ 7 VIDOsd0A/B/Cコンフィグ、WINDOW0座標系を設定します;
コード:
VIDOsd0A = (LeftTopX<<11) | (LeftTopY << 0);
VIDOsd0B = (RightBotX<<11) | (RightBotY << 0);
VIDOsd0C = (LINEVAL + 1) * (HOZVAL + 1);
WINDOW0の左上と右下隅の座標の長さと幅を設定します。

ステップ 8 VIDW00ADD0B0 と VIDW00ADD1B0をコンフィグ、フレームバッファのアドレスを設定します;
コード:
VIDW00ADD0B0 = FB_ADDR;
VIDW00ADD1B0 = (((HOZVAL + 1)*4 + 0) * (LINEVAL + 1)) & (0xffffff);

画像

ステップ 9 SHADOWCONを設定し、 dma をチャンネル 0を使用可能にします;
コード:
SHADOWCON = 0x1;
Window0をしようします、 DMA がチャンネル 0を使用します;
(二)関数 lcd_draw_pixel():
lcd_init()初期化と LCDコントローラを設定した後、LCDで グラフィックを描けます、コードには描画関係のコードは 関数lcd_draw_pixel()に基づきます、機能はLCDポイントを描き、そして各ポイントでグラフィックを構成されます。
LCDでポイント描くの本質は、FrameBufferに色の値を記入することです。次は関数lcd_draw_pixel()を分析します、
コード:
void lcd_draw_pixel(int row、 int col、 int color)
{
unsigned long * pixel = (unsigned long *)FB_ADDR;
*(pixel + row * COL + col) = color;
}
FB_ADDR = 0x23000000、すなわち framebufferのベースアドレス。row と colはオフセットの値、colorは色の値、framebufferで対応アドレスに色の値を記入すれば、LCDでそのポイントを描けます。

第三節 コードコンパイルとプログラミングの実行
コードをコンパイルし、Fedora端末で下記のコマンドを実行します:
# cd 19.lcd
# make
19.lcdのディレクトリ下にlcd.binを生成し、それを開発ボードにプログラムします。

第四節 実験現象
先ずシリアルポートで下記のメニューをプリントアウトします:
画像
1:LCD をクリア;
2:LCD左上隅にクロスを描き;
3:LCD真ん中に水平線を描き;
4:LCD真ん中に垂直線を描き;




---続く
dwtechadm
 
記事: 60
登録日時: 月 2 25, 2013 1:35 pm

Return to Cortex-A8関連

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[0人]