📄 flcd.c
字号:
*(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){ *(unsigned int *) (LCD_IO_Base + 0x38) = (HPos << 10) | VPos;} void OSD_Dim( unsigned int LCD_IO_Base, int HDim, int VDim){ int value; value = *(unsigned int *) (LCD_IO_Base + 0x34); value &= 0x0000001f; value |= ((HDim << 10) | (VDim << 5)); *(unsigned int *) (LCD_IO_Base + 0x34) = value;} void OSD_transparent( unsigned int LCD_IO_Base, int level){ *(unsigned int *) (LCD_IO_Base + 0x40) &= 0xffffff00; *(unsigned int *) (LCD_IO_Base + 0x40) |= (level << 6);}void OSD_fg_color( unsigned int LCD_IO_Base, int pal0, int pal1, int pal2, int pal3){ unsigned int value; *(unsigned int *) (LCD_IO_Base + 0x3c) = (pal0) | (pal1 <<8) | (pal2 << 16) | (pal3<< 24);}void OSD_bg_color( unsigned int LCD_IO_Base, int pal1, int pal2, int pal3){ unsigned int value; value = *(unsigned int *) (LCD_IO_Base + 0x40); value &= 0x0000003f; value |= (pal1 <<8) | (pal2 << 16) | (pal3 << 24); *(unsigned int *) (LCD_IO_Base + 0x40) = value;}void OSD_Scal( unsigned int LCD_IO_Base, int HScal, int VScal){ unsigned int value; value = *(unsigned int *) (LCD_IO_Base + 0x34); value &= 0xffffffe1; value |= (HScal<<3) | (VScal << 1) ; *(unsigned int *) (LCD_IO_Base + 0x34) = value;}void OSD_putc( char c, int position){ if( c >= '0' && c < '9' ) { *(unsigned int *) (LCD_IO_Base + 0xc000 + position *4 ) = ( (c -'0') << 4); } else if( c>= 'A' && c <= 'Z') { *(unsigned int *) (LCD_IO_Base + 0xc000 + position *4 ) = ( ( c - 'A' +10) << 4); } if( c == ' ' ) *(unsigned int *) (LCD_IO_Base + 0xc000 + position *4 ) = ( ( 'Z' - 'A' +10 + 1) << 4); if( c == '=') *(unsigned int *) (LCD_IO_Base + 0xc000 + position *4 ) = ( ( 'Z' - 'A' +10 + 2) << 4); if( c == ',') *(unsigned int *) (LCD_IO_Base + 0xc000 + position *4 ) = ( ( 'Z' - 'A' +10 + 3) << 4); }void OSD_puts( char *str, int position){ int i; for(i=0; i< strlen(str); i++) OSD_putc( *(str +i), position +i );}void OSD_Test( int mode, char *str){ int i,j,x,y, k; char result; char *msg=" "; strcpy( msg, str); for(i=0; i< 16*10 + 16* 26 ; i++) // 10 digit & 10 alphabet *(unsigned int *) (LCD_IO_Base + 0x8000 +i*4 ) = OSD_Font[i]; for(i=0; i< 100 ; i++) *(unsigned int *) (LCD_IO_Base + 0xc000 +i*4 ) = OSD_Attribute[i]; OSD_puts(str, 0); // Init_LCD( LCD_IO_Base, LcdModule, panel_type, 24);// ColorBar_RGB( 4, LBBP, pFrameBuffer, panel_width, panel_height, 0); *(unsigned int *) (LCD_IO_Base + 0x3c) = 0xFF1C03e0; //Pal3 (FF)= , Pal2 (1C)= Green, Pal1(03) = Red, Pal0(E0)= Blue if(mode == 2) //YCbCr { OSD_fg_color(LCD_IO_Base, 0x57, 0x88, 0x3B, 0xFF); OSD_bg_color(LCD_IO_Base, 0x57, 0x88, 0x3B);// OSD_puts("YCBCR OSD ", 0); } else { OSD_fg_color(LCD_IO_Base, 0x07, 0x38, 0xC0, 0xFF); OSD_bg_color(LCD_IO_Base, 0x07, 0x38, 0xc0);// OSD_puts("RGB OSD ", 0); } OSD_On(LCD_IO_Base); OSD_transparent( LCD_IO_Base, 1); // msg="D 10 10, i=j=10; OSD_Dim( LCD_IO_Base, i, j); OSD_Scal(LCD_IO_Base, 0,0 ); for( x= 1, y=1 ; x< 250; x++) //Move from "top left" to "top right" { OSD_Pos(LCD_IO_Base, x,y); for(k=0; k<7000;k++); } OSD_Scal(LCD_IO_Base, 1,1 ); for( ;y<150; y++) //Move From "top right" to "bottom right" { OSD_Pos(LCD_IO_Base, x,y); for(k=0; k<7000;k++); } for( ; x> 2; x--) //Move from "bottom right" to "bottom left" { OSD_Pos(LCD_IO_Base, x,y); for(k=0; k<7000;k++); } OSD_Scal(LCD_IO_Base, 3,3); for( ; y> 2; y--) //Move from "bottom left" to "top left" { OSD_Pos(LCD_IO_Base, x,y); for(k=0; k<7000;k++); } OSD_Scal(LCD_IO_Base, 0, 3); for( ; x< 250; x++, y++) //Move from "top left" to "bottom right" { OSD_Pos(LCD_IO_Base, x,y); for(k=0; k<7000;k++); } OSD_Scal(LCD_IO_Base, 3, 0); OSD_transparent( LCD_IO_Base, 2); for( x=200, y=0; x> 0; x--, y++) //Move from "top right" to "bottom left" { OSD_Pos(LCD_IO_Base, x,y); for(k=0; k<7000;k++); } OSD_Scal(LCD_IO_Base, 0,0 ); OSD_transparent( LCD_IO_Base, 3); OSD_Pos(LCD_IO_Base, 100, 60); for( i=2; i<=10; i++) for( j=2; j<=10; j++) { OSD_Dim( LCD_IO_Base, i, j); for(k=0; k<50000;k++); } }void ColorBar_RGB( unsigned char bpp, unsigned char endian, unsigned char *pFrameBuffer, int width, int height, int int_test){ int i,j; char result; unsigned pixel_per_byte; unsigned char pattern[4][5]={ {0x00, 0xff, 0x00, 0x0f, 0xf0}, //1bpp {Bar1, Bar2, Bar3, pixel-enidan1, pixel-endian2} {0x00, 0x55, 0xaa, 0x05, 0x50}, //2bpp {Bar1, Bar2, Bar3, pixel-enidan1, pixel-endian2} {0x00, 0x11, 0x22, 0x01, 0x10}, //4bpp {Bar1, Bar2, Bar3, pixel-enidan1, pixel-endian2} {0x00, 0x1, 0x2, 0x99, 0x99} //8bpp {Bar1, Bar2, Bar3, no-pixel-endian, no-pixel-endian} }; unsigned char bpp_tbl[9]={99,0,1,99,2,99,99,99,3}; pixel_per_byte = 8/bpp; // Init_LCD( LCD_IO_Base, LcdModule, panel_type, bpp); OSD_Off(LCD_IO_Base); *(unsigned int *) (LCD_IO_Base + 0x200) = 0x07E0001F; // Palette 0 = Red, Palette 1=Green *(unsigned int *) (LCD_IO_Base + 0x204) = 0xF800F800; // Palette 2 = Blue, SetBPP(bpp); switch(endian) { case BBBP: printf("RGB %d BBBP Testing\n", bpp); break; case LBLP: printf("RGB %d LBLP Testing\n", bpp); break; case LBBP: printf("RGB %d LBBP Testing\n", bpp); break; } if( endian == LBLP) { SetEndian( LBLP ); printf("Little Byte Little Pixel Testing\n"); for(i=0; i<height; i++) //*********** draw pattern { for(j=0; j<width* 1/3; j++) if( (j% pixel_per_byte ) ==0 ) *( pFrameBuffer + i*(width/pixel_per_byte) + j/pixel_per_byte) = pattern[ bpp_tbl[bpp] ][0]; for(j=width* 1/3; j< width * 2/3; j++) if( (j% pixel_per_byte ) == 0 ) *( pFrameBuffer + i*(width/pixel_per_byte) + j/pixel_per_byte) = pattern[ bpp_tbl[bpp] ][1]; for(j=width * 1/3 *2 ; j<width; j++) if( (j% pixel_per_byte )== 0 ) *( pFrameBuffer + i*(width/pixel_per_byte) + j/pixel_per_byte) = pattern[bpp_tbl[bpp]][2]; } } if( endian == BBBP ) { printf("Big Byte Big Pixel Testing\n"); SetEndian( BBBP ); for(i=0; i<height; i++) //*********** draw pattern { for(j=0; j<( width* 1/3) || (j%pixel_per_byte) != 0 ; j++) // Byte order formula floor(j/4) *4 + (3-(j%4)) ; 4 -> means 1 words = 4bytes if( (j%pixel_per_byte) ==0 ) *( pFrameBuffer + i*(width/pixel_per_byte) + (unsigned int) floor( (j/pixel_per_byte)/4) *4 +3 - ((j/pixel_per_byte) % 4) ) = pattern[ bpp_tbl[bpp] ][0]; // Test pixel endian *( pFrameBuffer + i*(width/pixel_per_byte) + (unsigned int) floor( (j/pixel_per_byte)/4) *4 +3 - ((j/pixel_per_byte) % 4) ) = pattern[ bpp_tbl[bpp] ][3]; for(/*j=width* 1/3*/ ; j< width * 2/3 || (j%pixel_per_byte) != 0 ; j++) if( (j%pixel_per_byte) == 0 ) *( pFrameBuffer + i*(width/pixel_per_byte) + (unsigned int) floor( (j/pixel_per_byte)/4) *4 +3 - ((j/pixel_per_byte) % 4)) = pattern[ bpp_tbl[bpp] ][1]; // j=419; // Test pixel endian *( pFrameBuffer + i*(width/pixel_per_byte) + (unsigned int) floor( (j/pixel_per_byte)/4) *4 +3 - ((j/pixel_per_byte) % 4) ) = pattern[ bpp_tbl[bpp] ][4]; for(/*j=width * 1/3 *2*/ ; j<width; j++) if( (j%pixel_per_byte)== 0 ) *( pFrameBuffer + i*(width/pixel_per_byte) + (unsigned int) floor( (j/pixel_per_byte)/4) *4 +3 - ((j/pixel_per_byte) % 4) ) =pattern[ bpp_tbl[bpp] ][2]; } } if( endian == LBBP ) { printf("Little Byte Big Pixel Testing\n"); SetEndian( LBBP ); for(i=0; i<height; i++) //*********** draw pattern { for(j=0; j<( width* 1/3) || (j%pixel_per_byte) != 0 ; j++) if( (j% pixel_per_byte ) ==0 ) *( pFrameBuffer + i*(width/pixel_per_byte) + j/pixel_per_byte) = pattern[ bpp_tbl[bpp] ][0]; *( pFrameBuffer + i*(width/pixel_per_byte) + j/pixel_per_byte) = pattern[ bpp_tbl[bpp] ][3]; for(/*j=width* 1/3*/ ; j< width * 2/3 || (j%pixel_per_byte) != 0 ; j++) if( (j%pixel_per_byte) == 0 ) *( pFrameBuffer + i*(width/pixel_per_byte) + j/pixel_per_byte) =pattern[ bpp_tbl[bpp] ][1]; *( pFrameBuffer + i*(width/pixel_per_byte) + j/pixel_per_byte) = pattern[ bpp_tbl[bpp] ][4]; for(/*j=width * 1/3 *2*/ ; j<width; j++) if( (j%pixel_per_byte)== 0 ) *( pFrameBuffer + i*(width/pixel_per_byte) + j/pixel_per_byte) = pattern[ bpp_tbl[bpp] ][2]; } } if( int_test) { printf(" Check the screen, if it is correct press 'y' or 'Y'"); do{ result = getchar(); }while( (result != 'y') ); //************* Check Buffer Under Run *************************************** FIFO_Under_Run=0; *(volatile unsigned int *) ( LCD_IO_Base + 0x20 )= 0x00000002; *(volatile unsigned int *) ( LCD_IO_Base + 0x18 )= 0x00000002; fLib_ConnectInt(34, UnderRun_Handler ); //it only can be UnmaskFIQ(2); SetFIQmode(2,LEVEL); 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(1); 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') ); UnmaskFIQ(2); DisableFIQ(); fLib_CloseInt(34); } }void rgb2ycbcr( unsigned char *r, unsigned char *g, unsigned char *b){ unsigned char r_tmp, g_tmp, b_tmp; r_tmp = *r; g_tmp = *g; b_tmp = *b; *r= (unsigned char) (0.299 * r_tmp + 0.578 * g_tmp + 0.114 * b_tmp); //Y =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -