Drm 例程2 双dumb buffer显示

2023-11-05

Drm 例程2 双buffer 显示

显示过程中,drm是通过申请framebuffer 填充其中的dumb的buf来显示的,drmModeAddFB对不同的dumb buff拿到的bufid也不一样,

最终使用drmModeSetCrtc来设定参数,使用dumb的bufid来填充相应的buf值

代码

#include <stdio.h>
#include <errno.h>
#include "xf86drmMode.h"
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <string.h>

#define DRM_CARD    "/dev/dri/card0"
#define Chartreuse  0x7FFF00
#define Yellow      0xFFFF00
#define GoldEnrod   0xDAA520

#define check_ptr(ptr) do{ \
    if(ptr == NULL) { \
        printf("ptr is NULL\n"); \
        return -1; \
    } \
} while (0)


#define drm_print(fmt, args...) \
do \
{ \
	printf("func:%s line:%d "#fmt"\n",  __FUNCTION__, __LINE__, ##args); \
}while (0)

typedef struct _buffer_object {
	unsigned int width;
	unsigned int height;
	unsigned int pitch;
	unsigned int handle;
	unsigned int size;
	unsigned int *vaddr;
	unsigned int fb_id;
}buffer_object;


typedef struct  _drm_ctx{
    int fd;    
    buffer_object buf[2];
    unsigned int conector_id;
    unsigned int crtc_id;
    unsigned int encoder_id;
}drm_ctx;

drm_ctx gdrm_var;

static int creat_fb(int fd, buffer_object *bo, uint32_t color)
{
    struct drm_mode_create_dumb creq;
    struct drm_mode_map_dumb mreq;
    int ret;
    uint32_t i;

    creq.width = bo->width;
    creq.height = bo->height;
    creq.bpp = 32;

    ret = ioctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq);
    if(ret != 0)
    {
        drm_print("ioctl creat dumb fail\n");
        return -1;
    }

    bo->pitch = creq.pitch;
    bo->handle = creq.handle;
    bo->size = creq.size;
    drm_print("bo pitch:%d", bo->pitch);
    drmModeAddFB(fd, bo->width, bo->height, 24, 32, bo->pitch, bo->handle, &bo->fb_id);

    mreq.handle = bo->handle;
    ret = ioctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq);
    if(ret != 0)
    {
        drm_print("ioctl mmap dumb fail\n");
        return -1;
    }
        /* perform actual memory mapping */
    bo->vaddr = mmap(0, creq.size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, mreq.offset);
    check_ptr(bo->vaddr);
    //使用crtc驱动connector
    //memset(bo->vaddr, 0xB4, bo->size);
    drm_print("bo size:%d", bo->size);//按照官方doc size=(height * pitch + width) * bpp / 4  跟实际打印出来的值 height * width *4  不大一样
	for (i = 0; i < (bo->size/4); i++)
		bo->vaddr[i] = color;

    return 0;
}

static int destroy_fb(int fd, buffer_object *bo)
{
    int ret;
    struct drm_mode_destroy_dumb dreq;

    drmModeRmFB(fd, bo->fb_id);
    dreq.handle = bo->handle;
    ret = ioctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &dreq);
    if(ret != 0)
    {
        drm_print("ioctl destory dumb fail\n");
        return -1;
    }
    
    munmap(bo->vaddr, bo->size);
}

int main(int argc, char *argv[])
{
    //open card
    drmModeResPtr   resptr;
    drmModeConnectorPtr conptr;

    int ret;
    unsigned int fb;

    gdrm_var.fd = open(DRM_CARD, O_RDWR);
    if(gdrm_var.fd < 0)
    {
        perror("open card fail\n");
        return -1;
    }

    drm_print("fd%d\n", gdrm_var.fd);
    //获取card resource,include crtc connector encoder plane
    resptr = drmModeGetResources(gdrm_var.fd);
    check_ptr(resptr);

    gdrm_var.crtc_id = resptr->crtcs[0];
    gdrm_var.conector_id = resptr->connectors[0];
    drm_print("crtc id:%d conector_id %d", gdrm_var.crtc_id, gdrm_var.conector_id);
    //printf("%s %d crtc_id:%d con_id:%d\n", resptr->count_crtcs, resptr->count_connectors);
    //select which connector used
    conptr = drmModeGetConnector(gdrm_var.fd, gdrm_var.conector_id);
    check_ptr(conptr);
    gdrm_var.buf[0].width = conptr->modes[0].hdisplay;
    gdrm_var.buf[0].height = conptr->modes[0].vdisplay;

    gdrm_var.buf[1].width = conptr->modes[0].hdisplay;
    gdrm_var.buf[1].height = conptr->modes[0].vdisplay;
    drm_print("%d %d %d", gdrm_var.buf[0].width, gdrm_var.buf[0].height, gdrm_var.buf[0].size);
    //create framebuffer, fill dumb buffer
    creat_fb(gdrm_var.fd, &gdrm_var.buf[0], Chartreuse);

    creat_fb(gdrm_var.fd, &gdrm_var.buf[1], GoldEnrod);

    drmModeSetCrtc(gdrm_var.fd, gdrm_var.crtc_id, gdrm_var.buf[0].fb_id,
                   0, 0, &gdrm_var.conector_id, 1, &conptr->modes[0]);

    sleep(2);
    drmModeSetCrtc(gdrm_var.fd, gdrm_var.crtc_id, gdrm_var.buf[1].fb_id,
                   0, 0, &gdrm_var.conector_id, 1, &conptr->modes[0]);
    //destory dumb buffer
    sleep(5);
    destroy_fb(gdrm_var.fd, &gdrm_var.buf[0]);
    destroy_fb(gdrm_var.fd, &gdrm_var.buf[1]);

    drmModeFreeConnector(conptr);
    drmModeFreeResources(resptr);
    close(gdrm_var.fd);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Drm 例程2 双dumb buffer显示 的相关文章

  • Unity3D StartCoroutine 调用一个函数,该函数什么时候返回?

    我知道Unity3D StartCoroutine调用了一个与StartCoroutine在同一线程上运行的函数 但是被调用的函数什么时候返回到原始调用者 我在互联网上查找了一个很好的 Unity3D Coroutine 示例 但找不到完整
  • DispatcherTimer 未按时执行

    我正在使用 c 中的 DispatchTimer 编写一个时钟应用程序 但由于某些原因 我的时钟似乎时不时地跳过 1 秒 例如 52 秒 gt 54 秒 跳过 53 秒 在我看来 计时器并不是每秒都执行一次 DispatcherTimer
  • C 中的变量定义是什么意思[重复]

    这个问题在这里已经有答案了 你们能告诉我 这在 C 中意味着什么吗 define Privileged Data Privileged Data static int dVariable 编译器对变量进行寻址有特殊意义吗 这只是一个宏Pri
  • MVC 重定向到没有控制器的视图

    希望应该是一个简单的 我创建了一个通用错误视图 当整个站点的操作方法内发生异常时 我想显示该视图 我创建了一个部分页面 所有导航都位于其中 因此我不需要在此视图上使用控制器 那么如何从控制器内的操作方法重定向到它 像这样的东西 HttpPo
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 返回 int& 的函数[重复]

    这个问题在这里已经有答案了 我在网上查了一下发现一篇试图解释的文章std move和右值 http thbecker net articles rvalue references section 01 html并发现了一些我实在无法掌握的东
  • 为什么假设 send 可能返回的数据少于在阻塞套接字上传输的请求数据?

    在流套接字上发送数据的标准方法始终是调用 send 并写入一大块数据 检查返回值以查看是否发送了所有数据 然后再次调用 send 直到整个消息被接受 例如 这是一个常见方案的简单示例 int send all int sock unsign
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • 如何不在类中实现接口的功能?

    面试时面试官问了我以下问题 但我不知道这个问题的答案是什么 请帮忙 如果我不想 我必须做什么 在我的类中实现一个函数 在接口中声明为 由我班实施 Edited 我正在使用 NET 和 C 如果有人可以提供 C 示例代码示例 那就太好了 Th
  • `cosf`、`sinf` 等不在 `std` 中 [重复]

    这个问题在这里已经有答案了 根据这里的讨论 我有报告了一个错误 https bugs launchpad net ubuntu source gcc 8 bug 1831385给 Ubuntu 开发者 编译以下示例 C 程序时 includ
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源

随机推荐

  • java拦截通过url访问页面,必须通过登录页面访问目标页面

    在web xml中配置过滤
  • ROS AGV 笔记

    Ubuntu18 04 install of ROS Melodic 1 Installation 1 1 Configure your Ubuntu repositories 1 2 Setup your sources list sud
  • STM32_USART

    1 时钟使能 RCC APB2PeriphClockCmd RCC APB2Periph USART1 RCC APB2Periph GPIOA ENABLE USART1 GPIOA 2 引脚配置 GPIO InitTypeDef GPI
  • 二叉树的层序遍历(广度优先遍历)

    二叉树的层序遍历 Name 二叉树的层序遍历 Copyright Author lkm Date 01 04 22 21 47 include
  • Web开发权威指南笔记(三)

    书 Web开发权威指南 美 Chris Aquino Todd Gandee著 为3rd实战项目Chattrbox练习以及代码整理 全为个人借鉴本书产出 若需要转载请联系通知我 请尊重原创 谢谢 整理了大概8天了 内容比较多 很多重点都整理
  • Eigen: C++开源矩阵计算工具——Eigen的简单用法

    Eigen非常方便矩阵操作 当然它的功能不止如此 由于本人只用到了它的矩阵相关操作 所以这里只给出了它的一些矩阵相关的简单用法 以方便快速入门 矩阵操作在算法研究过程中 非常重要 例如在图像处理中二维高斯拟合求取光斑中心时使用Eigen提供
  • Android优秀开源项目汇总

    UI相关 图片 Android Universal Image Loader com nostra13 universalimageloader 异步加载 缓存 显示图片 ImageLoader com novoda imageloader
  • multipartFile.getOriginalFilename();不能获取原文件名称,也就是含有路径名

    一直在debug 发现只能获取文件名 进去看源代码 翻译过来就是 返回客户端文件系统中的原始文件名 p 这可能包含路径信息 取决于所使用的浏览器 但它通常不会与opera浏览器有关 只是可能包含路径名 所以我试了360浏览器 谷歌 火狐都只
  • 进程和线程的区别和联系

    一 简介 进程 进程是操作系统资源分配的基本单位 进程是指正在运行的程序实例 每个进程都有自己的内存空间 代码 数据和资源 操作系统通过管理进程来控制计算机的资源分配 每个进程都有一个唯一的标识符 称为进程 ID 以便操作系统可以识别和管理
  • Adapter 适配器基础讲解

    Adapter 适配器基础讲解 1 MVC模式的简单理解 在开始学习 Adapter 之前我们要来了解下这个 MVC 模式概念 举个例子 大型的商业程序通常由多人一同开 发完成 比如有人负责操作接口的规划与设计 有人负责程序代码的编写如果要
  • 表情包(图片)自生产——Python爬虫xpath实现

    文章目录 严正声明 爬虫应严格遵守国家的相关法律法规 坚决做一只文明爬虫 前言 一 知识准备 二 功能解析与实现 1 引入库 2 请求准备 3 发起请求 4 数据解析 5 数据保存 6 成果展示 三 普通代码展示 四 封装代码展示 总结 严
  • 核心基础知识1

    图片相关 安卓选择ETC2 8bit 苹果选择ETC PVRTC 4 bit RGBA32 32代表RGBA4个通道总共32位 每一个通道是8位 通常图片的格式有jpg和png jpg代表的是有损压缩无透明 png无损压缩有透明 显示同一张
  • 埋点--Vue前端通过自定义指令实现埋点功能

    需求 项目新版本新功能 需要再新页面添加埋点功能 记录用户的使用情况和使用习惯 因为前端项目使用的是Vue 所以选择使用Vue的自定义指令来实现埋点功能 埋点 主要记录 谁 什么时候 做了什么事情 直接上代码 1 自定义指令 import
  • HTML响应式Web设计

    目录 什么是响应式 Web 设计 创建自己的响应式设计 使用 Bootstrap 什么是响应式 Web 设计 RWD 指的是响应式 Web 设计 Responsive Web Design RWD 能够以可变尺寸传递网页 RWD 对于平板和
  • ARTS挑战打卡第十七周

    Algorithm 一周至少一道算法题 Review 阅读并点评至少一篇英文技术文章 Tip 学习至少一个技术技巧 总结和归纳在日常工作中所遇到的知识点 Share 分享一篇有观点和思考的技术文章 01 Algorthm https lee
  • xp系统开启iis服务器,WindowsXPHome版本安装IIS服务器方法

    首先在 开始 菜单的 运行 中输入 c Windows inf sysoc inf 系统会自动使用记事本打开sysoc inf这个文件 在sysoc inf中找到 Components 这一段 因为是XP简化版 所以里面东西很少 在里面加上
  • Tensorflow学习总结(1):CNN

    简介 CNN 卷积神经网络 是一种特殊的对图像识别的方式 属于非常有效的带有前向反馈的网络 CNN主要用于对二维图像的识别 它的网络结构对平移 比例放缩 倾斜或其他的变形具有高度不变性 因为 每层关注的特征不一样 贴近原图的 关注像素级别的
  • elasticsearch安装和使用

    一 全文检索基础 1 什么是全文检索 将 结构化数据中的 部分信息提取出来 重新组织 使其变得有 定结构 然后对此有 定结构的数 据进 搜索 从 达到搜索相对较快的 的 这部分从 结构化数据中提取出的然后重新组织的信息 我们称之索引 例如
  • 树状dp总结

    树的最长路径 树的最长路径 思路 每次都把每个点看成根节点之后进行向下进行遍历每次求最大 和次大值把他相加 不断进行搜索 include
  • Drm 例程2 双dumb buffer显示

    Drm 例程2 双buffer 显示 显示过程中 drm是通过申请framebuffer 填充其中的dumb的buf来显示的 drmModeAddFB对不同的dumb buff拿到的bufid也不一样 最终使用drmModeSetCrtc来