拓冰建站拓冰建站
首页 / 资讯中心 / 正文

7、Encoder驱动实现:mtk_dsi.c、mtk_dp.c、mtk_hdmi.c分析

7.1 三个驱动的核心差异先说说这三个家伙的区别。DSI是给内置屏用的走MIPI协议DP是给外接显示器用的走DisplayPort协议HDMI则是给电视用的。它们虽然都是Encoder但底层实现完全不同。我个人习惯拿到一个新平台先看这三个驱动的初始化流程。你会发现它们都遵循一个共同的框架——Linux DRM的encoder结构体。但具体实现上各有各的脾气。核心要点三个驱动都实现了drm_encoder_helper_funcs结构体中的enable/disable/mode_set回调。但时序参数配置和链路训练是它们最大的不同点。7.2 mtk_dsi.c 深度分析先看DSI驱动。这个文件我印象特别深因为当年做第一个项目时DSI屏幕死活点不亮最后发现是时序参数配错了。// mtk_dsi.c 核心初始化流程 static void mtk_dsi_encoder_enable(struct drm_encoder *encoder) { struct mtk_dsi *dsi encoder_to_dsi(encoder); // 1. 配置DSI时序参数 mtk_dsi_phy_timconfig(dsi); // 2. 设置视频模式 mtk_dsi_video_config(dsi); // 3. 启动DSI mtk_dsi_start(dsi); }这里有个关键点——时序参数配置。DSI的时序参数包括HSA、HBP、HFP、VSA、VBP、VFP等。我在项目中遇到过有些屏厂给的时序参数是错的你得自己用示波器量。参数说明常见坑点HSA水平同步脉冲宽度不能小于4个像素时钟HBP水平后肩太小会导致图像左移HFP水平前肩太小会导致图像右移VSA垂直同步脉冲宽度通常为1-3行我的经验调试DSI时序时先确认lane数和时钟频率。我曾经遇到一个案子屏厂给的时序参数在理论计算上完全正确但实际显示就是有抖动。最后发现是DSI clock的PLL配置有问题导致实际频率偏差了2%。7.3 mtk_dp.c 链路训练详解DP驱动最复杂的地方就是链路训练。说白了就是Source和Sink之间握手确定用多少lane、跑多快速度。// mtk_dp.c 链路训练核心代码 static int mtk_dp_link_training(struct mtk_dp *dp) { // 1. 时钟恢复阶段 mtk_dp_clock_recovery(dp); // 2. 通道均衡阶段 mtk_dp_channel_equalization(dp); // 3. 链路配置确认 mtk_dp_link_config(dp); return 0; }链路训练分两个阶段时钟恢复和通道均衡。时钟恢复阶段Source发训练序列Sink调整自己的时钟。通道均衡阶段Source调整预加重和电压摆幅。我记得有一次客户反馈DP外接显示器偶尔黑屏。查了两天发现是链路训练失败后没有做重试机制。后来我加了个循环最多重试3次问题就解决了。注意链路训练失败时不要立即报错。很多显示器第一次训练会失败需要重试。我建议至少重试3次每次间隔100ms。7.4 mtk_hdmi.c 时序参数配置HDMI驱动相对简单一些但时序参数配置同样重要。HDMI的时序参数和DSI类似但多了音频相关的配置。// mtk_hdmi.c 时序配置 static void mtk_hdmi_mode_set(struct mtk_hdmi *hdmi, struct drm_display_mode *mode) { // 配置视频时序 mtk_hdmi_video_timing(hdmi, mode); // 配置音频采样率 mtk_hdmi_audio_config(hdmi, 48000); // 配置HDMI 1.4/2.0特性 mtk_hdmi_features_config(hdmi); }HDMI的时序参数配置说白了就是告诉芯片当前分辨率是多少、刷新率是多少、是隔行还是逐行。这些参数都定义在drm_display_mode结构体中。你想想看为什么有时候HDMI接电视没声音大概率是音频配置没跟上。我建议在mode_set回调里同时把音频参数也配好别等后面再单独配置。7.5 三个驱动的共性设计虽然三个驱动实现不同但它们都遵循一个设计模式——回调函数注册。在probe函数里把encoder的enable/disable/mode_set等回调注册到DRM框架中。嗯这里要注意三个驱动的注册方式略有不同DSI通过mtk_dsi_bind()注册到DRMDP通过mtk_dp_bind()注册同时注册热插拔回调HDMI通过mtk_hdmi_bind()注册支持CEA标准时序实战建议如果你要移植这三个驱动到新平台建议先跑通DSI因为它最简单。DP和HDMI涉及外部设备交互调试起来更麻烦。7.6 避坑指南最后我总结几个常见的坑时序参数越界有些屏的参数超出芯片支持范围需要做参数校验链路训练超时DP链路训练有超时机制默认5秒建议根据实际场景调整HDMI EDID读取失败有时候HDMI线接触不良EDID读取会失败需要做重试多屏同时显示三个Encoder同时工作时注意时钟源冲突我曾经在调试HDMI时遇到一个诡异的问题——插拔HDMI线后系统死机。查了三天最后发现是热插拔中断处理函数里调用了sleep导致中断上下文卡死。后来改成workqueue处理问题解决。好了这一章的内容就到这里。Encoder驱动说难不难说简单也不简单。关键是要理解时序参数和链路训练这两个核心点。下一章我们讲具体的调试方法和工具使用到时候我会带大家实际看波形、抓log。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门