LCD 移植的那些坑-LCD屏幕配置常見的問題解決方案

原創 2020-03-07 18:14:00 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




參數計算

參考我們目前使用的7LCD顯示屏:

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四核處理器設計,核心板小尺寸核心板搭配獨特的薄款連接器,讓設計隨心所欲!

    了解詳情
    FETMX6Q-C核心板
  • FETMX6DL-S核心板

    飛凌嵌入式iMX6DL系列核心板采用NXP Cortex-A9 雙核 i.MX6DL處理器,主頻 1.2 GHz,郵票孔連接方式,穩定性強;iMX6DL核心板本身為最小系統板,上電即可使用,方便調試;iMX6DL核心板目前有工業級、商業級兩種規格,選擇性更強。如您想要進一步了解iMX6DL核心板詳細資料,i.MX6DL解決方案,可致電或聯系在線客服。 了解詳情
    FETMX6DL-S核心板

推薦閱讀 換一批 換一批