TQ210 —— LCD
生活随笔
收集整理的這篇文章主要介紹了
TQ210 —— LCD
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
TQ210 —— LCD
一、LCD控制器
1、S5PV210 LCD控制器
? ? ? 要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅(qū)動器,而且還需要相應(yīng)的LCD控制器。在通常情況下,生產(chǎn)廠商把LCD驅(qū)動器會以COF/COG的形式與LCD玻璃基板制作在一起,而LCD控制器則是由外部的電路來實現(xiàn),現(xiàn)在很多的MCU內(nèi)部都集成了LCD控制器,如S5PV210等。通過LCD控制器就可以產(chǎn)生LCD驅(qū)動器所需要的控制信號來控制STN/TFT屏了。
? ? ? LCD控制器可以通過編程支持不同LCD屏的要求,例如行和列像素數(shù),數(shù)據(jù)總線寬度,接口時序和刷新頻率等。
? ? ? LCD控制器的主要作用,是將定位在系統(tǒng)存儲器中的顯示緩沖區(qū)中的LCD圖像數(shù)據(jù)傳送到外部LCD驅(qū)動器,并產(chǎn)生必要的控制信號,例如RGB_VSYNC, RGB_HSYNC, RGB_VCLK等。
?
2、主要特性
(1)支持4種接口類型:RGB/i80/ITU 601(656)/YTU444?
(2)支持單色、4級灰度、16級灰度、256色的調(diào)色板顯示模式?
(3)支持64K和16M色非調(diào)色板顯示模式?
(4)支持多種規(guī)格和分辨率的LCD?
(5)虛擬屏幕最大可達(dá)16MB?
(6)5個256*32位調(diào)色板內(nèi)存
(1)、主要由VSFR, VDMA, VPRCS , VTIME和視頻時鐘產(chǎn)生器幾個模塊組成:
(2)、VSFR由121個可編程控制器組,一套gamma LUT寄存器組(包括64個寄存器),一套i80命令寄存器組(包括12個寄存器)和5塊256*32調(diào)色板存儲器組成,主要用于對lcd控制器進(jìn)行配置。
(3)、VDMA是LCD專用的DMA傳輸通道,可以自動從系統(tǒng)總線上獲取視頻數(shù)據(jù)傳送到VPRCS,無需CPU干涉。
(4)、VPRCS收到數(shù)據(jù)后組成特定的格式(如16bpp或24bpp),然后通過數(shù)據(jù)接口(RGB_VD, VEN_VD, V656_VD or SYS_VD)傳送到外部LCD屏上。?
(5)、VTIME模塊由可編程邏輯組成,負(fù)責(zé)不同lcd驅(qū)動器的接口時序控制需求。VTIME模塊產(chǎn)生 RGB_VSYNC, RGB_HSYNC, RGB_VCLK, RGB_VDEN, VEN_VSYNC等信號。
二、接口信號
FIMD顯示控制器信號(我寫的word表格怎么成這樣了?)
Signal I/O Description LCD Type?
LCD_HSYNC O 水平同步信號 RGB I/F?
LCD_VSYNC O 垂直同步信號
LCD_VDEN O 數(shù)據(jù)使能
LCD_VCLK O 視頻時鐘
LCD_VD[23:0] O LCD像素數(shù)據(jù)輸出
SYS_OE O 輸出使能
VSYNC_LDI O Indirect i80接口,垂直同步信號 i80 I/F?
SYS_CS0 O Indirect i80接口,片選LCD0
SYS_CS1 O Indirect i80接口,片選LCD1
SYS_RS O Indirect i80接口,寄存器選擇信號
SYS_WE O Indirect i80接口,寫使能信號
SYS_VD[23:0] IO Indirect i80接口,視頻數(shù)據(jù)輸入輸出
SYS_OE O Indirect i80接口,輸出使能信號
VEN_HSYNC O 601接口水平同步信號 ITU 601/656 I/F?
VEN_VSYNC O 601接口垂直同步信號
VEN_HREF O 601接口數(shù)據(jù)使能
V601_CLK O 601接口數(shù)據(jù)時鐘
VEN_DATA[7:0] O 601接口YUV422格式數(shù)據(jù)輸出
V656_DATA[7:0] O 656接口YUV422格式數(shù)據(jù)輸出
V656_CLK O 656接口數(shù)據(jù)時鐘
VEN_FIELD O 601接口域信號
其中主要的RGB接口信號:
(1)、LCD_HSYNC: 行同步信號,表示一行數(shù)據(jù)的開始,LCD控制器在整個水平線(整行)數(shù)據(jù)移入LCD驅(qū)動器后,插入一個LCD_HSYNC信號;?
(2)、LCD_VSYNC: ?幀同步信號,表示一幀數(shù)據(jù)的開始,LCD控制器在一個完整幀顯示完成后立即插入一個LCD_VSYNC信號,開始新一幀的顯示;VSYNC信號出現(xiàn)的頻率表示一秒鐘內(nèi)能顯示多少幀圖像,稱為“顯示器的頻率”?
(3)、LCD_VCLK:像素時鐘信號,表示正在傳輸一個像素的數(shù)據(jù);
(4)、LCD_VDEN: 數(shù)據(jù)使能信號;
(5)、LCD_VD[23:0]: LCD像素數(shù)據(jù)輸出端口
三、工作時序
下圖是LCD RGB接口工作時序圖:
?
上面時序圖上各時鐘延時參數(shù)的含義如下:(這些參數(shù)的值,LCD產(chǎn)生廠商會提供相應(yīng)的數(shù)據(jù)手冊)?
VBPD(vertical back porch):表示在一幀圖像開始時,垂直同步信號以后的無效的行數(shù)
VFBD(vertical front porch):表示在一幀圖像結(jié)束后,垂直同步信號以前的無效的行數(shù)
VSPW(vertical sync pulse width):表示垂直同步脈沖的寬度,用行數(shù)計算
HBPD(horizontal back porch):表示從水平同步信號開始到一行的有效數(shù)據(jù)開始之間的VCLK的個數(shù)
HFPD(horizontal front porth):表示一行的有效數(shù)據(jù)結(jié)束到下一個水平同步信號開始之間的VCLK的個數(shù)
HSPW(horizontal sync pulse width):表示水平同步信號的寬度,用VCLK計算
(1)幀的傳輸過程
<1>、VSYNC信號有效時,表示一幀數(shù)據(jù)的開始, ? 信號寬度為 (VSPW + 1)個HSYNC信號周期,即(VSPW + 1)個無效行;
< 2>、VSYNC信號脈沖之后,總共還要經(jīng)過(VBPD + 1)個HSYNC信號周期,有效的行數(shù)據(jù)才出現(xiàn); 所以,在VSYNC信號有效之后,還要經(jīng)過(VSPW + 1 ?+ VBPD + 1)個無效的行;
<3>、隨即發(fā)出(LINEVAL + 1)行的有效數(shù)據(jù);
<4>、最后是(VFPD + 1)個無效的行;
(2)行中像素數(shù)據(jù)的傳輸過程
<1>、HSYNC信號有效時,表示一行數(shù)據(jù)的開始,信號寬度為(HSPW + 1)個VCLK信號周期,即(HSPW + 1)個無效像素;
<2>、HSYNC信號脈沖之后,還要經(jīng)過(HBPD + 1)個VCLK信號周期,有效的像素數(shù)據(jù)才出現(xiàn);
<3>、隨后發(fā)出(HOZVAL + 1)個像素的有效數(shù)據(jù);
<4>、最后是(HFPD + 1)個無效的像素;
(3)將VSYNC、HSYNC、VCLK等信號的時間參數(shù)設(shè)置好之后,并將幀內(nèi)存的地址告訴LCD控制器,它即可自動地發(fā)起DMA傳輸從幀內(nèi)存中得到圖像數(shù)據(jù),最終在上述信號的控制下出現(xiàn)在數(shù)據(jù)總線VD[23:0]上。用戶只需要把要顯示的圖像數(shù)據(jù)寫入幀內(nèi)存中。?
四、外部接口
S5PV210外部LCD控制器接口圖如下:
?
下圖是信號的引腳連接描述:
??
(1)16M(24BPP)色的顯示模式?
用24位的數(shù)據(jù)來表示一個像素的顏色,每種顏色使用8位
?LCD控制器從內(nèi)存中獲得某個像素的24為顏色值后,直接通過VD[23:0]數(shù)據(jù)線發(fā)送給LCD;
在內(nèi)存中,使用4個字節(jié)(32位)來表示一個像素,其中的3個字節(jié)從高到低分別表示紅、綠、藍(lán),剩余的1個字節(jié)無效; ??
?(2)64K(16BPP)色的顯示模式?
用16位的數(shù)據(jù)來表示一個像素的顏色;
格式又分為兩種:
? ? ? ? ? 5:6:5 ——使用5位來表示紅色,6位表示綠色,5位表示藍(lán)色 ?;
? ? ? ? ? 5:5:5:1——分別使用5位來表示紅、綠、藍(lán),最后一位表示透明度; ?
每種bpp模式下的引腳定義:
? ?
五、寄存器
主要寄存器如下:(其它參照用戶手冊S5PV210X_UserManual.pdf)
(1)VIDCON0: 配置視頻輸出格式,顯示使能(VIDCON0,R/W,ADDRESS=0XF800_0000)
? ? ?
? VIDCON1: RGB 接口控制信號?
? VIDCON2 : 輸出數(shù)據(jù)格式控制?
? VIDCON3 : 圖像增強(qiáng)控制?
? I80IFCONx: i80接口控制信號?
? ITUIFCON : ITU接口控制信號?
? VIDTCONx: 配置視頻輸出時序及顯示大小
? WINCONx: 每個窗口特性設(shè)置?
? VIDOSDxA,B : 窗口位置設(shè)置?
? VIDOSDxC,D: OSD大小設(shè)置
六、LCD配置步驟(S5PV210手冊給出了)
1. VIDCON0: Configures video output format and displays enable/disable.
2. VIDCON1: Specifies RGB I/F control signal.
3. VIDCON2: Specifies output data format control.
4. VIDCON3: Specifies image enhancement control.
5. I80IFCONx: Specifies CPU interface control signal.
6. VIDTCONx: Configures video output timing and determines the size of display.
7. WINCONx: Specifies each window feature setting.
8. VIDOSDxA, VIDOSDxB: Specifies window position setting.
9. VIDOSDxC,D: Specifies OSD size setting.
10. VIDWxALPHA0/1: Specifies alpha value setting.
11. BLENDEQx: Specifies blending equation setting.
12. VIDWxxADDx: Specifies source image address setting.
13. WxKEYCONx: Specifies color key setting register.
14. WxKEYALPHA: Specifies color key alpha value setting.
15. WINxMAP: Specifies window color control.
16. GAMMALUT_xx: Specifies gamma value setting.
17. COLORGAINCON: Specifies color gain value setting.
18. HUExxx: Specifies Hue coefficient and offset value setting.
19. WPALCON: Specifies palette control register.
20. WxRTQOSCON: Specifies RTQoS control register.
21. WxPDATAxx: Specifies Window Palette Data of each Index.
22. SHDOWCON: Specifies Shadow control register.
23. WxRTQOSCON: Specifies QoS control register
實際中,我們還需要配置 LCD 相關(guān)信號引腳(GPIO),以及背光控制引腳。
關(guān)鍵點解析:
1、 LCD 時鐘源的確定(參考 S5PV210 芯片手冊時鐘部分)
在 VIDCON0 寄存器中的 CLKSEL_F 域指定 LCD 的時鐘源可以是 HCLK 和 SCLK_FIMD。S5PV210 由 3 個時鐘域組成,其中 DSYS 域為 FIMD 提供時鐘,FIMD 就是 Fully Interactive Mobile Display(完全交互式移動顯示設(shè)備),即我們要操作的 LCD 控制器。所以上面的 HCLK 為 HCLK_DSYS,由 MOUT_DSYS 分頻得到,freq(HCLK_DSYS) = MOUT_DSYS / (HCLK_DSYS_RATIO + 1) = 667 / (3 + 1) = 166MHz,而 SCLK_FIMD 由 MOUT_FIMD 分頻得到,而 MOUT_FIMD 的時鐘源由 SCLK_SRC1 寄存器中的 FIMD_SEL域確定。
2、在 S5PV210 芯片手冊 1.3.1 BRIEF DESCRIPTION OF THE SUB-BLOCK 中提到
Using the display controller data, you can select one of the above data paths by setting DISPLAY_PATH_SEL[1:0] (0xE010_7008). For more information, refer to Chapter, "Section 02.03. Clock controller".我們需要配置這個寄存器
3、 VIDCON1 中配置 HSYNC、 VSYNC、 VDEN 的極性是否反轉(zhuǎn),這要對比 S5PV210 中的 LCD 時序圖和LCD 芯片手冊中的 LCD 時序圖,如果有效信號的電平或上升沿或下降沿相同,則不反轉(zhuǎn),否則要反轉(zhuǎn)。
4、 S5PV210 顯示控制器有 5 個窗口,每個窗口有 3 個視頻緩沖區(qū),通過 WINCON0 寄存器 BUFSEL選擇哪一個,這在配置幀緩存地址時用到。
添加 lcd 后,代碼已經(jīng)增大至 37kB,而 BL1 最大為 16KB,所以需要重定位,?
初始化時鐘、串口、 DDR,設(shè)置棧,然后跳轉(zhuǎn)到 DDR 中執(zhí)行 bl2.bin, 在 bl2.bin 中進(jìn)行 lcd 初始化,畫線、畫圓。
一、LCD控制器
1、S5PV210 LCD控制器
? ? ? 要使一塊LCD正常的顯示文字或圖像,不僅需要LCD驅(qū)動器,而且還需要相應(yīng)的LCD控制器。在通常情況下,生產(chǎn)廠商把LCD驅(qū)動器會以COF/COG的形式與LCD玻璃基板制作在一起,而LCD控制器則是由外部的電路來實現(xiàn),現(xiàn)在很多的MCU內(nèi)部都集成了LCD控制器,如S5PV210等。通過LCD控制器就可以產(chǎn)生LCD驅(qū)動器所需要的控制信號來控制STN/TFT屏了。
? ? ? LCD控制器可以通過編程支持不同LCD屏的要求,例如行和列像素數(shù),數(shù)據(jù)總線寬度,接口時序和刷新頻率等。
? ? ? LCD控制器的主要作用,是將定位在系統(tǒng)存儲器中的顯示緩沖區(qū)中的LCD圖像數(shù)據(jù)傳送到外部LCD驅(qū)動器,并產(chǎn)生必要的控制信號,例如RGB_VSYNC, RGB_HSYNC, RGB_VCLK等。
?
2、主要特性
(1)支持4種接口類型:RGB/i80/ITU 601(656)/YTU444?
(2)支持單色、4級灰度、16級灰度、256色的調(diào)色板顯示模式?
(3)支持64K和16M色非調(diào)色板顯示模式?
(4)支持多種規(guī)格和分辨率的LCD?
(5)虛擬屏幕最大可達(dá)16MB?
(6)5個256*32位調(diào)色板內(nèi)存
(7)支持透明疊加
(1)、主要由VSFR, VDMA, VPRCS , VTIME和視頻時鐘產(chǎn)生器幾個模塊組成:
(2)、VSFR由121個可編程控制器組,一套gamma LUT寄存器組(包括64個寄存器),一套i80命令寄存器組(包括12個寄存器)和5塊256*32調(diào)色板存儲器組成,主要用于對lcd控制器進(jìn)行配置。
(3)、VDMA是LCD專用的DMA傳輸通道,可以自動從系統(tǒng)總線上獲取視頻數(shù)據(jù)傳送到VPRCS,無需CPU干涉。
(4)、VPRCS收到數(shù)據(jù)后組成特定的格式(如16bpp或24bpp),然后通過數(shù)據(jù)接口(RGB_VD, VEN_VD, V656_VD or SYS_VD)傳送到外部LCD屏上。?
(5)、VTIME模塊由可編程邏輯組成,負(fù)責(zé)不同lcd驅(qū)動器的接口時序控制需求。VTIME模塊產(chǎn)生 RGB_VSYNC, RGB_HSYNC, RGB_VCLK, RGB_VDEN, VEN_VSYNC等信號。
二、接口信號
FIMD顯示控制器信號(我寫的word表格怎么成這樣了?)
Signal I/O Description LCD Type?
LCD_HSYNC O 水平同步信號 RGB I/F?
LCD_VSYNC O 垂直同步信號
LCD_VDEN O 數(shù)據(jù)使能
LCD_VCLK O 視頻時鐘
LCD_VD[23:0] O LCD像素數(shù)據(jù)輸出
SYS_OE O 輸出使能
VSYNC_LDI O Indirect i80接口,垂直同步信號 i80 I/F?
SYS_CS0 O Indirect i80接口,片選LCD0
SYS_CS1 O Indirect i80接口,片選LCD1
SYS_RS O Indirect i80接口,寄存器選擇信號
SYS_WE O Indirect i80接口,寫使能信號
SYS_VD[23:0] IO Indirect i80接口,視頻數(shù)據(jù)輸入輸出
SYS_OE O Indirect i80接口,輸出使能信號
VEN_HSYNC O 601接口水平同步信號 ITU 601/656 I/F?
VEN_VSYNC O 601接口垂直同步信號
VEN_HREF O 601接口數(shù)據(jù)使能
V601_CLK O 601接口數(shù)據(jù)時鐘
VEN_DATA[7:0] O 601接口YUV422格式數(shù)據(jù)輸出
V656_DATA[7:0] O 656接口YUV422格式數(shù)據(jù)輸出
V656_CLK O 656接口數(shù)據(jù)時鐘
VEN_FIELD O 601接口域信號
其中主要的RGB接口信號:
(1)、LCD_HSYNC: 行同步信號,表示一行數(shù)據(jù)的開始,LCD控制器在整個水平線(整行)數(shù)據(jù)移入LCD驅(qū)動器后,插入一個LCD_HSYNC信號;?
(2)、LCD_VSYNC: ?幀同步信號,表示一幀數(shù)據(jù)的開始,LCD控制器在一個完整幀顯示完成后立即插入一個LCD_VSYNC信號,開始新一幀的顯示;VSYNC信號出現(xiàn)的頻率表示一秒鐘內(nèi)能顯示多少幀圖像,稱為“顯示器的頻率”?
(3)、LCD_VCLK:像素時鐘信號,表示正在傳輸一個像素的數(shù)據(jù);
(4)、LCD_VDEN: 數(shù)據(jù)使能信號;
(5)、LCD_VD[23:0]: LCD像素數(shù)據(jù)輸出端口
三、工作時序
下圖是LCD RGB接口工作時序圖:
?
上面時序圖上各時鐘延時參數(shù)的含義如下:(這些參數(shù)的值,LCD產(chǎn)生廠商會提供相應(yīng)的數(shù)據(jù)手冊)?
VBPD(vertical back porch):表示在一幀圖像開始時,垂直同步信號以后的無效的行數(shù)
VFBD(vertical front porch):表示在一幀圖像結(jié)束后,垂直同步信號以前的無效的行數(shù)
VSPW(vertical sync pulse width):表示垂直同步脈沖的寬度,用行數(shù)計算
HBPD(horizontal back porch):表示從水平同步信號開始到一行的有效數(shù)據(jù)開始之間的VCLK的個數(shù)
HFPD(horizontal front porth):表示一行的有效數(shù)據(jù)結(jié)束到下一個水平同步信號開始之間的VCLK的個數(shù)
HSPW(horizontal sync pulse width):表示水平同步信號的寬度,用VCLK計算
(1)幀的傳輸過程
<1>、VSYNC信號有效時,表示一幀數(shù)據(jù)的開始, ? 信號寬度為 (VSPW + 1)個HSYNC信號周期,即(VSPW + 1)個無效行;
< 2>、VSYNC信號脈沖之后,總共還要經(jīng)過(VBPD + 1)個HSYNC信號周期,有效的行數(shù)據(jù)才出現(xiàn); 所以,在VSYNC信號有效之后,還要經(jīng)過(VSPW + 1 ?+ VBPD + 1)個無效的行;
<3>、隨即發(fā)出(LINEVAL + 1)行的有效數(shù)據(jù);
<4>、最后是(VFPD + 1)個無效的行;
(2)行中像素數(shù)據(jù)的傳輸過程
<1>、HSYNC信號有效時,表示一行數(shù)據(jù)的開始,信號寬度為(HSPW + 1)個VCLK信號周期,即(HSPW + 1)個無效像素;
<2>、HSYNC信號脈沖之后,還要經(jīng)過(HBPD + 1)個VCLK信號周期,有效的像素數(shù)據(jù)才出現(xiàn);
<3>、隨后發(fā)出(HOZVAL + 1)個像素的有效數(shù)據(jù);
<4>、最后是(HFPD + 1)個無效的像素;
(3)將VSYNC、HSYNC、VCLK等信號的時間參數(shù)設(shè)置好之后,并將幀內(nèi)存的地址告訴LCD控制器,它即可自動地發(fā)起DMA傳輸從幀內(nèi)存中得到圖像數(shù)據(jù),最終在上述信號的控制下出現(xiàn)在數(shù)據(jù)總線VD[23:0]上。用戶只需要把要顯示的圖像數(shù)據(jù)寫入幀內(nèi)存中。?
四、外部接口
S5PV210外部LCD控制器接口圖如下:
?
下圖是信號的引腳連接描述:
??
(1)16M(24BPP)色的顯示模式?
用24位的數(shù)據(jù)來表示一個像素的顏色,每種顏色使用8位
?LCD控制器從內(nèi)存中獲得某個像素的24為顏色值后,直接通過VD[23:0]數(shù)據(jù)線發(fā)送給LCD;
在內(nèi)存中,使用4個字節(jié)(32位)來表示一個像素,其中的3個字節(jié)從高到低分別表示紅、綠、藍(lán),剩余的1個字節(jié)無效; ??
?(2)64K(16BPP)色的顯示模式?
用16位的數(shù)據(jù)來表示一個像素的顏色;
格式又分為兩種:
? ? ? ? ? 5:6:5 ——使用5位來表示紅色,6位表示綠色,5位表示藍(lán)色 ?;
? ? ? ? ? 5:5:5:1——分別使用5位來表示紅、綠、藍(lán),最后一位表示透明度; ?
每種bpp模式下的引腳定義:
? ?
五、寄存器
主要寄存器如下:(其它參照用戶手冊S5PV210X_UserManual.pdf)
(1)VIDCON0: 配置視頻輸出格式,顯示使能(VIDCON0,R/W,ADDRESS=0XF800_0000)
? ? ?
? VIDCON1: RGB 接口控制信號?
? VIDCON2 : 輸出數(shù)據(jù)格式控制?
? VIDCON3 : 圖像增強(qiáng)控制?
? I80IFCONx: i80接口控制信號?
? ITUIFCON : ITU接口控制信號?
? VIDTCONx: 配置視頻輸出時序及顯示大小
? WINCONx: 每個窗口特性設(shè)置?
? VIDOSDxA,B : 窗口位置設(shè)置?
? VIDOSDxC,D: OSD大小設(shè)置
六、LCD配置步驟(S5PV210手冊給出了)
1. VIDCON0: Configures video output format and displays enable/disable.
2. VIDCON1: Specifies RGB I/F control signal.
3. VIDCON2: Specifies output data format control.
4. VIDCON3: Specifies image enhancement control.
5. I80IFCONx: Specifies CPU interface control signal.
6. VIDTCONx: Configures video output timing and determines the size of display.
7. WINCONx: Specifies each window feature setting.
8. VIDOSDxA, VIDOSDxB: Specifies window position setting.
9. VIDOSDxC,D: Specifies OSD size setting.
10. VIDWxALPHA0/1: Specifies alpha value setting.
11. BLENDEQx: Specifies blending equation setting.
12. VIDWxxADDx: Specifies source image address setting.
13. WxKEYCONx: Specifies color key setting register.
14. WxKEYALPHA: Specifies color key alpha value setting.
15. WINxMAP: Specifies window color control.
16. GAMMALUT_xx: Specifies gamma value setting.
17. COLORGAINCON: Specifies color gain value setting.
18. HUExxx: Specifies Hue coefficient and offset value setting.
19. WPALCON: Specifies palette control register.
20. WxRTQOSCON: Specifies RTQoS control register.
21. WxPDATAxx: Specifies Window Palette Data of each Index.
22. SHDOWCON: Specifies Shadow control register.
23. WxRTQOSCON: Specifies QoS control register
實際中,我們還需要配置 LCD 相關(guān)信號引腳(GPIO),以及背光控制引腳。
關(guān)鍵點解析:
1、 LCD 時鐘源的確定(參考 S5PV210 芯片手冊時鐘部分)
在 VIDCON0 寄存器中的 CLKSEL_F 域指定 LCD 的時鐘源可以是 HCLK 和 SCLK_FIMD。S5PV210 由 3 個時鐘域組成,其中 DSYS 域為 FIMD 提供時鐘,FIMD 就是 Fully Interactive Mobile Display(完全交互式移動顯示設(shè)備),即我們要操作的 LCD 控制器。所以上面的 HCLK 為 HCLK_DSYS,由 MOUT_DSYS 分頻得到,freq(HCLK_DSYS) = MOUT_DSYS / (HCLK_DSYS_RATIO + 1) = 667 / (3 + 1) = 166MHz,而 SCLK_FIMD 由 MOUT_FIMD 分頻得到,而 MOUT_FIMD 的時鐘源由 SCLK_SRC1 寄存器中的 FIMD_SEL域確定。
2、在 S5PV210 芯片手冊 1.3.1 BRIEF DESCRIPTION OF THE SUB-BLOCK 中提到
Using the display controller data, you can select one of the above data paths by setting DISPLAY_PATH_SEL[1:0] (0xE010_7008). For more information, refer to Chapter, "Section 02.03. Clock controller".我們需要配置這個寄存器
3、 VIDCON1 中配置 HSYNC、 VSYNC、 VDEN 的極性是否反轉(zhuǎn),這要對比 S5PV210 中的 LCD 時序圖和LCD 芯片手冊中的 LCD 時序圖,如果有效信號的電平或上升沿或下降沿相同,則不反轉(zhuǎn),否則要反轉(zhuǎn)。
4、 S5PV210 顯示控制器有 5 個窗口,每個窗口有 3 個視頻緩沖區(qū),通過 WINCON0 寄存器 BUFSEL選擇哪一個,這在配置幀緩存地址時用到。
添加 lcd 后,代碼已經(jīng)增大至 37kB,而 BL1 最大為 16KB,所以需要重定位,?
初始化時鐘、串口、 DDR,設(shè)置棧,然后跳轉(zhuǎn)到 DDR 中執(zhí)行 bl2.bin, 在 bl2.bin 中進(jìn)行 lcd 初始化,畫線、畫圓。
部分代碼如下:
#ifndef LCD_H_ #define LCD_H_#include "types.h" // 重定義了一些類型#define RED 0xFF0000 #define GREEN 0x00FF00 #define BLUE 0x0000FFvoid lcd_init(); void backlight_ctl(u8 ctl); void lcd_enable(u8 enable); void draw_pixel(int x, int y, u32 color); void clear_screen(); void draw_line(int x0, int y0, int x1, int y1, u32 color); void draw_circle(int x, int y, int r, u32 color);#endif #include "lcd.h"#define GPD0CON *((volatile u32 *)0xE02000A0) // 00000001 #define GPD0DAT *((volatile u32 *)0xE02000A4) // 00000001#define GPF0CON *((volatile u32 *)0xE0200120) // 22222222 #define GPF1CON *((volatile u32 *)0xE0200140) // 22222222 #define GPF2CON *((volatile u32 *)0xE0200160) // 22222222 #define GPF3CON *((volatile u32 *)0xE0200180) // 00002222#define DISPLAY_CONTROL *((volatile u32 *)0xE0107008) // 00000002#define VIDCON0 *((volatile u32 *)0xF8000000) // 41b10133 #define VIDCON1 *((volatile u32 *)0xF8000004) // 01b6c060 #define VIDCON2 *((volatile u32 *)0xF8000008) // 00000000 #define VIDTCON0 *((volatile u32 *)0xF8000010) // 0009150c #define VIDTCON1 *((volatile u32 *)0xF8000014) // 001a0d13 #define VIDTCON2 *((volatile u32 *)0xF8000018) // 000efb1f #define VIDTCON3 *((volatile u32 *)0xF800001C) // 00000000 #define WINCON0 *((volatile u32 *)0xF8000020) // 0000802d #define SHODOWCON *((volatile u32 *)0xF8000034) // 00000001 #define VIDOSD0A *((volatile u32 *)0xF8000040) // 00000000 #define VIDOSD0B *((volatile u32 *)0xF8000044) // 003203bf #define VIDOSD0C *((volatile u32 *)0xF8000048) // 000bb800 #define VIDW00ADD0B0 *((volatile u32 *)0xF80000A0) // 28000000 #define VIDW00ADD1B0 *((volatile u32 *)0xF80000D0) // 28177c80#define VBPD 23 #define VFPD 22 #define VSPW 2 #define HEIGHT 480#define HBPD 46 #define HFPD 210 #define HSPW 2 #define WIDTH 800 #define BPP 24static u32 bytes_per_line; static u32 frame_buffer_size; static u32 frame_buffer_addr = 0x28000000;void lcd_init() {GPF0CON = 0x22222222; /* LCD_VD[3:0] LCD_VCLK LCD_VDEN LCD_VSYNC LCD_HSYNC */GPF1CON = 0x22222222; /* LCD_VD[11:4] */GPF2CON = 0x22222222; /* LCD_VD[19:12] */GPF3CON = 0x00002222; /* LCD_VD[23:20] */GPD0CON = (GPD0CON & ~0xF) | (0x1 << 0); /* LCD PWR(backlight) */DISPLAY_CONTROL = (2 << 0); /* Display path selection:RGB=FIMD I80=FIMD ITU=FIMD */bytes_per_line = WIDTH;if (BPP > 16)bytes_per_line *= 32;elsebytes_per_line *= BPP;bytes_per_line /= 8;frame_buffer_size = bytes_per_line * HEIGHT;/* Configures video output format and displays enable/disable */VIDCON0 = (5 << 6) | /* CLKVAL = 4, HCLK(166MHz) / (5 + 1) = 27MHz */(1 << 4) | /* Selects the clock source as divide using CLKVAL_F */(0 << 2); /* Selects the video clock source:HCLK=166MHz *//* Specifies RGB I/F control signal */VIDCON1 = (0 << 7) | /* Video data is fetched at VCLK falling edge */(1 << 6) | /* Inverted HSYNC pulse polarity */(1 << 5) | /* Inverted VSYNC pulse polarity */(0 << 4); /* Normal VDEN signal polarity ?????*//* Specifies output data format control */VIDCON2 = (0b000 << 19) | /* RGB interface output order(Even line, line #2,4,6,8):RGB */(0b000 << 16); /* RGB interface output order(Odd line, line #1,3,5,7):RGB *//* Configures video output timing and determines the size of display */VIDTCON0 = (VBPD << 16) | /* VBPD */(VFPD << 8) | /* VFPD */(VSPW << 0); /* VSPW */VIDTCON1 = (HBPD << 16) | /* HBPD */(HFPD << 8) | /* HFPD */(HSPW << 0); /* HSPW */VIDTCON2 = ((HEIGHT - 1) << 11) | /* vertical size of display(LINEVAL + 1) */(WIDTH - 1); /* horizontal size of display(HOZVAL + 1) */VIDTCON3 = (0b1 << 31); /* Enables VSYNC Signal Output */WINCON0 = (0 << 30) | /* BUFSEL_H = 0 */(0 << 20) | /* BUFSEL_L = 0, BUFSEL=0b00(Selects the Buffer set 0) */(1 << 15) | /* the Word swap Enable */(0xB << 2); /* Unpacked 24 bpp ( non-palletized R:8-G:8-B:8 ) *//* Specifies window position setting */VIDOSD0A = (0 << 11) | 0; /* LeftTop */VIDOSD0B = ((WIDTH - 1) << 11) | /* RightBotX */(HEIGHT - 1); /* RightBotY *//* Specifies the Window Size:Height * Width (Number of Word) */VIDOSD0C = frame_buffer_size / 4;/* the start address for Video frame buffer */VIDW00ADD0B0 = frame_buffer_addr;VIDW00ADD1B0 = VIDW00ADD0B0 + frame_buffer_size;SHODOWCON = 0x1; /* Enables Channel 0 */ }void backlight_ctl(u8 ctl) {if (ctl)GPD0DAT |= 1;elseGPD0DAT &= ~1; }void lcd_enable(u8 enable) {if (enable){ VIDCON0 |= 0x3;WINCON0 |= 1;}else{WINCON0 &= ~1;/* see the note in the framebuffer datasheet about why you** cannot take both of these bits down at the same time. */if (VIDCON0 & (1 << 1))VIDCON0 &= ~1;} }void draw_pixel(int x, int y, u32 color) {u32 *p = (u32 *)frame_buffer_addr;*(p + y * bytes_per_line / 4 + x) = color; }void clear_screen() {int x, y;for (y = 0; y < HEIGHT; y++){for (x = 0; x < WIDTH; x++)draw_pixel(x, y, 0);} }void draw_line(int x0, int y0, int x1, int y1, u32 color) {int x, y, dx, dy, Dx, Dy, e, i;Dx = x1 - x0;Dy = y1 - y0;dx = x1 - x0;if (dx < 0)dx *= -1;dy = y1 - y0;if (dy < 0)dy *= -1;x = x0;y = y0;if(dy > dx){e = -dy;for(i = 0; i < dy; i++){draw_pixel(x, y, color);if(Dy >= 0)y++; elsey--; e += 2 * dx;if(e >= 0){if(Dx >= 0)x++;elsex--; e -= 2 * dy;}}}else{e = -dx;for(i = 0; i < dx; i++){draw_pixel(x, y, color);if(Dx >= 0)x++;elsex--;e += 2 * dy;if(e >= 0){if(Dy >= 0)y++;elsey--;e -= 2 * dx;}}} }void draw_circle(int x, int y, int r, u32 color) {int a, b, num; a = 0; b = r; while(2 * b * b >= r * r) { draw_pixel(x + a, y - b,color); draw_pixel(x - a, y - b,color); draw_pixel(x - a, y + b,color); draw_pixel(x + a, y + b,color); draw_pixel(x + b, y + a,color); draw_pixel(x + b, y - a,color); draw_pixel(x - b, y - a,color); draw_pixel(x - b, y + a,color); a++; num = (a * a + b * b) - r*r; if(num > 0) { b--; a--; } } } #include "lcd.h"int main() { lcd_init();backlight_ctl(1);lcd_enable(1);clear_screen();draw_line(10, 10, 750, 450, RED);draw_circle(150, 150, 150, BLUE);return 0; }總結(jié)
以上是生活随笔為你收集整理的TQ210 —— LCD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TBC4.1下载
- 下一篇: 【wikioi】1034 家园(最大流+