RK3568笔记八: Display子系统

modetest 是由 libdrm 提供的测试程序,可以查询显示设备的特性,进行基本的显示测试,以及设置显示的模式。

我们可以借助该工具来学习 Linux DRM 应用编程,另外为了深入分析 Rockchip DRM driver,有必要先了解一下这个工具的使用方法和内部实现。

一、准本工作

1、开发板:ATK-DLRK3568 开发板

2、环境:ubuntu20.0 正点原子网盘提供的版本

二、modetest编译

本人没自己编译过,编译过程只供参考,正点的板子自带了

编写一个libdrm的测试程序较为复杂,这里我们使用libdrm官方的测试工具来进行测试,我们可以在这里下载源码并进行交叉编译出测试工具,以供在开发板上使用: libdrm .

新版的libdrm使用meson+ninja的构建方式,而不是老版的autotools,没有基础的同学构建新版libdrm会比较痛苦。 建议直接使用我们给大家编译好的测试程序,测试程序位于配套例程 linux_driver/framework_drm/modetest

如果要自己编译libdrm,可以参考下面命令:

git clone https://gitlab.freedesktop.org/mesa/drmsudo apt -y install python3-pip cmake git ninja-buildpython3 -m pip install meson  /*安装之后,重启板卡*/meson . build && ninja -C build

编译之后在build/tests/modetest/下会有modetest程序, 对libdrm测试程序感兴趣的同学,可以下载libdrm源码解压,在其目录/drm/tests/modetest/下,查看modetest.c文件,此为测试程序源码。

三、modetest 使用示例

modetest在bin目录下,板子上电后打开终端进入bin目录
 

cd /bin

1、 查看帮助信息

modetest -h

2、查看组件的信息

modetest -M rockchip

参数说明:

  • -M:用于指定访问 rockchip DRM driver

关键内容:

  • Encoders / Connectors / CRTCs / Planes 的 id,modetest 通过 id 来用于引用这些组件。
  • Connectors 的 modes/props:
    • prop: 任何你想设置的参数,都可以做成 property,是 DRM 驱动中最灵活、最方便的 Mode setting 机制;
    • modes: 显示模式,mode 里包含分辨率/刷新率等显示相关的信息;
  • CRTCs 的 props;
  • Planes 的 formats/props;

3、查看各组件的 id

modetest -M rockchip | cut -f1 | grep -E ^[0-9A-Z]\|id

正点原子的RK3568提供了一路的MIPI DSI 接口,所以测试MIPI

modetest -M rockchip -s 163@115:720x1280

四、最简单DRM(drm-single)

直接上代码,目录根据yolov5的那个程序修改的,替换mian.cc文件后需要添加drm库和头文件。

// Copyright (c) 2021 by Rockchip Electronics Co., Ltd. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License./*-------------------------------------------Includes
-------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <dlfcn.h>
#include <vector>
#include <string>#include "drm_func.h"
#include "rga_func.h"
#include "rknn_api.h"
#include "yolo.h"#include "RgaUtils.h"
#include "im2d.h"
#include "opencv2/core/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include <opencv2/opencv.hpp>
#include "rga.h"
#include <xf86drm.h>
#include <xf86drmMode.h>#define RED         0XFF0000
#define GREEN       0X00FF00
#define BLUE        0X0000FF
#define BLACK       0X000000
#define WHITE       0XFFFFFF
#define BLACK_BLUE  0X123456struct drm_device {uint32_t width;			//显示器的宽的像素点数量uint32_t height;		//显示器的高的像素点数量uint32_t pitch;			//每行占据的字节数uint32_t handle;		//drm_mode_create_dumb的返回句柄uint32_t size;			//显示器占据的总字节数uint32_t *vaddr;		//mmap的首地址uint32_t fb_id;			//创建的framebuffer的id号struct drm_mode_create_dumb create ;	//创建的dumbstruct drm_mode_map_dumb map;			//内存映射结构体
};drmModeConnector *conn;	    //connetor相关的结构体
drmModeRes *res;		    //资源
uint32_t conn_id;           //connetor的id号
uint32_t crtc_id;           //crtc的id号
int fd;					    //文件描述符#define RED 0XFF0000
#define GREEN 0X00FF00
#define BLUE 0X0000FFuint32_t color_table[6] = {RED,GREEN,BLUE,BLACK,WHITE,BLACK_BLUE};uint32_t plane_id[3];	//图层id数组struct drm_device buf;static int drm_create_fb(struct drm_device *bo)
{/* create a dumb-buffer, the pixel format is XRGB888 */bo->create.width = bo->width;bo->create.height = bo->height;bo->create.bpp = 32;/* handle, pitch, size will be returned */drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &bo->create);/* bind the dumb-buffer to an FB object */bo->pitch = bo->create.pitch;bo->size = bo->create.size;bo->handle = bo->create.handle;drmModeAddFB(fd, bo->width, bo->height, 24, 32, bo->pitch,bo->handle, &bo->fb_id);//每行占用字节数,共占用字节数,MAP_DUMB的句柄printf("pitch = %d ,size = %d, handle = %d \n",bo->pitch,bo->size,bo->handle);/* map the dumb-buffer to userspace */bo->map.handle = bo->create.handle;drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &bo->map);bo->vaddr = (uint32_t*)mmap(0, bo->create.size, PROT_READ | PROT_WRITE,MAP_SHARED, fd, bo->map.offset);/* initialize the dumb-buffer with white-color */memset(bo->vaddr, 0xff,bo->size);return 0;
}static void drm_destroy_fb(struct drm_device *bo)
{struct drm_mode_destroy_dumb destroy = {};drmModeRmFB(fd, bo->fb_id);munmap(bo->vaddr, bo->size);destroy.handle = bo->handle;drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy);
}int drm_init()
{//打开drm设备,设备会随设备树的更改而改变,多个设备时,请留一下每个屏幕设备对应的drm设备fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);if(fd < 0){printf("wrong\n");return 0;}//获取drm的信息res = drmModeGetResources(fd);crtc_id = res->crtcs[1];conn_id = res->connectors[1];//打印CRTCS,以及conneter的idprintf("crtc = %d , conneter = %d\n",crtc_id,conn_id);conn = drmModeGetConnector(fd, conn_id);buf.width = conn->modes[0].hdisplay;buf.height = conn->modes[0].vdisplay;//打印屏幕分辨率printf("width = %d , height = %d\n",buf.width,buf.height);//创建framebuffer层drm_create_fb(&buf);//设置CRTCSdrmModeSetCrtc(fd, crtc_id, buf.fb_id,0, 0, &conn_id, 1, &conn->modes[0]);return 0;
}void drm_exit()
{drm_destroy_fb(&buf);drmModeFreeConnector(conn);drmModeFreeResources(res);close(fd);
}int main(int argc, char **argv)
{int i,j;drm_init();sleep(2);printf("display colour\n");//显示三色for(j=0;j<3;j++){for(i =j*buf.width*buf.height/3;i< (j+1)*buf.width*buf.height/3;i++)buf.vaddr[i] = color_table[j];}getchar();printf("getchar\n");drm_exit();exit(0);
}

运行结果

程序需要注意一点。

  //获取drm的信息res = drmModeGetResources(fd);crtc_id = res->crtcs[1];conn_id = res->connectors[1];

接下来,实现采集视频显示。

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

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

相关文章

【JaveWeb教程】(26) Mybatis基础操作(新增、修改、查询、删除) 详细代码示例讲解(最全面)

目录 1. Mybatis基础操作1.1 需求1.2 准备1.3 删除1.3.1 功能实现1.3.2 日志输入1.3.3 预编译SQL1.3.3.1 介绍1.3.3.2 SQL注入1.3.3.3 参数占位符 1.4 新增1.4.1 基本新增1.4.2 主键返回 1.5 更新1.6 查询1.6.1 根据ID查询1.6.2 数据封装1.6.3 条件查询1.6.4 参数名说明 1. Myb…

HCIA——11计算机网络分层结构——OSI/ISO、TCP/IP

学习目标&#xff1a; 参考模型 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本…

SpringBoot教程(十七) | SpringBoot中ApplicationEvent用法

SpringBoot教程(十七) | SpringBoot中ApplicationEvent用法 对不起大家&#xff0c;昨天文章里的告别说早了&#xff0c;这个系列还不能就这么结束。 我们前面的文章中讲解过RabbitMQ的用法&#xff0c;所谓MQ就是一种发布订阅模式的消息模型。在Spring中其实本身也为我们提供…

【上分日记】第380场周赛(数位dp+ KMP + 位运算 + 二分 + 双指针 )

文章目录 前言正文1.3005. 最大频率元素计数2.3007.价值和小于等于 K 的最大数字3.3008. 找出数组中的美丽下标 II 总结尾序 前言 本场周赛&#xff0c;博主也只写出两道题(前两道, hhh菜鸡勿喷)&#xff0c;第三道涉及位运算 &#xff0c;数位dp&#xff0c;第四道涉及KMP。 下…

江科大STM32 下

目录 ADC数模转换器DMA直接存储器存取USART串口9-2 串口发送接受9-3 串口收发HEX数据包 I2C(mpu6050陀螺仪和加速度计)SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件读写W25Q64 BKP、RTC11.0 Unix时间戳11.1 读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR1…

[Linux 进程(四)] 再谈环境变量,程序地址空间初识

文章目录 1、前言2、环境变量2.1 main函数第三个参数 -- 环境参数表2.2 本地环境变量和env中的环境变量2.3 配置文件与环境变量的全局性2.4 内建命令与常规命令2.5 环境变量相关的命令 3、程序地址空间 1、前言 上一篇我们讲了环境变量&#xff0c;如果有不明白的先读一下上一…

【Kotlin】协程的字节码原理

前言 协程是Koltin语言最重要的特性之一&#xff0c;也是最难理解的特性。网上关于kotlin协程的描述也是五花八门&#xff0c;有人说它是轻量级线程&#xff0c;有人说它是无阻塞式挂起&#xff0c;有人说它是一个异步框架等等&#xff0c;众说纷芸。甚至还有人出了书籍专门介…

LabVIEW编码器自动校准系统

简介 在工作中&#xff0c;精确的角度测量和校准对于保持设备精度至关重要。开发了一套自动化角度编码器校准系统&#xff0c;利用了LabVIEW的强大功能。该系统以全圆连续角度标准装置为基础&#xff0c;配合二维导轨装夹系统&#xff0c;实现了空心轴角度编码器的高效自动校…

SQL Server 数据类型

文章目录 一、文本类型&#xff08;字母、符号或数字字符的组合&#xff09;二、整数类型三、精确数字类型四、近似数字&#xff08;浮点&#xff09;类型五、日期类型六、货币类型七、位类型八、二进制类型 一、文本类型&#xff08;字母、符号或数字字符的组合&#xff09; 在…

【FPGA Modsim】数字时钟

实验题目&#xff1a; 数字时钟设计 实验目的&#xff1a; 掌握数字时钟的工作原理&#xff1b;掌握使用数字逻辑设计集成开发环境分模块设计数字时钟的方法。 实验内容&#xff1a; 1、创建一个数字时钟工程…

【开发板资料】ESP32-S2-MINI-1开发板(源地工作室开发板)

最近买的开发板实在是太多了&#xff0c;一个一个盘算一下。 开发板为源地工作室售卖的源地ESP32-S2核心板&#xff0c;兼容ESP32-S2-DevKitM-1。 ESP32-S2-DevKitM-1 资料 引脚分布&#xff1a; 来源&#xff1a;ESP32-S2-DevKitM-1(U) - ESP32-S2 - — ESP-IDF Programmin…

第二百六十九回

文章目录 概念介绍设置方法示例代码内容总结 我们在上一章回中介绍了Card Widget相关的内容&#xff0c;本章回中将介绍国际化设置.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的国际化设置是指在App设置相关操作&#xff0c;这样可以让不同国家的…