新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 深入理解ARM體系架構(S3C6410)---lcd 顯示圖片

        深入理解ARM體系架構(S3C6410)---lcd 顯示圖片

        作者: 時間:2016-11-09 來源:網絡 收藏
        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。

        本文引用地址:http://www.104case.com/article/201611/317829.htm

        顯示控制器由VSFR,VDMA,VPRCS,VTIME,和視頻時鐘產生器。VSFR包含一些可編程的寄存器和兩個256x25的調色板內存。這些都是用于配置顯示控制器的。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的圖片顯示了,

        原圖片:

        我的手機像素極差,,,,

        程序如下:

        初始化函數:

        [cpp]view plaincopyprint?
        1. voidLCD_Init(void)
        2. {
        3. //設置VD0~15
        4. rGPICON=0xaaaaaaaa;//設置GPI0~15為LCDVD0~15
        5. rGPIPUD=0x00000000;
        6. //設置VD16~23和HSYNC、VSYNC、VDEN、VCLK
        7. rGPJCON=0x00aaaaaa;
        8. rGPJPUD=0x00000000;
        9. //LCD寄存器設置
        10. rSPCON|=(1<<0);//設置RGBI/F配置//rSPCON=rSPCON&~(0x3)|1;
        11. rMIFPCON&=~(1<<3);//設置LCD支路為一般模式
        12. 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);
        13. rVIDCON1=1<<7;//1=RGB類型LCD設備在VCLK上升沿得到視頻數據
        14. //設置屏的時序
        15. rVIDTCON0=(0x00<<16)|(0x00<<8)|(0x02<<0);
        16. rVIDTCON1=(0x2d<<16)|(0x04<<8)|(0x06<<0);
        17. rVIDTCON2=(271<<11)|(479<<0);
        18. //設置窗口格式
        19. rWINCON0=11<<2;//設置24BPP
        20. //設置窗口位置
        21. rVIDOSD0A=(0<<11)|(0<<0);
        22. rVIDOSD0B=(479<<11)|(271<<0);
        23. rVIDOSD0C=(((480*272)&0xffffff)<<0);//4.3屏幕分辨率480*272
        24. //設置Window1的開始和結束的緩存地址與地址在內存中的存放地址以及緩存的大小
        25. rVIDW00ADD0B0=((addr>>24)<<24)|(addr&0xffffff);
        26. rVIDW00ADD1B0=(addr&0xffffff+480*272);
        27. rVIDW00ADD2=(0<<13)|(480<<0);
        28. //設置抖動
        29. rDITHMODE=(1<<5)|(1<<3)|(1<<1)|(1<<0);
        30. //開顯示
        31. rVIDCON0|=(3<<0);
        32. rWINCON0|=(1<<0);
        33. }

        畫圖函數:

        [cpp]view plaincopyprint?
        1. voidLCD_DrawPixel(unsignedintx,unsignedinty,unsignedintcolor)
        2. {
        3. if((x<480)&&(y<272))
        4. LCD_BUFFER[y][x]=color;
        5. }
        6. voidLCD_Paint_Bmp(intx0,inty0,inth,intl,constunsignedchar*bmp)
        7. {
        8. intx,y;
        9. unsignedintc;
        10. intp=0;
        11. for(y=y0;y<l;y++)
        12. {
        13. for(x=x0;x<h;x++)
        14. {
        15. //RGB888
        16. c=(bmp[p])|(bmp[p+1]<<8)|(bmp[p+2]<<16);
        17. if(((x0+x)<LCD_XSIZE)&&((y0+y))
        18. LCD_BUFFER[y0+y][x0+x]=c;
        19. p=p+3;
        20. }
        21. }
        22. }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 酉阳| 漳州市| 剑川县| 文化| 罗江县| 海城市| 威远县| 高阳县| 来宾市| 定西市| 沈阳市| 咸宁市| 蒙阴县| 盐津县| 宜宾市| 玉溪市| 民勤县| 汉沽区| 健康| 静海县| 安塞县| 景洪市| 临沂市| 临汾市| 贵德县| 洛阳市| 同江市| 沙坪坝区| 集安市| 马公市| 临沭县| 玉屏| 文成县| 太白县| 偏关县| 上犹县| 黎城县| 巩义市| 隆安县| 阿合奇县| 丰原市|