Linux内核如何得知CPU的主频
自己定制了一款开发板,CPU用的arm926,Linux启动后,查看/proc/cpuinfo的信息如下:
[email protected]:~# 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
查看/proc/davinci_clocks的信息如下:
[email protected]:~# cat /proc/davinci_clocks
ref_clk users=21 27000000 Hz
pll1 users=19 pll 810000000 Hz
pll1_sysclk1 users= 0 pll 810000000 Hz
dsp users= 1 psc 810000000 Hz
pll1_sysclk2 users= 6 pll 405000000 Hz
arm users= 1 405000000 Hz
这里我们只关注
arm users= 1 405000000 Hz
根据我们的测算,arm的应该分得的频率为496MHz,而linux下显示的却是405MHz。
我的问题是:
Linux内核如何得知CPU的主频?CPU的主频又是在哪里设置的呢?
谢谢!
PS:
Linux是通过uboot挂载并引导启动的。
Answers
根据我的经验,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提供更多板级资料,我们再研究。