Linux-Linux内核如何得知CPU的主频
自己定制了一款开发板,CPU用的arm926,Linux启动后,查看/proc/cpuinfo的信息如下:
root@192.201.0.10:~# cat /proc/cpuinfo
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 201.93
Features : swp half thumb fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
Hardware : DaVinci DM646x EVM
Revision : 0000
Serial : 0000000000000000
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
根据我的经验,CPU主频应该在u-boot启动前就已经设置好了,这取决于你的开发板启动过程。
不知道你用的哪个厂家的ARM9,如果是LPC的话,启动过程如下:
1. LPC在内部ROM固化了一段启动代码,叫做bootstrap,它的功能是寻找可用的1级boot(寻找的源包括UART、NorFlash、NandFlash等),并将该1级boot copy到内部ram,然后设置ARM内部地址映射,将内部RAM映射到0x0000 0000 地址,并执行1级boot。
注意:这个1级boot有大小限制,一般不超过54k。
2. 1级boot的功能就比较多样了,LPC有一个通用的1级boot,叫做kickstart,功能是初始化板级系统(如果需要),找到2级boot,load到内存并执行。
3. 2级boot根据存储位置的不同,可以是uboot,也可以是另一个bootloader,比如LPC提供的S1lstage,由S1L来启动uboot。
说到这感觉有点乱,因为根据bootloader的存储位置不同,芯片会有不同的尺寸限制。取决于 ajaxhe 的开发板的详细资料。
总体的思路是在你的uboot运行之前,系统时钟肯定已经设定好了,不然怎么能保证uboot被正确加载到SDRAM并运行呢?因为我跑uCOS和前后台程序比较多,对uboot的功能不了解。所以暂时没有更好的建议。如果ajaxhe提供更多板级资料,我们再研究。
确实是在uboot中有设置
在/cpu/arm926ejs/davinci/lovwlevel_init.S文件中进行了设置:
/* Program the PLL Multiplier */
ldr r6, PLL2_PLLM
mov r2, $0x17 /* 162 MHz */
str r2, [r6]
/* Program the PLL2 Divisor Value */
ldr r6, PLL2_DIV1
mov r4, $0x0b /* 54 MHz */
str r4, [r6]
可以看到上面两段代码对倍频寄存器(PLL2_PLLM)和分频寄存器进行了设置(PLL2_DIV1)。楼主可以对应你的datasheet进行修改。
在/cpu/arm926ejs/davinci/cpu.c中有这样一个函数
int print_cpuinfo(void)
{
/* REVISIT fetch and display CPU ID and revision information
* too ... that will matter as more revisions appear.
*/
printf("Cores: ARM %d MHz",
pll_sysclk_mhz(DAVINCI_PLL_CNTRL0_BASE, ARM_PLLDIV));
#ifdef DSP_PLLDIV
printf(", DSP %d MHz",
pll_sysclk_mhz(DAVINCI_PLL_CNTRL0_BASE, DSP_PLLDIV));
#endif
printf("nDDR: %d MHzn",
/* DDR PHY uses an x2 input clock */
pll_sysclk_mhz(DAVINCI_PLL_CNTRL1_BASE, DDR_PLLDIV)
/ 2);
return 0;
}
该函数负责在输出ARM,DDR的频率
主频是在uboot里得到的。
CPU的主频是在uboot里设置的。
对于这种嵌入式的开发板,uboot的一部分功能就类比pc上的bios
可以使用两种方式设置主频:
* 用"cpufreq" 设置主频,生成"cpu_frq"变量
* 使用memory write(MW)命令直接写对应内存地址,改变主频。