Linux DRM KMS 驱动简介【转】
转自:https://blog.csdn.net/yangkuanqaz85988/article/details/48689521
Whoops,上次写完《Linux DRM Graphic 显示简单介绍》博文后,心情还是蛮愉悦的,来来,这次在说说具体的显卡驱动。
1. DRM 框架分解
DRM 框架提供了一系列的 IOCTL 行为,但是绝大部分可以分成两类行为:Graphics Execution Manager (GEM)、Kernel Mode-Setting (KMS) 下面截图 WIKI 上一段总结:
Since then, the scope of DRM has been expanded over the years to
cover more functionality previously handled by user space programs, such
as framebuffer managing and mode setting, memory sharing objects and
memory synchronization.[4][5] Some of these expansions had carried their
own specific names, such as Graphics Execution Manager (GEM) or Kernel
Mode-Setting (KMS), and the terminology prevails when the functionality
they provide is specifically alluded. But they are really parts of the
whole kernel DRM subsystem.
前者 GEM 主要是对 FrameBuffer 的管理,如显存的申请释放 (Framebuffer managing) ,显存共享机制
(Memory sharing objects), 及显存同步机制 (Memory synchronization),而后者 KMS
主要是完成显卡配置 (Display mode setting) .
现在将 Rockchip drm 驱动和上面对应一下,rockchip_drm_gem* 对应的当然就是 GEM,rockchip_drm_vop* / analogix_dp-rockchip* / dw_hdmi-rockchip* 肯定指的就是 KMS,而我们这次也先玩玩后者 KMS (Kernel Mode Setting).
2. 显卡设备驱动
我们先引用下 WIKI 的一段话,来简述下显卡设备的组成:
Due to the fact that dies of modern GPUs found on graphics cards
for desktop computers integrate “processing logic”, “display controller”
and “hardware video acceleration” SIP cores, non-technical people don’t
distinguish between these three very different components. SoCs on the
other hand, regularly mix SIP from different developers, and, for
example, ARM’s Mali SIP does not feature a display controller. For
historical reasons, the DRM and the KMS of the Linux kernel were
amalgamated into one component. They were split in 2013 for technical
reasons.[16]
显卡主要是由三类设备组成:Processing logic 指的是神秘的 GPU 模块,Display controller 指的是 LCDC 控制器,Hardware video acceleration 指的就是具体的显示接口 HDMI / eDP / …
根据上面的设备概念,我们来和具体驱动对应下:
[~/github_projs/linux] (analogix_dp_upstream) 837h28m $ ls drivers/gpu/drm/rockchip/
analogix_dp-rockchip.c rockchip_drm_fbdev.c
dw_hdmi-rockchip.c rockchip_drm_fbdev.h
Kconfig rockchip_drm_fb.h
Makefile rockchip_drm_gem.c
rockchip_drm_drv.c rockchip_drm_gem.h
rockchip_drm_drv.h rockchip_drm_vop.c
rockchip_drm_fb.c rockchip_drm_vop.h
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- Processing logic 很可惜不在我开发的目录中
- Display controller 肯定是 VOP 驱动了 rockchip_drm_vop*
- Hardware video acceleration 也就是 HDMI / eDP 驱动了 analogix_dp-rockchip* & dw_hdmi-rockchip*
而这次要要介绍的 DRM KMS (Kernel Mode Setting) 的概念,指的就是上面成员的集合,具体就是 VOP (Video Output Processor) / HDMI / eDP 端的驱动。DRM KMS 对于显卡设备驱动有三个概念 CRTC / Encoder / Connector,这三个概念很重要,但是很容易理解。CRTC 就是指 Display Controller,Encoder 就是指具体接口驱动 eDP / HDMI,Connector 指的是具体外接的屏幕 Monitor / Panel。
- CRTC 的常用行为如下:
- DPMS (Display Power Manage System) 电源状态管理 (crtc_funcs->dpms)
- 将 Framebuffer 转换成标准的 LCDC Timing ,其实就是一帧图像刷新的过程(crtc_funs->mode_set)
- 帧切换,即在 VBlank 消影期间,切换 Framebuffer(crtc_funcs->page_flip)
- Gamma 校正值调整(crtc_funcs->gamma_set)
- Encoder 的常用行为如下:
- DPMS (Display Power Manage System) 电源状态管理 (encoder_funcs->dpms)
- 将 VOP 输出的 lcdc Timing 打包转化为对应接口时序 HDMI TMDS / … (encoder_funcs->mode_set)
- Connector 的常用行为如下:
- 获取上报 热拔插 Hotplug 状态
- 读取并解析屏 (Panel) 的 EDID 信息
我简单以 HDMI Monitor 显示的过程为例,实例解析下 CRTC / Encoder / Connector 的行为:
1. 首先 HDMI 驱动检测到电视 Plugin 信号,读出电视的 EDID 信号,获取电视的分辨率信息 (DRM Connector)。
2. Userspace 将需要显示的数据填充在 framebuffer 里面,然后通过 libdrm 接口通知 VOP 设备开始显示。
3. 接着 VOP 驱动将 framebuffer 里面的数据转换成标准的 LCDC Timing 时序 (DRM CRTC)。
4. 同时 HDMI 驱动将 HDMI 硬件模块的 LCDC 时序配置与 VOP 输出时序一致,准备将输入的 LCDC Timing 转化为电视识别的 HDMI TMDS 信号 (DRM Encoder)。
具体 CRTC / Encoder / Connector 的驱动 API
细节,这次就不体现了,仅仅做一个概念性的介绍,以后再有机会在逐个分解说吧,最后还是 No Picture Say JB,盗用一张 GPU
同事画的一张 DRM 的框架流程图,整体和细节都把握的非常好。
Thanks
- Yakir
Linux DRM KMS 驱动简介【转】的更多相关文章
- linux DRM/KMS 测试工具 modetest、kmscude、igt-gpu-tools (一)
这里整理几个在学习Linux DRM/KMS中用到的几个工具,modetest.kmscude.igt-gpu-tools. 简介: modetest 是由libdrm提供的测试程序,可以查询显示设备 ...
- linux DRM/KMS 测试工具 modetest、kmscude、igt-gpu-tools (二)
kmscube kmscube is a little demonstration program for how to drive bare metal graphics without a c ...
- Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介
原文:Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介 Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理 ...
- 【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介
作者 : 韩曙亮 转载请出名出处 : http://blog.csdn.net/shulianghan/article/details/38636827 一. Linux 内核简介 1. 内核功能简介 ...
- Linux 内核引导选项简介
Linux 内核引导选项简介 作者:金步国 连接地址:http://www.jinbuguo.com/kernel/boot_parameters.html 参考参数:https://www.cnbl ...
- linux UART串口驱动开发文档
转:http://www.360doc.com/content/10/0417/18/829197_23519037.shtml linux UART串口驱动开发文档时间:2010-01-09 14: ...
- 移植Linux Kernel SM750 驱动到VxWorks 7
一.SM750简介 SM750 是SiliconMotion 推出的一款适合嵌入式设备的显卡(Embedded GPU),采用PCIe接口与CPU连接,内部集成16MB DDR SDRAM显存,产品具 ...
- 【VS开发】【DSP开发】浅谈Linux PCI设备驱动(一)
要弄清楚Linux PCI设备驱动,首先要明白,所谓的Linux PCI设备驱动实际包括Linux PCI设备驱动和设备本身驱动两部分.不知道读者理不理解这句话,本人觉得这句话很重要,对于PCI.US ...
- linux块设备驱动之实例
1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major = register_blkdev(sbull_major, "sbull&quo ...
随机推荐
- 20135337朱荟潼 Linux第七周学习总结——可执行程序的装载
朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第七周 Linu ...
- Eclipse导入包提示Setting build path has encountered a problem
Eclipse无法导入jar包时, 提示:“Setting build path” has encountered a problem,Could not write file D:\\workspa ...
- 软件工程学习之小学四则混合运算出题软件 Version 1.00 设计思路及感想
对于小学四则混合运算出题软件的设计,通过分析设计要求,我觉得为了这个软件在今后便于功能上的扩充,可以利用上学期所学习的<编译原理>一课中的LL1语法分析及制导翻译的算法来实现.这样做的好处 ...
- Redis Cluster机器内存充爆处理
机器配置 系统:CentOS6.7 配置:4C8G 应用:Redis Cluster,实例化 现象 1.无法启动redis,启动后系统OOM,直接杀死 2.Redis: OOM command not ...
- LOJ#551 Matrix
本地打表在线AC什么的最喜欢了. 题意 \(\rm Alice\)和\(\rm Bob\)在玩游戏,他们要给一个\(n\times n\)的矩阵打标记.初始时没有任何标记,每一轮\(\rm Bob\) ...
- 【设计模式】—— 代理模式Proxy
前言:[模式总览]——————————by xingoo 模式意图 代理模式为其他的对象增加一个代理对象,进行访问控制.从而避免直接访问一个对象,造成效率或者安全性上的降低. 应用场景 1 远程代理, ...
- Java学习之String
一.String介绍(引用类型)1.java.lang.String字符串.用""括住的时字符串,都可以看做是实现此类的实例类String中也有许多简单方法 2.特点1).字符串不 ...
- Luogu4783 【模板】矩阵求逆(高斯消元)
对矩阵进行高斯消元直至消为单位矩阵,并在另一个单位矩阵上对其做同样的操作即可. 模意义下的高斯消元可以直接计算系数来避免整行的辗转相除. 还不知道有什么用. #include<iostream& ...
- Java 8新特性之 Nashorn(八恶人-6)
Joe Gage 盖奇·乔 “First time in my life I made a pretty penny.And, figured I'd come home and spend time ...
- Git合并的代码 不提交服务器的方法
使用Git下载代码的时候,常遇到合并的情况,然后再上传的时候,系统就会自动把合并代码的过程也上传,有时候会感觉非常的烦Merge remote-tracking branch 'choose_remo ...