我所理解的DRM显示框架

什么是DRM:

DRM全称是DirectRenderingManager,是linux主流的一种显示框架,支持多图层合成,为用户图层提供统一的API(libdrm),来访问GPU,实现统一管理。它是为了解决多个程序对video card访问协同资源使用而产生的。DRM可以简单的分成三个模块:

  • libdrm:它是一个库,向上层提供通用的 API,是对底层各种 ioctl 的接口进行封装,用来进行图像显示和图像处理。 当然用 drm 的 ioctl 或者是用 framebuffer 来操作显示图像也可以。
  • GEM:内存管理,主要负责显示buffer的分配和释放、显存的共享和处理CPU、GPU内存同步
  • KMS:Kernel Mode Setting,用于更新画面和参数的设置,完成显卡的配置,和对硬件gpu操作进行了一层接口的封装。可以抽象为:Framebuffer、CRTC、Plane、Encoder、Connector等模块。

DRM框架图:

KMS框架组成:

  • Framebuffer:一块内存区域,用于存储显示的图像数据,驱动和应用层都可以访问,并且保存分辨率、色彩模式(yuv、rgb)等信息。
  • Crtc:显示控制,如用于display timings,resolution等配置,扫描读取Framebuffer的数据,在叠加Plane的内容传输给 Encoder。在vop(Video Output Processor)里,也就是lcdc控制器。
  • Plane:和Framebuffer一样是一块内存,是一块硬件图像层
显示 DRM 框架中添加属性通常涉及对内核模块的修改,以支持新的硬件特性或用户空间接口。以下是实现这一目标的一般步骤: ### 1. 理解 DRM 属性机制 DRM 属性(property)用于描述和控制显示对象(如 CRTC、Plane、Connector 等)的各种特性。属性可以是静态的(如最大分辨率)或动态的(如亮度、对比度)。DRM 提供了 `drm_property_create` 和相关函数来创建和管理属性。 ### 2. 定义新的属性 在内核模块中定义新的属性时,需要选择合适的属性类型。常见的属性类型包括: - `DRM_MODE_PROP_RANGE`:表示一个整数范围。 - `DRM_MODE_PROP_ENUM`:表示一个枚举值。 - `DRM_MODE_PROP_OBJECT`:表示一个 DRM 对象引用。 - `DRM_MODE_PROP_BITMASK`:表示一个位掩码。 ```c struct drm_property *my_property; my_property = drm_property_create(dev, DRM_MODE_PROP_RANGE, "my_property", 0); if (!my_property) return -ENOMEM; ``` ### 3. 将属性绑定到显示对象 创建属性后,需要将其绑定到特定的显示对象上。例如,将属性绑定到 CRTC: ```c drm_object_attach_property(&crtc->base, my_property, initial_value); ``` ### 4. 实现属性的读写操作 为了使用户空间能够访问和修改属性,需要实现相应的 `get` 和 `set` 回调函数。这些函数通常通过 `drm_crtc_funcs` 或 `drm_plane_funcs` 结构体中的 `atomic_get_property` 和 `atomic_set_property` 成员进行注册。 ```c static int my_crtc_atomic_set_property(struct drm_crtc *crtc, struct drm_crtc_state *state, struct drm_property *property, uint64_t val) { if (property == my_property) { state->my_property_value = val; return 0; } return -EINVAL; } static int my_crtc_atomic_get_property(struct drm_crtc *crtc, const struct drm_crtc_state *state, struct drm_property *property, uint64_t *val) { if (property == my_property) { *val = state->my_property_value; return 0; } return -EINVAL; } ``` ### 5. 注册回调函数 最后,将上述回调函数注册到 DRM CRTC 的函数表中: ```c static const struct drm_crtc_funcs my_crtc_funcs = { .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state, .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state, .atomic_set_property = my_crtc_atomic_set_property, .atomic_get_property = my_crtc_atomic_get_property, // 其他必要的回调函数 }; ``` ### 6. 测试和调试 完成上述步骤后,重新编译并加载内核模块,使用用户空间工具(如 `modetest`)验证新属性是否成功添加并正常工作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值