在RK(瑞芯微)平台开发中,时钟(CLK)子系统是SOC的“心脏”——CPU变频、DDR数据传输、以太网通信、LCD显示等所有组件的稳定运行,都依赖精准的时钟信号。但时钟树复杂、配置参数多、调试踩坑频繁,一直是开发者的痛点。
今天这篇文章,从核心知识、实操调试步骤到常见问题解决方案,帮你系统掌握RK平台CLK开发,少走弯路!
一、RK平台CLK核心知识:搞懂这些不迷路
时钟子系统的核心是“精准分配与控制”,需先掌握3大核心模块:基础框架、GPIO输出时钟、PLL展频(降EMI关键)。
1.基础框架:时钟树与关键组件
RK平台时钟以“树状结构”(时钟树)分配,从源头(晶振/ PLL)到终端(外设),依赖4类关键组件:
| 组件
|
作用
|
关键细节
|
| 晶振(Oscillator)
|
时钟源头,提供基础频率(如24M无源晶振)
|
所有PLL的输入基准,信号质量直接影响后续时钟稳定性
|
| PLL(锁相环)
|
对晶振频率倍频,生成高频时钟(如CPU、DDR所需)
|
RK主流PLL分工明确:- APLL:独占给CPU(随CPU变频调整)- DPLL:独占给DDR- GPLL:总线/外设备份(常设594M/1200M)- CPLL/NPLL:LCDC/GMAC独占
|
| Divider(分频器)
|
对PLL输出频率分频,适配不同外设需求(如200M→50M)
|
支持整数分频(如/ 2)和小数分频(如I2S/UART需精准频率)
|
| MUX(多路选择器)
|
选择时钟来源(如外设可从GPLL或CPLL取时钟)
|
寄存器配置选择路径,需注意“父时钟与子时钟的兼容性”
|
| GATING(时钟门控)
|
控制时钟开关,降低功耗(设备不工作时关闭时钟)
|
有引用计数机制:子时钟打开时自动打开父时钟;所有子时钟关闭才关父时钟
|
此外,总线时钟分“高速”和“低速”两类,需根据外设需求选择:
•高速总线(PERI):ACLK_PERI(100-300M,如EMMC/USB/GMAC)、HCLK_PERI(37-150M)
•低速总线(BUS):ACLK_BUS(100-300M,如I2C/I2S/SPI)、PCLK_BUS(50-150M)
2. GPIO输出时钟:降成本的关键设计
很多场景下,可通过SOC的GPIO输出时钟替代外部晶振(如WiFi、摄像头),减少外围电路成本。但需满足3个前提:
(1)核心配置条件
1.IOMUX配置:GPIO必须支持“CLK输出”功能(需查芯片TRM确认);
2.频率匹配:优先选择晶振bypass输出(如24M),信号质量最优;若从PLL分频,需确认外设是否接受信号抖动;
3.驱动能力:部分GPIO输出波形差,需调整IO驱动能力寄存器。
(2)主流芯片对应关系(示例)
| 芯片型号
|
时钟名称
|
对应GPIO
|
支持频率
|
| RK3399
|
SCLK_TEstOUT
|
GPIO2_D1/GPIO0_B0
|
24M、32K
|
| RK3566/8
|
CLK_MAC0_OUT
|
GPIO2_C1
|
24M、25M、50M、125M
|
| RK3588
|
REFCLKOUT
|
GPIO0_A0
|
24M
|
| RK3576
|
REF_CLK0_OUT
|
GPIO0_A0
|
12M、24M、27M等
|
3. PLL展频:解决EMI超标的“神器”
时钟信号是EMI(电磁干扰)的主要来源——高频时钟能量集中在窄频段,易超标。PLL展频(SSCG)通过“将能量分散到宽频段”,降低EMI峰值,是合规关键。
(1)核心参数
•调制速度:30-120KHz(需高于人耳听觉范围20KHz,避免噪音);
•调制深度:0.1%-4%(深度越大,EMI降得越多,但需兼容外设频率容忍度)。
(2)配置逻辑
•非RK3588芯片:需先开启PLL小数模式(dsmpd=0),再配置展频幅度(ssmod_spread)和速率(ssmod_pval);
•RK3588芯片:单独配置sscg_en使能,再设幅度(mrr)、速率(mfr)和模式(center spread最优,降抖动)。
二、RK平台CLK实操调试步骤:从查看状态到问题定位
调试时钟需按“先看状态→再控参数→最后测输出”的流程,以下是关键步骤和命令:
1.第一步:查看时钟树状态
先确认当前时钟树结构、频率、使能状态,定位异常时钟:
# 查看所有时钟的父时钟、当前频率、使能计数cat/sys/kernel/debug/clk/clk_summary
关键关注:
•parent:是否为预期的父时钟(如LCDC时钟应指向独占PLL);
•rate:当前频率是否符合需求(如百兆以太网需50M);
•enable count:使能计数是否为1(0表示时钟未开启)。
2.第二步:控制时钟频率与使能
通过/sys/kernel/debug/clk/[时钟名]/节点,直接调整频率和使能:
# 1. 查看指定时钟当前频率(以saradc为例)cat /sys/kernel/debug/clk/clk_saradc/clk_rate# 2. 设置时钟频率(如设为24M)echo24000000>/sys/kernel/debug/clk/clk_saradc/clk_rate# 3. 使能时钟(kernel <6.1)echo1>/sys/kernel/debug/clk/clk_saradc/clk_enable_count# 3. 使能时钟(kernel ≥6.1,需用prepare_enable)echo1>/sys/kernel/debug/clk/clk_saradc/clk_prepare_enable# 4. 关闭时钟echo0>/sys/kernel/debug/clk/clk_saradc/clk_enable_count
3.第三步:GPIO输出时钟调试(以RK3399为例)
若需用GPIO输出24M时钟(替代外部晶振),步骤如下:
# 1. 设置测试时钟频率为24Mecho24000000 > /sys/kernel/debug/clk/clk_testout1_pll_src/clk_rateecho24000000 > /sys/kernel/debug/clk/clk_testout1/clk_rate# 2. 使能测试时钟echo1 > /sys/kernel/debug/clk/clk_testout1/clk_enable_count# 3. 配置GPIO2_D1为CLK输出功能(IOMUX)io -4 0xff77e004 0x000c0008
其他芯片参考:
•RK3566/8输出CAM_CLK:io -4 0xfdc60064 0x70001000+echo 27000000 > /sys/kernel/debug/clk/clk_cam0_out/clk_rate
•RK3588输出REFCLKOUT:io -4 0xfd5f0000 0x000f0001
4.第四步:TEST_CLK_OUT硬件测试
若需直接测量时钟波形(如确认LCDC DCLK),需配置TEST_CLK_OUT引脚:
1.配置MUX:选择要输出的时钟源(如ACLK_PERI);
# RK3399配置TEST_CLK源为24M(寄存器CRU_MISC_CON,地址0xff76050c)io-40xff76050c0x00000800
1.配置DIV:设置分频比(如1分频,输出原频率);
# RK3399配置分频比为1(寄存器CRU_CLKSEL58_CON,地址0xff7601e8)io-40xff7601e80x0f000000
1.使能GATING:打开时钟门控;
# RK3399使能TEST_CLK(寄存器CRU_CLKGATE13_CON,地址0xff760334)io-40xff7603340x00000001
1.用示波器测量TEST_CLK_OUT引脚波形。
5.第五步:PLL展频调试(以RK3588 GPLL为例)
若EMI超标,需配置PLL展频:
# 1. 设置展频速率30KHz、幅度0.5%、模式为center spreadio-40xfd7c01cc0x00ff000c # 速率30KHzio-40xfd7c01cc0x3f000500 # 幅度0.5%io-40xfd7c01cc0xc0008000 # center spread模式# 2. 使能展频功能io-40xfd7c01d00x00010001
三、常见问题与解决方案:避坑指南
1. PLL频率设置失败,返回- 1
•现象:调用clk_set_rate设置PLL频率,返回负数;
•原因:目标频率不在PLL频率表格中(如RK3399的rk3399_pll_rates);
•解决方案:按PLL公式补全频率表格:
// 公式:VCO=24M*FBDIV/REFDIV(450M~2200M);FOUT=VCO/POSTDIV1/POSTDIV2// 示例:添加594M频率(VCO=1188M=24*99/2,FOUT=1188/2/1)RK3036_PLL_RATE(594000000,2,99,2,1,1,0),
2.小数分频时钟抖动大、频偏超标
•现象:I2S/UART用小数分频后,信号抖动超外设容忍范围;
•原因:未满足“小数分频父时钟频率≥分频后频率×20”;
•解决方案:调整父时钟频率(如分频后需12M,父时钟需≥240M)。
3.以太网时钟不精准,通信丢包
•现象:百兆以太网(需50M)/千兆以太网(需125M)丢包、ping不通;
•原因:PLL输出时钟精度不足,或未使用独立时钟源;
•解决方案:
a.确认PLL频率精准(如GMAC独占CPLL,设为50M/125M);
b.若仍不精准,改用外部晶振(需硬件支持)。
4. LCD显示异常(花屏、闪屏)
•现象:LCD无显示或显示异常,排查后是DCLK问题;
•原因:LCDC未独占指定PLL(如RK3399双显需VOP0绑定VPLL、VOP1绑定CPLL);
•解决方案:在DTS中配置独占PLL:
// RK3399 VOP0(HDMI)绑定VPLL&vopb_rk_fb {assigned-clocks = <&cru DCLK_VOP0_DIV>;assigned-clock-parents = <&cru PLL_VPLL>;};
5.展频后DDR死机、USB测试失败
•现象:打开PLL展频后,DDR崩溃、USB 2.0频率测试不通过;
•原因:展频幅度过大,超出DDR/USB PHY的容忍范围;
•解决方案:
a.降低展频幅度(如从2%降至0.5%);
b.DDR展频需在LOADER阶段配置(避免运行中调整时钟);
c.USB需确认PHY弹性buffer大小(buffer小则幅度需更小)。
6.时钟被误关闭,外设无法启动
•现象:外设(如I2C)启动失败,clk_summary显示时钟enable count为0;
•原因:时钟未配置“常开”属性,初始化后被系统关闭;
•解决方案:
a.kernel <6.1:添加CLK_IGNORE_UNUSEDflag;
GATE(PCLK_PMUGRF_PMU,"pclk_pmugrf_pmu","pclk_pmu_src", CLK_IGNORE_UNUSED, RK3399_PMU_CLKGATE_CON(1),1, GFLAGS),
a.kernel ≥6.1:添加CLK_IS_CRITICALflag,或在bootargs加clk_gate.always_on=1。
四、总结与注意事项
1.芯片差异是关键:不同RK芯片(如RK3588 vs RK3328)的时钟方案、寄存器地址差异大,调试前务必参考对应芯片的TRM和官方指南;
2.优先软件调试,再动硬件:先通过sys/debug节点调整时钟,确认逻辑正确后,再固化到DTS或驱动;
3.展频需谨慎:展频虽降EMI,但可能影响敏感外设(如以太网、CAN),需充分做稳定性测试;
4.文档参考:遇到问题可查阅瑞芯微官方文档:
◦《Rockchip Clock开发指南》(时钟子系统框架);
◦《Rockchip Gpio Output Clocks》(GPIO输出时钟配置);
◦《Rockchip PLL展频功能详细说明》(EMI优化)。
时钟子系统虽复杂,但掌握“基础框架→调试工具→问题定位”的逻辑后,就能轻松应对。如果本文对你有帮助,欢迎点赞、转发,评论区交流你的调试踩坑经历!
推荐阅读:
时间跨度长达13年 A股又一百亿级财务造假案曝光!5家上市公司造假细节浮出水面





