深入理解ARM體系架構(gòu)(S3C6410)---lcd 顯示圖片
顯示控制器由VSFR,VDMA,VPRCS,VTIME,和視頻時(shí)鐘產(chǎn)生器。VSFR包含一些可編程的寄存器和兩個(gè)256x25的調(diào)色板內(nèi)存。這些都是用于配置顯示控制器的。VDMA專用于顯示DMA。它能將一幀的視頻數(shù)據(jù)發(fā)送到VPRCS。通過這些特定DMA,這些視頻數(shù)據(jù)可以在CPU不調(diào)停的情況下,顯示到顯示屏上。VPRCS從VDMA接收視頻數(shù)據(jù),并把接收的數(shù)據(jù)轉(zhuǎn)化成合適的數(shù)據(jù)格式,從而再發(fā)送到顯示器件上(LCD)。VTIME包含一些可編程的邏輯器件以滿足不同顯示設(shè)備的需求,如設(shè)置接口時(shí)序和刷新頻率. 產(chǎn)生:RGB_VSYNC,RGB_HSYNC, RGB_VCLK, RGB_VDEN,SYS_CS1, SYS_CS0等信號控制顯示設(shè)備。
FIFO在VDMA中。當(dāng)FIFO為空或部分為空時(shí),VDMA就會(huì)請求數(shù)據(jù)。當(dāng)內(nèi)存中的總線仲裁接收到這樣的傳輸請求時(shí),就會(huì)從系統(tǒng)內(nèi)存向內(nèi)部FIFO傳輸4/8/16連續(xù)的字。每個(gè)FIFO有64個(gè)字,同時(shí)FIFO的使用大小又有數(shù)據(jù)的傳輸速率決定。顯示控制器有5個(gè)FIFO,主要是為了滿足5個(gè)圖像層的使用。在每個(gè)屏幕顯示模式中,只有一個(gè)FIFO被使用。VPRCS通過FIFO提取數(shù)據(jù)。VPRCS支持層功能,最多5個(gè)層。下面的圖像顯示了數(shù)據(jù)流從系統(tǒng)總線到輸出緩存的過程。
再來看看mini6410中,nec43和顯示控制器的連接原理圖:
這樣我們就可以參考相應(yīng)的寄存器設(shè)置,來實(shí)現(xiàn)lcd的圖片顯示了,
原圖片:
我的手機(jī)像素極差,,,,
程序如下:
初始化函數(shù):
- void
LCD_Init(void) - {
//設(shè)置VD0~15 rGPICON = 0xaaaaaaaa; //設(shè)置GPI0~15為LCD VD0~15 rGPIPUD = 0x00000000; //設(shè)置VD16~23和HSYNC、VSYNC、VDEN、VCLK rGPJCON = 0x00aaaaaa; rGPJPUD = 0x00000000; //LCD寄存器設(shè)置 rSPCON |= (1<<0); //設(shè)置RGBI/F配置 //rSPCON = rSPCON & ~(0x3) | 1; rMIFPCON &= ~(1<<3); //設(shè)置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設(shè)備在VCLK上升沿得到視頻數(shù)據(jù) //設(shè)置屏的時(shí)序 rVIDTCON0 = (0x00<<16)|(0x00<<8)|(0x02<<0); rVIDTCON1 = (0x2d<<16)|(0x04<<8)|(0x06<<0); rVIDTCON2 = (271<<11)|(479<<0); //設(shè)置窗口格式 rWINCON0 = 11<<2; //設(shè)置24BPP //設(shè)置窗口位置 rVIDOSD0A = (0<<11)|(0<<0); rVIDOSD0B = (479<<11)|(271<<0); rVIDOSD0C = (((480*272)&0xffffff)<<0); //4.3屏幕分辨率480*272 //設(shè)置Window1的開始和結(jié)束的緩存地址與地址在內(nèi)存中的存放地址以及緩存的大小 rVIDW00ADD0B0 = ((addr>>24)<<24)|(addr&0xffffff); rVIDW00ADD1B0 = (addr&0xffffff + 480*272); rVIDW00ADD2 = (0<<13)|(480<<0); //設(shè)置抖動(dòng) rDITHMODE=(1<<5)|(1<<3)|(1<<1)|(1<<0); //開顯示 rVIDCON0 |= (3<<0); rWINCON0 |= (1<<0); - }
畫圖函數(shù):
- 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; } } - }
評論