歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> I2C子系統之I2C總線時鐘頻率設置

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

日期:2017/3/1 10:12:44   编辑:Linux編程

時鐘相關基本知識可先參考這篇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. s3c24xx_register_baseclocks(xtal);
  7. s3c244x_setup_clocks();
  8. s3c2410_baseclk_add();
  9. }

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. clk_xtal.rate = xtal;
  5. /* register our clocks */
  6. if (s3c24xx_register_clock(&clk_xtal) < 0)
  7. printk(KERN_ERR "failed to register master xtal\n");
  8. if (s3c24xx_register_clock(&clk_mpll) < 0)
  9. printk(KERN_ERR "failed to register mpll clock\n");
  10. if (s3c24xx_register_clock(&clk_upll) < 0)
  11. printk(KERN_ERR "failed to register upll clock\n");
  12. if (s3c24xx_register_clock(&clk_f) < 0)
  13. printk(KERN_ERR "failed to register cpu fclk\n");
  14. if (s3c24xx_register_clock(&clk_h) < 0)
  15. printk(KERN_ERR "failed to register cpu hclk\n");
  16. if (s3c24xx_register_clock(&clk_p) < 0)
  17. printk(KERN_ERR "failed to register cpu pclk\n");
  18. return 0;
  19. }

依次向注冊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. clk_mpll.rate = fclk;
  8. clk_h.rate = hclk;
  9. clk_p.rate = pclk;
  10. clk_f.rate = fclk;
  11. }
Copyright © Linux教程網 All Rights Reserved