根据我们的 AM3356电子保险丝(0x44E10600为0x0001fef)、它仅支持300MHz 的 CPU 时钟。 我们的 U-Boot 和 Linux 配置基于 Arago 处理器 SDK 中的 AM3356 EVM。 查看 U-Boot 代码、我们的板级代码使用以下 MPU PLL 配置:
const 结构 DPLL_params * get_DPLL_MPU_params (void)
{
int ind = get_sys_clk_index();
int freq = AM335x_get_efuse_mpu_max_freq (cdev);
开关(freq){
[...]
MPUPLL_M_300案例:
返回&DPLL_MPU_opp[ind][0];
}
[...]
}
const 结构 DPLL_params DPLL_MPU_opp[NUM_CRYSTRAL_FREQ][NUM_OPPS]={
[...]
{ /* 25MHz */
{24、0、2、-1、-1、 -1、-1}、 /* OPP 50 */
[...]
我们可以确认这些是实际使用的 PLL 设置(M2 = 2)。
问题1:产生的 CPU 频率是多少? 是25MHz * 24 = 600MHz 还是25MHz * 24 / 2 = 300MHz?
当 Linux 启动时、它 仅使用 MPU PLL N 和 M (而不是 M2)计算 CPU 时钟、并假设 CPU 以600MHz 运行:
[1.365424] cpufreq:cpufreq_online:cpu0:以未列出的 freq 运行:600000 KHz
问题2:Linux 是否正确使用 CPU 时钟"DPLL_MPU_ck "作为 CPU 时钟源而不是"DPLL_MPU_m2_ck "?
使用我们的 efuse 值0x0001fef、根据 arch/arm/boot/dts/am33xx.dtsi、唯一兼容的 OPP 是"opp50-3000000":
CPU0_opp_table:opp-table{
兼容="操作点 v2-ti-cpu";
SYSCON =<&SCM_conf>;
/*
*以下三个节点标有 opp-suspend
因为不能在上同时启用
*单个 SoC。
*
opp50-300000000{
opp-Hz =/bits/64 <300000000>;
op-microvolt =<950000 931000 96900000>;
opp-supported-HW =<0x06 0x0010>;
opp-suspend;
};
opp100-275000000{
opp-Hz =/bits/64 <275000000>;
op-microvolt =<1100000 1078000 1122000>;
opp-supported-HW =<0x01 0x00FF>;
opp-suspend;
};
opp100-300000000{
opp-Hz =/bits/64 <300000000>;
op-microvolt =<1100000 1078000 1122000>;
opp-supported-HW =<0x06 0x0020>;
opp-suspend;
};
opp100-500000000{
opp-Hz =/bits/64 <500000000>;
op-microvolt =<1100000 1078000 1122000>;
opp-supported-HW =<0x01 0xFFF>;
};
opp100-600000000{
opp-Hz =/bits/64 <6000000000000>;
op-microvolt =<1100000 1078000 1122000>;
opp-supported-HW =<0x06 0x0040>;
};
opp120-600000000{
opp-Hz =/bits/64 <6000000000000>;
op-microvolt =<1200000 1176000 1224000>;
opp-supported-HW =<0x01 0xFFF>;
};
[...]
问题3:"opp100-300000000"也不应该是兼容模式?
在 Linux 中禁用 cpufreq 驱动程序与"opp50-300000000"下的操作相比、显著加快了 Linux 启动过程。 我们假设 U-Boot 中的 MPU PLL 设置在本例中保持不变。
问题4:如果 U-Boot 将 MPU PLL 正确配置为300MHz、为什么 Linux cpufreq 驱动程序是否启用有所不同?