?_Eternity_ 2025-11-19 20:06 采纳率: 0%
浏览 11
已结题

rk3576 Android14 深度休眠时怎么控制rk806的pwrctrl2引脚

rk3576 Android14 深度休眠时控制rk806的pwrctrl2引脚
正常工作情况下pwrctrl2是低电平,深度休眠时pwrctrl2是1.8v,我需要深度休眠的时候该引脚也是低电平,请问应该怎么修改?

img

img

img

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2025-11-19 20:24
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    RK3576 平台运行 Android 14 的情况下,如果你希望在**深度休眠(Deep Sleep)**时控制 RK806 芯片的 PWRCTRL2 引脚保持为低电平,而不是默认的 1.8V,你需要从以下几个方面进行分析和修改:


    ✅ 一、问题分析

    1. PWRCTRL2 引脚的作用

    • PWRCTRL2 是 RK806 芯片的一个控制引脚,通常用于控制电源管理模块(如 PMIC)的某些功能。
    • 在正常工作时,该引脚为低电平(GND),表示系统处于正常供电状态。
    • 在深度休眠时,该引脚可能被拉高至 1.8V,以触发某些低功耗模式或关闭部分电路。

    2. 目标

    • 深度休眠时,确保 PWRCTRL2 引脚保持低电平(GND),而不是 1.8V。

    ✅ 二、解决方案

    1. 确定 PWRCTRL2 的控制源

    a. 查看设备树(DTS)配置

    • 找到与 RK806 相关的设备树节点,查看 pwrctrl2-gpios 或类似字段。
    • 示例:
      &rk806 {
          compatible = "rockchip,rk806";
          pwrctrl2-gpios = <&gpio0 RK_GPIO_A0 GPIO_ACTIVE_HIGH>;
      };
      
      • 如果该引脚是通过 GPIO 控制,则可以修改其驱动逻辑。

    b. 检查内核驱动代码

    • 查找 RK806 驱动中对 PWRCTRL2 的控制逻辑,通常位于:
      • drivers/mfd/rk806.c
      • 或相关电源管理模块中。
    • 确认该引脚是否在进入深度休眠时被主动设置为高电平。

    2. 修改内核驱动逻辑

    a. 修改 PWRCTRL2 控制逻辑

    • 在内核中找到控制 PWRCTRL2 的函数,例如:
      static int rk806_set_pwrctrl2(struct rk806 *rk806, bool enable)
      {
          gpio_set_value(rk806->pwrctrl2_gpio, enable ? 1 : 0);
      }
      
    • 在深度休眠时,应调用 rk806_set_pwrctrl2(rk806, false) 来保持低电平。

    b. 修改休眠唤醒流程

    • suspendresume 流程中添加控制逻辑:
      static int rk806_suspend(struct device *dev)
      {
          struct rk806 *rk806 = dev_get_drvdata(dev);
          rk806_set_pwrctrl2(rk806, false); // 保持低电平
          return 0;
      }
      
      static int rk806_resume(struct device *dev)
      {
          struct rk806 *rk806 = dev_get_drvdata(dev);
          rk806_set_pwrctrl2(rk806, true);  // 恢复正常状态
          return 0;
      }
      

    3. 修改设备树(可选)

    如果 PWRCTRL2 是由某个 GPIO 控制的,你可以在设备树中修改其默认值:

    &pinctrl {
        rk806_pwrctrl2: rk806-pwrctrl2 {
            rockchip,pins = <0 0 0 0 0>; // 根据实际 GPIO 编号调整
            rockchip,drive = <0>;
            rockchip,pull = <0>;
        };
    };
    
    &rk806 {
        compatible = "rockchip,rk806";
        pwrctrl2-gpios = <&gpio0 RK_GPIO_A0 GPIO_ACTIVE_LOW>;
    };
    

    注意: 如果你使用的是 GPIO_ACTIVE_LOW,则表示低电平有效。否则,可能会导致误判。


    4. 测试与验证

    • 编译并烧录修改后的内核。
    • 使用 adb shellgpioget 工具检查 PWRCTRL2 的电平状态:
      gpioget /dev/gpiochip0 0
      
      • 其中 0 是 GPIO 编号,根据你的硬件配置调整。

    ✅ 三、总结

    | 步骤 | 内容 | |------|------| | 1 | 查找设备树中 PWRCTRL2 的配置 | | 2 | 检查内核驱动中对 PWRCTRL2 的控制逻辑 | | 3 | 在 suspend/resume 流程中强制设置 PWRCTRL2 为低电平 | | 4 | 可选:修改设备树中的 GPIO 枚举值 | | 5 | 重新编译内核并测试结果 |


    ✅ 四、参考代码片段(示例)

    以下是一个简化版的内核驱动修改示例:

    static int rk806_suspend(struct device *dev)
    {
        struct rk806 *rk806 = dev_get_drvdata(dev);
        if (rk806->pwrctrl2_gpio) {
            gpio_set_value(rk806->pwrctrl2_gpio, 0); // 设置为低电平
        }
        return 0;
    }
    
    static int rk806_resume(struct device *dev)
    {
        struct rk806 *rk806 = dev_get_drvdata(dev);
        if (rk806->pwrctrl2_gpio) {
            gpio_set_value(rk806->pwrctrl2_gpio, 1); // 恢复为高电平
        }
        return 0;
    }
    

    如果你有具体的设备树文件或驱动代码,我可以进一步帮助你定位具体需要修改的部分。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月9日
  • 创建了问题 11月19日