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博客
相关文章:
libdrm移植到arm设备
一、环境资源要求 下载libdrm Index of /libdrm 这边使用的是2.4.114版本,版本太高对meson版本要求也很高,为了省事用apt安装meson就不用太高版本了,1.x版本虽然使用makefile编译方便但是太老,对应用支持不太好。 https://dri…...
自定义序列化数据类型
目录 1. WritableComparable1.1 Writable1.2 Comparable1.3 IntWritable 2. 自定义序列化数据类型RectangleWritable3. 矩形面积计算3.1 Map3.2 Reduce 4. 代码和结果4.1 pom.xml中依赖配置4.2 工具类util4.3 矩形面积计算4.4 结果 参考 本文引用的Apache Hadoop源代码基于Apac…...
【Linux网络编程】:URL(encode),HTTP协议,telnet工具
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux网络编程笔记: https://mp.csdn…...
C语言基础系列【3】VSCode使用
前面我们提到过VSCode有多么的好用,本文主要介绍如何使用VSCode编译运行C语言代码。 安装 首先去官网(https://code.visualstudio.com/)下载安装包,点击Download for Windows 获取安装包后,一路点击Next就可以。 配…...
学前端框架之前,你需要先理解 MVC
MVC 软件架构设计模式鼎鼎大名,相信你已经听说过了,但你确定自己已经完全理解到 MVC 的精髓了吗? 如果你是新同学,没听过 MVC,那可以到网上搜一些文章来看看,不过你要有心理准备,那些文章大多都…...
Mysql:数据库
Mysql 一、数据库概念?二、MySQL架构三、SQL语句分类四、数据库操作4.1 数据库创建4.2 数据库字符集和校验规则4.3 数据库修改4.4 数据库删除4.4 数据库备份和恢复其他 五、表操作5.1 创建表5.2 修改表5.3 删除表 六、表的增删改查6.1 Create(创建):数据新增1&#…...
python的函数介绍
一.定义和调用函数 1.定义函数 在 Python 中,使用 def 关键字来定义一个函数。函数可以包含参数,也可以包含返回值 基本语法 def function_name(parameters):"""docstring"""# Function bodyreturn resultdef greet(n…...
要完成使用MLflow比较模型运行、选择模型并将其部署到REST API的教程
要完成使用MLflow比较模型运行、选择模型并将其部署到REST API的教程,请按照以下有序步骤操作: 设置环境 导出MLflow跟踪URI:设置环境变量以指向您的MLflow跟踪服务。export MLFLOW_TRACKING_URIyour-organizations-MLflow-server-url 加载数…...
Windows Docker笔记-简介摘录
Docker是一个开源的容器化平台,可以帮助开发人员将应用程序与其依赖项打包在一个独立的容器中,然后在任何安装的Docker的环境中快速、可靠地运行。 几个基本概念和优势: 容器:容器是一个轻量级、独立的运行环境,包含了…...
MVC 文件夹:架构之美与实际应用
MVC 文件夹:架构之美与实际应用 引言 MVC(Model-View-Controller)是一种设计模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种架构模式不仅提高了代码的可维护性和可扩展性,而且使得开发流程更加清晰。本文将深入探讨MVC文…...
AI透明化与全球政治格局的发展:如何避免AI被人为操控
在现代社会,人工智能(AI)已经逐渐渗透到我们的日常生活中,尤其是在社交平台和信息传播领域。虽然AI可以极大地推动社会发展,但也潜藏着被恶意操控的风险。最令人担忧的是,某些势力可能通过操控AI来操控公众…...
ubuntu 网络管理--wpa_supplicant、udhcpc
ubuntu 网络管理--wpa_supplicant 1 介绍wpa_supplicant 无线认证wpa_passphrase 配置工具 NetworkManager 网络管理udhcpc 与 dhclient对比dhclient概述主要功能 udhcpc概述主要功能 2 联系依赖关系配置文件 3 区别4 如何选择5 示例使用 wpa_supplicant 手动连接无线网络使用 …...
熟练掌握Http协议
目录 基本概念请求数据Get请求方式和Post请求方式 响应数据响应状态码 基本概念 Http协议全称超文本传输协议(HyperText Transfer Protocol),是网络通信中应用层的协议,规定了浏览器和web服务器数据传输的格式和规则 Http应用层协议具有以下特点&#…...
C++的 I/O 流
本文把复杂的基类和派生类的作用和关系捋出来,具体的接口请参考相关文档 C的 I/O 流相关的类,继承关系如下图所示 https://zh.cppreference.com/w/cpp/io I / O 的概念:内存和外设进行数据交互称为 I / O ,例如:把数…...
寒假刷题Day22
一、2570. 合并两个二维数组 - 求和法 class Solution { public:vector<vector<int>> mergeArrays(vector<vector<int>>& nums1, vector<vector<int>>& nums2) {int i 0, j 0, n1 nums1.size(), n2 nums2.size();int tmp 0;…...
【PDF多区域识别】如何批量PDF指定多个区域识别改名,基于Windows自带的UWP的文字识别实现方案
海关在对进口货物进行查验时,需要核对报关单上的各项信息。对报关单 PDF 批量指定区域识别改名后,海关工作人员可以更高效地从文件名中获取关键信息,如货物来源地、申报价值等。例如文件名 “[原产国]_[申报价值].pdf”,有助于海关快速筛选重点查验对象,提高查验效率和监管…...
【大数据技术】本机PyCharm远程连接虚拟机Python
本机PyCharm远程连接虚拟机Python 注意:本文需要使用PyCharm专业版。 pycharm-professional-2024.1.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本地PyCharm远程连接虚拟机,运行Python脚本,提高编程效率。 注意: …...
Windows图形界面(GUI)-QT-C/C++ - Qt Combo Box
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 一、概述 1.1 基本概念 1.2 应用场景对比 二、核心属性详解 2.1 行为控制 2.2 显示配置 三、数据操作与访问 3.1 基础数据管理 3.2 高级数据访问 四、用户交互处理 4.1 信号处…...
数字化转型:概念性名词浅谈(第四讲)
大家好,本篇文章是在新年之际写的,所以在这里先给大家拜个年。 今天要介绍的名词为ETL: ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transfor…...
标题:市场波动中的价格趋势分析与策略优化
在市场投资中,价格的波动不仅是常态,更是影响投资决策的关键因素。市场价格的变化受多种因素影响,包括供需关系、政策调整、国际市场动态等。如何理解价格走势,并在其中寻找合适的交易机会,是投资者需要长期研究的课题…...
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)
目录 1 -> List 1.1 -> 创建List组件 1.2 -> 添加滚动条 1.3 -> 添加侧边索引栏 1.4 -> 实现列表折叠和展开 1.5 -> 场景示例 2 -> dialog 2.1 -> 创建Dialog组件 2.2 -> 设置弹窗响应 2.3 -> 场景示例 3 -> form 3.1 -> 创建…...
Linux:文件系统(软硬链接)
目录 inode ext2文件系统 Block Group 超级块(Super Block) GDT(Group Descriptor Table) 块位图(Block Bitmap) inode位图(Inode Bitmap) i节点表(inode Tabl…...
深度学习系列--01.入门
一.深度学习概念 深度学习(Deep Learning)是机器学习的分支,是指使用多层的神经网络进行机器学习的一种手法抖音百科。它学习样本数据的内在规律和表示层次,最终目标是让机器能够像人一样具有分析学习能力,能够识别文字…...
如何抓取酒店列表: 揭开秘密
搜索酒店列表是一种强大的工具,可以从各种在线资源中收集有关住宿、价格和可用性的综合数据。无论您是要比较价格、分析市场趋势,还是要创建个性化的旅行计划,搜索都能让您有效地汇编所需的信息。在本文中,我们将介绍如何搜索酒店…...
深度剖析 C++17 中的 std::byte:解锁字节级编程新境界
文章目录 一、引入背景二、基本定义三、特性详解不可隐式转换为整型显式转换为unsigned char位运算支持字面量支持四、使用场景内存操作数据序列化与反序列化网络通信文件读写操作五、与其他数据类型的交互与字符类型的交互与整数类型的交互与指针类型的交互六、注意事项避免混…...
【多线程】线程池核心数到底如何配置?
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 前置回顾2. 动态线程池2.1 JMX 的介绍2.1.1 MBeans 介绍 2.2 使用 JMX jconsole 实现动态修改线程池2.2.…...
三维空间全局光照 | 及各种扫盲
Lecture 6 SH for diffuse transport Lecture 7关于 SH for glossy transport 三维空间全局光照 diffuse case和glossy case的区别 在Lambertian模型中,BRDF是一个常数 diffuse case 跟outgoing point无关 glossy case 跟outgoing point有关 (Gloss…...
通过C/C++编程语言实现“数据结构”课程中的链表
引言 链表(Linked List)是数据结构中最基础且最重要的线性存储结构之一。与数组的连续内存分配不同,链表通过指针将分散的内存块串联起来,具有动态扩展和高效插入/删除的特性。本文将以C/C++语言为例,从底层原理到代码实现,手把手教你构建完整的链表结构,并深入探讨其应…...
Polardb三节点集群部署安装--附虚拟机
1. 架构 PolarDB-X 采用 Shared-nothing 与存储计算分离架构进行设计,系统由4个核心组件组成。 计算节点(CN, Compute Node) 计算节点是系统的入口,采用无状态设计,包括 SQL 解析器、优化器、执行器等模块。负责数据…...
java s7接收Byte字节,接收word转16位二进制
1图: 2.图: try {List list getNameList();//接收base64S7Connector s7Connector S7ConnectorFactory.buildTCPConnector().withHost("192.168.46.52").withPort(102).withTimeout(1000) //连接超时时间.withRack(0).withSlot(3).build()…...
