SYSCLK是CPU CORE的时钟源,通过PLL倍频,可以得到CCB时钟频率,CCB通过倍频可以分别得到core0 和core1的时钟频率。U-BOOT的串口输出时显示的频率,是由上面提到的两个PLL倍数计数得到的。
这是一个只读寄存器,由硬件来配置各个倍频倍数。
Plat_Ratio 设定由SYSCLK倍频到CCB时钟的倍数
e500_1_Ratio设置由CCB时钟倍频到CPU core1时钟的倍数
e500_0_Ratio设置由CCB时钟倍频到CPU core0时钟的倍数
DDR_Ratio设置由DDRCLK倍频DDR Complex 时钟的倍数
以U-BOOT 2013.01版本为例,
U-Boot 2013.01 (Feb 11 2014 - 16:41:19)
CPU0: P2020E, Version: 2.1, (0x80ea0021)
Core: E500, Version: 5.1, (0x80211051)
Clock Configuration:
CPU0:800 MHz, CPU1:800 MHz,
CCB:400 MHz,
DDR:400 MHz (800 MT/s data rate) (Asynchronous), LBC:25 MHz
在一段启动的时候会通过初始化序列调用checkcpu函数,获得各个核的时钟频率,DDR时钟速率,LBC速率等时钟数值
get_sys_info(&sysinfo);
puts("Clock Configuration:");
for_each_cpu(i, core, nr_cores, mask) {
if (!(i & 3))
printf ("\n ");
printf("CPU%d:%-4s MHz, ", core,
strmhz(buf1, sysinfo.freqProcessor[core]));
}
printf("\n CCB:%-4s MHz,\n", strmhz(buf1, sysinfo.freqSystemBus));
上面代码只是字符串的输出,字符串输出前会调用get_sys_info(&sysinfo)来计算实际的时钟数值
plat_ratio = (gur->porpllsr) & 0x0000003e;
plat_ratio >>= 1;
sysInfo->freqSystemBus = plat_ratio * CONFIG_SYS_CLK_FREQ;
我们关注的几个时钟的数值都是在上面函数技术出来的。
CONFIG_SYS_CLK_FREQ由板级头文件定义,在P2020RDB-PC中的定义为100M
#if defined(CONFIG_P2020RDB)
#define CONFIG_SYS_CLK_FREQ 100000000
#else
#define CONFIG_SYS_CLK_FREQ 66666666
#endif
#define CONFIG_DDR_CLK_FREQ 66666666