时钟相关基本知识可先参考这篇http://www.linuxidc.com/Linux/2012-02/54968.htm

下面直接从总线时钟初始化函数开始分析:

  1. void __init s3c244x_init_clocks(int xtal)  
  2. {  
  3.     /* initialise the clocks here, to allow other things like the 
  4.      * console to use them, and to add new ones after the initialisation 
  5.      */  
  6.   
  7.     s3c24xx_register_baseclocks(xtal);  
  8.     s3c244x_setup_clocks();  
  9.     s3c2410_baseclk_add();  
  10. }  

s3c24xx_init_clocks主要实现两个功能:

1.初始化s3c2440的总线时钟。通过s3c24xx_register_baseclocks(xtal)和s3c244x_setup_clocks实现

2.想系统注册外设时钟。通过s3c2410_baseclk_add()实现

首先分析初始化系统时钟

  1. int __init s3c24xx_register_baseclocks(unsigned long xtal)  
  2. {  
  3.     printk(KERN_INFO "S3C24XX Clocks, Copyright 2004 Simtec Electronics\n");  
  4.   
  5.     clk_xtal.rate = xtal;  
  6.   
  7.     /* register our clocks */  
  8.   
  9.     if (s3c24xx_register_clock(&clk_xtal) < 0)  
  10.         printk(KERN_ERR "failed to register master xtal\n");  
  11.   
  12.     if (s3c24xx_register_clock(&clk_mpll) < 0)  
  13.         printk(KERN_ERR "failed to register mpll clock\n");  
  14.   
  15.     if (s3c24xx_register_clock(&clk_upll) < 0)  
  16.         printk(KERN_ERR "failed to register upll clock\n");  
  17.   
  18.     if (s3c24xx_register_clock(&clk_f) < 0)  
  19.         printk(KERN_ERR "failed to register cpu fclk\n");  
  20.   
  21.     if (s3c24xx_register_clock(&clk_h) < 0)  
  22.         printk(KERN_ERR "failed to register cpu hclk\n");  
  23.   
  24.     if (s3c24xx_register_clock(&clk_p) < 0)  
  25.         printk(KERN_ERR "failed to register cpu pclk\n");  
  26.   
  27.     return 0;  
  28. }  

依次向注册clk_xtal、clk_mpll、clk_upll... ...clk_p等时钟,clk_p等的定义如下:

  1. struct clk clk_p = {  
  2.     .name       = "pclk",  
  3.     .id     = -1,  
  4.     .rate       = 0,  
  5.     .parent     = NULL,  
  6.     .ctrlbit    = 0,  
  7.     .ops        = &clk_ops_def_setrate,  
  8. };  

注册成功后然后通过s3c244x_setup_clocks->s3c24xx_setup_clocks(fclk, hclk, pclk)来初始化前面注册的各个时钟。

  1. void __init_or_cpufreq s3c24xx_setup_clocks(unsigned long fclk,  
  2.                        unsigned long hclk,  
  3.                        unsigned long pclk)  
  4. {  
  5.     clk_upll.rate = s3c24xx_get_pll(__raw_readl(S3C2410_UPLLCON),  
  6.                     clk_xtal.rate);  
  7.   
  8.     clk_mpll.rate = fclk;  
  9.     clk_h.rate = hclk;  
  10.     clk_p.rate = pclk;  
  11.     clk_f.rate = fclk;  
  12. }  
Logo

更多推荐