📄 l2_lcdtv.c
字号:
{
XBYTE[0x2D2B] |= 0x01; //enable gamma //cytsai@0328
XBYTE[0x21AC] |= 0x01; //enable saturation and hue adjustment //cytsai@0328
// patch 5.2.1_32@mattwang@fix STNLCD160 & STNLCD128 setting beg
XBYTE[0x21AE]= 0x58; // saturation // 20040423 mattwang add
XBYTE[0x201C] = 0x02; //00; // TV encoder clock=12MHz // 20040422 mattwang modify
XBYTE[0x2D20] = 0x40; // imgsubsamp // 20040422 mattwang add
XBYTE[0x2D00] = 0x0C; // tvdspmode
XBYTE[0x2D02] = 0x8B; //AF; // vline // 20040423 mattwang modify
XBYTE[0x2D03] = 0x00; // vline
XBYTE[0x2D04] = 0xAB; //1F; // hpixel // 20040423 mattwang modify
XBYTE[0x2D05] = 0x00; //01; // hpixel // 20040423 mattwang modify
XBYTE[0x2D06] = 0x02; // vsyncw
XBYTE[0x2D07] = 0x08; //04; // hsyncw // 20040423 mattwang modify
XBYTE[0x2D08] = 0x28; // vldx0
XBYTE[0x2D09] = 0x00; // vldx0
XBYTE[0x2D0A] = 0x04; // vldy0
XBYTE[0x2D0B] = 0x00; // vldy0
XBYTE[0x2D0C] = 0xA7; // vldx1
XBYTE[0x2D0D] = 0x00; // vldx1
XBYTE[0x2D0E] = 0x83; // vldy1
XBYTE[0x2D0F] = 0x00; // vldy1
XBYTE[0x2D1B] = 0x00; // imgvofst
XBYTE[0x2D1C] = 0x00; // imgvofst
XBYTE[0x2D1D] = 0x00; // imghofst
XBYTE[0x2D1E] = 0x00; // imghofst
XBYTE[0x2D26] = 0x02; // odd , even line
XBYTE[0x2D21] = 0x40; // osdsubsamp
XBYTE[0x2D32] = 0x20; // osdvzfac
XBYTE[0x2D33] = 0x00; // osdvofst
XBYTE[0x2D34] = 0x20; // osdhofst // 20040423 mattwang modify
XBYTE[0x2DE2] = 0x02; // field mode
// patch 5.2.1_32@mattwang@fix STNLCD160 & STNLCD128 setting end
return 0;
}
//#endif
// patch 5.2.1_30@mattwang@add STNLCD128 LCD pannel end
// patch 5.2.1_33@mattwang@add AU015AN04 LCD pannel beg
//#ifdef AU015AN04
if(index==21)// AU015AN04 output
{
ThreeWire_WriteMsb16Data(0x0001); // scan direction: up to down, left to right
ThreeWire_WriteMsb16Data(0x2001); // data setting: UPS052 mode
ThreeWire_WriteMsb16Data(0x400C); // source IC setting: normal operating
ThreeWire_WriteMsb16Data(0x6001); // timing select: UPS052 timing
XBYTE[0x201C] = 0x00; // using 27MHz for AU digital I/F TFT-LCD
XBYTE[0x20E6] = 0x80; // phase adjustment
XBYTE[0x2D00] = 0x09; // tvdspmode= UPS052
XBYTE[0x2D02] = 262 & 0xFF; // vline
XBYTE[0x2D03] = 262 >> 8; // vline
XBYTE[0x2D06] = 3; // vsyncw
XBYTE[0x2D0A] = ((25-3)-1) & 0xFF; // vldy0
XBYTE[0x2D0B] = ((25-3)-1) >> 8; // vldy0
XBYTE[0x2D0E] = ((25-3)+220-1) & 0xFF; // vldy1
XBYTE[0x2D0F] = ((25-3)+220-1) >> 8; // vldy1
XBYTE[0x2D04] = (1560/2+1) & 0xFF; // hpixel
XBYTE[0x2D05] = (1560/2+1) >> 8; // hpixel
XBYTE[0x2D07] = 25/2+1; // hsyncw
XBYTE[0x2D08] = ((268-4*4)/2) & 0xFF; // vldx0
XBYTE[0x2D09] = ((268-4*4)/2) >> 8; // vldx0
XBYTE[0x2D0C] = ((268+(280+56)*4)/2-1) & 0xFF; // vldx1
XBYTE[0x2D0D] = ((268+(280+56)*4)/2-1) >> 8; // vldx1
XBYTE[0x2D1B] = 0x00; // imgvofst
XBYTE[0x2D1C] = 0x00; // imgvofst
XBYTE[0x2D1D] = 0x00; // imghofst
XBYTE[0x2D1E] = 0x00; // imghofst
XBYTE[0x2D20] = 0x20; // imgsubsamp
XBYTE[0x2D21] = 0x24; // osdsubsamp
XBYTE[0x2D26] = 0x08; // oddrgb & evenrgb
XBYTE[0x2D33] = 0x00; // osdvofst
XBYTE[0x2D34] = 0x46; // osdhofst
XBYTE[0x2DE2] = 0x02; // field mode
status = 0;
}
//#endif
// patch 5.2.1_33@mattwang@add AU015AN04 LCD pannel end
MemStretch = tmp;
return(status);
}
//-----------------------------------------------------------------------------
//L2_SetDisplaySrcImgSize
//-----------------------------------------------------------------------------
// return value
// 0: no error
// 1: parameter error
UCHAR L2_SetDisplaySrcImgSize(USHORT hsize, USHORT vsize, UCHAR type)
{
UCHAR imghzfac, imgvzfac;
USHORT imggrp, dsphsize, dspvsize;
UCHAR LCD_status = 0;
UCHAR tmp;
//patch4.4@richie@tv begin
//adjust for lcdtv start point
UCHAR tmp1,tmp2;
USHORT lcdtvX0,lcdtvY0;
USHORT lcdtvX1,lcdtvY1;
tmp1 = XBYTE[0x2D09];
tmp2 = XBYTE[0x2D08];
lcdtvX0 = ( ((USHORT)tmp1 << 8) | ((USHORT)tmp2) );
tmp1 = XBYTE[0x2D0B];
tmp2 = XBYTE[0x2D0A];
lcdtvY0 = ( ((USHORT)tmp1 << 8) | ((USHORT)tmp2) );
tmp1 = XBYTE[0x2D0D];
tmp2 = XBYTE[0x2D0C];
lcdtvX1 = ( ((USHORT)tmp1 << 8) | ((USHORT)tmp2) );
tmp1 = XBYTE[0x2D0F];
tmp2 = XBYTE[0x2D0E];
lcdtvY1 = ( ((USHORT)tmp1 << 8) | ((USHORT)tmp2) );
//printf("L2 lcdtv = (%d,%d) (%d,%d)\n",lcdtvX0,lcdtvY0,lcdtvX1,lcdtvY1);
//printf("L2 width = %d,height = %d\n",(lcdtvX1 - lcdtvX0 + 1),(lcdtvY1 - lcdtvY0 + 1));
//patch4.4@richie@tv end
tmp = MemStretch;
MemStretch = 0x01;
if(hsize%16==0) imggrp = (hsize >> 4);
else imggrp = (hsize >> 4) + 1;
if(type==0||type==2||type==4||type==6||type==17) // NTSC display size
//patch4.3@yichang@0612 to fit TV screen
{
//patch4.4@richie@tv begin
//dsphsize = 640;dspvsize = 216;
dsphsize = (lcdtvX1 - lcdtvX0 + 1);
//patch4.4@yichang@tv begin
dspvsize = (lcdtvY1 - lcdtvY0 + 1);
if((G_DSPVsize/dspvsize) != 2)
{
//patch5.2.1@ada@Fix NTSC & PAL display error while rotation begin
//G_DSPVsize = 2 * dspvsize;
//vsize = G_DSPVsize;
vsize = 2 * dspvsize;
//patch5.2.1@ada@Fix NTSC & PAL display error while rotation end
}
//patch4.4@yichang@tv end
//patch4.4@richie@tv end
}
//{dsphsize = 720;dspvsize = 240;}
//{dsphsize = 800;dspvsize = 600;}
else if(type==1||type==3||type==5||type==7) // PAL display size
{
//patch4.4@richie@tv begin
//dsphsize = 720;dspvsize = 288;
dsphsize = (lcdtvX1 - lcdtvX0 + 1);
//patch4.4@yichang@tv begin
dspvsize = (lcdtvY1 - lcdtvY0 + 1);
if((G_DSPVsize/dspvsize) != 2)
{
//patch5.2.1@ada@Fix NTSC & PAL display error while rotation begin
//G_DSPVsize = 2 * dspvsize;
//vsize = G_DSPVsize;
vsize = 2 * dspvsize;
//patch5.2.1@ada@Fix NTSC & PAL display error while rotation end
}
//patch4.4@yichang@tv end
//patch4.4@richie@tv end
}
else if(type==8) // UPS051
{dsphsize = 288;dspvsize = 220;}
else if(type==9) // EPSON LCD panel
{dsphsize = 312;dspvsize = 230;}
else if(type==10) // CASIO LCD panel
{dsphsize = 356;dspvsize = 240;}
else if(type==11) // GiantPlus STN LCD panel
{dsphsize = 240;dspvsize = 160;}
else if(type==12) // PrimeView TFT LCD panel
{dsphsize = 640;dspvsize = 480;}
else if(type==13) // AU015AN02
{dsphsize = 312;dspvsize = 220;}
else if(type==14) // STNLCD160
//patch4.2@richie@0523
{dsphsize = 161;dspvsize = 120;}
else if(type==15) // PrimeView TFT LCD panel
{dsphsize = 800;dspvsize = 600;}
else if(type==16) // AU015BL01 //patch5.2.1@cwh@AU015BL01;2003/08/08
{dsphsize = 520;dspvsize = 250;}
// patch 5.2.1_28@mattwang@rename CASIO2G to CASIO2G1181 beg
else if(type==18) // CASIO2G1181 //patch5.2.1@cwh@CASIO2G;2003/09/24
{dsphsize = 480;dspvsize = 240;}
// patch 5.2.1_28@mattwang@rename CASIO2G to CASIO2G1181 end
// patch 5.2.1_28@mattwang@add CASIO2G1163 LCD pannel beg
else if(type==19) // CASIO2G1163
{dsphsize = 280;dspvsize = 228;}//WENDY@2004/9/9
// patch 5.2.1_28@mattwang@add CASIO2G1163 LCD pannel end
// patch 5.2.1_30@mattwang@add STNLCD128 LCD pannel beg
else if(type==20) // STNLCD128
{dsphsize = 128;dspvsize = 128;}
// patch 5.2.1_30@mattwang@add STNLCD128 LCD pannel end
// patch 5.2.1_33@mattwang@add AU015AN04 LCD pannel beg
else if(type==21) // AU015AN04
{dsphsize = 340;dspvsize = 220;}
// patch 5.2.1_33@mattwang@add AU015AN04 LCD pannel end
else LCD_status = 1;
imgvzfac = ((ULONG)vsize*32)/dspvsize;
imghzfac = ((ULONG)hsize*128)/dsphsize;
//printf("hsizec=%d, vsize=%d\n",hsize,vsize);
//printf("dsphsize=%d, dspvsize=%d\n",dsphsize,dspvsize);
//printf("imghzfac=%bx, imgvzfac=%bx\n",imghzfac,imgvzfac);
XBYTE[0x2D19] = imgvzfac;
XBYTE[0x2D1A] = imghzfac;
XBYTE[0x2D1F] = imggrp;
MemStretch = tmp;
return(LCD_status);
}
//-----------------------------------------------------------------------------
//L2_TurnOnOffDisplay
//-----------------------------------------------------------------------------
// return value
// 0: no error
// 1: parameter error
UCHAR L2_TurnOnOffDisplay (UCHAR mode)
{
UCHAR type;
UCHAR LCD_state = 0;
UCHAR tmp;
tmp = MemStretch;
MemStretch = 0x01;
type = XBYTE[0x2D00];
//patch4.4@richie@flip
type = type & 0x0F;
if(mode>2){
LCD_state = 1; // parameter error
}
//Joe@2003.3.12 14:26 modify begin
//else if(mode==0)
else if( (mode==0) || (G_DisplayMode == K_DisplayModePowerOff) )
//Joe@2003.3.12 14:26 modify end
{ // turn off display
//Joe@2003.3.5 13:42 add begin
if ((XBYTE[0x2001] & 0x01) > 0) //Make sure TV output is enabled
{
while ((XBYTE[0x2DA0] & 0x08) > 0); //wait TV VD low
while ((XBYTE[0x2DA0] & 0x08) == 0); //wait TV VD high
}
//Joe@2003.3.5 13:43 add end
XBYTE[0x2001] = 0x04;
XBYTE[0x2D01] = XBYTE[0x2D01] | 0x10;
//patch4.4.1@yichang@ to fix two LCD/TV display bugs
//1. TV output field sequence error.
//2. LCD and TV picture become vague as the display device is changed repeatedly.
//begin:
XBYTE[0x2013] = XBYTE[0x2013] & 0xE7; // stop the 27 and 13.5MHz source
//Joe@2003.2.25 14:52 add begin
#if(TURNKEY_OPTION == 1)
L2_SetGPIOBit(15,0); //LCD_BACKLIGHT
//DbgPrint("L2_TurnOnOffDisplay15=%bu\n",15);
#else
L2_SetGPIOBit(16,0);
#endif
//Joe@2003.2.25 14:52 add end
}
else if(mode==1)
{ // turn on display
if(type==0||type==1)
{
//Joe@2003.2.25 14:52 add begin
#if(TURNKEY_OPTION == 1)
L2_SetGPIOBit(15,0); //LCD_BACKLIGHT
//DbgPrint("L2_TurnOnOffDisplay16=%bu\n",16);
#else
L2_SetGPIOBit(16,0); //Back light(5V,18V)
#endif
//Joe@2003.3.5 13:42 add begin
if ((XBYTE[0x2001] & 0x01) > 0) //Make sure TV output is enabled
{
while ((XBYTE[0x2DA0] & 0x08) > 0); //wait TV VD low
while ((XBYTE[0x2DA0] & 0x08) == 0); //wait TV VD high
}
//Joe@2003.3.5 13:43 add end
//Joe@2003.2.27 13:06 modify begin
XBYTE[0x2001] = 0x01;
//XBYTE[0x2001] = 0x09;
//Joe@2003.2.27 13:06 modify end
XBYTE[0x2D01] = XBYTE[0x2D01] | 0x10;
XBYTE[0x2013] = XBYTE[0x2013] | 0x18; // start the 27 and 13.5MHz source
//Joe@2003.2.25 14:52 add end
}
else
{
//Joe@2003.2.25 14:52 add begin
//Joe@2003.2.25 14:52 add end
#if(TURNKEY_OPTION == 1)
L2_SetGPIOBit(15,1); //LCD_BACKLIGHT
#else
L2_SetGPIOBit(16,1); //Back light(5V,18V)
#endif
//Joe@2003.3.5 13:42 add begin
if ((XBYTE[0x2001] & 0x01) > 0) //Make sure TV output is enabled
{
while ((XBYTE[0x2DA0] & 0x08) > 0); //wait TV VD low
while ((XBYTE[0x2DA0] & 0x08) == 0); //wait TV VD high
}
//Joe@2003.3.5 13:43 add end
XBYTE[0x2001] = 0x05;
XBYTE[0x2D01] = XBYTE[0x2D01] | 0x10;
XBYTE[0x2013] = XBYTE[0x2013] | 0x18; // start the 27 and 13.5MHz source
}
}
else if(mode==2)
{ // no image input
//Joe@2003.2.25 14:53 add begin
#if(TURNKEY_OPTION == 1)
L2_SetGPIOBit(15,1); //LCD_BACKLIGHT
#else
L2_SetGPIOBit(16,1); //Back light(5V,18V)
#endif
//Joe@2003.2.25 14:53 add end
//Joe@2003.3.5 13:42 add begin
if ((XBYTE[0x2001] & 0x01) > 0) //Make sure TV output is enabled
{
while ((XBYTE[0x2DA0] & 0x08) > 0); //wait TV VD low
while ((XBYTE[0x2DA0] & 0x08) == 0); //wait TV VD high
}
//Joe@2003.3.5 13:43 add end
XBYTE[0x2D01] = XBYTE[0x2D01] & 0x0F;
}
//patch4.4.1@yichang@ to fix two LCD/TV display bugs
//1. TV output field sequence error.
//2. LCD and TV picture become vague as the display device is changed repeatedly.
//end
MemStretch = tmp;
return LCD_state;
}
//-----------------------------------------------------------------------------
//L2_SetColorPalette
//-----------------------------------------------------------------------------
// return value
// 0: no error
// 1: parameter error
UCHAR L2_SetColorPalette(UCHAR index, UCHAR r, UCHAR g, UCHAR b)
{
UCHAR LCD_state = 0;
UCHAR tmp;
tmp = MemStretch;
MemStretch = 0x01;
if(index>8) LCD_state = 1;
else if(index==0){
XBYTE[0x2D37] = r/8; // set R
XBYTE[0x2D38] = g/8; // set G
XBYTE[0x2D39] = b/8; // set B
}
else if(index==1){
XBYTE[0x2D3A] = r/8; // set R
XBYTE[0x2D3B] = g/8; // set G
XBYTE[0x2D3C] = b/8; // set B
}
else if(index==2){
XBYTE[0x2D3D] = r/8; // set R
XBYTE[0x2D3E] = g/8; // set G
XBYTE[0x2D3F] = b/8; // set B
}
else if(index==3){
XBYTE[0x2D40] = r/8; // set R
XBYTE[0x2D41] = g/8; // set G
XBYTE[0x2D42] = b/8; // set B
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -