当前位置: 首页 > news >正文

MTK Linux DRM分析(二十六)- MTK mtk_drm_ddp_xxx.c

一、代码分析

(1) mtk_drm_ddp.h (头文件)
  • 总体内容:这是一个显示数据路径(DDP:Display Data Path)的核心头文件,定义了MediaTek DRM驱动中与显示互斥量(mutex)、组件(comp)和路径相关的结构和函数。主要用于管理显示管道的同步和组件连接。
  • 关键结构
    • struct mtk_disp_mutex:表示显示互斥量,用于同步显示组件。
    • struct mtk_disp_ddp_data:包含互斥量模块、SOF(Start of Frame)等配置数据。
    • struct mtk_ddp:核心DDP结构,包含设备、时钟、寄存器、互斥量数组等。
    • struct dummy_mapping:用于虚拟寄存器映射。
  • 关键宏和常量
    • 定义互斥量总数(DISP_MUTEX_TOTAL = 16)、DDP组件ID范围等。
  • 函数声明
    • 互斥量管理:mtk_disp_mutex_get、mtk_disp_mutex_prepare、mtk_disp_mutex_add_comp、mtk_disp_mutex_enable 等,用于获取、准备、添加组件、启用/禁用互斥量。
    • 路径管理:mtk_ddp_add_comp_to_path、mtk_ddp_remove_comp_from_path 等,用于动态添加/移除显示路径中的组件。
    • 转储和调试:mutex_dump_reg_*、mmsys_config_dump_reg_* 等函数,用于寄存器转储和分析(针对不同芯片如MT6885、MT6983等)。
    • 特定功能:如插入/移除DSC(Display Stream Compression)组件、mtk_ddp_connect_dual_pipe_path 等,支持双管道路径。
  • 特点:高度芯片特定(e.g., MT6983、MT6879),支持CMDQ(Command Queue)扩展,用于异步命令执行。依赖于其他头文件如mtk_drm_ddp_comp.h、mtk_drm_crtc.h、mtk-cmdq-ext.h。
(2) mtk_drm_ddp_addon.h (头文件)
  • 总体内容:这是一个扩展头文件,专注于DDP的"附加"(addon)功能,用于处理显示路径的额外模块配置,如缩放(RSZ)、PQ(Picture Quality)、WDMA(Write DMA)等。引入了附加场景和模块的概念,支持动态路径配置。
  • 关键结构
    • enum addon_scenario:定义场景,如NONE、ONE_SCALING、GAME_PQ、MML_WITH_PQ(MML:MediaTek Multimedia Layer,支持PQ和旋转)。
    • enum addon_module:定义模块,如DISP_RSZ、DISP_WDMA0、DISP_MML_IR_PQ 等。
    • enum addon_type:类型,如ADDON_BETWEEN(插入路径中)、ADDON_BEFORE(插入前)、ADDON_CONNECT(连接)等。
    • struct mtk_addon_path_data:路径数据,包括路径数组和长度。
    • struct mtk_addon_module_data:模块数据,包括模块、类型和附加组件。
    • struct mtk_addon_scenario_data:场景数据,包括模块数量、模块数据和HRT类型(High Resolution Timer?)。
    • 配置结构:struct mtk_addon_rsz_config(RSZ配置)、struct mtk_addon_wdma_config(WDMA配置)、struct mtk_addon_mml_config(MML配置),以及联合体union mtk_addon_config。
  • 函数声明
    • 获取路径/场景:mtk_addon_module_get_path、mtk_addon_get_scenario_data、mtk_addon_get_scenario_data_dual、mtk_addon_scenario_support。
    • 配置路径:mtk_addon_path_config。
    • 连接/断开:mtk_addon_connect_between、mtk_addon_disconnect_between、mtk_addon_connect_before 等,支持不同类型(between、before、after、external、embed)。
  • 特点:依赖于DRM CRTC(Cathode Ray Tube Controller)和CMDQ。支持双管道(dual pipe)和MML集成,用于高级显示处理如PQ增强、旋转和直接链接(DL)。
(3) mtk_drm_ddp_addon.c (源文件) - 重点分析
  • 总体内容:这是mtk_drm_ddp_addon.h的实现文件,负责实际配置显示附加路径和模块。文件定义了各种路径数组(e.g., disp_rsz_path、disp_mml_rsz_path),并实现了路径连接、断开、配置等逻辑。核心是动态管理显示管道中的附加组件,支持芯片特定场景(如MML PQ、RSZ缩放、WDMA写回)。
  • 关键路径数组
    • 定义了多种附加路径,如disp_rsz_path(RSZ路径)、disp_wdma0_path(WDMA路径)、disp_mml_rsz_path(MML RSZ路径,包括HDR、AAL、TDSHP、COLOR等PQ组件)。
    • 这些路径是DDP组件ID的数组,用于构建子路径(subpath)。
    • 全局数组addon_module_path:映射每个附加模块到其路径数据。
  • 主要函数实现
    • 获取函数
      • mtk_addon_module_get_path:返回模块的路径数据。
      • mtk_addon_get_scenario_data / mtk_addon_get_scenario_data_dual:从CRTC的路径数据中获取场景数据,支持错误检查。
      • mtk_addon_scenario_support:检查CRTC是否支持特定场景。
    • 配置函数
      • mtk_addon_path_config:遍历路径,调用mtk_ddp_comp_addon_config配置每个组件(传入前后组件ID和配置联合体)。
    • 路径启动/停止
      • mtk_addon_path_start:遍历路径,启动非虚拟组件(调用mtk_ddp_comp_start)。
      • mtk_addon_path_stop:遍历路径,停止组件(调用mtk_ddp_comp_stop),并在断开时额外配置MML IR PQ模块。
    • 互斥量和路径管理(内部函数)
      • mtk_addon_path_connect_and_add_mutex:连接路径组件(mtk_ddp_add_comp_to_path_with_cmdq),添加互斥量(mtk_disp_mutex_add_comp_with_cmdq)。
      • mtk_addon_path_disconnect_and_remove_mutex:反向操作,移除组件和互斥量。
    • 连接/断开函数(核心API)
      • mtk_addon_connect_between / mtk_addon_disconnect_between:在路径中间插入/移除子路径,支持附加组件的动态调整。
      • mtk_addon_connect_before / mtk_addon_disconnect_before:在附加组件前插入/移除。
      • mtk_addon_connect_after / mtk_addon_disconnect_after:在附加组件后插入/移除。
      • mtk_addon_connect_external / mtk_addon_disconnect_external:外部连接/断开(可能用于独立路径)。
      • mtk_addon_connect_embed / mtk_addon_disconnect_embed:嵌入式连接/断开(将子路径嵌入附加组件中)。
      • 这些函数的逻辑类似:(1) 附加/分离CRTC组件;(2) 连接/断开子路径并管理互斥量;(3) 添加/移除主路径中的组件;(4) 配置组件(多次调用mtk_ddp_comp_addon_config);(5) 启动/停止路径。
  • 特点和注意点
    • CMDQ集成:所有操作使用struct cmdq_

文章转载自:

http://MCwvq6k6.fwywr.cn
http://Y6G2gZTO.fwywr.cn
http://vM7mZQNT.fwywr.cn
http://DvYPjj1w.fwywr.cn
http://aaq6yPUI.fwywr.cn
http://Zbx9lPDM.fwywr.cn
http://mqqcvrIx.fwywr.cn
http://MoNG7NoL.fwywr.cn
http://A9Fxf3ir.fwywr.cn
http://2WonXoHZ.fwywr.cn
http://ZawfEfAT.fwywr.cn
http://yYu9yNtV.fwywr.cn
http://hj6RdKHW.fwywr.cn
http://B9crucJL.fwywr.cn
http://38aGWMmn.fwywr.cn
http://6C9xy3DF.fwywr.cn
http://ys83tnWz.fwywr.cn
http://65bqAsA9.fwywr.cn
http://vSo71k8S.fwywr.cn
http://OuGlR6VG.fwywr.cn
http://s3kfCi8V.fwywr.cn
http://D8W0dfPz.fwywr.cn
http://6nQjGvpq.fwywr.cn
http://cvV8YXTN.fwywr.cn
http://xF4ot7GR.fwywr.cn
http://tgb1OWgi.fwywr.cn
http://BRVzjK8e.fwywr.cn
http://1Fuwn1Ia.fwywr.cn
http://TWsiuD3j.fwywr.cn
http://qWdHakDK.fwywr.cn
http://www.dtcms.com/a/363678.html

相关文章:

  • 如何创建逻辑卷
  • Shell脚本入门:从零到精通
  • 容器设备映射配置在海外云服务器GPU加速环境的实施规范
  • QML的focus与activeFocus
  • C++ 左值引用与右值引用介绍
  • MySQL数据库精研之旅第十五期:索引的 “潜规则”(下)
  • OpenCV Python
  • 0825-0829 | 大模型方向周报:多模态模型研究、训练与优化策略、安全与对齐等方向
  • SQL Server--提取性能最差的查询
  • 阿里云国际代理商:如何重置阿里云服务器密码?
  • 阿里云日志服务之WebTracking 小程序端 JavaScript SDK (阿里SDK埋点和原生uni.request请求冲突问题)
  • 现代CPU设计哲学——加载/存储(Load-Store)架构
  • 作为软件专业学生,我眼中新架构实践的‘稳’与‘进’
  • NLP学习系列 | Transformer代码简单实现
  • MySQL 事务隔离与 MVCC
  • 鸿蒙权限崩溃?一招解决闪退难题
  • 自建局域网gitlab如何修改提交时间
  • 365 天技术创作手记:从一行代码到四万同行者的相遇
  • 基本IP保护 Swagger UI 的中间件
  • Flutter doctor
  • 试用Augment编写python脚本实现智能家居3D环境交互响应
  • Vite + React + Tailwind v4 正确配置指南(避免掉进 v3 的老坑)
  • MyBatis 日志与调试技巧:让 SQL 执行过程完全透明
  • Node.js 命令行交互王者:inquirer 模块实战指南
  • 你们公司的 QPS 是怎么统计出来的?这 5 种常见方法我踩过一半的坑!
  • LazyLLM教程 | 第7讲:检索升级实践:亲手打造“更聪明”的文档理解系统!
  • Text2SQL与DataAgent技术深度对比与实践指南
  • 【算法笔记 day six】二分算法的第三部分
  • Linux下Qt样式配置
  • Qt内存映射到文件,解决打开大文件占用内存高的问题