MTK Linux DRM分析(十五)- Mediatek KMS实现mtk_drm_plane.c

一、MTK Plane实现分析

这个代码模块是 MediaTek DRM (Direct Rendering Manager) 驱动程序的一部分,主要负责处理 DRM plane(显示层)的相关功能。Plane 是 DRM 框架中的核心概念,用于表示显示叠加层(overlay),可以叠加在 CRTC(Controller)上,支持多层合成、缩放、格式转换等操作。该模块针对 MediaTek SoC(如 MT6885、MT6983 等)优化,支持特定硬件特性,如 MML(Multi-Media Layer,用于多媒体处理)、secure buffer(安全缓冲区,用于 DRM 内容保护)、双管道缩放(dual pipe scaling)和低功耗模式(如 AOD)。代码结合了 DRM 核心框架的接口(如 drm_plane_funcs 和 drm_plane_helper_funcs),并扩展了 MediaTek 特定的属性和状态管理。

下面我将代码分为几个主要部分,分析其实现内容和作用。分析基于提供的 mtk_drm_plane.c 和 mtk_drm_plane.h 文件。

1. 头文件和常量定义(mtk_drm_plane.h 中的主要部分)
  • 实现
    • 定义了枚举类型,如 DISP_ORIENTATION(旋转方向)、DISP_FORMAT(像素格式,如 RGB565、ARGB8888)、DISP_LAYER_TYPE(2D/3D 层类型)、DISP_BUFFER_TYPE(缓冲区类型,如 normal/secure)、DISP_ALPHA_TYPE(alpha 模式)、DISP_YUV_RANGE_ENUM(YUV 范围,如 BT601/BT709)。
    • 定义了 MTK_FMT_MODIFIER(格式修饰符,如 premultiplied/secure)。
    • 定义了 MTK_PLANE_PROP(plane 属性枚举,如 NEXT_BUFF_IDX、ALPHA_CON、DATASPACE 等)。
    • 结构定义:
      • mtk_crtc_ovl_csc_config:OVL 的 CSC(Color Space Conversion)配置,包括亮度和颜色变换。
      • mtk_drm_plane:扩展 drm_plane,支持自定义属性数组。
      • mtk_plane_pending_state:待处理状态,包含配置、地址、格式、坐标等。
      • mtk_plane_input_config:输入配置,包含源地址、格式、旋转、alpha 等。
      • mtk_plane_comp_state:组件状态,包含组件 ID、LYE ID 等。
      • mtk_plane_state:扩展 drm_plane_state,包含 pending 状态、组件状态和自定义属性。
    • 宏定义:如 MAKE_DISP_FORMAT_ID(生成格式 ID)、to_mtk_plane(容器转换)、to_mtk_plane_state 等。
  • 作用
    • 提供 MediaTek 特定的枚举和结构,用于 plane 配置和硬件交互。
    • 支持 YUV、RGB 等多种格式,确保兼容性(formats 数组列出了支持的 DRM_FORMAT_*)。
    • 扩展 DRM 状态管理,支持 MML 模式和自定义属性(如 ALPHA_CON、COMPRESS)。
    • 辅助函数声明:mtk_plane_init、mtk_get_format_bpp、mtk_get_format_name、mtk_plane_get_comp_state、to_crtc_plane_index。
2. 辅助函数(mtk_get_format_bpp、mtk_get_fo
<think>我们注意到用户提到在静态编译libdrm后没有生成libdrm.a文件。根据引用[1]的描述,默认情况下编译的是动态库,需要修改meson.build文件中的default_options,添加'default_library=static'选项。用户可能已经按照这个步骤操作了,但仍然没有生成静态库。我们需要分析可能的原因。 可能的原因及解决方案: 1. **修改的meson.build文件位置不正确**:用户可能修改了错误的meson.build文件。应该修改的是libdrm源码根目录下的meson.build文件。请确认修改的是解压后的源码目录中的文件。 2. **构建目录未重新配置**:修改meson.build文件后,如果之前已经配置过构建目录(例如已经运行过`meson setup builddir`),那么需要清除构建目录或者重新配置。因为meson会在配置阶段读取配置,如果构建目录已经存在,则不会重新读取修改后的配置。 解决方案:删除构建目录(例如`builddir`),然后重新运行配置和编译命令: ```bash rm -rf builddir # 删除原有构建目录 meson setup builddir # 重新配置 ninja -C builddir # 重新编译 ``` 3. **静态库名称可能不是libdrm.a**:在libdrm项目中,由于包含多个子模块(如intel, amdgpu等),静态库可能会被拆分成多个。但主库应该还是`libdrm.a`。不过,也有可能静态库被生成在构建目录的子目录中。我们可以使用`find`命令来查找: ```bash find builddir -name 'libdrm.a' ``` 4. **编译过程中出现错误**:在运行`ninja -C builddir`时,可能出现了编译错误,导致静态库没有生成。请检查编译命令的输出,看是否有错误信息。 5. **meson版本问题**:引用[1]中提到需要meson版本>=0.46。如果系统安装的meson版本过低,可能导致配置失败。请检查meson版本: ```bash meson --version ``` 如果版本过低,请升级meson。可以通过pip安装最新版: ```bash pip3 install meson --upgrade ``` 6. **依赖项缺失**:引用[4]中列出了许多依赖项,其中与libdrm编译直接相关的是`libpciaccess-dev`。如果缺少依赖,编译可能会失败。请确保已安装所有必要的依赖: ```bash sudo apt-get install libpciaccess-dev ``` 7. **静态编译选项被覆盖**:在meson.build文件中,如果其他地方覆盖了默认库类型,可能会导致静态库没有生成。确保在`project()`函数的`default_options`中添加了`'default_library=static'`,并且没有其他设置将其覆盖。 8. **构建系统没有识别修改**:有时meson可能缓存了之前的配置。除了删除构建目录外,还可以尝试使用`meson setup --reconfigure builddir`来重新配置。 按照以上步骤逐一排查,通常可以解决问题。 如果用户按照上述步骤操作后仍然没有生成静态库,我们可以尝试手动指定构建类型为静态库(在meson配置命令中直接指定): ```bash meson setup builddir -Ddefault_library=static ``` 然后编译: ```bash ninja -C builddir ``` 这样,即使meson.build文件没有修改,也会强制生成静态库(但注意,这样可能会影响其他依赖的构建,不过对于libdrm来说,通常没问题)。 如果以上方法都无效,建议查看构建目录中的日志文件(通常在`builddir/meson-logs/meson-log.txt`)以获取详细的错误信息。 最后,如果用户确实需要静态库,也可以考虑在编译完成后,将生成的动态库通过ar命令手动打包成静态库,但这并不是标准做法,可能会遇到问题。标准做法还是通过构建系统生成。 总结步骤: 1. 确保修改了正确的meson.build文件(在项目根目录)。 2. 删除旧的构建目录并重新配置。 3. 使用`meson setup builddir -Ddefault_library=static`强制指定静态库。 4. 检查依赖是否安装。 5. 检查编译输出是否有错误。 希望这些步骤能帮助用户生成静态库。</think>### 静态编译 libdrm 后未生成 libdrm.a 文件的解决方案 当您按照引用[1]的方法修改 `meson.build` 后仍无法生成 `libdrm.a` 静态库时,可能是以下原因导致的: #### 常见原因及解决方法 1. **构建目录未清除**(最常见问题) ```bash # 删除旧构建目录 rm -rf builddir # 重新配置并编译 meson setup builddir -Ddefault_library=static ninja -C builddir ``` Meson 会缓存配置,修改后必须**完全删除**旧构建目录[^1] 2. **依赖项缺失** ```bash # 安装核心依赖 sudo apt-get install libpciaccess-dev libkmod-dev libudev-dev ``` 缺少 `libpciaccess` 等依赖会导致编译中断(参考引用[4]) 3. **Meson 版本过低** ```bash # 检查版本 (需 >=0.46) meson --version # 升级 Meson pip3 install --upgrade meson ``` 4. **配置参数错误** ```bash # 显式指定静态库编译 meson setup builddir \ --default-library=static \ -Dintel=disabled \ -Damdgpu=disabled \ -Dnouveau=disabled ``` 禁用不需要的驱动模块可减少依赖冲突 #### 验证静态库生成 ```bash # 查找生成的静态库 find builddir -name '*.a' # 检查文件类型 file builddir/libdrm/libdrm.a # 正确输出: ELF 64-bit LSB relocatable, x86-64... ``` #### 手动生成静态库(备选方案) 如果 Meson 仍失败,可手动编译: ```bash # 生成对象文件 gcc -c src/*.c -Iinclude/drm # 打包为静态库 ar rcs libdrm.a *.o ``` #### 常见错误排查 1. **链接错误**: ```log undefined reference to `drmGetDevices' ``` 需确保编译时包含所有源文件(特别是 `xf86drm*.c`) 2. **权限问题**: ```bash sudo chown -R $USER . # 获取源码目录所有权 ``` 3. **交叉编译问题**: ```bash # 设置交叉编译链 export CC=aarch64-linux-gnu-gcc meson setup builddir --cross-file=cross.ini ``` > **关键提示**:静态编译时需确保所有依赖库(如 libpciaccess)也是静态版本,否则最终链接仍会依赖动态库[^4][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值