📄 lcd.c
字号:
#include "Lcd.h"
S32 g_lhorizontalpix;
S32 g_lverticalpix;
S32 g_ldummypix;
S32 g_lstartpoint;
S32 g_lstartline;
S32 g_lhorizontalclknum;
S32 g_lhscalevec;
S32 g_lvscalevec;
void spi_mst(S32 addr, S32 data)
{
S32 i=0;
*P_SPI_TXRX_STATUS = 0x40000000; //SPI smart mode
*P_SPI_TX_STATUS = 0x80000010; //SPITXLEVEL1;
*P_SPI_RX_STATUS = 0x80000030; //SPIRXLEVEL3;
*P_SPI_MODE_CTRL = 0x80000006;
*P_SPI_TX_DATA = addr;
*P_SPI_TX_DATA = data;
while(i != 0x00000001)
i = *P_SPI_TXRX_STATUS & 0x00000001;
*P_SPI_MODE_CTRL = 0x00000006; //SPI_OFF
for(i=0;i<1000;i++);
}
void LCD_Buffer_Setting(S32 FB_ADDR0, S32 FB_ADDR1, S32 FB_ADDR2)
{
*P_LCD_BUFFER_SA1 = FB_ADDR0;
*P_LCD_BUFFER_SA2 = FB_ADDR1;
*P_LCD_BUFFER_SA3 = FB_ADDR2;
}
void TFT_Ctrl_Setting( S32 tft_en, S32 ver_scl, S32 hor_scl, S32 clk_sel, S32 int_en )
{
int p_tft_int, p_tft_ctrl;
p_tft_int = int_en << 24;
p_tft_ctrl = (tft_en << 24) + (ver_scl << 10) + (hor_scl << 8) + (clk_sel);
*P_TFT_INT_STATUS = p_tft_int;
*P_TFT_MODE_CTRL = p_tft_ctrl;
}
void Hor_Time_Setting( S32 hor_act, S32 hor_fblk, S32 hor_bblk, S32 hor_syncw )
{
*P_TFT_HOR_ACT = hor_act;
*P_TFT_HOR_FRONT = hor_fblk;
*P_TFT_HOR_BACK = hor_bblk;
*P_TFT_HOR_SYNC = hor_syncw;
}
void Ver_Time_Setting( S32 ver_act, S32 ver_fblk, S32 ver_bblk, S32 ver_syncw )
{
*P_TFT_VER_ACT = ver_act;
*P_TFT_VER_FRONT = ver_fblk;
*P_TFT_VER_BACK = ver_bblk;
*P_TFT_VER_SYNC = ver_syncw;
}
void Dis_area_Setting( S32 str_lno, S32 str_pno, S32 pix_num, S32 dumy_pix )
{
*P_TFT_ROW_START = str_lno;
*P_TFT_COL_START = str_pno;
*P_TFT_COL_WIDTH = pix_num;
*P_TFT_DUMMY_WIDTH = dumy_pix;
}
void Data_seq_Setting( S32 tft_fmt, S32 yuv_fmt, S32 yuv_seq, S32 rgb_ol_seq, S32 rgb_el_seq )
{
int p_data_seq;
p_data_seq = (yuv_fmt<<24) + (yuv_seq << 16) + (rgb_ol_seq << 8) + (rgb_el_seq);
*P_TFT_DATA_SEQ = p_data_seq;
*P_TFT_DATA_FMT = tft_fmt;
}
void delay_TFT( unsigned int T )
{
for( ; T > 0; T-- )
{
__asm("nop");
__asm("nop");
__asm("nop");
}
}
void calculate_act_area( S32 type, S32 mode, S32 CLK )
{
if( mode == VGA_Data )
{
g_lhorizontalpix = 640;
g_lverticalpix = 480;
g_lhscalevec = 2;
g_lvscalevec = 2;
}
else if( mode == HVGA_Data )
{
g_lhorizontalpix = 640;
g_lverticalpix = 240;
g_lhscalevec = 2;
g_lvscalevec = 0;
}
else
{
g_lhorizontalpix = 320;
g_lverticalpix = 240;
g_lhscalevec = 0;
g_lvscalevec = 0;
}
if( type == S_RGB )
g_lhorizontalclknum = ((g_lhorizontalpix << 1) + g_lhorizontalpix ) << CLK;
else if( type == S_RGBDM)
g_lhorizontalclknum = ( g_lhorizontalpix << 2 ) << CLK;
else
g_lhorizontalclknum = g_lhorizontalpix << CLK;
}
void Init_TFTLcd( S32 Panel_Sel, S32 type, S32 mode, S32 fb_fmt )
{
int i;
*(U32*)0x88210034 = 0;
for(i=0;i<2000;i++);
*(U32*)0x88210034 = 3;
for(i=0;i<0xffff; i++);
for(i=0;i<0xffff; i++);
*P_BUFCTRL_MODE_CTRL3 = 0x1;//PPU_P2L_EN;
switch(Panel_Sel)
{
case AUO_6 :
calculate_act_area( type, mode, CK_135 );
*P_TFT_FRAME_FMT1 = fb_fmt;
//Hor_Time_Setting( g_lhorizontalclknum, 48, 128, 96 );
//Ver_Time_Setting( g_lverticalpix, 3, 6, 10 );
Hor_Time_Setting( 1056, 16, 224, 48 );
Ver_Time_Setting( 288, 3, 15, 1 );
Data_seq_Setting( type, 0, 0, O_RGB, E_RGB );
//Dis_area_Setting( 0, 0, g_lhorizontalpix, 0 );
Dis_area_Setting( 0, 0, 512, 16 );
TFT_Ctrl_Setting( TFT_EN, g_lvscalevec, g_lhscalevec, CK_135, INT_DEN );
break;
case TDO_20: // TDO 2.0" 052
calculate_act_area( type, mode, CK_27 );
*P_TFT_FRAME_FMT1 = fb_fmt;
if( type == S_RGBDM )
{
Hor_Time_Setting( g_lhorizontalclknum, 40, 240, 10 );
Ver_Time_Setting( g_lverticalpix, 1, 21, 1 );
Data_seq_Setting( type, 0, 0, O_RGB, E_RGB );
}
else if ( type == CCIR601_M640 || type == CCIR601_M720 )
{
Hor_Time_Setting( g_lhorizontalclknum, 36, 240, 10 );
Ver_Time_Setting( g_lverticalpix, 1, 21, 1 );
Data_seq_Setting( type, dis_YCbCr, V0Y0U0Y1, 0, 0 );
}
Dis_area_Setting( 0, 0, g_lhorizontalpix, 0 );
TFT_Ctrl_Setting( TFT_EN, g_lvscalevec, g_lhscalevec, CK_27, INT_DEN );
spi_mst(0x08, 0x00);
break;
case A036QN01 : //AUO 3.6" Stripe (051)
calculate_act_area( type, mode, CK_27 );
*P_TFT_FRAME_FMT1 = fb_fmt;
Hor_Time_Setting( g_lhorizontalclknum, 196, 196, 10 );
Ver_Time_Setting( g_lverticalpix, 200, 13, 3 );
Data_seq_Setting( type, 0, 0, O_RGB, E_RGB );
Dis_area_Setting( 0, 0, g_lhorizontalpix, 0 );
TFT_Ctrl_Setting( TFT_EN, g_lvscalevec, g_lhscalevec, CK_27, INT_DEN );
break;
case A036QN02 : //AUO 3.6" Stripe (052)
calculate_act_area( type, mode, CK_27 );
*P_TFT_FRAME_FMT1 = fb_fmt;
if( type == S_RGB )
{
Hor_Time_Setting( g_lhorizontalclknum, 515, 241, 10 );
Ver_Time_Setting( g_lverticalpix, 1, 21, 1 );
Data_seq_Setting( type, 0, 0, O_RGB, E_GBR );
}
else if( type == S_RGBDM )
{
Hor_Time_Setting( g_lhorizontalclknum, 515, 241, 10 );
Ver_Time_Setting( g_lverticalpix, 1, 21, 1 );
Data_seq_Setting( type, 0, 0, O_RGB, E_RGB );
}
else if( type == CCIR656_M720 || type == CCIR656_M640 )
{
//Hor_Time_Setting( g_lhorizontalclknum, 112, 324, 10);
Hor_Time_Setting( g_lhorizontalclknum, 124, 156, 10);
//Hor_Time_Setting( g_lhorizontalclknum, 124, 140, 10);
Ver_Time_Setting( g_lverticalpix, 2, 21, 9 );
Data_seq_Setting( type, dis_YCbCr, U0Y0V0Y1, 0, 0 );
}
//Dis_area_Setting( 0, 0, g_lhorizontalpix, 0 );
Dis_area_Setting( 0, 0, 320, 0 );
TFT_Ctrl_Setting( TFT_EN, g_lvscalevec, g_lhscalevec, CK_27, INT_DEN );
if( type == S_RGB )
{
spi_mst(0x04, 0x07);
spi_mst(0x06, 0x15);
spi_mst(0x07, 0xf1);
}
else if( type == S_RGBDM )
{
spi_mst(0x10, 0xc8);
spi_mst(0x00, 0xbf);
spi_mst(0x34, 0x10);
spi_mst(0x84, 0x98);
spi_mst(0x60, 0x80);
spi_mst(0x70, 0x88);
spi_mst(0xc1, 0x00);
}
else if( type == CCIR656_M720 || type == CCIR656_M640 )
{
spi_mst(0x00, 0x3f);
spi_mst(0x10, 0xee);
spi_mst(0x60, 0x80);
spi_mst(0x70, 0x88);
spi_mst(0x30, 0x10);
spi_mst(0x20, 0x80);
spi_mst(0x84, 0x98);
spi_mst(0xc1, 0x00);
}
break;
case A024CN02: //AUO 2.36" (052)
calculate_act_area( type, mode, CK_27 );
*P_TFT_FRAME_FMT1 = fb_fmt;
Hor_Time_Setting( g_lhorizontalclknum, 200, 249, 10 );
Ver_Time_Setting( g_lverticalpix, 10, 16, 4 );
Data_seq_Setting( type, 0, 0, O_RGB, E_RGB );
Dis_area_Setting( 0, 0, g_lhorizontalpix, 0 );
TFT_Ctrl_Setting( TFT_EN, g_lvscalevec, g_lhscalevec, CK_27, INT_DEN );
// spi_mst(0x00, 0x0f);
break;
case GPLS024: //Gaintplus 2.36" (051)
//calculate_act_area( type, mode, CK_27 );
g_lhorizontalpix = 160; //480dots
g_lverticalpix = 240; //234 dots
g_lhscalevec = 0;
g_lvscalevec = 0;
g_lhorizontalclknum = 480;
*P_TFT_FRAME_FMT1 = fb_fmt;
Hor_Time_Setting( g_lhorizontalclknum, 5, 100, 1 );
Ver_Time_Setting( g_lverticalpix, 12, 16, 1 );
Data_seq_Setting( type, 0, 0, O_RGB, E_GBR );
Dis_area_Setting( 0, 0, 160, 160 );
TFT_Ctrl_Setting( TFT_EN, g_lvscalevec, g_lhscalevec, CK_27, INT_DEN );
spi_mst(0x00, 0x0f);
break;
case A025BN01: //AUO 2.5" ( 052 + CCIR656 )
calculate_act_area( type, mode, CK_27 );
*P_TFT_FRAME_FMT1 = fb_fmt;
if( type == S_RGB )
{
}
else if( type == S_RGBDM )
{
Hor_Time_Setting( g_lhorizontalclknum, 103, 261, 1 );
Ver_Time_Setting( g_lverticalpix, 12, 12, 1 );
Data_seq_Setting( type, 0, 0, O_RGB, E_RGB );
}
else if( type == CCIR656_M720 || type == CCIR656_M640 )
{
Hor_Time_Setting( g_lhorizontalclknum, 154, 260, 1 );
Ver_Time_Setting( g_lverticalpix, 12, 12, 1 );
Data_seq_Setting( type, dis_YCbCr, U0Y0V0Y1, 0, 0 );
}
Dis_area_Setting( 0, 0, 320, 0 );
TFT_Ctrl_Setting( TFT_EN, g_lvscalevec, g_lhscalevec, CK_27, INT_DEN );
if( type == S_RGB )
{
}
else if( type == S_RGBDM )
{
spi_mst(0x10, 0x11);
spi_mst(0x00, 0x3f);
}
else if( type == CCIR656_M720 || type == CCIR656_M640 )
{
spi_mst(0x10, 0x13);
spi_mst(0x00, 0x3f);
}
break;
case A025DL01: //AUO 2.5" LTPS ( 051+052+CCIR656 )
calculate_act_area( type, mode, CK_27 );
*P_TFT_FRAME_FMT1 = fb_fmt;
if( type == S_RGB )
{
Hor_Time_Setting( g_lhorizontalclknum, 515, 241, 10 );
Ver_Time_Setting( g_lverticalpix, 1, 21, 1 );
Data_seq_Setting( type, 0, 0, O_RGB, E_GBR );
}
else if( type == S_RGBDM )
{
Hor_Time_Setting( g_lhorizontalclknum, 79, 241, 10 );
Ver_Time_Setting( g_lverticalpix, 1, 21, 1 );
Data_seq_Setting( type, 0, 0, O_RGB, E_RGB );
}
else if( type == CCIR656_M720 || type == CCIR656_M640 )
{
Hor_Time_Setting( g_lhorizontalclknum, 112, 324, 10 );
Ver_Time_Setting( g_lverticalpix, 2, 21, 9 );
Data_seq_Setting( type, dis_YCbCr, U0Y0V0Y1, 0, 0 );
}
//Dis_area_Setting( 0, 0, g_lhorizontalpix, 0 );
Dis_area_Setting( 0, 0, 320, 0 );
TFT_Ctrl_Setting( TFT_EN, g_lvscalevec, g_lhscalevec, CK_27, INT_DEN );
if( type == S_RGB )
{
spi_mst(0x04, 0x07);
spi_mst(0x06, 0x15);
spi_mst(0x07, 0xf1);
}
else if( type == S_RGBDM )
{
spi_mst(0x04, 0x17);
spi_mst(0x06, 0x15);
spi_mst(0x07, 0xf1);
}
else if( type == CCIR656_M720 || type == CCIR656_M640 )
{
// spi_mst(0x05, 0x00);
spi_mst(0x04, 0x57);
spi_mst(0x0c, 0x66);
}
spi_mst(0x08, 0x07);
spi_mst(0x05, 0x77);
break;
case TS35ND2501:
calculate_act_area( type, mode, CK_675 );
// *P_TFT_DM = 0;
*P_TFT_FRAME_FMT1 = fb_fmt;
Hor_Time_Setting(g_lhorizontalclknum,0x5, 249,10);
// Hor_Time_Setting(g_lhorizontalclknum, 200, 5, 10);
Ver_Time_Setting( g_lverticalpix, 1,24, 1 );
// Ver_Time_Setting( g_lverticalpix, 10, 16, 0x10004 );
Data_seq_Setting( type, 0, 0, O_RGB, E_RGB );
Dis_area_Setting( 0, 0, g_lhorizontalpix, 0 );
TFT_Ctrl_Setting( TFT_EN, g_lvscalevec, g_lhscalevec, CK_675 ,TFT_DEN); // TFT_DEN );
*P_TFT_FRAME_FMT2 = 1;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -