libdrm编译调试

news2025/1/11 1:53:14

本文主要介绍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
    └── man

10 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 1
 
struct 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 point
    int 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 vsync
    	ret = drmWaitVBlank(fd, &vbl);
    	if (ret != 0) {
    	    printf("drmWaitVBlank failed ret=%d\n", ret);
    	    return -1;
    	}
        //vsync callback
        onVsync();
    }
    return 0;
}

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

查找DRM服务的哪块屏幕?

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


结束

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

16、SQL注入之查询方式及报错盲注

目录 前言SQL注入报错盲注补充: Access暴力猜解不出的问题? 前言 当进行SQL注入时&#xff0c;有很多注入会出现无回显的情况&#xff0c;其中不回显的原因可能是SQL语句查询方式的问题导致&#xff0c;这个时候我们需要用到相关的报错或盲注进行后续操作&#xff0c;同时作为…

进程间通信的介绍

目录 进程间通信的目的 进程间通信发展 进程间通信分类 进程间通信的分析 进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&a…

PWM+RC 滤波的DAC 输出的数学理论

PWM示意图 PWM 本质上其实就是一种周期一定&#xff0c;占空比可调的方波。典型PWM 波形如下 图所示&#xff1a; PWM分段函数 图中的PWM 波形可以用如下分段函数表示&#xff1a; 函数中&#xff1a;T 是单片机中计数脉冲的基本周期&#xff0c;也就是STM32F4 定时器的计数频率…

Couldn‘t find a tree builder with the features you requested: lxml

这是一个常见于Python爬虫代码的报错。 报错原因&#xff1a;BeautifulSoup的解析方法之一&#xff0c;xml&#xff0c;需要安装好lxml库才行 解决办法&#xff1a;安装 lxml 库即可。 pip install lxml 安装好之后&#xff0c;BeautifulSoup就能正常解析了。 然后&#xff…

RabbitMQ系列(26)--RabbitMQ实现高可用负载均衡

前言&#xff1a;我们以往只能连接一个指定的队列&#xff0c;不能自由地连接其他的队列&#xff0c;当我们连接的那个指定队列宕机了&#xff0c;生产者和消费者都没办法往队列发送消息和消费消息&#xff0c;而且生产者和消费者也不能自动的连接到其他正常运行的队列&#xf…

嵌入式开发--XW09A触摸芯片的使用

XW09A触摸芯片 XW09A是厦门市芯网电子科技有限公司出品的一颗触摸芯片&#xff0c;支持9键多点触摸&#xff0c;I2C接口&#xff0c;带中断引脚。 以下摘抄自芯片手册 极高的灵敏度&#xff0c;可穿透13mm 的玻璃&#xff0c;感应到手指的触摸 超强的抗干扰和ESD 能力,不加任何…

设计模式-迪米特法则

代码世界中类间的耦合关系会直接影响代码可复用性、可读性、可扩展性等。这种耦合关系就如同人之间朋友关系一样&#xff0c;志不同道不合不应相于谋&#xff0c;否则最终只会落得个互相伤害的下场。代码组织时也应如此&#xff0c;应按照一定的原则处理好类之间的关系&#xf…

C++常用库函数 3.数据转换函数

函数名&#xff1a;abs 函数原型&#xff1a;int abs(int n)&#xff1b; 参数&#xff1a;n 整数值。 所需头文件&#xff1a;<cstdlib> 功能&#xff1a;求绝对值。 返回值&#xff1a;返回 n 的绝对值。函数名&#xff1a;atof&#xff0c;atoi&#xff0c;atol …

第42节:cesium 火焰效果(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><!-- :shouldAnimate="true" 添加动画 --><vc-viewer @ready

linux 命令之find

find 命令 1. 作用 命令用于在指定目录下以及其子母路查找文件和目录。 2. 语法 find [path] [expression] 不指定path的默认为当前路径 2.1 常见的参数 -name pattern&#xff1a;按文件名查找&#xff0c;支持使用通配符 * 和 ?。 -type type&#xff1a;按文件类型查…

NVIC的中断挂起寄存器和EXTI的中断挂起寄存器的区别

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;仅个人拙见&#xff0c;若有错误&#xff0c;欢迎大家指正&#xff0…

Spring MVC 程序开发

什么是 Spring MVC&#xff1f; 官⽅对于 Spring MVC 的描述是这样的&#xff1a; Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,”…

数据特征降维 | 核主元分析KPCA数据降维

文章目录 效果一览文章概述部分源码部分源码参考资料效果一览 文章概述 数据特征降维 | 核主元分析KPCA,主要用于数据降维。 部分源码 部分源码 %% 清空环境变量 warning off % 关闭报警信息 close all % 关闭开启的图窗 clear …

SpringBoot(六)SpringBoot项目部署到腾讯云服务器

这篇文章&#xff0c;可以说是干货满满。关注我的同学应该直到&#xff0c;之前我有几篇SpringBoot的文章&#xff0c;介绍了如何搭建本地服务器&#xff08;没看过的同学可以系统地看下我的SpringBoot专栏&#xff0c;保证你会有很多的收获&#xff09;。但我们那都是在本地玩…

CSDN1周年的创作纪念日【个人总结】

机缘 2022年的7月&#xff0c;第一次了解到这个平台。 得知这个平台可以实现以下功能&#xff1a; 例如&#xff1a; 实战项目中的经验分享日常学习过程中的记录通过文章进行技术交流… 收获 其实出发点是我自己整合笔记&#xff0c;顺带佛系分享给大家看&#xff0c;但是好…

在原有J-IM基础上改造,开发记录方便日后学习,主要区别加入mysql持久化,但是不完善、仅供参考

在原有J-IM基础上改造&#xff0c;开发记录方便日后学习&#xff0c;主要区别加入mysql持久化&#xff0c;但是不完善、仅供参考 原站地址 https://gitee.com/xchao/j-im 改造后的地址 https://gitee.com/lbx_1397372495/jim-chat 本地启动测试 1&#xff0c;修改mysql 数…

Windows 安装 RabbitMq 和 Erlang

1.安装Erlang 音乐RabbitMq是基于Erlang开发的&#xff0c;所以先要安装这个环境 下载地址&#xff1a;32位 64位 其他版本自己找 官网 下载完之后无脑安装直接一直下一步 2.配置Erlang环境变量 2.1 新建ERLANG_HOME 把自己的安装的根目录填进去 比如&#xff1a;C:\Progra…

计算机体系结构基础知识介绍之缓存性能的十大进阶优化之小型且简单的一级缓存(二)

缓存是一种高速的存储器&#xff0c;用于存放处理器经常访问的数据和指令。缓存的组织方式有多种&#xff0c;其中一种是按照不同的关联度(associativity)来划分。关联度表示一个缓存块(block)可以放在缓存中的位置数。关联度越高&#xff0c;缓存中可以容纳的不同块的数量越多…

动态规划之62 不同路径(第4道)

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

网络的构成要素【图解TCP/IP(笔记七)】

文章目录 网络的构成要素通信媒介与数据链路网卡中继器网桥/2层交换机路由器/3层交换机4&#xff5e;7层交换机网关各种设备及其对应网络分层概览 网络的构成要素 通信媒介与数据链路 计算机之间通过电缆相互连接。电缆可以分为很多种&#xff0c;包括双绞线电缆、光纤电缆、同…