libdrm移植到arm设备

一、环境资源要求

下载libdrm

Index of /libdrm

这边使用的是2.4.114版本,版本太高对meson版本要求也很高,为了省事用apt安装meson就不用太高版本了,1.x版本虽然使用makefile编译方便但是太老,对应用支持不太好。

https://dri.freedesktop.org/libdrm/libdrm-2.4.114.tar.xz

由于libdrm项目是基于meson构建的,所以需要安装meson

sudo apt install meson

二、代码编译

1、解压并cd到代码目录下 

cd libdrm-2.4.114

2、创建目录

#建立安装目录
mkdir install
#创建编译目录
mkdir build

3、创建cross_file.txt文件

#创建并编写cross_file.txt文件,用于配置交叉编译环境
vi cross_file.txt

在cross_file.txt添加如下配置项

[binaries]
c = 'arm-linux-gnueabihf-gcc'
cpp = 'arm-linux-gnueabihf-g++'
ar = 'arm-linux-gnueabihf-ar'
strip = 'arm-linux-gnueabihf-strip'[host_machine]
system = 'linux'
cpu_family = 'arm'
cpu = 'armv7'
endian = 'little'[build_machine]
system = 'linux'
cpu_family = 'x86_64'
cpu = 'x86_64'
endian = 'little'

4、配置编译选项

# cd到build目录
cd build
# 配置编译选项,根据自己平台将对应平台的false替换为true
meson --prefix=$(pwd)/../install \--cross-file=../cross_file.txt \-D amdgpu=false \       #amd集显平台-D etnaviv=false \      #vivante图芯gpu支持-D exynos=false \       #三星平台-D freedreno=false \    #高通平台-D freedreno-kgsl=false \ #高通平台-D intel=false \        #intel集显平台-D nouveau=false \      #nvdia平台-D omap=false \         #ti平台-D radeon=false \       #amd独显平台-D tegra=false \        #nvdia tegra(switch)平台-D vc4=false \          #博通VC4平台-D libkms=false \       #drm kms库-D man-pages=false \    #man手册-D udev=false \         #udev支持-D valgrind=false \     #内存测试-D cairo-tests=false \  #cairo语言测试-D vmwgfx=false         #VMWare图形驱动支持-D install-test-programs=true \    #安装测试程序,建议安装,便于检测排查问题。

5、编译安装

#编译并安装
ninja && ninja install
#完成后在../install目录可以能得到对应的文件

三、环境测试

1、modetest测试

#modetest 参数
modetest -h  #帮助Query options:#用于查询的参数选项-c      list connectors #列举出所有的connectors-e      list encoders   #列举出所有的encoders   -f      list framebuffers #列举出所有的framebuffers -p      list CRTCs and planes (pipes) #列举出所有的CRTCs和planes Test options:#用于测试的参数选项#-P给CRTC指定plane-P <plane_id>@<crtc_id>:<w>x<h>[+<x>+<y>][*<scale>][@<format>]  set a plane #-s 设置输出模式,选择connector和crtc-s <connector_id>[,<connector_id>][@<crtc_id>]:[#<mode index>]<mode>[-<vrefresh>][@<format>] set a mode -C      test hw cursor-v      test vsynced page flipping-r      set the preferred mode for all connectors-w <obj_id>:<prop_name>:<value> set property-a      use atomic API-F pattern1,pattern2    specify fill patternsGeneric options:#指定打开设备、驱动-d      drop master after mode set-M module       use the given driver-D device       use the given deviceDefault is to dump all info.#例子
#-s <connector_id>[,<connector_id>][@<crtc_id>]:[#<mode index>]<mode>[-<vrefresh>][@<format>]
#-P <plane_id>@<crtc_id>:<w>x<h>[+<x>+<y>][*<scale>][@<format>]  set a plane 
modetest  -s 37@35:1024x768  -P 33@35:1024x768  #运行成功会有屏幕彩块显示
#37是连接器号,通过modetest -c查询
#两个35都是crtc的号,通过modetest -p可以查询到带分辨率的接口crtc号,以及显示分辨率。

2、代码测试

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <xf86drm.h>
#include <xf86drmMode.h>#define WIDTH 800     //修改为屏幕对应分辨率宽度
#define HEIGHT 600    //修改为屏幕对应分辨率高度int main(int argc, char **argv) {int fd;drmModeRes *resources;drmModeConnector *connector;drmModeEncoder *encoder;drmModeCrtc *crtc;uint32_t *framebuffer;uint32_t handle;uint32_t stride;uint32_t size;int ret;// 打开DRM设备fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);if (fd < 0) {perror("Failed to open DRM device");return 1;}// 获取资源resources = drmModeGetResources(fd);if (!resources) {perror("Failed to get DRM resources");close(fd);return 1;}// 查找连接for (int i = 0; i < resources->count_connectors; i++) {connector = drmModeGetConnector(fd, resources->connectors[i]);if (connector->connection == DRM_MODE_CONNECTED && connector->count_modes > 0) {break;}drmModeFreeConnector(connector);}if (!connector) {fprintf(stderr, "No connected connector found\n");drmModeFreeResources(resources);close(fd);return 1;}// 查找编码器encoder = drmModeGetEncoder(fd, connector->encoder_id);if (!encoder) {perror("Failed to get encoder");drmModeFreeConnector(connector);drmModeFreeResources(resources);close(fd);return 1;}// 获取CRTCcrtc = drmModeGetCrtc(fd, encoder->crtc_id);if (!crtc) {perror("Failed to get CRTC");drmModeFreeEncoder(encoder);drmModeFreeConnector(connector);drmModeFreeResources(resources);close(fd);return 1;}// 计算帧缓冲区大小stride = WIDTH * 4; // 假设每个像素4字节(32位颜色)size = stride * HEIGHT;// 创建帧缓冲区ret = drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMMY, &handle);if (ret < 0) {perror("Failed to create dummy buffer");drmModeFreeCrtc(crtc);drmModeFreeEncoder(encoder);drmModeFreeConnector(connector);drmModeFreeResources(resources);close(fd);return 1;}// 映射帧缓冲区到内存framebuffer = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, handle);if (framebuffer == MAP_FAILED) {perror("Failed to map framebuffer");drmModeFreeCrtc(crtc);drmModeFreeEncoder(encoder);drmModeFreeConnector(connector);drmModeFreeResources(resources);close(fd);return 1;}// 填充帧缓冲区for (int y = 0; y < HEIGHT; y++) {for (int x = 0; x < WIDTH; x++) {uint32_t color = (x * 255 / WIDTH) << 16 | (y * 255 / HEIGHT) << 8 | 255;framebuffer[y * WIDTH + x] = color;}}// 设置CRTCret = drmModeSetCrtc(fd, crtc->crtc_id, handle, 0, 0, &connector->connector_id, 1, &connector->modes[0]);if (ret < 0) {perror("Failed to set CRTC");munmap(framebuffer, size);drmModeFreeCrtc(crtc);drmModeFreeEncoder(encoder);drmModeFreeConnector(connector);drmModeFreeResources(resources);close(fd);return 1;}// 等待用户输入printf("Press Enter to exit...\n");getchar();// 恢复原来的CRTCdrmModeSetCrtc(fd, crtc->crtc_id, crtc->buffer_id, crtc->x, crtc->y, &connector->connector_id, 1, &crtc->mode);// 清理资源munmap(framebuffer, size);drmModeFreeCrtc(crtc);drmModeFreeEncoder(encoder);drmModeFreeConnector(connector);drmModeFreeResources(resources);close(fd);return 0;
}

编译代码

gcc -o drm_draw main.c -ldrm# 交叉编译 gcc可替换arm-linux-gnueabihf-gcc, -ldrm前加上drm库路径 -L /path/libdrm/lib/ 以及加上include路径 -I /path/libdrm/include/

 运行代码

sudo ./drm_draw

四、参考文章

DRM框架与libdrm移植-CSDN博客

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

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

相关文章

Win10环境使用ChatBox集成Deep Seek解锁更多玩法

Win10环境使用ChatBox集成Deep Seek解锁更多玩法 前言 之前部署了14b的Deep Seek小模型&#xff0c;已经验证了命令行及接口方式的可行性。但是纯命令行或者PostMan方式调用接口显然不是那么友好&#xff1a; https://lizhiyong.blog.csdn.net/article/details/145505686 纯…

kafka服务端之日志磁盘存储

文章目录 页缓存顺序写零拷贝 Kafka依赖于文件系统&#xff08;更底层地来说就是磁盘&#xff09;来存储和缓存消息 。 那么kafka是如何让自身在使用磁盘存储的情况下达到高性能的&#xff1f;接下来主要从3各方面详细解说。 页缓存 页缓存是操作系统实现的一种主要的磁盘缓存…

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas) 文章目录 计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)摘要Abstract一、Attention U-Net1. 基本思想2. Attention Gate模块3. 软注意力与硬注意力4. 实验…

韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系

韶音科技&#xff1a;消费电子行业售后服务实现数字化转型&#xff0c;重塑客户服务体系 在当今这个科技日新月异的时代&#xff0c;企业之间的竞争早已超越了单纯的产品质量比拼&#xff0c;**售后服务成为了衡量消费电子行业各品牌实力与客户满意度的关键一环。**深圳市韶音…

使用 CloudDM 和钉钉流程化管理数据库变更审批

CloudDM 是一个专为团队协同工作打造的数据库数据管控平台。在管控数据库安全变更的过程中&#xff0c;为提高效率&#xff0c;CloudDM 接入了钉钉&#xff0c;支持实时通知与移动办公&#xff0c;满足广大企业用户的实际需求。 本文将介绍如何使用 CloudDM 和钉钉实现高效的数…

如何在WPS和Word/Excel中直接使用DeepSeek功能

以下是将DeepSeek功能集成到WPS中的详细步骤&#xff0c;无需本地部署模型&#xff0c;直接通过官网连接使用&#xff1a;1. 下载并安装OfficeAI插件 &#xff08;1&#xff09;访问OfficeAI插件下载地址&#xff1a;OfficeAI助手 - 免费办公智能AI助手, AI写作&#xff0c;下载…

程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<7>

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 今天我们一起来学习转移表&#xff0c;回调函数&#xff0c;qsort… 目录 一、转移表1.1 定义与原理1.3…

漏洞分析 Spring Framework路径遍历漏洞(CVE-2024-38816)

漏洞概述 VMware Spring Framework是美国威睿&#xff08;VMware&#xff09;公司的一套开源的Java、JavaEE应用程序框架。该框架可帮助开发人员构建高质量的应用。 近期&#xff0c;监测到Spring Framework在特定条件下&#xff0c;存在目录遍历漏洞&#xff08;网宿评分&am…

笔记:理解借贷相等的公式

强烈推荐非会计人士&#xff0c;快速了解会计看这个系列的视频&#xff0c;其中比较烧脑的“借贷相等”公式&#xff0c;这个视频讲解的不错&#xff1a; 4.小白财务入门-借贷记账法_哔哩哔哩_bilibili 比如这里&#xff0c;钱在银行卡重&#xff0c;所以银行存款就是借方…

【Spring】什么是Spring?

什么是Spring&#xff1f; Spring是一个开源的轻量级框架&#xff0c;是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…

学习笔记:机器学习中的数学原理(一)

1. 集合 集合分为有限集和无限集&#xff1b; 对于有限集&#xff0c;两集合元素数相等即为等势&#xff1b; 对于无限集&#xff0c;两集合元素存在一一映射关系即为等势&#xff1b; 无限集根据是否与正整数集等势分为可数集和不可数集。 2. sigmoid函数&#xff08;也叫…

【信息系统项目管理师-案例真题】2016下半年案例分析答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一【问题1】4 分【问题2】12 分【问题3】3 分【问题4】6 分试题二【问题1】3 分【问题2】4 分【问题3】8 分【问题4】5 分【问题5】5 分试题三【问题1】4 分【问题2】8 分【问题3】5 分【问题4】8 分试题一…

基于javaweb的SpringBoothis智能医院管理系统(源码+文档+部署讲解)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 运行环境开发工具适用功能说明一、项目运行 环境配置&#xff1a; 运行环境 Java≥8、MySQL≥5.7、Node.js≥14 开发工具 后端&…

JS实现灯光闪烁效果

在 JS中&#xff0c;我们可以实现灯光闪烁效果&#xff0c;这里主要用 setInterval 和 clearInterval 两个重要方法。 效果图 源代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>灯闪烁效果<…

7.PPT:“中国梦”学习实践活动【20】

目录 NO1234​ NO5678​ NO9\10\11 NO1234 考生文件夹下创建一个名为“PPT.pptx”的新演示文稿Word素材文档的文字&#xff1a;复制/挪动→“PPT.pptx”的新演示文稿&#xff08;蓝色、黑色、红色&#xff09; 视图→幻灯片母版→重命名&#xff1a;“中国梦母版1”→背景样…

学习笔记十九:K8S生成pod过程

K8S生成pod过程 流程图具体生成过程用户提交 Pod 定义API Server 处理请求调度器分配节点&#xff08;Scheduling&#xff09;目标节点上的 Pod 创建网络配置状态上报与监控控制器管理&#xff08;Controller Manager&#xff09;就绪与服务发现 关键错误场景高级特性 流程图 具…

封装descriptions组件,描述,灵活

效果 1、组件1&#xff0c;dade-descriptions.vue <template><table><tbody><slot></slot></tbody> </table> </template><script> </script><style scoped>table {width: 100%;border-collapse: coll…

21.2.6 字体和边框

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 通过设置Rang.Font对象的几个成员就可以修改字体&#xff0c;设置Range.Borders就可以修改边框样式。 【例 21.6】【项目&#xff…

360手机刷机 360手机解Bootloader 360手机ROOT

360手机刷机 360手机解Bootloader 360手机ROOT 问&#xff1a;360手机已停产&#xff0c;现在和以后&#xff0c;能刷机吗&#xff1f; 答&#xff1a;360手机&#xff0c;是肯定能刷机的 360手机资源下载网站 360手机-360手机刷机RootTwrp 360os.top 360rom.github.io 一、…

链表专题-02

链表专题 /*** 链表的节点* param <E>*/ public class ListNode<E> {public E element;public ListNode<E> next;public ListNode() {}public ListNode(E element) {this.element element;}public ListNode(E element, ListNode<E> next) {this.eleme…