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

MTK Linux DRM分析(二十三)- MTK mtk_drm_crtc.c(Part2)

一、代码分析

mtk_drm_crtc2.c 中主要函数的基本作用分析,基于提供的代码片段。这些函数是 MediaTek DRM (Direct Rendering Manager) 驱动的一部分,主要用于管理显示控制器(CRTC)的触发循环、事件循环、硬件同步、调试输出等功能。以下按功能分组,简要说明每个函数的作用,保持清晰简洁,并避免过多技术细节。


1. CMDQ 回调函数

  • trig_done_cb
    • 作用: CMDQ 触发循环完成时的回调函数,记录触发循环完成事件。
    • 关键点: 使用 CRTC_MMP_MARK 和 drm_trace_tag_mark 记录日志,标记触发循环的完成状态,当前仅用于非低功耗视频模式。
  • event_done_cb
    • 作用: CMDQ 事件循环完成时的回调函数,记录事件循环完成事件。
    • 关键点: 使用 drm_trace_tag_mark 记录日志,标记事件循环的完成状态。
  • lcm_cmd_cmdq_cb
    • 作用: 处理 LCM(LCD Module)命令的 CMDQ 回调,记录特定事件(如自动模式、最小帧率等)的完成。
    • 关键点: 支持 OPLUS ADFR 特性,根据 misc 值记录不同事件(如 fftimer_end, automode_end),释放 CMDQ 句柄并清理回调数据。

2. 事件和触发循环管理

  • mtk_crtc_clear_wait_event
    • 作用: 清除 CRTC 的等待事件(如 EOF 信号),确保显示事件状态正确。
    • 关键点: 在触发模式下,创建 CMDQ 包,设置 EVENT_STREAM_EOF、EVENT_ESD_EOF 和 EVENT_CABC_EOF 事件,执行并销毁 CMDQ 包。
  • mtk_crtc_start_sodi_loop
    • 作用: 启动 SODI(Screen-Off Display Idle)循环,用于低功耗管理。
    • 关键点:
      • 仅对 CRTC ID 为 0 有效,创建 CMDQ 包并等待 EVENT_CMD_EOF 和 EVENT_SYNC_TOKEN_SODI 事件。
      • 写入 GCE 寄存器以启用 DDR,执行异步刷新,解决 GCE 硬件问题。
  • mtk_crtc_start_event_loop
    • 作用: 启动事件循环,管理显示时序(如 TE、DSI PLL、电源管理等)。
    • 关键点:
      • 配置显示时序参数(如 dsi_pll_check_off_offset, prefetch_te_offset),支持动态 FPS 和 OPLUS ADFR/MFR 模式。
      • 根据硬件选项(如 MTK_DRM_OPT_PREFETCH_TE)启用预取、合并触发等功能。
      • 使用 CMDQ 包设置事件、睡眠、条件跳转等,处理 DSI PLL 开关和电源管理。
      • 异步执行并绑定 event_done_cb 回调。
  • mtk_crtc_start_trig_loop
    • 作用: 启动触发循环,管理显示触发信号。
    • 关键点:
      • 如果 CMDQ 被禁用,直接返回并记录日志。
      • 创建 CMDQ 包,配置触发相关逻辑(代码未完整显示,但通常涉及触发信号的设置和刷新)。

3. 硬件重置和配置

  • mtk_crtc_rec_trig_cnt
    • 作用: 记录触发计数(未完全实现,标记为 IF_ZERO)。
    • 关键点: 使用 CMDQ 逻辑指令增加计数器并写入寄存器,记录触发次数,可能用于调试或监控。
  • cmdq_pkt_reset_ovl_by_crtc
    • 作用: 检查 OVL(Overlay)层计数并重置 OVL 组件。
    • 关键点:
      • 读取 OVL 层的 GREQ 计数,检查是否为 0。
      • 如果计数非零,重置组件并更新 GCE 备份槽,记录组件 ID 和计数。
  • cmdq_pkt_reset_ovl
    • 作用: 重置 CRTC 路径中的所有 OVL 组件。
    • 关键点: 遍历主路径和双管道路径,仅对 OVL 类型组件执行 cmdq_pkt_reset_ovl_by_crtc,支持多层重置(最多 OVL_RT_LOG_NR 层)。
  • cmdq_pkt_request_te
    • 作用: 配置 TE(Tearing Effect)信号请求逻辑。
    • 关键点:
      • 读取 TE 启用状态,基于条件跳转决定是否执行 TE 切换。
      • 调用 DSI_MSYNC_SWITCH_TE_LEVEL_GRP 设置 TE 级别,支持动态刷新率调整。
  • cmdq_pkt_wait_te
    • 作用: 等待 TE 信号,确保显示同步。
    • 关键点:
      • 检查 TE 启用状态,清除并等待 EVENT_TE 或 EVENT_GPIO_TE1 事件。
      • 支持 Msync2.0,通过 cmdq_pkt_request_te 请求 TE 信号,处理双 TE 场景。

4. Panel Master 相关

  • mtk_crtc_start_for_pm
    • 作用: 为 Panel Master 启动 CRTC,初始化触发循环和组件。
    • 关键点:
      • 启动触发循环(如果启用),创建 CMDQ 包。
      • 在非触发模式下启动 DSI 视
http://www.dtcms.com/a/356366.html

相关文章:

  • 嵌入式Linux驱动开发 - GPIO LED驱动
  • 税务岗位能力提升培训课程推荐
  • 嵌入式Linux驱动开发:定时器驱动
  • 解析DB-GPT项目中三个 get_all_model_instances 方法的区别
  • 【WebRTC】从入门到忘记
  • 解密 Vue 3 shallowRef:浅层响应式 vs 深度响应式的性能对决
  • 园区智慧水电管理系统:让能源管理从“成本黑洞”变“利润引擎”
  • 【GM3568JHF】FPGA+ARM异构开发板 使用指南:以太网
  • nginx 怎么将 https 请求转为 http
  • AR巡检系统:数字化传统工作流程SOP的第一步
  • //Q是一个队列,S是一个空栈,实现将队列中的元素逆置的算法。
  • 从零开始学习单片机17
  • 医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(五)
  • AR智能眼镜:能源行业运维的数字化革新
  • iOS 文件管理与 uni-app 性能优化实战 多工具协作的完整指南
  • Frida-dexdump 使用指南:从内存中脱取安卓 Dex 文件
  • Go对接全球期货数据源指南:基于StockTV API实现多品种实时监控
  • LeetCode第二题知识点2 ---- 栈、堆、地址
  • 不止 ChatGPT:多模态 AI(文本 + 图像 + 音频)正重构内容创作全流程
  • 数据质检之springboot通过yarn调用spark作业实现数据质量检测
  • 第三章 Vue3 + Three.js 实战:用 OrbitControls 实现相机交互与 3D 立方体展示
  • Unity学习----【数据持久化】二进制存储(一)
  • ExcelJS实现导入转换HTML展示(附源码可直接使用)
  • Excel数组学习笔记
  • 在Excel和WPS表格中隔一行插入多个空白行
  • 网络编程 04:TCP连接,客户端与服务器的区别,实现 TCP 聊天及文件上传,Tomcat 的简单使用
  • 从零开始部署 Kubernetes Dashboard:可视化管理你的集群
  • [Linux]学习笔记系列 -- mm/shrinker.c 内核缓存收缩器(Kernel Cache Shrinker) 响应内存压力的回调机制
  • 创意程序之MP3分割工具
  • sqlachemy