嵌入式Linux?MIPI接口LCD調(diào)試-關于DRM顯示與應用調(diào)試的干貨濃縮
點擊上方「嵌入式云IOT技術圈」,選擇「置頂公眾號」第一時間查看嵌入式筆記!
經(jīng)過一段時間自己學習和理解,個人對于MIPI LCD
接口的調(diào)試有了自己的一點心得,當然也收獲了Linux DRM顯示框架及調(diào)試的一些心得,DRM真的很難很難,本文也無法顧及所有的細節(jié),之前也發(fā)了一些DRM相關的文章:linux中基于DRM的圖形顯示系統(tǒng)概述
libdrm-modetest原理及圖顯系統(tǒng)驗證方法以下的這些概念和操作都是本人在實踐的過程中覺得對調(diào)試有用,所以就記下來了,接下來我們來簡單的了解一下:
1、有關DRM的一些基礎概念
1.1、Connectors
就是屏幕,比如主控芯片通過HDMI、MIPI DSI,分別接2個屏幕顯示,就會有2個對應的Connectors ID;1.2、CRTCs
表示VOP,一個屏幕一般對應一個crtc;1.3、Planes
就是圖層,比如視頻層在plane2,UI在plane1,視頻在UI上面;2、通過modetest查看系統(tǒng)DRM的情況
例如在RV1109的開發(fā)板端執(zhí)行modetest,我們可以看到以下輸出信息:[root@RV1126_RV1109:/oem]# modetestEncoders:
id ??crtc ?type ?possible crtcs possible clones
55 ???53 ??DSI ??0x00000001 ??0x00000000
Connectors:
id ??encoder status ????name ?????size (mm) ???modes ?encoders
56 ???55 ??connected ???DSI-1 ?????154x86 ?????1 ???55
modes:
???name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot)
1024x600 54 1024 1240 1310 1470 600 612 622 645 51200 flags: nhsync, nvsync;
type: preferred, driver
props:
????1 EDID:
???????flags: immutable blob
???????blobs:
???????value:
????2 DPMS:
???????flags: enum
???????enums: On=0 Standby=1 Suspend=2 Off=3
???????value: 0
????5 link-status:
???????flags: enum
???????enums: Good=0 Bad=1
???????value: 0
????6 non-desktop:
???????flags: immutable range
???????values: 0 1
???????value: 0
????43 brightness:
???????flags: range
???????values: 0 100
???????value: 50
????44 contrast:
???????flags: range
???????values: 0 100
???????value: 50
????47 saturation:
???????flags: range
???????values: 0 100
???????value: 50
????48 hue:
???????flags: range
???????values: 0 100
???????value: 50
CRTCs:
id ??fb ??pos ??size
53 ???57 ??(0,0) ?(1024x600)
1024x600 54 1024 1240 1310 1470 600 612 622 645 51200 flags: nhsync, nvsync;
type: preferred, driver
props:
????38 left margin:
???????flags: range
???????values: 0 100
???????value: 100
????39 right margin:
???????flags: range
???????values: 0 100
???????value: 100
????40 top margin:
???????flags: range
???????values: 0 100
???????value: 100
????41 bottom margin:
???????flags: range
???????values: 0 100
???????value: 100
????51 FEATURE:
???????flags: immutable bitmask
???????values: afbdc=0x1
???????value: 0
???????Planes:
id ??crtc ?fb ??CRTC x,y ???x,y ??gamma size ??possible crtcs
52 ???53 ???57 ???0,0 ??????0,0 ??0 ???????0x00000001
formats: XR24 AR24 XB24 AB24 RG24 BG24 RG16 BG16
props:
????8 type:
???????flags: immutable enum
???????enums: Overlay=0 Primary=1 Cursor=2
???????value: 1
????50 FEATURE:
???????flags: immutable bitmask
???????values: scale=0x1 alpha=0x2 hdr2sdr=0x4 sdr2hdr=0x8 afbdc=0x10
???????value: 2
54 ???0 ???0 ???0,0 ??????0,0 ??0 ???????0x00000001
formats: XR24 AR24 XB24 AB24 RG24 BG24 RG16 BG16 NV12 NV16 NV24
props:
????8 type:
???????flags: immutable enum
???????enums: Overlay=0 Primary=1 Cursor=2
???????value: 0
????50 FEATURE:
???????flags: immutable bitmask
???????values: scale=0x1 alpha=0x2 hdr2sdr=0x4 sdr2hdr=0x8 afbdc=0x10
???????value: 3
Frame buffers:
id ??size ?pitch從以上信息,我們能夠了解到:
2.1、Connectors
觀察以上信息,我們可以看到Connectors有1個,代表可以接1個屏幕輸出,ID是56。該顯示輸出的最大分辨率是1024x600,刷新頻率54hz;2.2、CRTCs
觀察以上信息,我們可以看到CRTCs有1個,ID是53;2.3、Planes
觀察以上信息,我們可以看到Planes有2個,即代表有2個圖層,ID分別是52、54。plane 53當前type值是1,代表是Primary層;plane 55當前type值是0,代表是Overlay層;2.3.1、Primary層
2.3.2、Overlay層3、通過modetest指令測試屏幕輸出
我們可以根據(jù)以上modetest探測出來的信息,然后發(fā)送以下指令讓色塊顯示到LCD顯示屏上,在ARM端輸入以下命令:modetest -s 56@53:1024x600@RG24其中:- 56,對應Connectors ID;
- 53,對應CRTCs ID;
- 1024x600,輸出最大分辨率;
- RG24,代表RGB888,每個像素點24bit,R/G/B各8bit;
4、如何用/sys/kernel/debug/dri進行監(jiān)控
4.1、查看/sys/kernel/debug/dri下的節(jié)點
ls /sys/kernel/debug/dri/0/可以看到:4.2、獲取dri的狀態(tài)
cat /sys/kernel/debug/dri/0/state可以看到:4.3、查看dri當前的顯示狀態(tài)
cat /sys/kernel/debug/dri/0/summary可以看到:從以上信息可以看出:VOP的狀態(tài)是ACTIVE,表示正在運行中,如果是DISABLED,表示VOP沒在運行。Connector:DSI 表示對應屏幕接口的名稱。Display mode表示的是當前顯示的分辨率和頻率為,即分辨率為1024*600,頻率為54fps。4.4、查看當前的顯示時鐘
cat /sys/kernel/debug/clk/clk_summary | grep vop可以看到:- 關于dclk即pixel clock, 像素時鐘, 該時鐘由具體的顯示timing決定, 如果dclk不正確, 可能導致fps不對或直接不顯示.edp, mipi, lvds等顯示接口對應dclk的容忍性較好, 有些偏差也不影響正常顯示.但hdmi, dp等高清顯示接口,是有嚴格要求的, 這類顯示接口的頻率要給的很精準.
- DCLK頻率指的是像素時鐘,跟數(shù)據(jù)傳輸有關,液晶面板分辨率越高,像素時鐘信號的頻率也越高。在一行內(nèi),像素時鐘的個數(shù)與液晶面板一行內(nèi)所具有的像素數(shù)量相等。例如,對于1024×768的液晶面板,一行有1024個像素,則在一行中(對應于有效視頻區(qū)間)像素時鐘的個數(shù)也是1024個。
- aclk_vop:如果該時鐘頻率太低, 可能會導致顯示出現(xiàn)抖動, 另外如果aclk 沒有使能的話, 訪問vop的寄存器也可能引發(fā)總線掛死
- hclk_vop:如果該時鐘未使能, 不能訪問vop的寄存器, 一但訪問vop寄存器, 會造成總線掛死.
5、如何用/sys/類/drm進行監(jiān)控
5.1、查看/sys/drm/目錄下的節(jié)點
ls /sys/class/drm可以看到:5.2、獲取DRM連接器的名稱和當前的狀態(tài)
ARM終端輸入:for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n "${con#*/card?-}:"; cat $p; done可以看到:當前還有其它的節(jié)點可以訪問。6、基于RK平臺MIPI DSI設備調(diào)試實戰(zhàn)
6.1、查看顯示驅(qū)動是否已經(jīng)正常加載
以RK平臺為例,之前一直調(diào)試的是RV1126_RV1109,RK在底層實現(xiàn)了自己的一套DRM顯示框架:MIPI DRM 驅(qū)動的加載存在依賴關系,所以可能會多次因為驅(qū)動資源暫時獲取不到而返回 -517 ,但是只要配置正確,待相關組件驅(qū)動能夠完整獲取到資源后,最終就會 bound 成功,如果沒有看到如下:[ ??0.889511] rockchip-drm display-subsystem: bound ffb00000.vop (ops0xb093e180)[ ??0.889613] rockchip-drm display-subsystem: bound ffb30000.dsi (ops0xb09448ac)則綁定失敗,通訊異常。注意:如果你確定軟件上已經(jīng)沒問題了,那么多半是硬件連接的問題,因為 MIPI 排線比較脆弱,很容易導致接觸不良。
6.2、查看顯示信息
查看命令如下:cat /sys/kernel/debug/dri/0/summary6.3、查看當前連接狀態(tài)查看命令:cat /sys/class/drm/card0-DSI-1/status
6.4、查看當前使能狀態(tài)
cat /sys/class/drm/card0-DSI-1/enabled6.5、查看當前支持的顯示模式
查看命令:cat /sys/class/drm/card0-DSI-1/modes往期精彩
Linux MIPI DSI LCD設備驅(qū)動開發(fā)調(diào)試細節(jié)學習筆記(一)Linux MIPI DSI驅(qū)動調(diào)試筆記-設備樹DCS格式序列之配置LCD初始化代碼(二)Linux MIPI DSI驅(qū)動調(diào)試筆記-LCD時序參數(shù)配置(三)
楊工本周直播PPT分享<<表驅(qū)動法在嵌入式產(chǎn)品開發(fā)中的應用>>新產(chǎn)品立項了,作為嵌入式軟件工程師該如何來開展設計工作?(個人經(jīng)驗分享)
覺得本次分享的文章對您有幫助,隨手點
[在看]
并轉(zhuǎn)發(fā)分享,也是對我的支持。