最简单的 DRM 应用 & drm设备不工作

2023-05-16

https://zhuanlan.zhihu.com/p/341895843
https://zhuanlan.zhihu.com/p/75321245

编写最简单的 DRM 应用

主程序:

int main(int argc, char **argv)
{
int fd;
drmModeConnector *conn;
drmModeRes *res;
uint32_t conn_id;
uint32_t crtc_id;

// 1. 打开设备

fd = open(“/dev/dri/card0”, O_RDWR | O_CLOEXEC);

// 2. 获得 crtc 和 connector 的 id

res = drmModeGetResources(fd);
crtc_id = res->crtcs[0];
conn_id = res->connectors[0];

// 3. 获得 connector

conn = drmModeGetConnector(fd, conn_id);
buf.width = conn->modes[0].hdisplay;
buf.height = conn->modes[0].vdisplay;

// 4. 创建 framebuffer

modeset_create_fb(fd, &buf);

// 5. Sets a CRTC configuration,这之后就会开始在 crtc0 + connector0 pipeline 上进行以 mode0 输出显示

drmModeSetCrtc(fd, crtc_id, buf.fb_id, 0, 0, &conn_id, 1, &conn->modes[0]);

getchar();

// 6. cleanup

return 0;
}
modeset_create_fb():

该函数用于分配 framebuffer,目前不需要太关心,大致就是 3 个步骤:

Allocating memory;
Preparing a mapping;
Mapping memory;
运行效果:

程序运行后,eDP 屏显示全屏白色,等待用户输入按键;当用户按下任意按键后,程序退出,显示黑屏。

drm设备不工作

在设备升级新版内核后,发现没有 fb0 设备,开机没有打印 drm 相关的信息

首先是检查设备树,确认加入 panel 节点

panel: panel {
        compatible = "lg,lb070wv8”, “simple-panel";
        #address-cells = <1>;
        #size-cells = <0>;
        enable-gpios = <&pio 4 6 GPIO_ACTIVE_HIGH>;
    port@0 {
        reg = &lt;0&gt;;
        #address-cells = &lt;1&gt;;
        #size-cells = &lt;0&gt;;

        panel_input: endpoint@0 {
            reg = &lt;0&gt;;
            remote-endpoint = &lt;&amp;tcon0_out_lcd&gt;;
        };
    };
};

其次是检查内核是否开启了相关的驱动,这里使用的是 lichepi nano,依赖的驱动是 SUN4I 系列的驱动

CONFIG_DRM_SUN4I=y
CONFIG_DRM_SUN4I_HDMI=y
CONFIG_DRM_SUN4I_BACKEND=y

不过在检查完上面两个地方没有问题后,还是没有解决问题

为了获取 drm 启动过程中的更多信息,在 uboot 的 bootargs 中加入 drm.debug=0x1f debug ,让内核打印 drm 的更多信息

[    1.079849] [drm:drm_core_init] Initialized
[ 1.084524] [drm:sun4i_drv_probe] Adding component /soc/display-backend@1e60000
[ 1.092143] [drm:sun4i_drv_probe] Adding component /soc/lcd-controller@1c0c000
[ 1.099606] [drm:sun4i_drv_probe] Adding component /panel
[ 1.105025] [drm:sun4i_drv_traverse_endpoints] No output to bind on port 1
[ 1.124695] [drm:compare_of] Comparing of node /soc/lcd-controller@1c0c000 with /soc/display-backend@1e60000

发现内核尝试着挂载 /panel 节点,这个本来是不用挂载的

修改 suniv_quirks,加上 has_channel_0 的配置。缺少 has_channel_0 会让内核认为这个 TCON 没有 RGB 口

static const struct sun4i_tcon_quirks suniv_quirks = {
.has_channel_0 = true,
.has_channel_1 = true,
};

重新编译烧录后,drm 的启动信息如下。内核没有再去挂载 /panel 节点了,不过 drm 的启动还是没有成功

[    1.079943] [drm:drm_core_init] Initialized
[ 1.084616] [drm:sun4i_drv_probe] Adding component /soc/display-backend@1e60000
[ 1.092235] [drm:sun4i_drv_probe] Adding component /soc/lcd-controller@1c0c000
[ 1.099662] [drm:sun4i_drv_traverse_endpoints] Endpoint is our panel… skipping
[ 1.121843] [drm:compare_of] Comparing of node /soc/display-backend@1e60000 with /soc/display-backend@1e60000
[ 1.131931] [drm:compare_of] Comparing of node /soc/display-backend@1e60000 with /soc/lcd-controller@1c0c000

后来在看到了这份 commit 中说的内容,将 .has_channel_1 屏蔽掉,drm 正常工作了

static const struct sun4i_tcon_quirks suniv_f1c100s_quirks = {
/*
* The F1C100s SoC has a second channel in TCON, but the clock input of
* it is not documented.
/
.has_channel_0 = true,
/
.has_channel_1 = true, */
};

感谢

非常感谢这两位大神给我的帮助

  • Icenowy
  • libunko
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最简单的 DRM 应用 & drm设备不工作 的相关文章

  • OpenGL进阶 | GLM数学库& Shader相关

    一 GLM数学库 OpenGL和DirextX不一样 xff0c 没有内置的数学库 xff0c 于是我们需要找一个第三方数学库来完成OpenGL相关的数学计算 GLM库是一个为OpenGL准备的数学库 xff0c 它提供了各种数学运算的函数
  • Kibana学习&理解

    注 xff1a 本篇的kibana基于7 5 1版本 Kibana是什么 xff1f kibana是一个数据可视化平台 展示与分析 将es里面的东西通过各种图表展示出来 xff0c 还可以执行es的各种搜索 amp 监控 Kibana环境搭
  • (5)py接口自动化之配置文件&数据库连接详解

    目录 一 配置文件 ini amp yaml 1 作用 2 ini A 语法 B 特点 C 操作方法 3 yaml A 安装第三方库 B 支持的数据类型 C 特性 D 语法 E 数据读取 二 数据库连接与pytho配置文件 1 安装数据库
  • 数组名a+1和&a+1的区别

    C C 43 43 里面的数组名字会退化为指针 xff0c 所以数组名a实际指的是数组的第一个元素的地址 而数组名作为指针来讲有特殊性 xff0c 它正在它所指向的内存区域中 xff0c amp a的值和a的数值是相同的 xff08 可以输
  • 2013&2014

    2013总结 2013 毕业了 xff0c 算是正式工作半年 xff0c 2013年7月开始 xff0c 算是我的生活 xff0c 工作之外的时间都是自己的 一 收获 1 压力测试 差不多算是一个月的时间 xff0c 疯狂的一个月 xff0
  • AMP:参考xapp-1078和xapp1079的一些建议

    Linux系统默认是SMP模式 xff0c 有时我们也需要AMP模式进行开发 参考网站 xff1a wiki xilinx com 有xapp1078 xapp1079最新版本的AMP demo www arm com 主要是介绍arm系列
  • 持续请求/socket.io/?EIO=3&transport=polling&t=N8HrzIR

    项目基本介绍 xff1a 使用React xff0c webpack xff0c socket io client Node js Express socket io 等技术 xff0c 采用前后端分离开发 实现项目中的聊天室时遇到报错 x
  • Chrome安装Proxy SwitchyOmega插件&Ubuntu20.04安装Proxychains

    目录 1 Chrome浏览器1 1 安装Proxy SwitchyOmega插件1 2 安装Proxy SwitchyOmega插件 2 Ubuntu服务器2 1 安装2 2 配置2 3 测试2 4 异常处理 1 Chrome浏览器 1 1
  • ROS速成之发送&接收消息

    人真的老了 xff0c 扔了个周末 xff0c 完全不记得干了什么 论纪录的重要性啊 xff0c 当时觉得明白的很 xff0c 你扔两天试试 xff1f 扔一年试试 xff1f 扔几年试试 xff1f 最近参加的各种项目脑疼眼乏 xff0c
  • Docker数据卷&&自定义Docker镜像

    目录 宿主机与容器之间的文件拷贝 引言 xff1a 利用MySQL镜像安装MySQL服务 从容器中拷贝文件到宿主机 从宿主机拷贝文件到容器 数据卷 数据卷容器 Dockerfile自定义镜像 自定义tomcat8 xff08 熟悉几乎所有的
  • linux中断&poll&selcet按键处理机制

    在上一篇linux按键中断处理中 xff0c 我们采用按键中断处理获取按键 xff0c 在read函数中阻塞读取 xff0c 当按键发生时 xff0c read自动解除阻塞 xff0c 实现应用层读取到相应的按键值 在上一节中如果没有按键到
  • Cmake入门&运行保存C/C++文件

    Cmake入门 amp 运行保存C C 43 43 文件 在ubuntu创建 保存 运行c 43 43 文件CMake入门创建文件编译 参考 最近在学习Intel realsense T265双目视觉 xff0c 其中一步需要创建源文件ma
  • 关于 DRM 中 DUMB 和 PRIME 名字的由来

    前言 在上一篇 DRM驱动程序开发 VKMS 文章里 我们学习了如何编写一个最简单的 KMS 驱动 而本篇 我将以叙述的形式为大家讲解 DRM GEM 的相关概念 代码留到下一篇进行讲解 我知道 大多数的 DRM 初学人员 在刚接触到 GE
  • DRM(Direct Rendering Manager)学习简介

    DRM DRM是Linux目前主流的图形显示框架 相比FB架构 DRM更能适应当前日益更新的显示硬件 比如FB原生不支持多层合成 不支持VSYNC 不支持DMA BUF 不支持异步更新 不支持fence机制等等 而这些功能DRM原生都支持
  • DRM框架(vkms)分析(3)----connector->func && connector->helper_private的使用

    一 connector gt func drm connector funcs类型的对象实例 其中有些对象实例可直接使用helper函数 有些可以自定义 还有一些可以忽略掉不赋值的 struct drm connector funcs co
  • MIPI DSI的linux kernel驱动原理

    为了点亮一块MIPI屏幕 我们除了要了解MIPI DSI的工作原理之外 大前提是要了解整个MIPI DSI图显系统的组成 更需要清楚点亮一块MIPI屏幕需要做哪些事情 本文会捋顺各个环节所实现的功能以及基于RK3399来分析各个环节实现的原
  • 如何使用android.drm框架

    我正在开发一个基于 DRM 的 Android 应用程序 应用程序旨在在下载并获得对文件 音频 视频 的控制访问权限后对 音频 视频 文件进行加密 防止文件 音频 视频 复制和粘贴并使文档过期 从而无法再查看它们 为此我使用 android
  • 三星智能电视通过 PlayRead 串流 MPEG DASH

    我尝试在 Orsay TV Tizen 之前的三星电视 上播放流 带有 PlayReady 的 MPEG DASH 未加密的 DASH 工作正常 我试图严格按照 DRM Today 手册 即我的 DRM 提供商 获取许可证 但播放无法开始
  • 如何确定 Android 应用程序是否使用可信执行环境 (TEE) 和安全元件 (SE)?

    我已经解决了问题One https stackoverflow com questions 61225795 how to check whether android phone supports tee 64422042 64422042
  • 如何在 Cast Receiver Player 中续订过期的 DRM 许可证?

    我基于以下内容开发自定义 Cast Receiver 应用程序Google Cast 应用程序框架 https developers google com cast docs caf receiver 接收器应用程序负责播放 Widevin

随机推荐

  • 【解救ROS】关于ros机器人(小车)动态调试PID参数

    1 打开终端 xff0c 连接树莓派 ssh clbrobot 64 clbrobt 2 打开底盘节点 roslaunch clbrobot bringup launch 3 再打开一个终端 ssh clbrobot 64 clbrobt
  • 十进制转十六进制(C语言)

    首先要注意输入非负整数的范围 xff1a 这里用long表示 xff1b long 取值 2147483648 2147483647 include lt stdio h gt int main long n int i 61 0 j ch
  • C语言之数组的定义及其使用方法

    作者 xff1a 从未止步 博客主页 xff1a 从未止步的博客 专栏 xff1a 和我一起学C 语录 xff1a Every day is a second chance 行动是理想最高贵的表达 xff0c 给大家介绍一款超牛的斩获大厂o
  • python之常量的定义

    常量 xff1a 与C语言不同的是 xff0c python中并没有用来修饰常量的修饰符 xff0c 在python中可以通过自定义实现常量 xff0c 要求常量的标识符必须全是大写字母 xff0c 且该值不能被修改 举例 xff1a PI
  • C语言之根据摄氏温度求华氏温度

    求摄氏温度26 C对应的华氏温度 计算公式 xff1a f 61 9 c 5 43 32 xff0c 式中 xff1a c表示摄氏温度 xff0c f表示华氏温度 输入输出示例 xff1a celsius 61 26 fahr 61 78
  • python文件的操作和异常之异常

    异常 xff1a python使用称为异常的特殊类对象来管理程序执行期间发生的错误 xff0c 每当发生让python不知所措的错误时 xff0c 他都会创建一个异常的对象 如果你编写了处理该异常的代码 xff0c 程序将继续进行 xff0
  • Java---抽象类和接口

    抽象类 xff1a 抽象类的基本概念 xff1a 在面向对象的概念中 xff0c 所有的对象都是通过类来描述并创建的 xff0c 但是有一种特殊的类 xff0c 并不能用完整的信息来描述一个具体的对象 xff0c 这样的类就是抽象类 xff
  • 通过基于注解的声明式事务实现事务功能~

    编程式事务 xff1a 事务功能的相关操作全部通过自己编写代码来实现 xff1a span class token class name Connection span conn span class token operator 61 s
  • 《DRM 专栏》| 彻底入门 DRM 驱动

    https cloud tencent com developer article 2021477 前面的 DRM 应用程序系列文章中 xff0c 我们学习了如何使用 libdrm 接口编写 DRM 应用程序 本篇我们将进入一个全新的世界
  • 声明式事务的属性~

    说明 xff1a 本篇文章的代码是基于上篇文章之上的 xff0c 如有需要 xff0c 请移至这篇文章 声明式事务的属性 xff1a 只读 xff0c 超时 xff0c 回滚策略 xff1a 事务属性 xff1a 只读 对一个查询操作来说
  • 配置SpringMVC的前端控制器DispatcherServlet时,<url-pattern>中“/“和“/*“的区别

    span class token comment lt 表示所匹配的请求可以是login或 html或 js或 css方式的请求路径 xff0c 但是 不能匹配 jsp请求路径的请求 xff0c 因此就可以避免在访问jsp页面时 xff0c
  • 解决在idea中构建项目出现不能创建java类,只能创建文件的问题~

    注意 xff1a 一定要根据箭头的指向顺序进行 修改完成 xff0c 如下所示 xff1a
  • 解决在idea中构建项目时,出现的java:错误:不支持发行版本 5

    错误描述 xff0c 如下所示 xff1a 错误原因 xff1a idea中默认配置中有几个地方的jdk版本与实际不一致 解决办法 xff1a 第一步 xff1a 第二步 xff1a 第三步 xff1a 第四步 xff1a 第五步 xff1
  • 【C++】搭建HTTP服务器

    目录 项目介绍 网络协议栈介绍 协议分层 数据的封装与分用 HTTP相关知识介绍 HTTP的特点 URL格式 URI URL URN HTTP的协议格式 HTTP的请求方法 HTTP的状态码 HTTP常见的Header CGI机制介绍 CG
  • vscode 出现“未定义标识符cout”

    1 检查是否有 xff1a include lt iostream gt using namespace std 2 若有 xff0c 可以修改一下vscode的设置 xff1a 将C Cpp intelli Sense Engine的 D
  • FreeRtos.STM32f103c8t6调用vTaskDelay时间不准问题

    1 选择晶振要选择正确 2 内核选择的主频要和实际一致 define configCPU CLOCK HZ unsigned long 72000000 系统主频 define configTICK RATE HZ TickType t 1
  • FreeRtos外部中断使用

    首先是config文件里的宏 ARM Cortex M 架构自身允许最多 256 个不同的优先级 xff08 最多有 8 个 优先级位 xff0c 因此从 0 到 0xff 的优先级都是可能的 xff09 xff0c 但绝大多数使用 ARM
  • MPU-6050资源介绍

    介绍 作用 xff1a 测量三轴加速度和三轴角速度 测三轴加速度 xff1a 加速度计 测三轴角速度 xff1a 陀螺仪 加速度计具有静态稳定性 xff0c 动态不稳定性 陀螺仪具有静态不稳定性 xff0c 动态稳定性 需要互补滤波 xff
  • STM32硬件I2C

    以I2C2为例子 硬件I2C不需要我们手动去翻转电平 首先配置I2C xff1a 配置GPIO xff0c 配置复用功能I2C 配置复用开漏 xff0c 使能I2C I2C起始条件函数 64 param I2Cx where x can b
  • 最简单的 DRM 应用 & drm设备不工作

    https zhuanlan zhihu com p 341895843 https zhuanlan zhihu com p 75321245 编写最简单的 DRM 应用 主程序 xff1a int main int argc char