上节讲到显示处理器会将一块含有图像数据的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);
}

此函数的目的有两个

  1. 计算patch,返回用户
  2. 创建对象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有两个作用

  1. 创建drm_gem_cma_object对象并初始化其中的drm_gem_object
  2. 使用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相关推荐

  1. DRM驱动(六)之atomic_check

    上节聊到应用传下来的参数均被存到对应的state.为了使驱动的容错能力比较强,在更新到硬件寄存器之前还需要进行一系列的参数检查,比如要显示图像的大小是否会超过支持分辨率,如果超过了显示的硬件可能会异常 ...

  2. DRM框架(vkms)分析(9)----drm驱动创建fbdevice分析(以rockchip_drm_drv为例)

    本文主要介绍DRM框架里的fbdev兼容逻辑 一 framebuffer框架简单介绍 framebuffer框架下fbdev的注册主要三步步: (1)创建fbdev操作函数,以rockchip为例: ...

  3. 基于STM32MP157的GPU编程之DRM驱动调试

    linux系统GPU编程之DRM编程 背景: framebuffer大家都知道哈,打开/dev/fb0设备节点,然后开辟一段内存(即显存),再mmap,在吧图形数据填充到这段显存里面.怎么填,比如QT ...

  4. DRM驱动代码分析:图层参数更新

    前言: 无业居家,闭门造车.非常欢迎大家帮忙指正. 有些代码流程是看代码分析的,没有去验证是否正确 我对DRM框架的很多东西都不了解,所以有些地方会比较生硬.熟悉学习需要时间,文章一直堆在草稿箱可能会 ...

  5. fb驱动安装linux系统,drm 驱动是如何创建 fb device 的

    drm 驱动是如何创建 fb device 的 什么是 drm? drm 是一个 Linux 内核的显示系统驱动框架,区别于另外一个 DRM数字版权保护 drm 是一个管理 GPU 的显示框架 在内核 ...

  6. DRM驱动(二)之DRM驱动模块简介

    上节在<显示处理器介绍>中阐述了显示处理器的大致功能以及要配置的参数:本节将介绍一下DRM驱动中的模块与显示处理器的关系. 做过显示的都知道,目前大多数厂商已经抛弃fb框架,使用drm驱动 ...

  7. DRM驱动(五)之drm_atomic_state

    上节讲到<DRM驱动(四)之ADD_FB>调用drmModeAddFB创建drm_framebuffer.然后通过 drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB ...

  8. 《DRM 专栏》| 彻底入门 DRM 驱动

    https://cloud.tencent.com/developer/article/2021477 前面的 DRM 应用程序系列文章中,我们学习了如何使用 libdrm 接口编写 DRM 应用程序 ...

  9. DRM驱动(一)之显示处理器介绍

    显示处理器是什么 将在内存中的图像数据,转化为电信号送到显示设备称为显示控制器,比如早期的LCDC.后面进行了拓展,可以处理一些简单的图像,比如缩放.旋转.合成等,如瑞芯的vop,高通的sde称为显示 ...

最新文章

  1. vista——最恰当的中文译名应该是“喂死它”
  2. 一个不错的js制作的右键菜单
  3. vim的巧用---对比操作
  4. vue 中$index $key 已移除
  5. abp的权限与导航菜单的关系
  6. login.html id=9453,SN100C Sublizenzierung und Aufnahme in die ISO 9453
  7. Upload LABS Pass-5
  8. swipe.js文档及用法
  9. [论文阅读] Large Scale Incremental Learning
  10. 深度学习中的Precision和Recall,AP,mAP
  11. python 输出语句
  12. ASP.NET编程总结
  13. 卸载ps显示无法连接adobe服务器,PS还在无法安装?无法卸载?通通搞定!
  14. 测试开发进阶——常用中间件概念——线程与线程池理解
  15. 怎么给表格加一列序号_excel表格怎么添加序号
  16. zabbix + nexmo = 电话告警
  17. ajax如何传递josn数据,jq之ajax以及json数据传递
  18. 用python画动态皮卡丘_如何利用python绘制可爱皮卡丘?
  19. python计算十年平均录取率_如何在Python中使用Pandas计算多年平均值
  20. Android 天气APP(十三)仿微信弹窗(右上角加号点击弹窗效果)、自定义背景图片、UI优化调整

热门文章

  1. 长春理工大学成人高考大专报名条件
  2. 新手小白想要成为软件测试工程师,必须要学会的这些基础知识!
  3. Node.js 单元测试:我要写测试 - Mocha - Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率
  4. 鸿蒙系统如何开启快捷方式,鸿蒙系统功能介绍-华为鸿蒙系统功能详细介绍 - 系统家园...
  5. 下拉菜单Spinner用法
  6. 计算机组成原理相关话题,“计算机组成原理”教学改革研究
  7. 计算机专业研究生阶段有几大研究方向可以选择
  8. 身份证读取设备开发解决方案:2、Android下通过usb转串口读取身份证信息
  9. 目前主流微型计算机显卡总线接口是,江苏省2011年普通高校对口单招文化统考计算机专业综合理论试卷B...
  10. android底层优化什么意思,华为所谓的“优化”到底是什么意思 看完这段你就明白...