S3C6410显现操控器包括这样的逻辑电路:从后处理器(POST Processor)或体系内存视频缓冲数据的本地总线传递数据到外部LCD驱动接口电路的逻辑电路。S3C6410包括4种接口:传统的RGB接口,I80接口,规范电视编码接口NTSC/PAL,IT-R BT.601接口。S3C6410显现操控器支撑5层图画窗口。层图画窗口支撑:various color format,16 level alpha blending, color key, x-y position control, soft scrolling,variable window size。显现操控器支撑1BPP~24BPP 颜色的RGB格局和YCbCr格局。显现操控器能满意水平笔直像素,数据宽度, 接口时序, 改写频率等各种设置需求。显现操控器视频数据接口包括:RGB_VD[23:0],SYS_VD[17:0], TV_OUT。
显现操控器由VSFR,VDMA,VPRCS,VTIME,和视频时钟发生器。VSFR包括一些可编程的寄存器和两个256×25的调色板内存。这些都是用于装备显现操控器的。VDMA专用于显现DMA。它能将一帧的视频数据发送到VPRCS。经过这些特定DMA,这些视频数据能够在CPU不调解的情况下,显现到显现屏上。VPRCS从VDMA接纳视频数据,并把接纳的数据转化成适宜的数据格局,然后再发送到显现器材上(LCD)。VTIME包括一些可编程的逻辑器材以满意不同显现设备的需求,如设置接口时序和改写频率. 发生:RGB_VSYNC,RGB_HSYNC, RGB_VCLK, RGB_VDEN,SYS_CS1, SYS_CS0等信号操控显现设备。
FIFO在VDMA中。当FIFO为空或部分为空时,VDMA就会恳求数据。当内存中的总线裁定接纳到这样的传输恳求时,就会从体系内存向内部FIFO传输4/8/16接连的字。每个FIFO有64个字,一起FIFO的运用巨细又有数据的传输速率决议。显现操控器有5个FIFO,首要是为了满意5个图画层的运用。在每个屏幕显现形式中,只要一个FIFO被运用。VPRCS经过FIFO提取数据。VPRCS支撑层功用,最多5个层。下面的图画显现了数据流从体系总线到输出缓存的进程。
再来看看mini6410中,nec43和显现操控器的衔接原理图:
这样咱们就能够参阅相应的寄存器设置,来完成lcd的图片显现了,
原图片:
我的手机像素极差,,,,
程序如下:
初始化函数:
- void
LCD_Init(void) - {
//设置VD0~15 rGP%&&&&&%ON = 0xaaaaaaaa; //设置GPI0~15为LCD VD0~15 rGPIPUD = 0x00000000; //设置VD16~23和HSYNC、VSYNC、VDEN、VCLK rGPJCON = 0x00aaaaaa; rGPJPUD = 0x00000000; //LCD寄存器设置 rSPCON |= (1<<0); //设置RGBI/F装备 //rSPCON = rSPCON & ~(0x3) | 1; rMIFPCON &= ~(1<<3); //设置LCD支路为一般形式 rVIDCON0 = (0<<29)|(0<<27)|(0<<26)|(0<<18)|(0<<17)|(0<<16)|(9<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(1<<1)|(1<<0); rVIDCON1 = 1<<7; //1=RGB类型LCD设备在VCLK上升沿得到视频数据 //设置屏的时序 rVIDTCON0 = (0x00<<16)|(0x00<<8)|(0x02<<0); rVIDTCON1 = (0x2d<<16)|(0x04<<8)|(0x06<<0); rVIDTCON2 = (271<<11)|(479<<0); //设置窗口格局 rWINCON0 = 11<<2; //设置24BPP //设置窗口方位 rVIDOSD0A = (0<<11)|(0<<0); rVIDOSD0B = (479<<11)|(271<<0); rVIDOSD0C = (((480*272)&0xffffff)<<0); //4.3屏幕分辨率480*272 //设置Window1的开端和完毕的缓存地址与地址在内存中的寄存地址以及缓存的巨细 rVIDW00ADD0B0 = ((addr>>24)<<24)|(addr&0xffffff); rVIDW00ADD1B0 = (addr&0xffffff + 480*272); rVIDW00ADD2 = (0<<13)|(480<<0); //设置颤动 rDITHMODE=(1<<5)|(1<<3)|(1<<1)|(1<<0); //开显现 rVIDCON0 |= (3<<0); rWINCON0 |= (1<<0); - }
画图函数:
- void
LCD_DrawPixel(unsigned int x, unsigned int y, unsigned int color) - {
if((x<480) && (y<272)) LCD_BUFFER[y][x] = color; - }
- void
LCD_Paint_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp) - {
int x,y; unsigned int c; int p = 0; for( y = y0 ; y < l ; y++ ) { for( x = x0 ; x < h ; x++ ) { //RGB888 c = (bmp[p]) | (bmp[p+1]<<8) | (bmp[p+2]<<16); if ( ( (x0+x) < LCD_XSIZE) && ( (y0+y) ) LCD_BUFFER[y0+y][x0+x] = c ; p = p+3; } } - }