开发linux显卡驱动,显卡驱动开发DRM入门--Apple的学习笔记
由于之前的blog提及kmscube的源碼我沒有找到,所以只能在網上搜索了。
DRM簡介
DRM是Linux目前主流的圖形顯示框架,同時DRM可以統一管理GPU和Display驅動,使得軟件架構更為統一,方便管理和維護。而且drm是集成在linux kernel中的。
DRM從模塊上劃分,可以簡單分為3部分:libdrm、KMS、GEM。
libdrm:對底層接口進行封裝,向上層提供通用的API接口,主要是對各種IOCTL接口進行封裝。
2)KMS:Kernel Mode Setting,主要作用是更新畫面和設置顯示參數
3)GEM:Graphic Execution Manager,主要負責顯示buffer的分配和釋放
然后我自己運行出錯的代碼是返回設置參數不正確。mode參數比如我設置1440x900,然后還有水平同步和垂直同步等信息。它從connector需要一路進行綁定。
綁定關系.png
調試問題
調試的時候出現過的權限問題。我下載的drm how-to工程在ubuntu本機驗證通過,但是開發板運行就報錯,ccs9調試發現drmModeSetCrtc返回參數無效。video初始化都是會建立設備/dev/dri/card0。之前調試運行在linux本機card0被x11等占用著資源,所以也會返回無權限。所以ubuntu下我本機調試的時候是使用ctrl+alt+F3切換到tty界面,然后通過ctrl+alt+F2再切換回圖形界面。
connector的TDMS
drmModeSetCrtc里到底做了什么,但是當我還沒有下載到libdrm的源碼,我只能自己分析傳入參數。學習了下HDMI接口TDMS協議。
顯示屏的顯示原理:
當CRT顯示器顯示一幅圖像時,電子槍是從左到右、從上到下來掃描屏幕的。由電子槍打出的電子經由偏轉線圈的偏轉得以打到屏幕的不同點上。電子束在從左到右掃描完一行后,需要回到起始方向進行下一行的掃描,這個返回的工作由回程轉換器來完成。
專業名詞
水平同步:同步一行,然后進行下一行
垂直同步:同步一幀。
60Hz刷新率就是指,每秒顯示60幀(圖像)
假設分辨率為800*600,則每秒有60次垂直同步。而每次垂直同步包括了600次水平同步。
另外傳輸的數據包括圖像數據(8bit調制為10bit每通道進行傳輸),控制信號(用來說明下一次傳輸哪類信號),音頻數據(4bit)。通道包括rgb共3通道,最后加一通道為clock。
HDMI TDMS.png
我此時懷疑是否ioctrl后底層驅動配置不支持。然后又看了下硬件原理用的是TDA19988的解碼芯片說只支持到1280的解碼,那么1440x900之前為什么也能支持?關于TDA在上圖中是什么位置有點搞不明白,之后再研究下。然后總是顯示tilcdc初始化成功,tilcdc到底是個什么東西。重要兜了個圈子又回到了TI官網,LCDC是LCD controller的縮寫,ti就是TI,說白了tilcdc就是am335的一個lcd模塊。就和我現在一直做的can模塊一樣。
LCDC模塊
終于進入正題,我之前除了看graph章節,我還應該要看TI官網的LCDC章節。這里面就寫drm及kmscube還有testmode的源碼路徑。并且還告知dts在有LCD的情況下應該如何配置,看了教程后覺得我的底層驅動當前是正常的,因為運行kmscube能正常顯示3D圖像。
http://software-dl.ti.com/processor-sdk-linux/esd/docs/latest/linux/Foundational_Components/Kernel/Kernel_Drivers/Display/LCDC.html
總結
以上是生活随笔為你收集整理的开发linux显卡驱动,显卡驱动开发DRM入门--Apple的学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux代理后网页显示问题,项目部署到
- 下一篇: linux6.4 vnc安装与配置,Or