4. 时钟树与PLL配置
在DRM/KMS显示子系统中,LVDS接口的像素时钟精度与抖动性能直接决定了显示画面的稳定性和信号完整性。本章深入剖析SoC内部时钟树的层级结构、PLL(锁相环)的分频/倍频工作原理,以及LVDS时钟源的选择策略,为后续链路训练中的时钟恢复与相位调整奠定理论基础。
4.1 SoC内部时钟树结构
现代SoC的显示时钟树通常采用多级级联结构,从高频振荡源到最终LVDS接口的差分时钟,经历多个分频、倍频与门控单元。典型的时钟树包含以下层级:
| 层级 | 组件 | 功能描述 | 典型频率范围 |
|---|---|---|---|
| L0 | 晶振 / 外部时钟源 | 提供基准频率,通常为24MHz或27MHz | 24–27 MHz |
| L1 | 主PLL (DPLL0) | 生成SoC核心与显示子系统的高频时钟 | 400–1600 MHz |
| L2 | 显示PLL (DPLL1/DPLL2) | 专为显示控制器与接口生成像素时钟 | 100–800 MHz |
| L3 | 时钟分频器 (CDD) | 将显示PLL输出分频为像素时钟、LVDS位时钟 | 25–200 MHz |
| L4 | LVDS SerDes PLL | 将并行像素数据串化为LVDS差分信号 | 200–800 MHz (7:1模式) |
关键概念: 时钟树中的每一级都会引入相位噪声与抖动。LVDS接口对时钟抖动的容忍度通常低于100ps(峰峰值),因此PLL的环路带宽与分频比设计至关重要。
4.2 PLL分频/倍频原理
PLL(锁相环)是时钟树中的核心频率合成单元。其基本工作原理是通过反馈环路使输出时钟与参考时钟保持固定的相位关系,从而实现频率的精确倍频或分频。一个典型的整数N分频PLL包含以下关键模块:
- 鉴频鉴相器 (PFD): 比较参考时钟与反馈时钟的相位差,输出UP/DOWN脉冲。
- 电荷泵 (CP): 将PFD的脉冲信号转换为电流,对环路滤波器充电或放电。
- 环路滤波器 (LF): 低通滤波,滤除高频噪声,生成稳定的控制电压。
- 压控振荡器 (VCO): 根据控制电压调整输出频率,通常工作在较高频率范围。
- 反馈分频器 (M): 将VCO输出分频后反馈至PFD,实现倍频:Fout = M × Fref。
- 前级分频器 (N): 对参考时钟进行预分频,扩展频率合成范围。
工程师笔记: 在DRM驱动中配置PLL时,通常通过
drm_mode中的clock字段(单位kHz)计算所需的分频系数。例如,对于1920×1080@60Hz的LVDS面板,像素时钟约为148.5MHz,若参考时钟为24MHz,则M/N分频比需满足:148.5 = 24 × (M/N)。实际配置时还需考虑VCO的频率范围限制。
4.3 LVDS时钟源选择
在DRM/KMS驱动中,LVDS接口的时钟源选择直接影响显示时序的生成与信号质量。通常有以下几种时钟源选项:
| 时钟源 | 来源 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 内部显示PLL | SoC内部DPLL | 集成度高,无需外部器件 | 抖动较大,受SoC温度/电压影响 | 消费类嵌入式设备 |
| 外部独立PLL | 外置时钟发生器 | 低抖动,高稳定性 | 增加BOM成本与PCB面积 | 工业/医疗高可靠性场景 |
| LVDS SerDes内置PLL | LVDS发送器内部 | 专为串化设计,匹配性好 | 可配置性有限 | 标准LVDS面板驱动 |
| 外部晶振直驱 | 专用LVDS晶振 | 最简设计,极低抖动 | 频率固定,不可调节 | 固定分辨率面板 |
时钟源选择陷阱: 在DRM驱动中,若选择内部显示PLL作为LVDS时钟源,必须确保PLL的输出频率与LVDS SerDes的输入频率范围匹配。例如,对于7:1 LVDS格式,SerDes PLL的输入时钟应为像素时钟的7倍。若内部PLL无法提供精确的7倍频,将导致链路训练失败或显示闪烁。
在驱动代码中,时钟源的选择通常通过设备树(Device Tree)或平台数据中的clock-names与assigned-clocks属性完成。以下是一个典型的设备树片段:
/* LVDS时钟源配置示例 */
&display_subsystem {
lvds_encoder: lvds-encoder@0 {
compatible = "vendor,lvds-encoder";
clocks = <&display_pll LVDS_CLK>,
<&lvds_serdes_pll SERDES_CLK>;
clock-names = "pixel", "serdes";
assigned-clocks = <&display_pll LVDS_CLK>;
assigned-clock-rates = <148500000>; /* 148.5 MHz */
};
};
4.4 时钟配置实战:从PLL到LVDS的链路计算
在实际的DRM驱动开发中,时钟配置的核心任务是计算并设置各级分频系数,使得最终输出的LVDS时钟满足面板规格。以下是一个典型的计算流程:
- 获取面板时序参数: 从
drm_display_mode中读取clock(像素时钟,单位kHz)。 - 确定LVDS格式: 根据面板数据手册确认是6-bit(3通道)还是8-bit(4通道)LVDS,以及串化比(通常为7:1)。
- 计算SerDes时钟: SerDes时钟 = 像素时钟 × 串化比。例如,148.5MHz × 7 = 1039.5MHz。
- 选择PLL参考源: 通常为24MHz或27MHz晶振。
- 计算分频系数: 根据VCO频率范围(例如400–1600MHz)确定M/N值,使得Fvco = Fref × (M/N) 在允许范围内。
- 配置寄存器: 通过DRM encoder的
atomic_check或mode_set回调写入PLL配置。
实战案例: 某1920×1080@60Hz LVDS面板,像素时钟148.5MHz,7:1串化,SerDes时钟需1039.5MHz。若内部PLL参考时钟为24MHz,VCO范围800–1600MHz,则选择M=43.3125(实际使用分数分频PLL),N=1,VCO=24×43.3125=1039.5MHz,满足要求。在驱动中需配置
pll_m=43、pll_n=1、pll_frac=0.3125。