DRM驱动(三)之CREATE_DUMB
上节讲到显示处理器会将一块含有图像数据的memory进行处理后送到下一级。后面几节我会根据龙哥的《最简单的DRM应用程序》一步一步分析用户调用的接口在drm驱动中有怎么样的处理。
DRM驱动的显存由GEM(Graphics execution management)管理。
我会根据我们如何创建一个drm的buf呢,或者你已经知道可以使用
drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create)
可以为显示创建buff,但此函数在内核又做了什么呢?下面一起学习一下内核如何为应用创建显存。
user space
创建显示buf需要三个参数
- width //图像宽度
- height //图像高度
- bpp //每个像素占用bit数
将以上参数放入数据结构struct drm_mode_create_dumb create中,并作为参数调用drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &create)后内核返回对应的handle赋值给handle,patch给用户使用;至于为什么会返回handle,后面介绍kernel部分的时候再说。
kernel space
在drm_ioctl.c中搜索DRM_IOCTL_MODE_CREATE_DUMB可知会调用drm_mode_create_dumb_ioctl
而此函数会调用drm_driver中注册的dev->driver->dumb_create(file_priv, dev, args)。
为了方便大家理解,拿出来了imx的部分代码:
此回调函数可以由厂商根据需要自己实现,这里采用默认的创建dump buf函数。
int drm_gem_cma_dumb_create(struct drm_file *file_priv,struct drm_device *drm, struct drm_mode_create_dumb *args)
{struct drm_gem_cma_object *cma_obj;args->pitch = DIV_ROUND_UP(args->width * args->bpp, 8);args->size = args->pitch * args->height;cma_obj = drm_gem_cma_create_with_handle(file_priv, drm, args->size, &args->handle);return PTR_ERR_OR_ZERO(cma_obj);
}
此函数的目的有两个
- 计算patch,返回用户
- 创建对象drm_gem_cma_object,因为其中包括分配内存的物理地址和虚拟地址;还包含一个重要的结构drm_gem_object
static struct drm_gem_cma_object *
drm_gem_cma_create_with_handle(struct drm_file *file_priv,struct drm_device *drm, size_t size,uint32_t *handle)
{struct drm_gem_cma_object *cma_obj;struct drm_gem_object *gem_obj;int ret;cma_obj = drm_gem_cma_create(drm, size);gem_obj = &cma_obj->base;ret = drm_gem_handle_create(file_priv, gem_obj, handle);return cma_obj;
}
以上代码删除了错误处理
drm_gem_cma_create有两个作用
- 创建drm_gem_cma_object对象并初始化其中的drm_gem_object
- 使用dma_alloc_wc分配内存并将物理地址存入paddr,虚拟地址存入vaddr
struct drm_gem_cma_object *drm_gem_cma_create(struct drm_device *drm,size_t size)
{struct drm_gem_cma_object *cma_obj;size = round_up(size, PAGE_SIZE);cma_obj = __drm_gem_cma_create(drm, size);if (IS_ERR(cma_obj))return cma_obj;cma_obj->vaddr = dma_alloc_wc(drm->dev, size, &cma_obj->paddr,GFP_KERNEL | __GFP_NOWARN);return cma_obj;
}
drm_gem_handle_create主要使用idr_alloc将drm_gem_object对象添加到file_priv->object_idr,并返回handle。
idr_alloc:是为了使用一个id与一个obj绑定。这样就可以通过id找到对应obj。这里将handle与分配的gem_object进行绑定,后面通过handle可以找到gem_object进而找到cma_object获取到物理地址或者虚拟地址
drm_gem_handle_create->drm_gem_handle_create_tail
int drm_gem_handle_create_tail(struct drm_file *file_priv,struct drm_gem_object *obj,u32 *handlep)
{struct drm_device *dev = obj->dev;u32 handle;int ret;idr_preload(GFP_KERNEL);ret = idr_alloc(&file_priv->object_idr, obj, 1, 0, GFP_NOWAIT);idr_preload_end();handle = ret;ret = drm_vma_node_allow(&obj->vma_node, file_priv);if (ret)goto err_remove;if (dev->driver->gem_open_object) {ret = dev->driver->gem_open_object(obj, file_priv);if (ret)goto err_revoke;}*handlep = handle;return 0;
}
到这里就完成了显示内存的获取。返回的handle和patch将在后面用到。
我也画了一个流程图,有需要的可以自取https://gitee.com/chaochao-feng/drm_driver
DRM驱动(三)之CREATE_DUMB相关推荐
- DRM驱动(六)之atomic_check
上节聊到应用传下来的参数均被存到对应的state.为了使驱动的容错能力比较强,在更新到硬件寄存器之前还需要进行一系列的参数检查,比如要显示图像的大小是否会超过支持分辨率,如果超过了显示的硬件可能会异常 ...
- DRM框架(vkms)分析(9)----drm驱动创建fbdevice分析(以rockchip_drm_drv为例)
本文主要介绍DRM框架里的fbdev兼容逻辑 一 framebuffer框架简单介绍 framebuffer框架下fbdev的注册主要三步步: (1)创建fbdev操作函数,以rockchip为例: ...
- 基于STM32MP157的GPU编程之DRM驱动调试
linux系统GPU编程之DRM编程 背景: framebuffer大家都知道哈,打开/dev/fb0设备节点,然后开辟一段内存(即显存),再mmap,在吧图形数据填充到这段显存里面.怎么填,比如QT ...
- DRM驱动代码分析:图层参数更新
前言: 无业居家,闭门造车.非常欢迎大家帮忙指正. 有些代码流程是看代码分析的,没有去验证是否正确 我对DRM框架的很多东西都不了解,所以有些地方会比较生硬.熟悉学习需要时间,文章一直堆在草稿箱可能会 ...
- fb驱动安装linux系统,drm 驱动是如何创建 fb device 的
drm 驱动是如何创建 fb device 的 什么是 drm? drm 是一个 Linux 内核的显示系统驱动框架,区别于另外一个 DRM数字版权保护 drm 是一个管理 GPU 的显示框架 在内核 ...
- DRM驱动(二)之DRM驱动模块简介
上节在<显示处理器介绍>中阐述了显示处理器的大致功能以及要配置的参数:本节将介绍一下DRM驱动中的模块与显示处理器的关系. 做过显示的都知道,目前大多数厂商已经抛弃fb框架,使用drm驱动 ...
- DRM驱动(五)之drm_atomic_state
上节讲到<DRM驱动(四)之ADD_FB>调用drmModeAddFB创建drm_framebuffer.然后通过 drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB ...
- 《DRM 专栏》| 彻底入门 DRM 驱动
https://cloud.tencent.com/developer/article/2021477 前面的 DRM 应用程序系列文章中,我们学习了如何使用 libdrm 接口编写 DRM 应用程序 ...
- DRM驱动(一)之显示处理器介绍
显示处理器是什么 将在内存中的图像数据,转化为电信号送到显示设备称为显示控制器,比如早期的LCDC.后面进行了拓展,可以处理一些简单的图像,比如缩放.旋转.合成等,如瑞芯的vop,高通的sde称为显示 ...
最新文章
- vista——最恰当的中文译名应该是“喂死它”
- 一个不错的js制作的右键菜单
- vim的巧用---对比操作
- vue 中$index $key 已移除
- abp的权限与导航菜单的关系
- login.html id=9453,SN100C Sublizenzierung und Aufnahme in die ISO 9453
- Upload LABS Pass-5
- swipe.js文档及用法
- [论文阅读] Large Scale Incremental Learning
- 深度学习中的Precision和Recall,AP,mAP
- python 输出语句
- ASP.NET编程总结
- 卸载ps显示无法连接adobe服务器,PS还在无法安装?无法卸载?通通搞定!
- 测试开发进阶——常用中间件概念——线程与线程池理解
- 怎么给表格加一列序号_excel表格怎么添加序号
- zabbix + nexmo = 电话告警
- ajax如何传递josn数据,jq之ajax以及json数据传递
- 用python画动态皮卡丘_如何利用python绘制可爱皮卡丘?
- python计算十年平均录取率_如何在Python中使用Pandas计算多年平均值
- Android 天气APP(十三)仿微信弹窗(右上角加号点击弹窗效果)、自定义背景图片、UI优化调整
热门文章
- 长春理工大学成人高考大专报名条件
- 新手小白想要成为软件测试工程师,必须要学会的这些基础知识!
- Node.js 单元测试:我要写测试 - Mocha - Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率
- 鸿蒙系统如何开启快捷方式,鸿蒙系统功能介绍-华为鸿蒙系统功能详细介绍 - 系统家园...
- 下拉菜单Spinner用法
- 计算机组成原理相关话题,“计算机组成原理”教学改革研究
- 计算机专业研究生阶段有几大研究方向可以选择
- 身份证读取设备开发解决方案:2、Android下通过usb转串口读取身份证信息
- 目前主流微型计算机显卡总线接口是,江苏省2011年普通高校对口单招文化统考计算机专业综合理论试卷B...
- android底层优化什么意思,华为所谓的“优化”到底是什么意思 看完这段你就明白...