1. /*******************************************************************************
  2. * I.MX6 U-boot PWM hacking
  3. * 说明:
  4. * 本文主要记录I.MX6 U-boot是如何配置PWM,发现文中的pwm0对应的引脚和真正的
  5. * 电路板的pwm0不是一个,也就意味着其实是引脚连接错了,另外之前一直有一个
  6. * 疑问:为什么双屏显示的时候,有一个屏在U-boot阶段和Kernel阶段总是不亮。原因
  7. * 应该是这里只初始化了一个显示控制部分,也就是不会初始两个PWM。
  8. *
  9. * 2016-3-7 深圳 南山平山村 曾剑锋
  10. ******************************************************************************/
  11.  
  12. cat bootable/bootloader/uboot-imx/board/freescale/mx6q_sabresd/mx6q_sabresd.c
  13. ......
  14. #ifdef CONFIG_LCD
  15. void lcd_enable(void)
  16. {
  17. ......
  18. imx_pwm_config(pwm0, , ); ------------+
  19. imx_pwm_enable(pwm0); ------------*-+
  20. | |
  21. #if defined CONFIG_MX6Q | |
  22. /* PWM backlight */ | |
  23. mxc_iomux_v3_setup_pad(MX6Q_PAD_SD1_DAT3__PWM1_PWMO); | |
  24. /* LVDS panel CABC_EN0 */ | |
  25. mxc_iomux_v3_setup_pad(MX6Q_PAD_NANDF_CS2__GPIO_6_15); | |
  26. /* LVDS panel CABC_EN1 */ | |
  27. mxc_iomux_v3_setup_pad(MX6Q_PAD_NANDF_CS3__GPIO_6_16); | |
  28. #elif defined CONFIG_MX6DL | |
  29. /* PWM backlight */ | |
  30. mxc_iomux_v3_setup_pad(MX6DL_PAD_SD1_DAT3__PWM1_PWMO); | |
  31. /* LVDS panel CABC_EN0 */ | |
  32. mxc_iomux_v3_setup_pad(MX6DL_PAD_NANDF_CS2__GPIO_6_15); | |
  33. /* LVDS panel CABC_EN1 */ | |
  34. mxc_iomux_v3_setup_pad(MX6DL_PAD_NANDF_CS3__GPIO_6_16); | |
  35. #endif | |
  36. ...... | |
  37. } | |
  38. ...... | |
  39. | |
  40. static struct pwm_device pwm0 = { <-----------+ |
  41. .pwm_id = , | |
  42. .pwmo_invert = , | |
  43. }; | |
  44. | |
  45. | |
  46. int imx_pwm_config(struct pwm_device pwm, int duty_ns, int period_ns) <----+ |
  47. { |
  48. unsigned long long c; |
  49. unsigned long period_cycles, duty_cycles, prescale; |
  50. u32 cr; |
  51. |
  52. if (period_ns == || duty_ns > period_ns) |
  53. return -; |
  54. |
  55. pwm.mmio_base = pwm.pwm_id ? (unsigned long)IMX_PWM2_BASE: |
  56. (unsigned long)IMX_PWM1_BASE; |
  57. |
  58. if (pwm.pwmo_invert) |
  59. duty_ns = period_ns - duty_ns; |
  60. |
  61. c = mxc_get_clock(MXC_IPG_PERCLK); |
  62. c = c * period_ns; |
  63. do_div(c, ); |
  64. period_cycles = c; |
  65. |
  66. prescale = period_cycles / 0x10000 + ; |
  67. |
  68. period_cycles /= prescale; |
  69. c = (unsigned long long)period_cycles * duty_ns; |
  70. do_div(c, period_ns); |
  71. duty_cycles = c; |
  72. |
  73. writel(duty_cycles, pwm.mmio_base + MX_PWMSAR); |
  74. writel(period_cycles, pwm.mmio_base + MX_PWMPR); |
  75. |
  76. cr = MX_PWMCR_PRESCALER(prescale) | |
  77. MX_PWMCR_STOPEN | MX_PWMCR_DOZEEN | |
  78. MX_PWMCR_WAITEN | MX_PWMCR_DBGEN; |
  79. |
  80. cr |= MX_PWMCR_CLKSRC_IPG_HIGH; |
  81. |
  82. writel(cr, pwm.mmio_base + MX_PWMCR); |
  83. |
  84. return ; |
  85. } |
  86. |
  87. int imx_pwm_enable(struct pwm_device pwm) <----------------+
  88. {
  89. unsigned long reg;
  90. int rc = ;
  91.  
  92. if (pwm.enable_pwm_clk)
  93. pwm.enable_pwm_clk();
  94.  
  95. pwm.mmio_base = pwm.pwm_id ? (unsigned long)IMX_PWM2_BASE:
  96. (unsigned long)IMX_PWM1_BASE;
  97.  
  98. reg = readl(pwm.mmio_base + MX_PWMCR);
  99. reg |= MX_PWMCR_EN;
  100. writel(reg, pwm.mmio_base + MX_PWMCR);
  101.  
  102. if (pwm.enable_pwm_pad)
  103. pwm.enable_pwm_pad();
  104.  
  105. return rc;
  106. }

I.MX6 U-boot PWM hacking的更多相关文章

  1. I.MX6 U-boot lvds display hacking

    /*********************************************************************************** * I.MX6 U-boot ...

  2. I.MX6 Power off register hacking

    /*********************************************************************** * I.MX6 Power off register ...

  3. I.MX6 android BatteryService jni hacking

    /**************************************************************************** * I.MX6 android Batter ...

  4. I.MX6 Ar8031 device register hacking

    /***************************************************************************** * I.MX6 Ar8031 device ...

  5. I.MX6 change boot partition 1 to User area

    /************************************************************************************ * I.MX6 change ...

  6. I.MX6 PWM buzzer driver hacking with Demo test

    /***************************************************************************** * I.MX6 PWM buzzer dr ...

  7. I.MX6 天嵌 E9 U-boot menu hacking

    /************************************************************************************ * I.MX6 天嵌 E9 ...

  8. I.MX6 mfgtool2-android-mx6q-sabresd-emmc.vbs hacking

    /******************************************************************** * I.MX6 mfgtool2-android-mx6q- ...

  9. I.MX6 gpio-keys driver hacking

    /**************************************************************************** * I.MX6 gpio-keys driv ...

随机推荐

  1. python 模拟ajax查询社工库...

    在windows中使用,输入有关信息查询社工库,本来是网页版的,我把ajax请求提取出来.粗略的封装下,挺好玩. #coding:utf8 import urllib2,urllib from Bea ...

  2. 文件大小的友好输出及其 Python 实现

    在数据库中存储时,使用 Bytes 更精确,可扩展性和灵活性都很高. 输出时,需要做一些适配. 1. 注意事项与测试代码 需要考虑 sizeInBytes 为 None 的场景. 除以 1024.0 ...

  3. 【原创】一起学C++ 之指针的--/++ ---------C++ primer plus(第6版)

    讲*和++同时用于指针时提出了这样的问题:将什么解除引用,将什么递增. ]={21.1, 32.8, 23.4, 45.2, 37.4 }; double *pt=arr; //pt指针指向arr[0 ...

  4. 《WPF程序设计指南》读书笔记——第3章 内容的概念

    1.Content属性及字体相关的属性 using System; using System.Windows; using System.Windows.Media; namespace LY.Dis ...

  5. Battle Over Cities (25)(DFS、连通图)

    It is vitally important to have all the cities connected by highways in a war. If a city is occupied ...

  6. 【多路复用】I/O多路复用

    http://www.tuicool.com/articles/RBvqUz C#下用select方法实现socket服务端

  7. EXTJS 4.2 资料 跨域的问题

    关于跨域,在项目开发中难免会遇到:之前笔者是用EXTJS3.0开发项目的,在开发过程中遇到了关于跨域的问题,但是在网上找到资料大部分都是ExtJs4.0以上版本的 在ExtJs中 例如:Ext.Aja ...

  8. 【BZOJ 1003】 [ZJOI2006]物流运输trans

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  9. Navicat for mysql 远程连接 mySql数据库10061、1045错误问题 (转)

    远程使用Navicat for mysql 客户端软件连接 mySql数据时,连接出现 2003-Can’t connect to MySQL on ’192.168.1.2’(10061)错误时,是 ...

  10. 看几道JQuery试题后总结(下篇)

    感谢圆友的提醒 昨天下午完成了9道试题中的前4道,之后好多园友存在些疑惑和建议,在这里我一并说一下吧.首先对于昨天第一题可能存在误导,在JQuery中并没有innerHTML这个属性,不过我们可以将J ...