由于之前的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需要一路进行绑定。
调试问题
调试的时候出现过的权限问题。我下载的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。
我此时怀疑是否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