当前位置: 首页 > 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://www.xdnf.cn/news/1429183.html

相关文章:

  • Spring Boot 3.5.3 集成 Log4j2 日志系统
  • 从spring MVC角度理解HTTP协议及Request-Response模式
  • 异常处理小妙招——1.别把“数据库黑话”抛给用户:论异常封装的重要性
  • 图像 OSD层数据 显示--OSD LOGO单色黑色显示,按区域大小申请MMZ内存的优缺点分析
  • 2022版Unity创建时没有2D灯光(2D Light),没有Global LIght2D怎么办?
  • Java集合遍历的方法有哪些
  • 使用Spark计算WordCount
  • 美团 LongCat 开源大模型60 亿参数 MoE 架构,赋能开发者加速 AI 应用落地
  • vue2中如何使用Ant Design Vue 中的 Tooltip 文字提示
  • 242. 有效的字母异位词| 349. 两个数组的交集
  • 通信中FDD和TDD的区别
  • 【JavaEE】多线程案例
  • 使用 Python 的 SymPy 进行符号计算
  • 机器学习回顾——决策树详解
  • 详解Grafana k6 的阈值(Thresholds)
  • FPGA时序分析(三)--基础知识
  • Leetcode_206.反转链表(递归)
  • 【嵌入式电机控制#进阶7】V/F强拖启动
  • 变频器实习DAY41 单元测试介绍
  • 前端实现解析【导入】数据后调用批量处理接口
  • Redis有哪些部署方案?了解哨兵机制吗?
  • AI文档产品与传统OCR软件的根本区别是什么?
  • 手写Muduo网络库核心代码2--Poller、EPollPoller详细讲解
  • 百度智能云,除了AI还有啥?
  • 线程特定存储
  • Go语言开发合并文件小工具
  • go命令行工具:如何在现有的工程里加入使用cobra
  • 苹果手机文本转音频,自行制作背诵素材
  • Redis 持久化机制详解
  • 《WINDOWS 环境下32位汇编语言程序设计》第10章 内存管理和文件操作(2)