#include "dev_lcd.h"

/* TFT-LCD LQ038Q5DR01 */
#define LCD_HORIZONTAL_PERIOD         400	/* 水平同期周期 */
#define LCD_HORIZONTAL_DISPLAY_PERIOD 320	/* 水平表示期間 */
#define LCD_HORIZONTAL_BACK_PORCH      72	/* 水平バックポーチ */
#define LCD_HORIZONTAL_PULSE_WIDTH      1	/* 水平同期期間 */

#define LCD_VERTICAL_PERIOD           263	/* 垂直同期周期 */
#define LCD_VERTICAL_DISPLAY_PERIOD   240	/* 垂直表示期間 */
#define LCD_VERTICAL_BACK_PORCH         6	/* 垂直バックポーチ */
#define LCD_VERTICAL_PULSE_WIDTH        1	/* 垂直同期期間 */

/* グラフィック部1 */
#define GRA1_HORIZONTAL_SIZE          320	/* 水平表示サイズ */
#define GRA1_VERTICAL_SIZE            240	/* 垂直表示サイズ */
#define GRA1_HORIZONTAL_POS             0	/* 水平表示位置 */
#define GRA1_VERTICAL_POS               0	/* 垂直表示位置 */
#define GRA1_VRAM_BASE         0x3C078000	/* 大容量内蔵RAM ページ4(240KB) */

unsigned short int table[] = { BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,YELLOW,WHITE };
/*
 * VDC3の初期化
 */
void vd3_initialize(void){

	/* 端子機能の設定 */	
	*PGCR7 = 0x5A01;
	*PGCR4 = 0x1111;	
	*PGCR3 = 0x1111;	
	*PGCR2 = 0x1111;
	*PGCR1 = 0x1111;	
	*PGCR0 = 0x1110;
	
	/* 表示制御部 初期化 */
	*SGMODE = 0x00000001;
	*SYNCNT = 0x010F0000;
	
	*PANEL_CLKSEL = *PANEL_CLKSEL & ~(1 << 12);
	*PANEL_CLKSEL = 0x00002008;		/* 6MHz(48MHz / 8) ≒ 6.3MHz(typ) */
	*PANEL_CLKSEL = *PANEL_CLKSEL | (1 << 12);
	
	*SYN_SIZE = (LCD_VERTICAL_PERIOD << 16) | (LCD_HORIZONTAL_PERIOD);
	
	*PANEL_VSYNC_TIM  = (0 << 16) | (LCD_VERTICAL_PULSE_WIDTH);
	*PANEL_HSYNC_TIM  = (0 << 16) | (LCD_HORIZONTAL_PULSE_WIDTH);
	*DE_SIZE = (LCD_VERTICAL_DISPLAY_PERIOD << 16) | (LCD_HORIZONTAL_DISPLAY_PERIOD);
	*DE_START = (LCD_VERTICAL_BACK_PORCH << 16) | (LCD_HORIZONTAL_BACK_PORCH);
	*GRA_VSYNC_TIM = 0;

	/* グラフィックス部1 初期化 */
	*GRCMEN1 = 0x00000002;	/* カレントレイヤ許可、下位レイヤー不許可 */
	*GRCBUSCNT1 = 0x00000000;	/* RGB565 */
	*GROPSADR1 = GRA1_VRAM_BASE;
	*GROPSWH1 = (GRA1_VERTICAL_SIZE << 16) | (GRA1_HORIZONTAL_SIZE);
	*GROPSOFST1 = GRA1_HORIZONTAL_SIZE * 2;
	*GROPDPHV1 = ((LCD_VERTICAL_BACK_PORCH - 1 + GRA1_VERTICAL_POS) << 16)
	                    | (LCD_HORIZONTAL_BACK_PORCH - 16 + GRA1_HORIZONTAL_POS);
	*GROPBASERGB1 = 0x0000FFFF;	/* グラフィックス画像外色(White) */
	*GRCMEN1 = *GRCMEN1 | (1 << 31);	/* レジスタ値転送許可 */

	/* グラフィックス部2 初期化 */
	*GRCMEN2 = 0x00000001;	/* カレントレイヤ不許可、下位レイヤー許可 */
	*GRCMEN2 = *GRCMEN2 | (1 << 31);	/* レジスタ値転送許可 */
}

/*
 * カラーバーの表示
 */
void show_color_bar(void){
	int i, j;
	unsigned short int *gra_vram;
	
	/* グラフィックス部1 描画(カラーバー) */
	gra_vram = (unsigned short int *)GRA1_VRAM_BASE;
	
	for(j = 0; j < GRA1_VERTICAL_SIZE ; j++)
	{
		for(i = 0; i < GRA1_HORIZONTAL_SIZE; i++)
		{
			if(i < GRA1_HORIZONTAL_SIZE / 8)
				*gra_vram++ = 0x0000;	/* Black */
			else if(i < GRA1_HORIZONTAL_SIZE / 8 * 2)
				*gra_vram++ = 0x001F;	/* Blue */
			else if(i < GRA1_HORIZONTAL_SIZE / 8 * 3)
				*gra_vram++ = 0x07E0;	/* Green */
			else if(i < GRA1_HORIZONTAL_SIZE / 8 * 4)
				*gra_vram++ = 0x07FF;	/* Cyan */
			else if(i < GRA1_HORIZONTAL_SIZE / 8 * 5)
				*gra_vram++ = 0xF800;	/* Red */
			else if(i < GRA1_HORIZONTAL_SIZE / 8 * 6)
				*gra_vram++ = 0xF81F;	/* Magenta */
			else if(i < GRA1_HORIZONTAL_SIZE / 8 * 7)
				*gra_vram++ = 0xFFE0;	/* Yellow */
			else
				*gra_vram++ = 0xFFFF;	/* White */

		}
	}	
}

/*
 * ディスプレイに色を表示する
 */
 void show_color(unsigned short color,volatile unsigned char line_val){
	int i, j;
	unsigned short int *gra_vram;
	
	/* グラフィックス部1 描画(カラーバー) */
	gra_vram = (unsigned short int *)GRA1_VRAM_BASE;
	
	for(j = 0; j < GRA1_VERTICAL_SIZE /2 ; j++){
		for(i = 0; i < GRA1_HORIZONTAL_SIZE; i++){
			*gra_vram++ = color;
		}
	}
	
	for(j = 0; j < GRA1_VERTICAL_SIZE/2 ; j++){
		for(i = 0; i < GRA1_HORIZONTAL_SIZE; i++){
			if( i < GRA1_HORIZONTAL_SIZE / 3 ){
				if((line_val & 0x01) == 0x01){
					*gra_vram++ = WHITE;
				}else{
					*gra_vram++ = BLACK;
				}
			}else if( i < GRA1_HORIZONTAL_SIZE / 3 * 2){
				if((line_val & 0x02) == 0x02){
					*gra_vram++ = WHITE;
				}else{
					*gra_vram++ = BLACK;
				}
			}else if( i < GRA1_HORIZONTAL_SIZE / 3 * 3){
				if((line_val & 0x04) == 0x04){
					*gra_vram++ = WHITE;
				}else{
					*gra_vram++ = BLACK;
				}
			}else{
				*gra_vram++ = BLACK;
			}
		}
	}
 }
 