由于之前的blog提及kmscube的源碼我沒有找到语泽,所以只能在網(wǎng)上搜索了榕堰。
DRM簡介
DRM是Linux目前主流的圖形顯示框架氓润,同時(shí)DRM可以統(tǒng)一管理GPU和Display驅(qū)動(dòng)璧帝,使得軟件架構(gòu)更為統(tǒng)一叔锐,方便管理和維護(hù)黄痪。而且drm是集成在linux kernel中的紧帕。
DRM從模塊上劃分,可以簡單分為3部分:libdrm桅打、KMS是嗜、GEM愈案。
-
libdrm:對(duì)底層接口進(jìn)行封裝,向上層提供通用的API接口鹅搪,主要是對(duì)各種IOCTL接口進(jìn)行封裝站绪。
2)KMS:Kernel Mode Setting,主要作用是更新畫面和設(shè)置顯示參數(shù)
3)GEM:Graphic Execution Manager涩嚣,主要負(fù)責(zé)顯示buffer的分配和釋放
然后我自己運(yùn)行出錯(cuò)的代碼是返回設(shè)置參數(shù)不正確崇众。mode參數(shù)比如我設(shè)置1440x900,然后還有水平同步和垂直同步等信息航厚。它從connector需要一路進(jìn)行綁定顷歌。
綁定關(guān)系.png
調(diào)試問題
調(diào)試的時(shí)候出現(xiàn)過的權(quán)限問題。我下載的drm how-to工程在ubuntu本機(jī)驗(yàn)證通過幔睬,但是開發(fā)板運(yùn)行就報(bào)錯(cuò)眯漩,ccs9調(diào)試發(fā)現(xiàn)drmModeSetCrtc返回參數(shù)無效。video初始化都是會(huì)建立設(shè)備/dev/dri/card0麻顶。之前調(diào)試運(yùn)行在linux本機(jī)card0被x11等占用著資源赦抖,所以也會(huì)返回?zé)o權(quán)限。所以u(píng)buntu下我本機(jī)調(diào)試的時(shí)候是使用ctrl+alt+F3切換到tty界面辅肾,然后通過ctrl+alt+F2再切換回圖形界面队萤。
connector的TDMS
drmModeSetCrtc里到底做了什么,但是當(dāng)我還沒有下載到libdrm的源碼矫钓,我只能自己分析傳入?yún)?shù)要尔。學(xué)習(xí)了下HDMI接口TDMS協(xié)議。
顯示屏的顯示原理:
當(dāng)CRT顯示器顯示一幅圖像時(shí)新娜,電子槍是從左到右赵辕、從上到下來掃描屏幕的。由電子槍打出的電子經(jīng)由偏轉(zhuǎn)線圈的偏轉(zhuǎn)得以打到屏幕的不同點(diǎn)上概龄。電子束在從左到右掃描完一行后还惠,需要回到起始方向進(jìn)行下一行的掃描,這個(gè)返回的工作由回程轉(zhuǎn)換器來完成私杜。
專業(yè)名詞
水平同步:同步一行蚕键,然后進(jìn)行下一行
垂直同步:同步一幀。
60Hz刷新率就是指衰粹,每秒顯示60幀(圖像)
假設(shè)分辨率為800*600,則每秒有60次垂直同步锣光。而每次垂直同步包括了600次水平同步。
另外傳輸?shù)臄?shù)據(jù)包括圖像數(shù)據(jù)(8bit調(diào)制為10bit每通道進(jìn)行傳輸)寄猩,控制信號(hào)(用來說明下一次傳輸哪類信號(hào))嫉晶,音頻數(shù)據(jù)(4bit)骑疆。通道包括rgb共3通道田篇,最后加一通道為clock替废。
我此時(shí)懷疑是否ioctrl后底層驅(qū)動(dòng)配置不支持。然后又看了下硬件原理用的是TDA19988的解碼芯片說只支持到1280的解碼泊柬,那么1440x900之前為什么也能支持椎镣?關(guān)于TDA在上圖中是什么位置有點(diǎn)搞不明白,之后再研究下兽赁。然后總是顯示tilcdc初始化成功状答,tilcdc到底是個(gè)什么東西。重要兜了個(gè)圈子又回到了TI官網(wǎng)刀崖,LCDC是LCD controller的縮寫惊科,ti就是TI,說白了tilcdc就是am335的一個(gè)lcd模塊亮钦。就和我現(xiàn)在一直做的can模塊一樣馆截。
LCDC模塊
終于進(jìn)入正題,我之前除了看graph章節(jié)蜂莉,我還應(yīng)該要看TI官網(wǎng)的LCDC章節(jié)蜡娶。這里面就寫drm及kmscube還有testmode的源碼路徑。并且還告知dts在有LCD的情況下應(yīng)該如何配置映穗,看了教程后覺得我的底層驅(qū)動(dòng)當(dāng)前是正常的窖张,因?yàn)檫\(yùn)行kmscube能正常顯示3D圖像。
http://software-dl.ti.com/processor-sdk-linux/esd/docs/latest/linux/Foundational_Components/Kernel/Kernel_Drivers/Display/LCDC.html