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