好久没有写过博客了,工作之后平时都没有总结,感觉像做了学到很多东西,但是又感觉什么都没有学到,似懂非懂(真尼玛纠结)。突然别人说的一句话,学东西不仅仅是自己学会就好了,要尝试把你知道的讲给别人听,然而在讲诉的过程中,自己就会清楚自己到底懂还是不懂。好了,言归正传,来介绍下我最近一年都在做的东西,Linux DRM 显示驱动。

刚开始收到任务准备接手 DRM 工作的时候,直接先看下代码路径,

[~/github_projs/linux] (analogix_dp_upstream) 817h40m $ ls drivers/gpu/drm/

amd drm_edid.c drm_panel.c msm

armada drm_edid_load.c drm_pci.c nouveau

ast drm_encoder_slave.c drm_plane_helper.c omapdrm

ati_pcigart.c drm_fb_cma_helper.c drm_platform.c panel

atmel-hlcdc drm_fb_helper.c drm_prime.c qxl

bochs drm_flip_work.c drm_probe_helper.c r128

bridge drm_fops.c drm_rect.c radeon

cirrus drm_gem.c drm_scatter.c rcar-du

drm_agpsupport.c drm_gem_cma_helper.c drm_sysfs.c rockchip

drm_atomic.c drm_global.c drm_trace.h savage

drm_atomic_helper.c drm_hashtab.c drm_trace_points.c shmobile

drm_auth.c drm_info.c drm_vma_manager.c sis

drm_bridge.c drm_internal.h drm_vm.c sti

drm_bufs.c drm_ioc32.c exynos tdfx

drm_cache.c drm_ioctl.c fsl-dcu tegra

drm_context.c drm_irq.c gma500 tilcdc

drm_crtc.c drm_legacy.h i2c ttm

drm_crtc_helper.c drm_lock.c i810 udl

drm_crtc_internal.h drm_memory.c i915 vgem

drm_debugfs.c drm_mipi_dsi.c imx via

drm_dma.c drm_mm.c Kconfig virtio

drm_dp_helper.c drm_modes.c Makefile vmwgfx

drm_dp_mst_topology.c drm_modeset_lock.c mga

drm_drv.c drm_of.c mgag200

好特么高端,直接就放在了 “gpu/” 路径下。GPU 这东西一直很神秘,说说当时我心里飘过的关键字:"高逼格"、"ARM Mali"、"代码不开源"。心里一顿暗爽,这么高端的东西肯定很好玩。老习惯先百度几篇中文的资料来看看,结果一搜,出来的全特么是什么 "数字版权保护" 的叽叽。不开森啊、不开森  :/  难道是这个东西太新了,git log 一看,提交时间也是 2008 年啊,看来只能说当时关键字匹配不好。

commit c0e09200dc0813972442e550a5905a132768e56c

Author: Dave Airlie Date: Thu May 29 10:09:59 2008 +1000

drm: reorganise drm tree to be more future proof.

With the coming of kernel based modesetting and the memory manager stuff,

the everything in one directory approach was getting very ugly and

starting to be unmanageable.

This restructures the drm along the lines of other kernel components.

It creates a drivers/gpu/drm directory and moves the hw drivers into

subdirectores. It moves the includes into an include/drm, and

sets up the unifdef for the userspace headers we should be exporting.

Signed-off-by: Dave Airlie

当时也不会,所以就硬着头皮,直接以 HDMI 开始,代码里面加 LOG 来看看这是个什么鬼。换在现在,我就不用这种方法来坑大家了(不然写这个博客,也就太没意思了)。首先 WIKI 搜下 "Linux DRM",出来的内容不错,原文贴出来:

The Direct Rendering Manager (DRM) is a subsystem of the Linux kernel responsible for

interfacing with GPUs of modern video cards. DRM exposes an API that user space programs

can use to send commands and data to the GPU, and perform operations such as configuring

the mode setting of the display. DRM was first developed as the kernel space component of

the X Server's Direct Rendering Infrastructure,[1] but since then it has been used by other

graphic stack alternatives such as Wayland.

WIKI 里面概括的还是比较清楚的,如上面英文所诉,DRM 由两个部分组成:一是 Kernel 的子系统,这个子系统对硬件 GPU 操作进行了一层框架封装。二是提供了一个 libdrm 库,里面封装了一系列 API,用来进行图像显示。整体看来和在 Android 上用的 Direct Frame Buffer 差不多嘛,Android Kernel 走的是 FB 的框架,然后 Android HAL 层那边抽象出了一个 FBDEV,用来进行 FB IOCTRL 的统一管理。然而 DRM 就相当于对图形设备进行集中处理,并且多出了个漂亮的 libdrm 库。都说没图说个 JB,来来贴两张 WIKI 上面的对比图片 (左边是 Without DRM,右边是 With DRM,点击图片可以看大图)

Without DRM

With DRM

DRM allows multiple programs concurrently access to the 3D video card avoiding collisions

现在应该知道 DRM 大概的流程是什么样子了,那继续看看我当时真正需要开发的部分:

[~/github_projs/linux] (analogix_dp_upstream) 817h21m $ ls drivers/gpu/drm/rockchip/

analogix_dp-rockchip.c rockchip_drm_drv.h rockchip_drm_gem.c

dw_hdmi-rockchip.c rockchip_drm_fb.c rockchip_drm_gem.h

Kconfig rockchip_drm_fbdev.c rockchip_drm_vop.c

Makefile rockchip_drm_fbdev.h rockchip_drm_vop.h

rockchip_drm_drv.c rockchip_drm_fb.h

乍眼一看,跟 GPU 没毛线关系(有点伤心),看起来更像是显示接口的开发(但是也挺有意思的)。其中的 VOP(Video Output Processor) 又指 SoC 的 LCDC 模块,主要可以完成图层渲染、色彩信号转换(YUV - > RGB)、LCDC Timing 输出,而 HDMI / eDP 则具体的显示接口。而 GEM / FBDEV 我猜是和硬件 IOMMU 内存管理相关的东西,drm_drv 则应该是 Rockchip Drm Platform 和 DRM 大框架对接的部分。

好勒,今天介绍的差不多了,以后有机会再具体介绍下具体 DRM 具体的显卡驱动怎么写,以及问问神秘的 GPU 小组,看看 DRM 和 GPU 有没有配合起来。

Thanks,

- Yakir

linux drm 写屏幕,Linux DRM Graphic 显示简单介绍相关推荐

  1. G++ 4.4.7 无法编译模板程序,Vs可以,和解?智者尾部留言,本人第一次使用vs pro,通常并且习惯在linux下写些小东西,虽然程序简单;...

    G++ 4.4.7 无法编译模板程序,Vs可以,和解?智者尾部留言,本人第一次使用vs pro,通常并且习惯在linux下写些小东西,虽然程序简单; vs 模板编译运行Ok \ linux g++ 4 ...

  2. linux sed.写文件,Linux文件处理sed命令-linux sed命令详解-linux sed写入文件-嗨客网

    Linux文件处理sed命令详解教程 Linux sed命令使用 Linux sed 命令处理时,把当前处理的行存储在临时缓冲区中,称为 "模式空间"( oattern space ...

  3. linux不写日志,linux 重要日志

    以下介绍的是20个位于/var/log/ 目录之下的日志文件.其中一些只有特定版本采用,如dpkg.log只能在基于Debian的系统中看到. /var/log/messages - 包括整体系统信息 ...

  4. linux硬盘写0,linux – kworker消耗90%的IO和零磁盘写入

    这是AWS Linux AMI EBS上的标准apache Web服务器.我们注意到高负载平均值(8)和iotop -a显示: Total DISK READ: 0.00 B/s | Total DI ...

  5. linux+top写日志,Linux:日志那些命令

    这里都是Linux那些命令 1.sed: 2.awk: 3.printf: 4.sort 5.cut: # linux 下 取进程占用 cpu 最高的前10个进程 ps aux|head -1;ps ...

  6. DRM驱动(一)之显示处理器介绍

    显示处理器是什么 将在内存中的图像数据,转化为电信号送到显示设备称为显示控制器,比如早期的LCDC.后面进行了拓展,可以处理一些简单的图像,比如缩放.旋转.合成等,如瑞芯的vop,高通的sde称为显示 ...

  7. linux ntfs 写文件,Linux下写NTFS文件系统

    最近因为工作需要,安装了Debian Linux,保留了机器上原有的Windows2000操作系统.不幸的是我的磁盘分区格式都是NTFS的,在Linux下读是不成问题的:mount -tntfs /d ...

  8. linux怎么写时间戳,Linux时间戳

    在Linux系统中每一个文件都有3种时间定义(称之为时间戳timestamps),这三种时间分 别为:Access time(atime),Modify time(mtime),Change time ...

  9. linux shell写服务,Linux shell编写系统服务脚本

    事先准备工作:源码安装apache .安装目录为/usr/local/httpd 任务需求: 1.可通过 service httpd start|stop|status|restart 命令对服务进行 ...

  10. linux 多线程 写日志,rsyslog多线程远程日志记录介绍(lamp+rsyslog)

    rsyslog多线程远程日志记录介绍(lamp+rsyslog) rsyslog: rsyslog: 多线程: 支持UDP, TCP, SSL, TLS, RELP远程日志记录 rsyslog支持将日 ...

最新文章

  1. win7 win10下80端口被System进程占用的解决方法
  2. SQL统计指定的一列多少种取值
  3. 我常用的python函数(part1)--内置函数isinstance
  4. P3768 简单的数学题(杜教筛)
  5. QT事件事件之一:Qt中的事件处理与传递
  6. html:(39):块级元素和内联块级元素
  7. 论文浅尝 | TANDA: Transfer and Adapt Pre-Trained Transformer Models
  8. java phantomjs 截图_phantomjs 截图
  9. proteus里面没有stm32怎么办_使用C#编写STM32对接物联网平台IoTSharp发送遥测数据
  10. CentOS SVN 服务器搭建
  11. javascript-从toString方法在判断复杂数据类型上的妙用,引申到对原型链的理解...
  12. 重新认识margin-top和margin-bottom
  13. hdu 4622 Reincarnation(SAM)
  14. 小型三维引擎设计实现-渲染层的设计总结
  15. 练习- Java顺序结构综合练习三之金融投资收益计算
  16. 【银河麒麟国产服务器安装mysql、nginx和docker遇到的问题】(回忆篇)
  17. Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行
  18. hidapi在linux下编译,HIDAPI
  19. 线性表练习扑克牌游戏(炸金花)
  20. 将DDS集成到AUTOSAR Adaptive平台

热门文章

  1. android 获取系统是否允许自动旋转屏幕
  2. 冰雪经济下,全民滑雪进入国际化的“黄金时代”
  3. Win11更改用户文件夹名
  4. 10015---JavaScript--表单验证
  5. 学科实践活动感悟50字_社会实践感悟50字_寒假社会实践感悟
  6. 2019重新起航:搭建个人博客
  7. 使用计算机时要注意防,计算机使用的几个基本技巧
  8. PDF修改文字的步骤
  9. 校友厅——只有一层的“校友楼”
  10. 深度学习之卷积神经网络CNN详解