DRM 驱动相关的概念 Objects 在开始编写 DRM 驱动程序之前,我有必要对 DRM 内部的 Objects 进行一番介绍。因为这些 Objects 是 DRM 框架的核心,它们缺一不可。 上图蓝色部分则是对物理硬件的抽象,黄色部分则是对软件的抽象。虚线以上的为 drm_mode_object,虚线以下为 drm_gem_object。 之前曾对这些 objects 做...
所以,对 drm device 进行 mmap 操作时,传进去的 offset 参数并不是真正的内存偏移量,而是一个 gem object 的索引值。通过该索引值,drm 驱动就可以准确定位到当前具体要操作的是哪个 gem object,进而获取到与该 object 相对应的物理 buffer,并对其做真正的 mmap 操作。 那如何知道某个 gem object 的索引值呢?
GEM名称是一个唯一的32位整数,用于引用同一DRM设备中由相同DRM驱动程序创建的单一GEM对象。通过flink操作,可以从GEM句柄获取GEM名称,进而通过IPC机制传递给其他进程。接收进程则可以利用该GEM名称获取本地GEM句柄,实现对共享缓冲区的访问。然而,使用GEM名称进行缓冲区共享存在安全隐患。恶意第三方进程可能通过探测32位...
给driver_features 添加上 DRIVER_GEM 标志位,告诉 DRM Core 该驱动支持 GEM 操作; dumb_create 回调接口用于创建 gem object,并分配物理 buffer。这里直接使用 CMA helper 函数来实现; fb_create 回调接口用于创建 framebuffer object,并绑定 gem objects。这里直接使用 CMA helper 函数实现。 fops 中的 mmap 接口...
1. lbdrm是DRM框架提供的、位于用户空间、操作DRM的库。应用程序调用内核里面的KMS和GEM,访问显示相关的资源。 2. KMS(Kernel Mode Setting) KMS是DRM框架的一个大模块,主要功能是:显示参数及显示控制。 3. GEM(Graphics Execution Manager) GEM负责DRM下的内存管理和...
1. lbdrm是DRM框架提供的、位于用户空间、操作DRM的库。应用程序调用内核里面的KMS和GEM,访问显示相关的资源。 2. KMS(Kernel Mode Setting) KMS是DRM框架的一个大模块,主要功能是:显示参数及显示控制。 3. GEM(Graphics Execution Manager) GEM负责DRM下的内存管理和释放。
GEM主要负责显示buffer的分配和释放,linux内核中使用struct drm_gem_object表示GEM对象,驱动一般需要用私有信息来扩展GEM对象,因此struct drm_gem_object都是嵌入在驱动自定义的GEM结构体内的。 gem object的创建以及初始化步骤如下: 创建一个GEM对象,驱动为自定义GEM对象申请内存; ...
2、DRM驱动框架 2.1 DRM驱动对象介绍 DRM内部的Objects是组成DRM框架的核心,下图中蓝色部分为物理硬件的抽象,棕色部分则为软件的抽象,其中GEM结构体为:drm_gem_object,其余部分位于结构体drm_mode_object中. PS:drm_panel不属于object范畴,只是为了降低LCD驱动与encoder驱动间的耦合,是一堆回调函数集合。
10.1.3. GEM(generic DRM memory-management) 顾名思义,GEM负责对DRM使用的内存(如显存)进行管理,是一个软件抽象。 GEM框架提供的功能包括: 内存分配和释放 命令执行 执行命令时的管理10.2. 驱动简述我们通过简单讲解了DRM驱动的框架,简单地带领大家认识了DRM框架下对显示功能的实现方法。实际的代码细节远比上述给...
.mmap =drm_gem_cma_mmap,\ DRM_GEM_CMA_UNMAPPED_AREA_FOPS \ } #define DRM_GEM_CMA_UNMAPPED_AREA_FOPS \.get_unmapped_area = drm_gem_cma_get_unmapped_area, 特别关注一下drm_ioctl(): drm_ioctl ->[DRM_COMMAND_BASE, DRM_COMMAND_END)是特定驱动的ioctl命令。