NXP MCU 技术论坛
直播中

哔哔哔-

9年用户 1346经验值
擅长:电源/新能源
私信 关注
[问答]

如何在i.MX6ULL睡眠时停止刷新LCD?

为了更好的 EMC,我们需要在 i.MX6ULL 进入睡眠状态时停止 LCD 刷新。
能否实现 ?
平台: i.MX6ULL
系统: Linux

回帖(1)

洒下墨色

2025-4-7 18:19:32

在i.MX6ULL进入睡眠状态时停止LCD刷新以优化EMC,可以通过以下步骤实现:




1. 理解LCD控制器与电源管理的关系



  • i.MX6ULL的LCD控制器(如eLCDIF)由内核的Framebuffer驱动管理。

  • 系统睡眠时(如mem/standby模式),需通过电源管理(PM)回调函数关闭控制器。




2. 修改LCD驱动以支持Suspend/Resume



  • 目标:在系统挂起时禁用LCD控制器,恢复时重新初始化。


  • 代码示例(在LCD驱动中添加PM回调):


    static int lcd_drv_suspend(struct device *dev)
    {
      struct fb_info *info = dev_get_drvdata(dev);
      // 停止LCD控制器
      imx_lcdif_disable_controller(info->par);
      // 关闭相关时钟(如PLL5、pixel clock)
      clk_disable_unprepare(lcd_clk);
      // 配置GPIO为低功耗状态(可选)
      pinctrl_pm_select_sleep_state(dev);
      return 0;
    }

    static int lcd_drv_resume(struct device *dev)
    {
      struct fb_info *info = dev_get_drvdata(dev);
      // 重新启用时钟和控制器
      clk_prepare_enable(lcd_clk);
      imx_lcdif_enable_controller(info->par);
      pinctrl_pm_select_default_state(dev);
      return 0;
    }

    static const struct dev_pm_ops lcd_pm_ops = {
      .suspend = lcd_drv_suspend,
      .resume = lcd_drv_resume,
    };





3. 配置设备树(Device Tree)



  • 关闭睡眠时的LCD电源
    &lcdif {
      pinctrl-names = "default", "sleep";
      pinctrl-0 = <&pinctrl_lcdif_dat /* 其他活动状态引脚 */>;
      pinctrl-1 = <&pinctrl_lcdif_sleep>; // 睡眠状态引脚配置
      status = "okay";
    };

  • 定义睡眠状态引脚(高阻态或下拉):
    pinctrl_lcdif_sleep: lcdifgrp_sleep {
      fsl,pins = <
          MX6ULL_PAD_LCD_DATA00__GPIO3_IO05 0x10059 // 配置为GPIO并禁用上拉
          // 其他数据线同理...
      >;
    };




4. 调整时钟配置



  • 在挂起时关闭PLL5(如果LCD时钟源自PLL5):
    // 在suspend函数中添加:
    clk_disable_unprepare(clk_pll5);




5. 验证与调试



  • 检查PM回调是否触发
    dmesg | grep "lcd_drv_suspend"

  • 测量EMC信号:使用示波器验证睡眠时LCD时钟(如LCD_CLK)和数据线是否静默。

  • 唤醒后恢复测试:确保唤醒后LCD能正常重新初始化。




6. 高级优化(可选)



  • 动态EMC调整:在运行时根据LCD状态调整驱动强度(通过设备树的drive-strength配置)。

  • 禁用未使用的控制器功能:如关闭背光(PWM或GPIO控制):
    // 在suspend中关闭背光
    gpiod_set_value(bl_gpio, 0);




注意事项



  • 内核版本兼容性:确认使用的内核版本是否支持pinctrl睡眠状态(4.1+已支持)。

  • 硬件差异:不同i.MX6ULL开发板的LCD引脚可能不同,需根据原理图调整设备树。


通过上述步骤,可以有效在睡眠时停止LCD刷新,降低EMI/EMC干扰。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分