一、代码分析
mtk_drm_plane.h 和 mtk_drm_plane.c 两个文件,并生成基于文本的函数调用图,我将首先解析文件中的主要函数及其功能,然后根据代码中的调用关系整理出调用图。由于文件内容较长,我会专注于关键函数及其相互调用关系,并以清晰的文本形式呈现。
文件分析
1. mtk_drm_plane.h
作用: 该头文件定义了 MediaTek DRM (Direct Rendering Manager) 平面相关的结构体、枚举和函数声明,主要用于管理显示平面(plane)的属性和状态。关键内容:
枚举:
DISP_ORIENTATION: 定义显示方向(如 0°、90°、180°、270°)。DISP_FORMAT: 定义支持的像素格式(如 RGB565、ARGB8888 等),并通过 MAKE_DISP_FORMAT_ID 宏生成格式 ID。DISP_LAYER_TYPE: 定义图层类型(2D、3D 侧-by-side、top-and-bottom 等)。DISP_BUFFER_TYPE: 定义缓冲区类型(普通、保护、加密)。DISP_BUFFER_SOURCE: 定义缓冲区来源(ION、MVA、Alpha)。DISP_ALPHA_TYPE: 定义 Alpha 混合类型。DISP_YUV_RANGE_ENUM: 定义 YUV 颜色范围(如 BT601、BT709)。MTK_FMT_MODIFIER: 定义格式修饰符(如预乘、加密)。MTK_PLANE_PROP: 定义平面属性(如 Alpha、数据空间、压缩等)。
结构体:
mtk_crtc_ovl_csc_config: 用于存储 CSC(颜色空间转换)配置。mtk_drm_plane: 扩展 DRM 平面结构体,包含自定义属性。mtk_plane_pending_state: 存储平面的待处理状态(如地址、格式、尺寸等)。mtk_plane_input_config: 定义平面输入配置(如缓冲区地址、格式、旋转等)。mtk_plane_comp_state: 存储平面组件状态(如组件 ID、图层能力)。mtk_plane_state: 扩展 DRM 平面状态,包含待处理状态、组件状态和属性值。
函数声明:
mtk_plane_init: 初始化 DRM 平面。mtk_get_format_bpp: 获取像素格式的每像素字节数。mtk_get_format_name: 获取像素格式的名称。mtk_plane_get_comp_state: 获取平面组件状态。to_crtc_plane_index: 将平面索引转换为 CRTC 平面索引。
2. mtk_drm_plane.c
作用: 该源文件实现了头文件中声明的功能,主要处理 DRM 平面的初始化、状态管理、属性设置/获取、以及原子更新等逻辑。关键函数:
to_crtc_plane_index: 将全局平面索引转换为 CRTC 相关的平面索引。mtk_get_format_bpp: 根据像素格式返回每像素字节数。mtk_get_format_name: 根据像素格式返回格式名称字符串。mtk_plane_reset: 重置平面状态,设置默认值(如格式为 RGB565)。mtk_plane_duplicate_state: 复制平面状态,保留旧状态的属性值。mtk_drm_plane_destroy_state: 销毁平面状态,释放内存。mtk_plane_atomic_set_property: 设置平面属性值。mtk_plane_atomic_get_property: 获取平面属性值。mtk_plane_atomic_check: 检查平面状态的有效性(如缓冲区、CRTC、分辨率等)。mtk_plane_get_comp_state: 获取平面组件状态(在 MTK_DRM_ADVANCE 宏下实现)。mtk_plane_atomic_update: 更新平面状态,配置缓冲区、尺寸、位置等。mtk_plane_atomic_disable: 禁用平面,设置待处理状态为禁用。dummy_helper_prepare_fb / dummy_plane_helper_cleanup_fb: 空实现的帧缓冲区准备和清理函数。mtk_plane_attach_property: 为平面附加自定义属性。mtk_plane_init: 初始化 DRM 平面,设置函数表和属性。
函数调用图
以下是基于 mtk_drm_plane.c 的函数调用关系,以文本形式表示。调用图展示了主要函数之间的直接调用关系,格式为 调用者 -> 被调用者,并附带简要说明。为了保持清晰,仅列出关键函数的调用关系,忽略次要或外部函数(如 DDP 系列日志函数)。
1. mtk_plane_init
├── drm_universal_plane_init
│ └── 初始化 DRM 平面,设置平面类型、格式和可能的 CRTC
└── mtk_plane_attach_property
└── drm_property_create_range
└── 创建 DRM 属性并附加到平面
2. mtk_plane_attach_property
└── drm_property_create_range
└── 创建范围属性(如 NEXT_BUFF_IDX、PLANE_PROP_ALPHA_CON 等)
3. mtk_plane_reset
├── __drm_atomic_helper_plane_destroy_state
│ └── 销毁旧的平面状态
└── kzalloc
└── 分配新的平面状态内存
4. mtk_plane_duplicate_state
├── __drm_atomic_helper_plane_duplicate_state
│ └── 复制 DRM 平面状态
├── kzalloc
│ └── 分配新状态内存
└── to_mtk_plane
└── 将 DRM 平面转换为 MTK 平面结构体
5. mtk_drm_plane_destroy_state
├── __drm_atomic_helper_plane_destroy_state
│ └── 销毁 DRM 平面状态
└── kfree
└── 释放平面状态内存
6. mtk_plane_atomic_set_property
└── to_mtk_plane
└── 将 DRM 平面转换为 MTK 平面以访问属性
7. mtk_plane_atomic_get_property
└── to_mtk_plane
└── 将 DRM 平面转换为 MTK 平面以获取属性
8. mtk_plane_atomic_check
├── drm_atomic_get_new_plane_state
│ └── 获取新的平面状态
├── mtk_fb_get_gem_obj
│ └── 获取帧缓冲区的 GEM 对象
├── drm_atomic_get_crtc_state
│ └── 获取 CRTC 状态
├── to_mtk_crtc
│ └── 将 DRM CRTC 转换为 MTK CRTC
├── mtk_drm_crtc_avail_disp_mode
│ └── 获取可用显示模式
├── to_mtk_crtc_state
│ └── 将 DRM CRTC 状态转换为 MTK CRTC 状态
└── drm_atomic_helper_check_plane_state
└── 检查平面状态(如缩放范围)
9. mtk_plane_get_comp_state (在 MTK_DRM_ADVANCE 宏下)
├── to_mtk_crtc_state
│ └── 获取 MTK CRTC 状态
├── to_mtk_crtc
│ └── 获取 MTK CRTC
├── mtk_drm_helper_get_opt
│ └── 获取 DRM 选项(如 SPHRT)
├── drm_property_lookup_blob
│ └── 查找属性 blob
├── drm_property_blob_put
│ └── 释放 blob 引用
└── _mtk_plane_get_comp_state
└── 复制组件状态数据
10. mtk_plane_atomic_update
├── to_mtk_plane_state
│ └── 获取 MTK 平面状态
├── to_mtk_crtc
│ └── 获取 MTK CRTC
├── to_mtk_crtc_state
│ └── 获取 MTK CRTC 状态
├── mtk_drm_fb_is_secure
│ └── 检查帧缓冲区是否为加密缓冲区
├── mtk_fb_get_dma
│ └── 获取帧缓冲区的 DMA 地址
├── mtk_fb_get_size
│ └── 获取帧缓冲区大小
├── mtk_drm_crtc_plane_update
│ └── 更新 CRTC 的平面配置
└── atomic_set
└── 设置 CRTC 的配置标志
11. mtk_plane_atomic_disable
├── to_mtk_plane_state
│ └── 获取 MTK 平面状态
├── drm_atomic_get_old_plane_state
│ └── 获取旧的平面状态
└── mtk_drm_crtc_plane_disable
└── 禁用 CRTC 的平面
12. mtk_get_format_bpp
└── 无直接调用其他函数,仅通过 switch-case 返回字节数
13. mtk_get_format_name
└── 无直接调用其他函数,仅通过 switch-case 返回格式名称
14. to_crtc_plane_index
└── 无直接调用其他函数,仅通过条件判断返回索引
说明
调用关系:
mtk_plane_init 是入口函数,负责初始化平面并附加属性。mtk_plane_reset、mtk_plane_duplicate_state 和 mtk_drm_plane_destroy_state 管理平面状态的生命周期。mtk_plane_atomic_* 函数(如 set_property、get_property、check、update、disable)处理原子操作,与 DRM 框架的原子更新机制紧密相关。mtk_plane_get_comp_state 涉及高级功能(如 LYE blob),仅在 MTK_DRM_ADVANCE 宏启用时生效。to_mtk_plane 和 to_mtk_plane_state 是常用的类型转换宏,贯穿多个函数。
关键依赖:
DRM 框架函数(如 drm_universal_plane_init、drm_atomic_helper_*)。MediaTek 自定义函数(如 mtk_fb_get_*、mtk_drm_crtc_*)。内存管理函数(如 kzalloc、kfree)。
日志函数:
DDPINFO、DDPPR_ERR、DDPDBG 等用于调试和日志记录,未在调用图中详细列出。
条件编译:
部分功能(如 mtk_plane_get_comp_state 和 OPLUS_FEATURE_DISPLAY_PANELCHAPLIN)受宏控制,可能在特定场景下启用。
暂无评论内容