Skip to content

khadas/android_vendor_rockchip_hardware_modules_power_ext

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

38 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Rockchip 电源扩展接口

该仓库包含 Rockchip 电源扩展接口的实现,用于 Android,通过 Android 硬件抽象层 (HAL) 提供增强的电源管理功能。

概述

电源扩展接口提供了标准 Android 电源 HAL 之外的额外电源管理功能。它包括:

  1. Magic Boost - 扩展的电源接口,可以使特定任务申请不同场景的加速
  2. 电源提示会话 - 针对不同应用场景的增强型电源提示处理
  3. 加速会话 - 用于应用程序性能优化的专用加速功能

目录结构

  • configs/ - 配置文件,包括一些默认的 profile,能够通过配置选择加速参数。
  • default/ - 扩展部分接口的默认实现,包含 BoostSession 和 MagicBoost 类,这部分默认的 AOSP 不会调用到,给 RK 上层增加的服务调用。
  • libmagicboost_manager/ - 管理魔法加速功能的核心库
  • power_ext/ - AOSP Power aidl 的默认实现,会将 MagicBoost 扩展作为 power aidl 的插件注册到系统。通过 libmagicboost_manager 去管理控制所有硬件节点。
  • vts/ - VTS(供应商测试套件)测试,用于验证实现

核心组件

Magic Boost

提供了一种机制,可以为特定任务临时提升设备性能。它通过以下方式实现:

  • MagicBoost.h/cpp - 默认服务中的核心实现
  • MagicBoostManager.h/cpp - 用于管理加速状态和参数的库
  • magic_boost.json - 定义加速参数的配置文件

电源扩展

Power AIDL 的主要实现包括:

  • Power.h/cpp - 主电源 HAL 扩展实现
  • PowerHintSession.h/cpp - 增强的电源提示会话处理

加速会话

专用的加速功能在以下文件中实现:

  • BoostSession.h/cpp - 加速会话管理

构建

该模块作为 Android 构建系统的一部分,使用每个目录中的 Android.bp 文件进行构建。

测试

vts/ 目录中有 VTS 测试,可用于验证电源扩展接口的正确实现。

调试

可以通过 adb shell dumpsys 命令与 Power HAL 进行交互,以进行调试和状态检查。

基本用法

执行以下命令可以查看 MagicBoost 管理器的当前状态,包括已发现的硬件集群(CPU, GPU 等)及其当前状态(频率,调节器等)。

adb shell dumpsys android.hardware.power.IPower/default

调试选项

dumpsys 命令支持多种参数,用于控制日志记录、功能开关和信息展示:

  • debug_on: 启用详细的调试日志。日志将输出到 logcat 中,tag 为 MagicBoostAIDL
  • debug_off: 关闭调试日志。
  • enable: 启用 MagicBoost 管理器。
  • disable: 禁用 MagicBoost 管理器并释放所有性能锁,将硬件恢复到默认状态。
  • trace_on: 开始跟踪长时持有(indefinite)的 profile 锁。
  • trace_off: 停止并清除跟踪数据。
  • profiles: 在输出中包含所有可用的 profile 列表。
  • trace: 在输出中包含当前被跟踪的 profile 锁的详细信息。
  • load <file>: 加载一个自定义的配置文件。

示例:

# 打开调试日志并查看可用的 profile
adb shell dumpsys android.hardware.power.IPower/default debug_on profiles

动态加载配置文件 (load)

这是一个非常强大的调试功能,允许您在设备运行时动态加载一个新的配置文件,而无需重新编译或重启设备。这对于快速测试和微调 profile 非常有用。

使用方法:

  1. 将您修改后的 magic_boost.json (或任何其他自定义配置文件) 推送到设备上,例如 /data/local/tmp/ 目录:

    adb push configs/magic_boost_rk3588.json /data/local/tmp/test_config.json
  2. 使用 load 命令让 Power HAL 加载这个文件:

    adb shell dumpsys android.hardware.power.IPower/default load /data/local/tmp/test_config.json

加载后,文件中定义的 profile 将会覆盖或添加到当前运行的配置中。您可以通过再次执行 dumpsys 并带上 profiles 参数来验证更改是否生效。

配置

configs/ 目录中的 magic_boost.json 文件定义了魔法加速功能的参数。可以根据设备特定要求自定义此文件。该文件主要包含两部分:hardware_infoprofiles

hardware_info

hardware_info 数组定义了可控的硬件单元及其对应的 sysfs 节点信息。每个硬件单元是一个 JSON 对象,包含以下字段:

  • name: 硬件的唯一标识符 (例如: "cpu", "gpu")。
  • description: 硬件的描述。
  • base_path: 该硬件在 sysfs 中的基础路径。
  • parser: 用于解析该硬件 sysfs 目录结构的解析器类型。例如,policy 用于 CPU,因为它有 policyX 子目录。
  • info_min_path/info_max_path: 读取硬件支持的最小/最大值(例如频率)的节点文件名。
  • min_path/max_path: 控制硬件最小/最大值的节点文件名。
  • governor_path: 控制硬件调节器 (governor) 的节点文件名。
  • default_gov: 默认的调节器。

修改示例: 如果您的设备的 GPU sysfs 路径不同,您可以修改 gpu 条目的 base_path

{
    "name": "gpu",
    "description": "GPU",
    "base_path": "/sys/class/devfreq/new_gpu_path",
    ...
}

profiles

profiles 数组定义了不同的性能模式。有两种类型的 profile:

  1. 基础 Profile (Base Profiles): 直接控制硬件节点。

    • name: Profile 的唯一名称 (例如: cpu_base_highest)。
    • nodes: 一个数组,定义了要操作的硬件节点。
      • alias: 对应 hardware_info 中的一个 name,指定要控制哪个硬件。
      • index: 指定要控制的硬件索引。all 表示所有。对于 CPU,可以是 "0", "4" 等。
      • path_alias: 一个数组,指定要写入的节点,对应 hardware_info 中的路径别名 (例如: max_path, min_path)。
      • value: 要写入的值。可以是具体数值,也可以是 maxmin,表示使用硬件信息中读取到的最大/最小值。

    示例: cpu_base_highest profile 将所有 CPU 核心的最小和最大频率都设置为其支持的最高频率。

    {
        "name": "cpu_base_highest",
        "description": "Basic CPU adjuster, all cores highest frequency",
        "nodes": [
            {
                "name": "cpu_freq_all_max",
                "alias": "cpu",
                "index": "all",
                "path_alias": ["max_path", "min_path"],
                "value": "max"
            }
        ]
    }
  2. 复合 Profile (Composite Profiles): 组合多个已有的 Profile。

    • name: Profile 的名称 (例如: LAUNCH)。
    • alias: 一个包含其他 Profile 名称的数组。

    示例: LAUNCH profile 是一个复合 profile,它激活了多个基础 profile,以在应用启动时提升 CPU, GPU, UFS, VOP 和 DDR 的性能。

    {
        "name": "LAUNCH",
        "description": "AOSP App launch profile",
        "alias": [
            "cpu_base_highest",
            "gpu_base_highest",
            "ufs_base_highest",
            "vop_base_highest",
            "ddr_base_highest"
        ]
    }

如何自定义 Profile:

您可以添加新的基础 profile 来微调某个硬件,或者创建新的复合 profile 来应对特定的应用场景。例如,要创建一个新的游戏模式,可以组合不同的基础 profile,甚至可以为该模式创建一个新的基础 profile,专门设置某个硬件参数。

高级配置:覆盖和特定平台配置

系统支持通过创建特定的 JSON 配置文件来覆盖默认的 magic_boost.json 中的 profiles 或为特定硬件平台/产品添加新的 profiles

加载顺序与覆盖规则

系统启动时,会按以下顺序加载配置文件:

  1. /vendor/etc/power/magic_boost.json (或 APEX 路径下的) - 这是基础配置文件。
  2. 基于平台 (ro.board.platform) 的配置文件,例如: .../magic_boost_rk3588.json
  3. 基于产品型号 (ro.product.odm.model) 的配置文件,例如: .../magic_boost_MyDevice.json

加载是增量式的。如果后续加载的配置文件中包含与已加载的 profile 同名的 profile,则新的 profile覆盖旧的。如果 profile 名称是新的,则会被添加进去。hardware_info 部分只在 magic_boost.json 中解析,后续的配置文件应只包含 profiles 数组。

示例:为 RK3588 平台自定义 Profile

假设我们想为 RK3588 平台修改 EXPENSIVE_RENDERING 这个 profile 的行为。

  1. 创建新的配置文件: 在 configs/ 目录下创建一个名为 magic_boost_rk3588.json 的新文件。

  2. 定义覆盖 Profile: 在该文件中,我们只定义需要覆盖或添加的 profiles。例如,我们让 EXPENSIVE_RENDERING 只提升 DDR 频率:

    {
        "profiles": [
            {
                "name": "EXPENSIVE_RENDERING",
                "description": "RK3588 Expensive rendering profile",
                "alias": [
                    "ddr_base_highest"
                ]
            }
        ]
    }

    当系统在一个 ro.board.platform 属性为 "rk3588" 的设备上运行时,这个新的 EXPENSIVE_RENDERING 定义会覆盖 magic_boost.json 中的默认定义。

  3. 更新构建文件: 最后,需要将这个新的配置文件添加到 configs/Android.bp 中,以便编译系统能将它打包到系统中。

    apex_defaults {
        name: "rockchip-power_ext-config-default",
        prebuilts: [
            "magic_boost.json",
            "magic_boost_rk3588.json", // 添加新文件
        ],
    }
    
    prebuilt_etc {
        name: "magic_boost_rk3588.json", // 为新文件添加 prebuilt_etc
        vendor: true,
        src: "magic_boost_rk3588.json",
        filename_from_src: true,
    }

通过这种方式,您可以为不同的硬件平台或产品型号维护一套独立的、可覆盖的性能配置,而无需修改基础的 magic_boost.json 文件。

实现细节

该实现遵循 Android 的 AIDL(Android 接口定义语言)来实现电源扩展接口,提供了一种标准化的方法,使 Android 框架可以访问 Rockchip 特定的电源管理功能。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages