在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。
全部博文(197)
分类: LINUX
2007-11-11 11:45:03
问题 , 我发在这里勒:
=
去看datasheet , 看的更是一头雾水 , 我正在努力看,
熟悉2410的大侠能否通俗的讲讲 ,对于初始化来讲, 怎么确定 FCLK ,PCLK mpll ,
等这些数值呢? 对于porting kernel的人来讲, 这些数值太重要了。
++++++++++++++++++++
[自己回复]
仔细的分析了一下, 在piaoxiang网友的帮助,自己分析了clock的datasheet和代码,
现把分析的结果放在这里:
看的时候, 对照着原来的driver 和datasheet ,了解到流程很简单,
1> 读取 MPLLCON 寄存器 , 比如读到 mpllcon_value 变量中,
2> 对 mpllcon_value 分别移位操作, 取得 MDIV ,PDIV ,SDIV
3> 利用公式:
Mpll = (m * Fin) / (p * 2^s)
m = (MDIV + 8), p = (PDIV + 2), s = SDIV
4> fclk = Mpll
5》 读取 CLKDIVN 寄存器 ,
6》 然后作相应的计算: 求出 FCLK , HCLK , PCLK (WATCHDOG 用到了,我们kernel就要初始化)
HDIVN |
[1] |
0: HCLK has the clock same as the FCLK. |
0 |
|
|
1: HCLK has the clock same as the FCLK/2. |
|
PDIVN |
[0] |
0: PCLK has the clock same as the HCLK. |
0 |
|
|
1: PCLK has the clock same as the HCLK/2. |
|
到现在流程已经知道了, 估计 2410自带的代码也忘记的差不多了,那就可以自己写了。 只有自己写, 才能发现自己的问题, 也才能领会 作者那样写的妙处,当然作者也不见得都对
我就自己重新实现了一个,
我自己写的时候, 就会考虑几个问题,
1> 我是要int 还是用 u32 ,会不会溢出呢?还有可移植性。
2> 小的临时变量 是用 u8 , 还是 u32
3> datasheet 有没有提到有些操作需要delay ,比如 delay(400) 什么的?
4> 最后 拿到板子上去验证。 看写的有没有问题?
自己实现的, 后面 有 2410 作者写的。 自己对比一下 。
static inline u32 s3c2410_get_pll_bob_version(u32 Fin, u32 mpllcon_value)
{
//u8 is enought for mdiv and pdiv and sdiv
u8 mdiv = 0; //作者都用
u8 pdiv = 0;
u8 sdiv = 0;
u32 mpll = 0;
//相比作者的代码, 这里面没有用 宏来标记一些bit 或者bitmask 。别人看起来可能一头污水, 不过标出来
//refer P240 CLOCK DIVIDER CONTROL (CLKDIVN) REGISTER 这样别人就一下子知道了。
mdiv = (mpllcon_value & ((1<<20) -1)) >> 12;
pdiv = (mpllcon_value & ((1<<10)-1)) >>4;
sdiv = (mpllcon_value & ((1<<2)-1)) >> 0; //我个人觉得 >> 0 很有意义。比不加强。
//see manual P237
mpll = (mdiv+8) * Fin;
mpll /=(pdiv+2);
mpll >>= sdiv;
printk("in s3c2410_get_mpll_bob_version() , mpll = %u\n",mpll);
return mpll;
}
void __init s3c2410_init_clocks(int xtal) //Õa¸öxtal¾íêÇ»ù±¾μÄêäèëÆμÂê12MHz
{
u32 mpll = 0;
u32 clock_mpllcon = 0;
u32 fclk = 0;
管理员在2009年8月13日编辑了该文章文章。