libdrm编译调试

news/2024/4/29 0:47:06/文章来源:https://blog.csdn.net/tugouxp/article/details/131619250

本文主要介绍libdrm的代码下载、编译和调试的工作。新版本的libdrm不再采用configure && make的方式编译,而是改用meson && ninja编译方式,近些年很多多媒体的开源软件包的构建系统有向后者靠拢的趋势,典型的比如gstream及其各类PLUGIN。

开发环境

LIBDRM下载:

由于使用的是UBUNTU18.4系统,选择其发布周期内的LIBDRM版本2.4.96版。

下载地址https://dri.freedesktop.org/libdrm/libdrm-2.4.96.tar.gz

编译

由于DRM的后端为GPU,而GPU和HOST之间通常以PCI/PCIe接口互联,所以LIBDRM对PCI库有依赖,需要提前安装:

sudo apt install libpciaccess-dev

之后执行如下命令进行配置

./configure --enable-install-test-programs --enable-omap-experimental-api --prefix=/home/zlcao/Workspace/libdrm/install

--enable-install-test-programs目的是编译测试工具,比如modetest工具是调试KMS参数的利器。--enable-omap-experimental-api纯粹为了验证选项,没有其它目的。

如果一切OK,配置结束后会输出编译配置summary:

之后,执行make && make install即可,可以看到,SDK包括测试工具,测试库和库对应的头文件,其结构是一个典型的SDK发布目录的结构。

zlcao@zlcao-Vostro-3268:~/Workspace/libdrm/install$ tree -L 2
.
├── bin
│   ├── drmdevice
│   ├── kms-steal-crtc
│   ├── kmstest
│   ├── kms-universal-planes
│   ├── modeprint
│   ├── modetest
│   ├── proptest
│   └── vbltest
├── include
│   ├── libdrm
│   ├── libkms
│   ├── libsync.h
│   ├── omap
│   ├── xf86drm.h
│   └── xf86drmMode.h
├── lib
│   ├── libdrm_amdgpu.la
│   ├── libdrm_amdgpu.so -> libdrm_amdgpu.so.1.0.0
│   ├── libdrm_amdgpu.so.1 -> libdrm_amdgpu.so.1.0.0
│   ├── libdrm_amdgpu.so.1.0.0
│   ├── libdrm_intel.la
│   ├── libdrm_intel.so -> libdrm_intel.so.1.0.0
│   ├── libdrm_intel.so.1 -> libdrm_intel.so.1.0.0
│   ├── libdrm_intel.so.1.0.0
│   ├── libdrm.la
│   ├── libdrm_nouveau.la
│   ├── libdrm_nouveau.so -> libdrm_nouveau.so.2.0.0
│   ├── libdrm_nouveau.so.2 -> libdrm_nouveau.so.2.0.0
│   ├── libdrm_nouveau.so.2.0.0
│   ├── libdrm_omap.la
│   ├── libdrm_omap.so -> libdrm_omap.so.1.0.0
│   ├── libdrm_omap.so.1 -> libdrm_omap.so.1.0.0
│   ├── libdrm_omap.so.1.0.0
│   ├── libdrm_radeon.la
│   ├── libdrm_radeon.so -> libdrm_radeon.so.1.0.1
│   ├── libdrm_radeon.so.1 -> libdrm_radeon.so.1.0.1
│   ├── libdrm_radeon.so.1.0.1
│   ├── libdrm.so -> libdrm.so.2.4.0
│   ├── libdrm.so.2 -> libdrm.so.2.4.0
│   ├── libdrm.so.2.4.0
│   ├── libkms.la
│   ├── libkms.so -> libkms.so.1.0.0
│   ├── libkms.so.1 -> libkms.so.1.0.0
│   ├── libkms.so.1.0.0
│   └── pkgconfig
└── share├── libdrm└── man10 directories, 39 files

测试命令

在图形终端下,/dev/dri/card0被占用。有些测试程序无法执行,需要chvt切换到字符终端中执行。

drmdevice可以在图形界面下执行,它会枚举DRM设备信息,联合LSPCI命令的输出,可以确定DRM设备的类型,比如下图表示我的DRM设备PCI BDF为:00:02.0,是INTEL I915集成显卡。

zlcao@zlcao-Vostro-3268:~/Workspace/libdrm/install/bin$ ./drmdevice 
--- Checking the number of DRM device available ---
--- Devices reported 1 ---
--- Retrieving devices information (PCI device revision is ignored) ---
device[0]
+-> available_nodes 0x05
+-> nodes
|   +-> nodes[0] /dev/dri/card0
|   +-> nodes[2] /dev/dri/renderD128
+-> bustype 0000
|   +-> pci
|       +-> domain 0000
|       +-> bus    00
|       +-> dev    02
|       +-> func   0
+-> deviceinfo+-> pci+-> vendor_id     8086+-> device_id     5912+-> subvendor_id  1028+-> subdevice_id  0762+-> revision_id   IGNORED--- Opening device node /dev/dri/card0 ---
--- Retrieving device info, for node /dev/dri/card0 ---
device[0]
+-> available_nodes 0x05
+-> nodes
|   +-> nodes[0] /dev/dri/card0
|   +-> nodes[2] /dev/dri/renderD128
+-> bustype 0000
|   +-> pci
|       +-> domain 0000
|       +-> bus    00
|       +-> dev    02
|       +-> func   0
+-> deviceinfo+-> pci+-> vendor_id     8086+-> device_id     5912+-> subvendor_id  1028+-> subdevice_id  0762+-> revision_id   04--- Opening device node /dev/dri/renderD128 ---
--- Retrieving device info, for node /dev/dri/renderD128 ---
device[0]
+-> available_nodes 0x05
+-> nodes
|   +-> nodes[0] /dev/dri/card0
|   +-> nodes[2] /dev/dri/renderD128
+-> bustype 0000
|   +-> pci
|       +-> domain 0000
|       +-> bus    00
|       +-> dev    02
|       +-> func   0
+-> deviceinfo+-> pci+-> vendor_id     8086+-> device_id     5912+-> subvendor_id  1028+-> subdevice_id  0762+-> revision_id   04

modetest:

vbltest查看刷新率:

Linux 获取VSYNC核心原理解读

我们首先要理解几个基础概念,行同步/场同步/行消隐/场消隐,如下所示:

行同步HSYNC:电视信号发送端为了使接收端的行扫描与场扫描规律与其同步,在行扫描正常结束后,向接收机发出一个脉冲信号,表示这一行已经结束,这个脉冲信号就是行同步信号。
场同步VSYNC:电视信号发送端为了使接收端的行扫描与场扫描规律与其同步,在场扫描正常结束后,向接收机发出一个脉冲信号,表示这一场已经结束,这个脉冲信号就是场同步信号。
行消隐HBLANK:指行与行之间的返回过程。而扫描点扫描完一帧后,要从图像的右下角返回到图像的左上角,开始新一帧的扫描,这一时间间隔,叫做行消隐。
场消隐VBLANK:扫描点扫描完一帧后,要从图像的右下角返回到图像的左上角,开始新一帧的扫描,这一时间间隔,叫做垂直消隐,也称场消隐。
使用Linux系统 libdrm库 获取Vsync的核心原理:使用drmWaitVBlank()可以获得场消隐VBlank,可以简单理解为要想获得2个Vsync之间的时间间隔,可以通过获得 场消隐VBlank之间的时间间隔,因为每一次场消隐伴随着场同步信号VSYNC的触发。

有了这个理解,使用drmWaitVBlank方法就可以使用VSYNC信号了,demo源码如下所示:

#include <stdio.h>
#include <xf86drm.h>
#include <fcntl.h>
#include <string.h>
#include <sys/time.h>#define DRM_VBLANK_HIGH_CRTC_SHIFT 1struct timeval tp1, tp2;void onVsync(){long usec1 = 0;gettimeofday(&tp2, NULL);usec1 = 1000000 * (tp2.tv_sec - tp1.tv_sec) + (tp2.tv_usec - tp1.tv_usec);printf("onVsync= %f ms \n",usec1/1000.0f);gettimeofday(&tp1, NULL);
}int main(int argc, char** argv) 
{int ret = 0;drmVBlank vbl;memset(&vbl, 0, sizeof(vbl));vbl.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE);;vbl.request.sequence = 0;//open card0 device pointint fd = open("/dev/dri/card0",O_RDWR);if ( fd<0 ) {printf("failed to open /dev/dri/card0");return -1;}gettimeofday(&tp1, NULL);while (1) {uint32_t high_crtc = (0 << DRM_VBLANK_HIGH_CRTC_SHIFT);vbl.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE | (high_crtc & DRM_VBLANK_HIGH_CRTC_MASK) );vbl.request.sequence = 1;//wait next vsyncret = drmWaitVBlank(fd, &vbl);if (ret != 0) {printf("drmWaitVBlank failed ret=%d\n", ret);return -1;}//vsync callbackonVsync();}return 0;
}

得到VBLANK周期为13.8ms,对应到刷新频率为72,和vbitest结论相符。

查找DRM服务的哪块屏幕?

 使用xrandr命令去看,这时候主要是确定对应的接口类型是 HDMI、DP还是DSI接口。同时也确定对应的数字,比如,我的PC上有DP和HDMI接口,当前连接的是DRM接口,执行xrandr后显示如下:


结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_328284.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

English Learning - L3 作业打卡 Lesson8 Day59 2023.7.4 周二

English Learning - L3 作业打卡 Lesson8 Day59 2023.7.4 周二 引言&#x1f349;句1: I started snowboarding, then I went back to work, then I went back to school.成分划分连读爆破语调 &#x1f349;句2: And just this past February, I won two back to back World C…

视频编码流程 YUV数据编码为H264数据

文章目录 1.视频编码流程2.实战demo3.相关编码知识点讲解1. 参数设置问题:2. 关于av_opt_set3. 关于码流设置 1.视频编码流程 2.实战demo #ifndef MAINBACK_C #define MAINBACK_C #endif // MAINBACK_C #include <stdint.h> #include <stdio.h> #include <stdl…

Go内存分配那些事,就这么简单!

这篇文章主要介绍Go内存分配和Go内存管理&#xff0c;会轻微涉及内存申请和释放&#xff0c;以及Go垃圾回收。 从非常宏观的角度看&#xff0c;Go的内存管理就是下图这个样子&#xff0c;我们今天主要关注其中标红的部分。 本文基于go1.11.2&#xff0c;不同版本Go的内存管理可…

Linux驱动开发:Linux内核启动流程详解

前言&#xff1a;Linux 内核同样作为 Linux 驱动开发的 “三巨头” 之一&#xff0c;Linux 内核的启动流程要比 uboot 复杂的多&#xff0c;涉及到的内容也更多。但秉持着 “知其然知其所以然” 的学习态度&#xff0c;作者将给读者朋友大致的过一遍 Linux 内核的启动流程。(考…

Java csv文件上传下载中的相关转换

目录 一. 需求二. List<Entity>转List<List<String>>2.1 实体类2.2 转换 三. 上传csv文件转List<Map>3.1 csv文件3.2 前台3.3 实体类3.4 转换3.5 效果 一. 需求 &#x1f914;项目中遇到了两个需求 1.查询数据库&#xff0c;得到List<Entity>这…

初阶C语言———操作符详解(2)

hello&#xff0c;我们又见面了&#xff0c;今天我们把操作符这一章节完结&#xff0c;那让我们一起来学习吧 逻辑操作符 &&逻辑与 ||逻辑或 这里我们要区分按位与和按位或还有逻辑与和逻辑或的区分。 1&2----->0 1&&2---->1 1|2----->3 1||2---…

嵌入式_Keil (MDK - ARM) 的调试步骤

目录 1. 编译 调试 2. 复位 全速运行 3. 单步调试 4. 逐步调试 5. 跳出调试 6. 运行到光标处 7. 跳转到暂停行 8. 调试窗口 首先为什么需要在 MDK 中进行程序的调试呢&#xff1f; 在 MDK 中进行程序调试的主要目的是识别和解决程序中的问题和错误。 比如说找到程序中…

【CANopen】周立功轻松入门CANopen笔记

前言 想学习些新东西了&#xff0c;原本想直接学学Ethercat&#xff0c;但是简单看了看对象字典啥的概念一头雾水的&#xff0c;决定先从CANopen开始&#xff0c;Ethercat看着头疼。Etehrcat和CANopen有挺多类似的地方。感谢ZLG的这个入门笔记&#xff0c;我似乎是看懂了些&am…

一、枚举类型——新特性(模式匹配-支配性)

switch 中 case 语句的顺序很重要。如果基类先出现&#xff0c;就会支配任何出现在后面的 case&#xff1a; Dominance.java JDK 17 sealed interface Base { }record Derived() implements Base { }public class Dominance {static String test(Base base) {return switch (ba…

视频行为识别(一)——综述

Deep Neural Networks in Video Human Action Recognition: A Review 本次分享的文章是2023年收录在计算机视觉领域的顶刊“CVPR”&#xff08;级别&#xff1a;视觉类TOP&#xff09;期刊上。该期刊详细信息可关注公众号 AI八倍镜 点击菜单项查询。 论文地址&#xff1a;http…

代码随想录二刷day46 | 动态规划之139.单词拆分

day46 139.单词拆分1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp[i] 139.单词拆分 题目链接 解题思路&#xff1a;单词就是物品&#xff0c;字符串s就是背包&#xff0c;单词能否组成字符串s&#xff0c;就是问物品能不能把背包装满…

第三章 SSD存储介质:闪存 3.4

3.4 闪存数据完整性 可采用以下数据完整性的技术确保用户数据不丢失&#xff1a; &#xff08;1&#xff09;ECC纠错&#xff1b; &#xff08;2&#xff09;RAID数据恢复&#xff1b; &#xff08;3&#xff09;重读&#xff08;Read Retry&#xff09;&#xff1b; &#xff…

vue 进阶---动态组件 插槽 自定义指令

目录 动态组件 如何实现动态组件渲染 使用 keep-alive 保持状态 keep-alive 对应的生命周期函数 keep-alive 的 include 属性和exclude属性 插槽 插槽的基础用法 具名插槽 作用域插槽 自定义指令 自定义指令的分类 私有自定义指令 全局自定义指令 了解 eslint 插件…

免费开源 | 基于SpringBoot的博客系统

介绍 基于springboot后端架构&#xff0c;websocket实现私信&#xff0c;前端采用thymeleafbootstraplayuiRedis 注册使用邮箱验证注册&#xff0c;且验证码存在redis中&#xff0c;所以需要有redis环境 软件架构 springbootwebsocketthymeleafbootstraplayuiRedismysql 8.…

Vue 数据双向绑定

双向数据绑定 : 通过前面学习知道 Vue 是数据驱动的&#xff0c;数据驱动有一个精髓之处是数据双向绑定&#xff0c; 即当数据发生变化的时候&#xff0c;视图也就发生变化&#xff0c;当视图发生变化的时候&#xff0c;数据也会跟着同步变化。&#xff08;就是mvvm数据发生变化…

C#,中国福利彩票《刮刮乐》的数学算法(01)——幸运123

彩票名称&#xff1a;幸运123面值&#xff1a;20元/张最高奖&#xff1a;100万&#xff08;人民币&#xff09;全套款式&#xff1a;2款玩法介绍&#xff1a; 一份好运&#xff0c;二倍快乐&#xff0c;三重惊喜。福彩刮刮乐新游戏“幸运123”&#xff0c;红色的票面上点缀着礼…

spring 详解二 IOC(Bean xml配置及DI)

配置列表 Xml配置 功能描述 <bean id"" class""></bean> Bean的id&#xff0c;配置id会转为Bean名称和不配就是全限定类名 <bean name"" ></bean> Bean的别名配置&#xff0c;存储在Factory的aliasMap中通过别名也…

Qt自定义控件之动画文本

文章目录 前言一、动画文本的效果二、具体实现定义动画对象设置动画时长的实现设置text函数实现绘制代码设置字体函数 三、高级部分操作代码总结 前言 在 Qt 中&#xff0c;自定义控件可以让我们实现丰富的用户界面效果和交互体验。其中&#xff0c;动画文本是一种常见的效果&…

使用 tail -f 实时观测服务器日志输出

在开发阶段, 有 console 端的输出, 总是可以方便实时地看到应用的日志. 可一旦应用部署到服务器上之后呢, 日志被输出到文件中, 在某些情景下需要不停地查看日志文件的输出以定位某些问题, 此时是否还能像开发那样实时查看日志呢? 答案是可以的! 这个命令就是 tail -f . tail…

Git使用详细教程

1. cmd面板的常用命令 clear&#xff1a;清屏cd 文件夹名称----进入文件夹cd … 进入上一级目录(两个点)dir 查看当前目录下的文件和文件夹(全拼:directory)Is 查看当前目录下的文件和文件夹touch 文件名----创建文件echo 内容 > 创建文件名----创建文件并写入内容rm 文件名…