歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

I2C子系統之I2C總線時鐘頻率設置

時鐘相關基本知識可先參考這篇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. }  
Copyright © Linux教程網 All Rights Reserved