Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1640889
  • 博文数量: 197
  • 博客积分: 10046
  • 博客等级: 上将
  • 技术积分: 1983
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 12:36
个人简介

在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。

文章分类
文章存档

2011年(2)

2010年(6)

2009年(18)

2008年(30)

2007年(100)

2006年(41)

分类: 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日编辑了该文章文章。

-->
阅读(3933) | 评论(6) | 转发(0) |
给主人留下些什么吧!~~