📄 flcd.c
字号:
*/
void SetFrameBase( unsigned char *pFrameBuffer )
{
*(unsigned int *)(LCD_IO_Base + 0x10) = (unsigned int) pFrameBuffer;
}
void Init_LCD( volatile unsigned int LCD_Base, volatile LCDMTYPE_T *pLCDC, unsigned int lcd_type, unsigned char bpp)
{
*(volatile unsigned int *) (LCD_Base + 0x0 )= pLCDC[lcd_type].Timing0;
*(volatile unsigned int *) (LCD_Base + 0x4 )= pLCDC[lcd_type].Timing1;
*(volatile unsigned int *) (LCD_Base + 0x8 )= pLCDC[lcd_type].Timing2;
// *(volatile unsigned int *) (LCD_Base + 0x10 )= 0x10000020;
// *(volatile unsigned int *) (LCD_Base + 0x1c )= 0x00053a29; //YCbCR
*(volatile unsigned int *) (LCD_Base + 0x1c ) = 0x00013a21; // Turn on LCD
SetBPP( bpp );
Set_DivNo(6);
}
void SetBPP( unsigned char bpp)
{
*(unsigned int *)(LCD_IO_Base + 0x1c) &= 0xFFFFFFF1;
switch( bpp)
{
case 1:
*(unsigned int *)(LCD_IO_Base + 0x1c) &= 0xFFFFFFF1;
*(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000000;
break;
case 2:
*(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000002;
break;
case 4:
*(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000004;
break;
case 8:
*(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000006;
break;
case 16:
*(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000008;
break;
case 24:
*(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x0000000a;
break;
}
}
void SetEndian( unsigned char endian )
{
*(unsigned int *)(LCD_IO_Base + 0x1c) &= 0xFFFFF9FF;
switch( endian )
{
case LBLP:
break;
case BBBP:
*(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000200;
break;
case LBBP:
*(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00000400;
break;
}
}
void SetYCbCr( int type )
{
*(unsigned int *)(LCD_IO_Base + 0x1c) &= 0xfff9ffff;
if( type == 422)
{
*(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00040000;
}
else
if( type == 420)
*(unsigned int *)(LCD_IO_Base + 0x1c) |= 0x00060000;
}
void ColorBar_YCbCr_420( unsigned char endian, unsigned char *pFrameBuffer, int width, int height, int int_test)
{
unsigned char *CbPtr, *CrPtr, r, g, b;
int i,j;
OSD_Off(LCD_IO_Base);
SetYCbCr(420);
Set_DivNo(6);
// SetBPP(8);
r=0, g=0; b=255;
rgb2ycbcr( &r, &g, &b );
*(unsigned int *)(LCD_IO_Base + 0x10) |= 0x20;
CbPtr = pFrameBuffer + 0x80000;
CrPtr = pFrameBuffer + 0xa0000;
SetEndian( endian );
if(endian == BBBP)
{
for(i=0; i<height; i++) //*********** draw pattern
{
r=255, g=0; b=0;
rgb2ycbcr( &r, &g, &b );
for(j=0; j<(width * 1/3 ); j++)
{
*(unsigned char *) (pFrameBuffer + i * width + (j & 0xFFFFFFFC ) + 3-(j%4) ) = r;
if( ((i%2) == 0) && ((j%2) == 0) )
*(unsigned char *) (CbPtr + (width>>1) * (i>> 1) + ((j>>1) & 0xFFFFFFFC) + (3 - ((j>>1) %4) ) ) = g;
if( ((i%2) == 0) && ((j%2) == 0) )
*(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + ((j>>1) & 0xFFFFFFFC) + (3 - ((j>>1) %4)) )= b;
}
r=0, g=255; b=0;
rgb2ycbcr( &r, &g, &b );
for( ; j<(width * 2/3 ); j++)
{
*(unsigned char *) (pFrameBuffer + i * width + (j & 0xFFFFFFFC ) + 3-(j%4) ) = r;
if( ((i%2) == 0) && ((j%2) == 0) )
*(unsigned char *) (CbPtr + (width>>1) * (i>> 1) + ((j>>1) & 0xFFFFFFFC) + (3 - ((j>>1) %4) )) = g;
if( ((i%2) == 0) && ((j%2) == 0) )
*(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + ((j>>1) & 0xFFFFFFFC) + (3 - ((j>>1) %4))) = b;
}
r=0, g=0; b=255;
rgb2ycbcr( &r, &g, &b );
for( ; j<width; j++)
{
*(unsigned char *) (pFrameBuffer + i * width + (j & 0xFFFFFFFC ) + 3-(j%4) ) = r;
if( ((i%2) == 0) && ((j%2) == 0) )
*(unsigned char *) (CbPtr + (width>>1) * (i>> 1) + ((j>>1) & 0xFFFFFFFC) + (3 - ((j>>1) %4) ) )= g;
if( ((i%2) == 0) && ((j%2) == 0) )
*(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + ((j>>1) & 0xFFFFFFFC) + (3 - ((j>>1) %4)) )= b;
}
} // end of i loop
} //end of if(BBBP)
else
{
for(i=0; i<height; i++) //*********** draw pattern
{
r=255, g=0; b=0;
rgb2ycbcr( &r, &g, &b );
for(j=0; j<(width * 1/3 ); j++)
{
*(unsigned char *) (pFrameBuffer + i * width + j ) = r;
if( (i%2) == 0 ) *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) + (j>>1) ) = g;
if( (i%2) == 0 ) *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + (j>>1) ) = b;
}
r=0, g=255; b=0;
rgb2ycbcr( &r, &g, &b );
for( ; j<(width * 2/3 ); j++)
{
*(unsigned char *) (pFrameBuffer + i * width + j) = r;
if( (i%2) == 0 ) *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) + (j>>1) ) = g;
if( (i%2) == 0 ) *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + (j>>1) ) = b;
}
r=0, g=0; b=255;
rgb2ycbcr( &r, &g, &b );
for( ; j<width; j++)
{
*(unsigned char *) (pFrameBuffer + i * width + j) = r;
if( (i%2) == 0 ) *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) + (j>>1) ) = g;
if( (i%2) == 0 ) *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + (j>>1) ) = b;
}
}
}
/*
for(i=0; i<height; i++) //*********** draw pattern
{
r=255, g=0; b=0;
rgb2ycbcr( &r, &g, &b );
for(j=0; j<(width * 1/3 ); j++)
{
*(unsigned char *) (pFrameBuffer + i * width + (j>>2) + 3-(j%4) ) = r;
if( (i%2) == 0 ) *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) + (j>>1) ) = g;
if( (i%2) == 0 ) *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + (j>>1) ) = b;
}
r=0, g=255; b=0;
rgb2ycbcr( &r, &g, &b );
for( ; j<(width * 2/3 ); j++)
{
*(unsigned char *) (pFrameBuffer + i * width + j) = r;
if( (i%2) == 0 ) *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) + (j>>1) ) = g;
if( (i%2) == 0 ) *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + (j>>1) ) = b;
}
r=0, g=0; b=255;
rgb2ycbcr( &r, &g, &b );
for( ; j<width; j++)
{
*(unsigned char *) (pFrameBuffer + i * width + j) = r;
if( (i%2) == 0 ) *(unsigned char *) (CbPtr + (width>>1) * (i>> 1) + (j>>1) ) = g;
if( (i%2) == 0 ) *(unsigned char *) (CrPtr + (width>>1) * (i>> 1) + (j>>1) ) = b;
}
}
*/
}
void ColorBar_YCbCr_422( unsigned char endian, unsigned char *pFrameBuffer, int width, int height, int int_test)
{
int i,j;
unsigned char r,g,b, result;
OSD_Off(LCD_IO_Base);
(volatile) FIFO_Under_Run=0;
fLib_ConnectInt(34, UnderRun_Handler ); //it only can be
UnmaskFIQ(2);
SetFIQmode(2,LEVEL);
SetBPP(16);
SetEndian(endian);
SetYCbCr(422);
Set_DivNo(6);
switch(endian)
{
case BBBP: printf("YCbCr BBBP Testing\n");
break;
case LBLP: printf("YCbCr LBLP Testing\n");
break;
case LBBP: printf("YCbCr LBBP Testing\n");
break;
}
for(i=0; i<height; i++) //*********** draw pattern
{
r=255, g=0; b=0; // Draw red Bar
rgb2ycbcr( &r, &g, &b );
for(j=0; j< ( width * 1/3) *2 ; j=j+4)
{
if( endian == BBBP)
{
*(unsigned char *) (pFrameBuffer + i * width*2 + j+3 ) = r;
*(unsigned char *) (pFrameBuffer + i * width*2 + j+2 ) = g;
*(unsigned char *) (pFrameBuffer + i * width*2 + j+1 ) = r;
*(unsigned char *) (pFrameBuffer + i * width*2 + j ) = b;
}
else
{
*(unsigned char *) (pFrameBuffer + i * width*2 + j+3 ) = r;
*(unsigned char *) (pFrameBuffer + i * width*2 + j+2 ) = b;
*(unsigned char *) (pFrameBuffer + i * width*2 + j+1 ) = r;
*(unsigned char *) (pFrameBuffer + i * width*2 + j ) = g;
}
}
r=0, g=255; b=0; // Draw green bar
rgb2ycbcr( &r, &g, &b );
for( ; j< (width * 2/3 )*2 ; j=j+4)
{
if( endian == BBBP)
{
*(unsigned char *) (pFrameBuffer + i * width*2 + j+3 ) = r;
*(unsigned char *) (pFrameBuffer + i * width*2 + j+2 ) = g;
*(unsigned char *) (pFrameBuffer + i * width*2 + j+1 ) = r;
*(unsigned char *) (pFrameBuffer + i * width*2 + j ) = b;
}
else
{
*(unsigned char *) (pFrameBuffer + i * width*2 + j+3 ) = r;
*(unsigned char *) (pFrameBuffer + i * width*2 + j+2 ) = b;
*(unsigned char *) (pFrameBuffer + i * width*2 + j+1 ) = r;
*(unsigned char *) (pFrameBuffer + i * width*2 + j ) = g;
}
}
r=0, g=0; b=255;
rgb2ycbcr( &r, &g, &b );
for( ; j<(width * 3/3) *2 ; j=j+4) //Draw blue bar
{
if( endian == BBBP)
{
*(unsigned char *) (pFrameBuffer + i * width*2 + j+3 ) = r;
*(unsigned char *) (pFrameBuffer + i * width*2 + j+2 ) = g;
*(unsigned char *) (pFrameBuffer + i * width*2 + j+1 ) = r;
*(unsigned char *) (pFrameBuffer + i * width*2 + j ) = b;
}
else
{
*(unsigned char *) (pFrameBuffer + i * width*2 + j+3 ) = r;
*(unsigned char *) (pFrameBuffer + i * width*2 + j+2 ) = b;
*(unsigned char *) (pFrameBuffer + i * width*2 + j+1 ) = r;
*(unsigned char *) (pFrameBuffer + i * width*2 + j ) = g;
}
}
}
//************* Check Buffer Under Run ***************************************
if( int_test)
{
*(volatile unsigned int *) ( LCD_IO_Base + 0x20 )= 0x00000002;
*(volatile unsigned int *) ( LCD_IO_Base + 0x18 )= 0x00000002;
EnableFIQ();
*(volatile unsigned int *) ( LCD_IO_Base + 0x08 ) &= 0xffff7fff; //Adpative off
printf("If the color bar is ok, press y to pass\n");
do{
result = getchar();
}while( (result != 'y') );
printf("Change divisor, press 'y' or 'Y'");
do{
result = getchar();
}while( (result != 'y') );
Set_DivNo(2);
printf("Check if your screen flash, press 'y' or 'Y'\n");
do{
result = getchar();
}while( (result != 'y') );
if( FIFO_Under_Run ) printf("Generate FIFO Under Run Interrupt Successfully\n");
else printf("FIFO Under Run Interrupt Fail\n");
if(FIFO_Under_Run) printf("FIFO under run generate interrupt\n");
else printf("FIFO under run interrupt fail\n");
printf("Use adaptive, press 'y' or 'Y'");
do{
result = getchar();
}while( (result != 'y') );
*(volatile unsigned int *) ( LCD_IO_Base + 0x08 ) |= 0x00008000;
printf("If screen is ok, press 'y' or 'Y'");
do{
result = getchar();
}while( (result != 'y') );
}
}
void OSD_On( unsigned int base ) //OSD Enable/disable
{
*(unsigned int *) (base + 0x34) &= 0xfffffffe;
*(unsigned int *) (base + 0x34) |= 1;
}
void OSD_Off( unsigned int LCD_IO_Base ) //OSD Enable/disable
{
*(unsigned int *) (LCD_IO_Base + 0x34) &= 0xfffffffe;
}
void OSD_Pos( unsigned int LCD_IO_Base, int HPos, int VPos)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -