LCD 移植的那些坑-LCD屏幕配置常見的問題解決方案
在使用我們的開發(fā)板過(guò)程中,關(guān)于LCD屏幕配置有一些常見的問題
問題1,如何修改開機(jī)默認(rèn)的屏幕尺寸?
全平臺(tái)都可以通過(guò)uboot的選擇菜單來(lái)選擇默認(rèn)的顯示,對(duì)應(yīng)配置方式可以參閱對(duì)應(yīng)平臺(tái)的應(yīng)用手冊(cè)。
i.MX6DL/i.MX6Q系列uboot已開源,可以通過(guò)直接修改uboot源碼文件include/configs/mx6sabre_common.h(參考linux4.1.15內(nèi)核版本)
如果是客戶自己移植屏幕,可能需要修改uboot源碼arch/arm/i.MX-common/video.c文件。修改默認(rèn)的屏幕配置 setenv("pannel", "SEIKO-WXGA");(參考linux4.1.15內(nèi)核版本)
問題2,如何自己移植LCD屏幕?
可以參考i.MX6x平臺(tái)應(yīng)用筆記中【8.0寸LCD屏移植筆記.pdf】一章。
lvds屏幕可參考【LVDS屏幕移植應(yīng)用筆記 .pdf】
問題3,移植LCD屏幕,uboot顯示logo不正常?
參考i.MX6Q linux4.1.15內(nèi)核版本,在uboot源碼board/freescale/mx6sabresd/mx6sabresd.c文件內(nèi)默認(rèn)的LCD 800x480的配置如下。在移植屏幕可以參考此結(jié)構(gòu)體添加新屏幕的參數(shù),參考【問題1】解決辦法選擇uboot默認(rèn)屏幕。
lvds屏可以直接修改下圖中的設(shè)置參數(shù)。
問題4,uboot顯示正常,kernel起來(lái)后顯示不正常?
這個(gè)可以通過(guò) cat /proc/cmdline命令來(lái)查看uboot傳遞給內(nèi)核的參數(shù)是不是正確。再參考【問題1】方法修改。(參考i.MX6Q啟動(dòng)參數(shù))
到內(nèi)核驅(qū)動(dòng)文件drivers/video/fbdev/mxc/mxc_LCDif.c中微調(diào)對(duì)應(yīng)的LCD屏幕配置參數(shù).
lvds對(duì)應(yīng)的內(nèi)核驅(qū)動(dòng)文件在drivers/video/fbdev/mxc/ldb.c.
在linux4.1.15內(nèi)核版本在可能要在設(shè)備樹修改默認(rèn)的fb0輸出以及LCD的配置.
問題5,LCD移植屏幕不亮?
LCD移植屏幕不亮的原因有很多,大部分的LCD屏幕背光為pwm控制,可以搜索linux Backlight部分,這里不做太多闡述。
問題6,LCD的參數(shù)怎么設(shè)置,怎么計(jì)算?
下面闡述一下LCD參數(shù)配置一些知識(shí)
LCD的一些原理
數(shù)字視頻的概念來(lái)自于模擬視頻,在模擬視頻中有像素,掃描顯示方式,幀,前肩,后肩,消影等參數(shù)。
在模擬視頻中像素(pixel)為圖像中的最小的控制單位,整個(gè)圖像是有許多的像素點(diǎn)構(gòu)成。
電子槍控制器控制電子槍從屏幕的左上方,從左到右按照像素單元依次打印出圖像,到行尾再返回下一行開頭從新開始從左到右打印本行像素,直到屏幕最右下方最后一個(gè)像素點(diǎn)。然后再返回屏幕的左上角從新打印下一幀圖像。
掃描槍就像打印機(jī)一樣走“之”字路線。打完一行返回重新打印下一行。那么從一行到新的一行的運(yùn)動(dòng)時(shí)間在模擬視頻中叫水平消影(HBlank).
從右下方最后一個(gè)像素點(diǎn)到最左上方的第一個(gè)像素點(diǎn),即從一幀數(shù)據(jù)切換到另一幀數(shù)據(jù)的時(shí)間叫做垂直消影(VBlank).
在數(shù)字視頻中保留了上述的這些概念。整個(gè)LCD的顯示典型顯示時(shí)序參考下圖:
像素(pixel):整個(gè)顯示圖像是由一個(gè)個(gè)的像素組成的。
點(diǎn)時(shí)鐘速率(VCLK/LCD_CLK):視頻硬件在顯示器上繪制像素的速率, 一個(gè) CLK 時(shí)鐘完成一個(gè)像素點(diǎn)的顯示。
垂直同步信號(hào)(VSYNC): 讓LCD控制器知道下面要開始新的一幀圖像
水平同步信號(hào)(HSYNC):讓LCD控制器知道下面要開始新的一行像素.
數(shù)據(jù)使能(DE), 在數(shù)據(jù)使能區(qū)是有效的數(shù)據(jù)
VBP(Vertical back porch): 垂直同步信號(hào)的后肩,表示一幀圖像開始時(shí),垂直同步信號(hào)以后的無(wú)效行數(shù)。
VFP(Vertical front porch): 垂直同步信號(hào)的前肩, 表示一幀圖像結(jié)束后,垂直同步信號(hào)以前的無(wú)效行數(shù)。
HBP(Horizontal back porch): 水平同步信號(hào)的后肩,表示從水平同步信號(hào)開始到一行的有效數(shù)據(jù)開始之前的VCLK的個(gè)數(shù)。
HFP(Horizontal front proch): 水平同步信號(hào)的前肩,表示從一行的有效數(shù)據(jù)結(jié)束到下一個(gè)水平信號(hào)開始之間的VCLK的個(gè)數(shù)。
要使得VSYNC和HSYNC信號(hào)有效,需要其電平保持一定的時(shí)間,這段時(shí)間被分別稱為:HSPW(水平同步信號(hào)脈寬), VSPW(垂直同步信號(hào)脈寬).
LCD手冊(cè)的時(shí)序圖(參考我們目前使用的7寸LCD顯示屏):
藍(lán)色:水平信號(hào)相關(guān)部分標(biāo)注
紅色:垂直信號(hào)相關(guān)部分標(biāo)注
內(nèi)核對(duì)LCD的描述
在linux 內(nèi)核中, 在include/linux/fb.h文件中定義的fb_videomode結(jié)構(gòu)體對(duì)LCD進(jìn)行描述。
下圖為linux的結(jié)構(gòu)體的示意圖,和結(jié)構(gòu)體屬性一一對(duì)應(yīng):
藍(lán)色:水平信號(hào)相關(guān)部分標(biāo)注
紅色:垂直信號(hào)相關(guān)部分標(biāo)注
解釋說(shuō)明
內(nèi)核對(duì)LCD的解釋是按照LCD的圖像為中心(二維面), 而手冊(cè)上是按照LCD的時(shí)序(一維線性)來(lái)解釋。二者解釋的是相同的東西。
對(duì)應(yīng)關(guān)系分別為:
LCD信號(hào) |
對(duì)應(yīng)LCD手冊(cè) |
對(duì)應(yīng)LCD結(jié)構(gòu)體 |
VCLK/LCD_CLK |
DCLK(dotclock) |
|
DE |
DE |
|
|
|
Refresh(刷新率) |
|
|
Pixclock(計(jì)算見下文) |
HSYNC |
HS |
|
|
thd |
xres |
HSPW |
thpw |
hsync_len |
HBP |
thb |
left_margin |
HFP |
thfp |
right_margin |
VSYNC |
VS |
|
|
tvd |
yres |
VSPW |
twpw |
vsync_len |
VBP |
tvb |
upper_margin |
VFP |
tvfp |
lower_margin |
|
|
|
參數(shù)計(jì)算
參考我們目前使用的7寸LCD顯示屏:
LCD驅(qū)動(dòng)中的參數(shù),左邊為實(shí)際的參數(shù),右邊為結(jié)構(gòu)體定義
藍(lán)色:水平信號(hào)相關(guān)部分標(biāo)注 紅色:垂直信號(hào)相關(guān)部分標(biāo)注
7寸LCD顯示屏手冊(cè):
對(duì)應(yīng)值
linux結(jié)構(gòu)體名稱 |
linux結(jié)構(gòu)體數(shù)值 |
LCD手冊(cè)名稱 |
LCD手冊(cè)數(shù)值 |
refresh |
57 |
|
|
xres |
800 |
thd |
800 |
yres |
480 |
tvd |
480 |
pixclock |
37037 |
|
|
left_margin |
40 |
thb |
46 |
right_margin |
60 |
thfp |
<16 - 354> |
upper_margin |
10 |
tvb |
23 |
lower_margin |
10 |
tvfp |
<7 - 147 > |
hsync_len |
20 |
thpw |
<1 - 40> |
vsyn_len |
10 |
twpw |
<7 - 147> |
|
|
|
|
計(jì)算pixclock像素時(shí)鐘和幀率
其中dotclock是視頻硬件在顯示器上繪制像素的速率。
根據(jù)注釋內(nèi)容 dotclock為 27MHz. 所以
pixclock = 1 / (27E6) = 3.7037037037037036e-08, 取整為37037 皮秒
幀率的計(jì)算:
幀率=dotclock / ((xres+left_margin+right_margin+hsync)*(yres+upper_margin+low_margin+vsync))
= (27E6)/( (40 + 800 + 60 + 20) (10 + 480 + 10 + 10))
= 57.54475703324808, 取整為 57Hz。
xres和yres已經(jīng)由硬件固定,一般屏幕的刷新率一般為60Hz,而高于刷新率的幀數(shù)都是無(wú)效幀數(shù)。所以可以根據(jù)公式調(diào)整其他參數(shù)以調(diào)整LCD幀率,使其盡量接近60fps. 如果數(shù)值設(shè)置偏差的話,可能會(huì)造成屏幕沙點(diǎn),抖動(dòng)現(xiàn)象。
相關(guān)產(chǎn)品 >
-
FETMX6Q-C核心板
i.MX6Q核心板板層出不窮,要如何選擇?飛凌解讀i.mx6Q芯片強(qiáng)性能為您推薦四核A9架構(gòu)的i.MX6Q產(chǎn)品精選,包含iMX6Q 核心板、i.MX6Q 核心板、iMX6Q工業(yè)級(jí)核心板,歡迎采購(gòu)。 i.MX6Q核心板基于NXP(原Freescale)Cortex-A9架構(gòu)的i.MX6Q四核處理器設(shè)計(jì),核心板小尺寸核心板搭配獨(dú)特的薄款連接器,讓設(shè)計(jì)隨心所欲!
了解詳情 -
FETMX6DL-S核心板
飛凌嵌入式iMX6DL系列核心板采用NXP Cortex-A9 雙核 i.MX6DL處理器,主頻 1.2 GHz,郵票孔連接方式,穩(wěn)定性強(qiáng);iMX6DL核心板本身為最小系統(tǒng)板,上電即可使用,方便調(diào)試;iMX6DL核心板目前有工業(yè)級(jí)、商業(yè)級(jí)兩種規(guī)格,選擇性更強(qiáng)。如您想要進(jìn)一步了解iMX6DL核心板詳細(xì)資料,i.MX6DL解決方案,可致電或聯(lián)系在線客服。 了解詳情