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. 别让emacs损伤你的小母指

    刚接触emacs时感觉,这东西怎么这么难用,还说是编辑器的神,我去. 写个代码跟挫游戏机手柄似的,关键是还这么难挫,平时用的最多的左ctrl键,这么难按,可怜的我的小母指(Petyr Baelish) ...

  2. sublime text2 配置php调试环境

    步骤一: 首先确保你电脑安装了php,并把php设置到环境变量里了. 步骤二: 点击 sublime_text的“工具”->"编译系统"->"编译新系统&qu ...

  3. insert into (select...WITH CHECK OPTION) values(...)

    insert into (<subquery> WITH CHECK OPTION) values (...) 语法看起来很特殊,其实是insert进subquery的这张表里: 1. 只 ...

  4. 请给出一个左侧定宽右侧自适应的HTML结构及样式

    <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...

  5. EXTJS 4.2 资料 控件之textfield文本框加事件的用法

    { xtype: "textfield", width: 100, id: "txtGroupName", name: "txtGroupName&q ...

  6. 关于安装Android Studio的一些问题的解决方法

    问题1:每次Fetching android sdk component information 这是在检查你的 Android SDK .有人会在这里卡上很长时间,很大的原因就是:网络连接有问题.可 ...

  7. linux学习笔记(3)-文件系统

    三大类文件类型 普通文件:包括文本文件.数据文件.可执行的二进制程序文件 目录文件:linux系统把目录看成一种特殊的文件,利用它构成了文件系统的树形结构 设备文件:把设备也看成是一个文件,例如你的鼠 ...

  8. 1034: [ZJOI2008]泡泡堂BNB - BZOJ

    Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵 ...

  9. OpenSessionInViewFilter 的配置及替代方案(转)

    鸣谢:http://justsee.iteye.com/blog/1174999,http://blog.csdn.net/sunsea08/article/details/4545186 Sprin ...

  10. C#学习笔记(三)

    1.我们在Main()函数中,调用Test()函数,我们管Main()函数称之为调用者,管Test()函数称之为被调用者.如果被调用者想要得到调用者的值:1).传递参数.2).使用静态字段来模拟全局变 ...