MTK Linux DRM分析(十九)- KMS drm_framebuffer.c
一、drm_framebuffer分析
代码主要作用分析
drm_framebuffer.c 是 Linux 内核 DRM(Direct Rendering Manager)子系统的一部分,主要负责管理帧缓冲区(Frame Buffer,简称 FB)。帧缓冲区是抽象的内存对象,用于存储像素数据,供显示控制器(CRTC)扫描输出到显示设备。它是 DRM 内核模式设置(KMS)功能的核心组件之一,允许用户空间通过特定的 ioctl 接口创建、配置和操作帧缓冲区。
主要功能:
- 帧缓冲区创建与管理:
- 提供接口(如 drm_mode_addfb 和 drm_mode_addfb2)以创建帧缓冲区,支持单平面和多平面格式(通过 drm_mode_fb_cmd2 结构)。
- 验证帧缓冲区参数(如分辨率、像素格式、修饰符等),确保符合硬件和驱动的要求。
- 通过引用计数管理帧缓冲区的生命周期(如 drm_framebuffer_get 和 drm_framebuffer_put)。
- 帧缓冲区操作:
- 支持查询帧缓冲区信息(drm_mode_getfb 和 drm_mode_getfb2)。
- 支持移除帧缓冲区(drm_mode_rmfb),包括从活动使用中移除并释放资源。
- 支持刷新帧缓冲区(drm_mode_dirtyfb),用于手动更新显示设备(如 USB 显示链接或 EDP 自刷新面板)。
- 与硬件的交互:
- 帧缓冲区依赖底层的内存管理器(如 GEM 或 TTM)来分配存储空间。
- 支持像素格式转换、修饰符(modifier)处理(如 Samsung 特定 tiling 格式)以及多平面帧缓冲区。
- 调试与信息输出:
- 提供调试接口(drm_framebuffer_debugfs_init)用于在调试文件系统中输出帧缓冲区信息。
- 通过 DRM_DEBUG_KMS 宏记录调试信息,便于开发者诊断问题。
- 原子模式设置支持:
- 支持原子模式设置(atomic modeset),通过 atomic_remove_fb 函数在移除帧缓冲区时更新相关 CRTC 和平面状态。
- 提供传统(非原子)模式设置的兼容实现(legacy_remove_fb)。
关键数据结构:
- struct drm_framebuffer:表示帧缓冲区对象,包含宽度、高度、像素格式、修饰符、引用计数等信息。
- struct drm_mode_fb_cmd 和 struct drm_mode_fb_cmd2:用户空间传递的帧缓冲区创建参数。
- struct drm_format_info:描述像素格式的元数据,如平面数量、子采样等。
主要函数分析
以下是代码中的主要函数及其作用:
- drm_framebuffer_check_src_coords
- 作用:检查源坐标(src_x, src_y, src_w, src_h)是否在帧缓冲区的边界内。
- 参数:
- src_x, src_y:源区域的起点坐标(以 16.16 固定点格式)。
- src_w, src_h:源区域的宽度和高度。
- fb:帧缓冲区对象。
- 返回值:0 表示有效,-ENOSPC 表示坐标超出边界。
- 用途:确保源坐标合法,防止扫描输出超出帧缓冲区范围。
- drm_mode_addfb
- 作用:通过旧版 ioctl(DRM_IOCTL_MODE_ADDFB)添加帧缓冲区,仅支持 RGB 格式。
- 参数:
- dev:DRM 设备。