嵌入式Linux?MIPI接口LCD調(diào)試-關(guān)于DRM顯示與應(yīng)用調(diào)試的干貨濃縮
點(diǎn)擊上方「嵌入式云IOT技術(shù)圈」,選擇「置頂公眾號(hào)」第一時(shí)間查看嵌入式筆記!
經(jīng)過一段時(shí)間自己學(xué)習(xí)和理解,個(gè)人對(duì)于MIPI LCD
接口的調(diào)試有了自己的一點(diǎn)心得,當(dāng)然也收獲了Linux DRM顯示框架及調(diào)試的一些心得,DRM真的很難很難,本文也無法顧及所有的細(xì)節(jié),之前也發(fā)了一些DRM相關(guān)的文章:linux中基于DRM的圖形顯示系統(tǒng)概述
libdrm-modetest原理及圖顯系統(tǒng)驗(yàn)證方法以下的這些概念和操作都是本人在實(shí)踐的過程中覺得對(duì)調(diào)試有用,所以就記下來了,接下來我們來簡單的了解一下:
1、有關(guān)DRM的一些基礎(chǔ)概念
1.1、Connectors
就是屏幕,比如主控芯片通過HDMI、MIPI DSI,分別接2個(gè)屏幕顯示,就會(huì)有2個(gè)對(duì)應(yīng)的Connectors ID;1.2、CRTCs
表示VOP,一個(gè)屏幕一般對(duì)應(yīng)一個(gè)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個(gè),代表可以接1個(gè)屏幕輸出,ID是56。該顯示輸出的最大分辨率是1024x600,刷新頻率54hz;2.2、CRTCs
觀察以上信息,我們可以看到CRTCs有1個(gè),ID是53;2.3、Planes
觀察以上信息,我們可以看到Planes有2個(gè),即代表有2個(gè)圖層,ID分別是52、54。plane 53當(dāng)前type值是1,代表是Primary層;plane 55當(dāng)前type值是0,代表是Overlay層;2.3.1、Primary層
2.3.2、Overlay層3、通過modetest指令測(cè)試屏幕輸出
我們可以根據(jù)以上modetest探測(cè)出來的信息,然后發(fā)送以下指令讓色塊顯示到LCD顯示屏上,在ARM端輸入以下命令:modetest -s 56@53:1024x600@RG24其中:- 56,對(duì)應(yīng)Connectors ID;
- 53,對(duì)應(yīng)CRTCs ID;
- 1024x600,輸出最大分辨率;
- RG24,代表RGB888,每個(gè)像素點(diǎn)24bit,R/G/B各8bit;
4、如何用/sys/kernel/debug/dri進(jìn)行監(jiān)控
4.1、查看/sys/kernel/debug/dri下的節(jié)點(diǎn)
ls /sys/kernel/debug/dri/0/可以看到:4.2、獲取dri的狀態(tài)
cat /sys/kernel/debug/dri/0/state可以看到:4.3、查看dri當(dāng)前的顯示狀態(tài)
cat /sys/kernel/debug/dri/0/summary可以看到:從以上信息可以看出:VOP的狀態(tài)是ACTIVE,表示正在運(yùn)行中,如果是DISABLED,表示VOP沒在運(yùn)行。Connector:DSI 表示對(duì)應(yīng)屏幕接口的名稱。Display mode表示的是當(dāng)前顯示的分辨率和頻率為,即分辨率為1024*600,頻率為54fps。4.4、查看當(dāng)前的顯示時(shí)鐘
cat /sys/kernel/debug/clk/clk_summary | grep vop可以看到:- 關(guān)于dclk即pixel clock, 像素時(shí)鐘, 該時(shí)鐘由具體的顯示timing決定, 如果dclk不正確, 可能導(dǎo)致fps不對(duì)或直接不顯示.edp, mipi, lvds等顯示接口對(duì)應(yīng)dclk的容忍性較好, 有些偏差也不影響正常顯示.但hdmi, dp等高清顯示接口,是有嚴(yán)格要求的, 這類顯示接口的頻率要給的很精準(zhǔn).
- DCLK頻率指的是像素時(shí)鐘,跟數(shù)據(jù)傳輸有關(guān),液晶面板分辨率越高,像素時(shí)鐘信號(hào)的頻率也越高。在一行內(nèi),像素時(shí)鐘的個(gè)數(shù)與液晶面板一行內(nèi)所具有的像素?cái)?shù)量相等。例如,對(duì)于1024×768的液晶面板,一行有1024個(gè)像素,則在一行中(對(duì)應(yīng)于有效視頻區(qū)間)像素時(shí)鐘的個(gè)數(shù)也是1024個(gè)。
- aclk_vop:如果該時(shí)鐘頻率太低, 可能會(huì)導(dǎo)致顯示出現(xiàn)抖動(dòng), 另外如果aclk 沒有使能的話, 訪問vop的寄存器也可能引發(fā)總線掛死
- hclk_vop:如果該時(shí)鐘未使能, 不能訪問vop的寄存器, 一但訪問vop寄存器, 會(huì)造成總線掛死.
5、如何用/sys/類/drm進(jìn)行監(jiān)控
5.1、查看/sys/drm/目錄下的節(jié)點(diǎn)
ls /sys/class/drm可以看到:5.2、獲取DRM連接器的名稱和當(dāng)前的狀態(tài)
ARM終端輸入:for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n "${con#*/card?-}:"; cat $p; done可以看到:當(dāng)前還有其它的節(jié)點(diǎn)可以訪問。6、基于RK平臺(tái)MIPI DSI設(shè)備調(diào)試實(shí)戰(zhàn)
6.1、查看顯示驅(qū)動(dòng)是否已經(jīng)正常加載
以RK平臺(tái)為例,之前一直調(diào)試的是RV1126_RV1109,RK在底層實(shí)現(xiàn)了自己的一套DRM顯示框架:MIPI DRM 驅(qū)動(dòng)的加載存在依賴關(guān)系,所以可能會(huì)多次因?yàn)轵?qū)動(dòng)資源暫時(shí)獲取不到而返回 -517 ,但是只要配置正確,待相關(guān)組件驅(qū)動(dòng)能夠完整獲取到資源后,最終就會(huì) bound 成功,如果沒有看到如下:[ ??0.889511] rockchip-drm display-subsystem: bound ffb00000.vop (ops0xb093e180)[ ??0.889613] rockchip-drm display-subsystem: bound ffb30000.dsi (ops0xb09448ac)則綁定失敗,通訊異常。注意:如果你確定軟件上已經(jīng)沒問題了,那么多半是硬件連接的問題,因?yàn)?MIPI 排線比較脆弱,很容易導(dǎo)致接觸不良。
6.2、查看顯示信息
查看命令如下:cat /sys/kernel/debug/dri/0/summary6.3、查看當(dāng)前連接狀態(tài)查看命令:cat /sys/class/drm/card0-DSI-1/status
6.4、查看當(dāng)前使能狀態(tài)
cat /sys/class/drm/card0-DSI-1/enabled6.5、查看當(dāng)前支持的顯示模式
查看命令:cat /sys/class/drm/card0-DSI-1/modes往期精彩
Linux MIPI DSI LCD設(shè)備驅(qū)動(dòng)開發(fā)調(diào)試細(xì)節(jié)學(xué)習(xí)筆記(一)Linux MIPI DSI驅(qū)動(dòng)調(diào)試筆記-設(shè)備樹DCS格式序列之配置LCD初始化代碼(二)Linux MIPI DSI驅(qū)動(dòng)調(diào)試筆記-LCD時(shí)序參數(shù)配置(三)
楊工本周直播PPT分享<<表驅(qū)動(dòng)法在嵌入式產(chǎn)品開發(fā)中的應(yīng)用>>新產(chǎn)品立項(xiàng)了,作為嵌入式軟件工程師該如何來開展設(shè)計(jì)工作?(個(gè)人經(jīng)驗(yàn)分享)
覺得本次分享的文章對(duì)您有幫助,隨手點(diǎn)
[在看]
并轉(zhuǎn)發(fā)分享,也是對(duì)我的支持。