Linux中主流的显示框架有两种:DRM框架和FB框架。

  • DRM框架:Direct Rendering Module,可以统一管理GPU显示
  • FB框架:Frame Buffer,不能处理基于3D加速的GPU显卡

一、DRM框架简介

1. 整体架构

DRM框架包含两部分:DRM core和DRM driver。

DRM core提供了一个基本的框架,DRM driver可以注册进DRM框架,同时为用户空间提供一组ioctl。

libdrm对底层接口(DRM driver提供的ioctl)进行封装,向上层提供统一的API接口。

DRM driver包含了GEM模块和KMS模块。

2. DRM driver

  • GEM:Graphics Execution Manager,图形执行管理器,是一个内存管理器,主要负责内存的分配与释放,可以调用GPU
  • DUMB:是一个dumb缓冲区,负责一些简单的buffer显示,可以通过CPU直接渲染
  • KMS:Kernel Mode Setting,内核显示模式设置,主要负责显示的控制,包括屏幕分辨率、屏幕刷新率、颜色深度等
  • CRTC:显示控制器,在DRM里有多个显存,可以通过操作CRTC来控制要显示的那个显存
  • Encoder:负责从CRTC里输出的timing时序转换成外部设备所需要的信号的模块,也负责控制LCD的显示
  • Connector:连接物理显示设备的连接器,比如DSI、HDMI等
  • Plane:负责获取显存,再输出到CRTC里
  • FB:帧缓冲,能够显示图层的buffer

3. GEM和KMS如何连接显示器

二、ST官方的DRM驱动框架

DRM驱动的核心是drm_driver结构体

1. ltdc设备树描述

在stm32mp1芯片级通用描述文件中:

2. ltdc驱动

通过兼容性找到ltdc驱动为:drivers/gpu/drm/stm/drv.c,绑定文档为:Documentation/devicetree/bindings/display/st,stm32-ltdc.yaml

可以看到,这是一个标准的platform驱动,当设备和驱动匹配以后,probe函数就会执行。

重点看一下drv_load函数:

其中最核心的是ltdc_load函数,其中通过drm_pannel结构体来获取屏幕参数。

3. drm_panel结构体

drm_panel结构体定义在include/drm/drm_bridge.h

/*** struct drm_panel - DRM panel object*/
struct drm_panel {/*** @dev:** Parent device of the panel.*/struct device *dev;/*** @backlight:** Backlight device, used to turn on backlight after the call* to enable(), and to turn off backlight before the call to* disable().* backlight is set by drm_panel_of_backlight() and drivers* shall not assign it.*/struct backlight_device *backlight;/*** @funcs:** Operations that can be performed on the panel.*/const struct drm_panel_funcs *funcs;/*** @connector_type:** Type of the panel as a DRM_MODE_CONNECTOR_* value. This is used to* initialise the drm_connector corresponding to the panel with the* correct connector type.*/int connector_type;/*** @list:** Panel entry in registry.*/struct list_head list;
};

三、RGB LCD屏幕驱动

在文件drivers/gpu/drm/panel/panel-simple.c中,可以是标准的platorm驱动:

匹配表如下:

匹配表中给出了兼容性和对应的屏幕参数数据,比如"ampire,am-1280800n3tzqw-t00h"这块屏幕,对应的屏幕参数如下:

四、内核配置——使能DRM

-> Device Drivers-> Graphics support[*] Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)[*] DRM Support for STMicroelectronics SoC Series-> Display Panels[*] support for simple panels-> Backlight & LCD device support[*] Generic GPIO based Backlight Driver



STM32MP157A驱动开发 | 04 - Linux DRM显示驱动框架相关推荐

  1. linux内核led驱动开发,从Linux内核LED驱动来理解字符设备驱动开发流程

    目录 博客说明 开发环境 1. Linux字符设备驱动的组成 1.1 字符设备驱动模块加载与卸载函数 1.2 字符设备驱动的file_operations 结构体中的成员函数 2. 字符设备驱动--设 ...

  2. RK3399驱动开发 | 04 - WK2124串口芯片驱动浅析

    一.驱动挂载与卸载 加载模块之后,查看完整的系统日志: 1. 模块加载与卸载 WK2124使用spi总线通信,所以在模块加载的时候向内核注册spi驱动. 2. 驱动挂载与卸载 可以看到spi驱动兼容性 ...

  3. i.MX6ULL驱动开发 | 31 - Linux内核网络设备驱动框架

    一.Linux网络设备驱动整体架构 网络设备是完成用户数据包在网络媒介上发送和接收的设备,它将上层协议传递下来的数据包,以特定的媒介访问控制方式进行发送,并将接收到的数据包传递给上层协议. Linux ...

  4. Linux 驱动 – Frame Buffer (帧缓冲)显示驱动

    Linux 驱动 – Frame Buffer (帧缓冲)显示驱动 一.Frame Buffer Frame Buffer 翻译过来是帧缓冲的意思,帧指的是一帧图像,缓冲是暂时存放的意思,连起来就是暂 ...

  5. 32驱动_轻松掌握pinctrl子系统驱动开发——一个虚拟pinctrl dev驱动开发

    这周主要对pinctrl子系统进行分析,该分析的基本上已经分析完成,唯一没有细说的估计就是gpio与pinctrl之间的关联了.本章即是pinctrl子系统分析的最后一章,本章我们主要实现一个虚拟的p ...

  6. 驱动开发:配置Visual Studio驱动开发环境

    在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境,首先我们需要安装Visual Studio 2013这款功能强大的程序开发工具,在课件内请双击ISO文件并运行内部的vs_ultimate.ex ...

  7. Linux 驱动开发 三:字符设备驱动框架

    一.参考 (3条消息) Linux 字符设备驱动结构(一)-- cdev 结构体.设备号相关知识解析_知秋一叶-CSDN博客 (3条消息) linux设备驱动框架_不忘初心-CSDN博客_linux设 ...

  8. 迅为linux下串口,迅为IMX6ULL开发板Linux RS232/485驱动实验(上)

    在 arm 设备中串口是很常用的一个外设,不仅可以用来打印信息,还可以用于外接设备和其他传感器通信.根据不同的电平,串口分为 TTL 和 RS232,但是在Linux内核中的驱动程序是一样的,在串口上 ...

  9. Android 底层驱动开发步骤——linux内核层、HAL层、JNI层

    1.Linux驱动实现 2.Linux内核驱动测试 3.Android HAL层实现 4.Aidl实现 5.Service java实现 6.Service jni 实现 7.注册service和jn ...

最新文章

  1. Cordova入门系列(三)Cordova插件调用
  2. [dp] Jzoj P5804 简单的序列
  3. Qt之两种初始化QListWidget的方法
  4. oracle php 配置,PHP + Oracle的配置
  5. php中生成标准uuid(guid)的方法
  6. 不学好css模型的怎么入山门?师傅与徒弟的真实独白
  7. 都说dlib是人脸识别的神器,那到底能不能识破妖怪的伪装?
  8. C#编写WINNT服务,随便解决安卓开发遇到的5037被众多程序无节操占用的问题
  9. javascript简单拖拽效果
  10. 春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。...
  11. 机械革命计算机配置,机械革命笔记本Bios设置方法
  12. Polkit授权管理
  13. 2015年阿里巴巴校招笔试题
  14. marker 头像 高德地图_高德地图头像怎么更换 高德地图更换头像图文教程
  15. 微信支付可能改变的六大行业
  16. Displayport 连接、握手时序
  17. Shell进阶(三) 交互式脚本 函数 数组 分片 字符串处理
  18. 旧金山犯罪预测与可视化分析
  19. 2018年计算机考研408操作系统真题(客观题)
  20. Word2019输入(码字)或删除操作出现卡顿问题

热门文章

  1. EasyPoi word导出 简易使用指南
  2. 红色景点,纪念馆打卡拍照小程序,打卡完成任务,JavaScript 循环 i < cars.length;
  3. 解决服务器不能复制粘贴的方法
  4. 厌倦了大众字体?你可以用这个项目自创一款手写体
  5. ubuntu下安装AndroidStudio
  6. 拥抱 Java 8 并行流:执行速度飞起
  7. daloRADIUS中文2017年
  8. 不用引入第三变量交换两个变量的值
  9. 动态规划——零钱兑换问题
  10. LoadLibrary失败的原因