前段时间查看了uboot的时钟,kernel的也稍微了解了下,记录于此,以后再来补充完善。

  1. board-mx6q_sabresd.c
  2. MACHINE_START(MX6Q_SABRESD, "Freescale i.MX 6Quad/DualLite/Solo Sabre-SD Board")
  3. /* Maintainer: Freescale Semiconductor, Inc. */
  4. .boot_params = MX6_PHYS_OFFSET + 0x100,
  5. .fixup = fixup_mxc_board,
  6. .map_io = mx6_map_io,
  7. .init_irq = mx6_init_irq,
  8. .init_machine = mx6_sabresd_board_init,
  9. .timer = &mx6_sabresd_timer, ---------+
  10. .reserve = mx6q_sabresd_reserve, |
  11. MACHINE_END |
  12. |
  13. static struct sys_timer mx6_sabresd_timer = { <----+
  14. .init = mx6_sabresd_timer_init, -----+
  15. }; |
  16. |
  17. static void __init mx6_sabresd_timer_init(void) <----+
  18. {
  19. struct clk *uart_clk;
  20. #ifdef CONFIG_LOCAL_TIMERS
  21. twd_base = ioremap(LOCAL_TWD_ADDR, SZ_256);
  22. BUG_ON(!twd_base);
  23. #endif
  24. mx6_clocks_init(32768, 24000000, 0, 0); -------------+
  25. |
  26. uart_clk = clk_get_sys("imx-uart.0", NULL); |
  27. early_console_setup(UART1_BASE_ADDR, uart_clk); |
  28. } |
  29. |
  30. int __init mx6_clocks_init(unsigned long ckil, unsigned long osc, <---+
  31. unsigned long ckih1, unsigned long ckih2)
  32. {
  33. __iomem void *base;
  34. int i, reg;
  35. u32 parent_rate, rate;
  36. unsigned long ipg_clk_rate, max_arm_wait_clk;
  37. external_low_reference = ckil; //32768
  38. external_high_reference = ckih1; //0
  39. ckih2_reference = ckih2; //0
  40. oscillator_reference = osc; //24000000
  41. // 2080000 + 18000 = 2098000
  42. timer_base = ioremap(GPT_BASE_ADDR, SZ_4K);
  43. // 208000 + 48000 = 20C8000
  44. apll_base = ioremap(ANATOP_BASE_ADDR, SZ_4K);
  45. for (i = 0; i < ARRAY_SIZE(lookups); i++) {
  46. clkdev_add(&lookups[i]);
  47. clk_debug_register(lookups[i].clk);
  48. }
  49. ......
  50. /*
  51. * We don't set ipu1_di_clk[1]'s parent clock to
  52. * pll5_video_main_clk as bootloader may need
  53. * the parent to be ldb_di1_clk to support LVDS
  54. * panel splashimage.
  55. */
  56. clk_set_parent(&ipu1_di_clk[0], &pll5_video_main_clk); -----------+
  57. #ifndef CONFIG_MX6_CLK_FOR_BOOTUI_TRANS |
  58. clk_set_parent(&ipu1_di_clk[1], &pll5_video_main_clk); |
  59. #endif |
  60. clk_set_parent(&ipu2_di_clk[0], &pll5_video_main_clk); |
  61. clk_set_parent(&ipu2_di_clk[1], &pll5_video_main_clk); |
  62. |
  63. clk_set_parent(&emi_clk, &pll2_pfd_400M); |
  64. clk_set_rate(&emi_clk, 200000000); |
  65. |
  66. ........... |
  67. } |
  68. |
  69. static struct clk ipu1_di_clk[] = { <------------------+
  70. {
  71. __INIT_CLK_DEBUG(ipu1_di_clk_0)
  72. .id = 0,
  73. .parent = &pll5_video_main_clk,
  74. .enable_reg = MXC_CCM_CCGR3,
  75. .enable_shift = MXC_CCM_CCGRx_CG1_OFFSET,
  76. .enable = _clk_enable,
  77. .disable = _clk_disable,
  78. .set_parent = _clk_ipu1_di0_set_parent, -------+
  79. .set_rate = _clk_ipu1_di0_set_rate, |
  80. .round_rate = _clk_ipu_di_round_rate, |
  81. .get_rate = _clk_ipu1_di0_get_rate, |
  82. .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE, |
  83. }, |
  84. { |
  85. __INIT_CLK_DEBUG(ipu1_di_clk_1) |
  86. .id = 1, |
  87. .parent = &pll5_video_main_clk, |
  88. .enable_reg = MXC_CCM_CCGR3, |
  89. .enable_shift = MXC_CCM_CCGRx_CG2_OFFSET, |
  90. .enable = _clk_enable, |
  91. .disable = _clk_disable, |
  92. .set_parent = _clk_ipu1_di1_set_parent, |
  93. .set_rate = _clk_ipu1_di1_set_rate, |
  94. .round_rate = _clk_ipu_di_round_rate, |
  95. .get_rate = _clk_ipu1_di1_get_rate, |
  96. .flags = AHB_HIGH_SET_POINT | CPU_FREQ_TRIG_UPDATE, |
  97. }, |
  98. }; |
  99. |
  100. static int _clk_ipu1_di0_set_parent(struct clk *clk, struct clk *parent) <----+
  101. {
  102. u32 reg, mux;
  103. if (parent == &ldb_di0_clk)
  104. mux = 0x3;
  105. else if (parent == &ldb_di1_clk)
  106. mux = 0x4;
  107. else {
  108. reg = __raw_readl(MXC_CCM_CHSCCDR)
  109. & ~MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_MASK;
  110. mux = _get_mux6(parent, &mmdc_ch0_axi_clk[0],
  111. &pll3_usb_otg_main_clk, &pll5_video_main_clk,
  112. &pll2_pfd_352M, &pll2_pfd_400M, &pll3_pfd_540M);
  113. reg |= (mux << MXC_CCM_CHSCCDR_IPU1_DI0_PRE_CLK_SEL_OFFSET);
  114. __raw_writel(reg, MXC_CCM_CHSCCDR);
  115. /* Derive clock from divided pre-muxed ipu1_di0 clock.*/
  116. mux = 0;
  117. }
  118. reg = __raw_readl(MXC_CCM_CHSCCDR)
  119. & ~MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_MASK;
  120. __raw_writel(reg | (mux << MXC_CCM_CHSCCDR_IPU1_DI0_CLK_SEL_OFFSET),
  121. MXC_CCM_CHSCCDR);
  122. return 0;
  123. }

Tony Liu

2016-8-30, Shenzhen

imx6 kernel clock的更多相关文章

  1. imx6 lvds 代码分析

    查看imx6 kernel中lvds设备和驱动的初始化过程. 相关文档: arm/arm/mach-mx6/board-mx6q_sabresd.c kernel/drivers/video/mxc/ ...

  2. Minix2.0操作系统kernel文件分析

    详细分析  MINIX消息机制的核心: mpx386.s start.c proc.c 保护模式分析: src/kernel/exception.c src/kernel/protect.c src/ ...

  3. imx6 18bit display

    imx6 kernel中使用18bit的lcd,uboot中bootargs参数bpp=32,lcd才能够正常显示. "bootargs=console=ttymxc0,115200 ini ...

  4. kernel对NTP的API,系统调用函数

    kenrel API for NTP kernel 提供两个API(即系统调用 system call)给应用程序NTP,去校准kernel system clock Kernel Applicati ...

  5. minix2.0内核组织结构与公用头文件说明

    Minix2.0操作系统的源代码由两个目录组成:include/目录和src/目录 include/目录包含了操作系统所有的头文件(即.h文件) src/目录下包含了操作系统所有的源文件(.c或.s文 ...

  6. saltstack实战4--综合练习1

    规范配置管理 实际工作中可能会有现网环境,基线环境,开发环境. 需要使用saltstack统一管理.机器多了,业务多了,可能配置文件存放的会比较乱,因此可以统一管理起来 我们可以再加2个目录,test ...

  7. #定位系统性能瓶颈# perf

    perf是一个基于Linux 2.6+的调优工具,在liunx性能測量抽象出一套适应于各种不同CPU硬件的通用測量方法,其数据来源于比較新的linux内核提供的 perf_event 接口 系统事件: ...

  8. 学习linux命令,看这篇2w多字的linux命令详解

    用心分享,共同成长 没有什么比每天进步一点点更重要了 本文已收录到我的github:https://github.com/midou-tech/articles/tree/master/docs/li ...

  9. imx6 uboot lvds clock

    在uboot中添加logo,lvds接口的lcd显示不正常,出现波动.网上说是lvds时钟频率的问题. 使用示波器测量之后,发现频率是60M,而lcd最大频率才46.8M. 因此就需要更改uboot中 ...

随机推荐

  1. Scala - Spark Lambda“goesto“ => 分析

    /// 定义一个函数AddNoise,参数分别为rdd,Fraction.其中rdd为(BreezeDenseMatrix, BreezeDenseMatrix)元组构成的RDD.Fraction为一 ...

  2. Windows Server 2012 FTP配置 后客户机一直登录不上

    配置FTP时出现奇怪的问题,服务器配置完成后客户机访问FTP站点时输入用户名密码一直不对. 经多次试验后发现,默认情况下是如下图配置.将用户下次登录时必须更改密码勾掉,勾选密码永不过期即可正常登录.

  3. 当一回Android Studio 2.0的小白鼠

    上个星期就放出了Android studio出2.0的消息,看了一下what's new 简直抓到了那个蛋疼的编译速度痛点.在网上稍微搜索了一下后发现基本都是介绍视频.一番挣扎后(因为被这IDE坑过几 ...

  4. [ZZ] D3D中的模板缓存(3)

    http://www.cppblog.com/lovedday/archive/2008/03/25/45334.html http://www.cppblog.com/lovedday/ D3D中的 ...

  5. Javascript 笔记与总结(2-11)暴力操作节点

    innerHTML 代表节点内的内容,能读能写 虽然不是 W3C 规定的标准,但是各浏览器都支持得很好 [例] <!DOCTYPE html> <html lang="en ...

  6. Ubuntu 12.04 卸载 VMware

    cd /usr/bin sudo vmware-installer -u vmware-player

  7. Python实用工具包Scrapy安装教程

       对于想用每个想用Python开发网络爬虫的开发者来说,Scrapy无疑是一个极好的开源工具.今天安装之后觉得Scrapy的安装确实不易啊.所以在此博文一篇,往后来着少走弯路. 废话不多说了,如果 ...

  8. flink - accumulator

      读accumlator JobManager 在job finish的时候会汇总accumulator的值, newJobStatus match { case JobStatus.FINISHE ...

  9. java 形参实参

    java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. public class TestFun { public static v ...

  10. 小米2/2S 手机由 Smartisan OS ROM 刷回 MIUI 教程

    刷机所需文件1.请前往 MIUI 官网下载小米 2/2S 标准版 MIUI ROM 包.下载地址:http://www.miui.com/getrom.php?r=2:下载后请将原文件名修改为“upd ...