Dell G15 5530 键值映射全解

适用Dell-G15-5530以及大部分Dell-G系列/Alienware中搭载AWCC的机型

本文引用的底层 SDK 源码来自 alienfan-SDK_v2。 它是一套封装 AWCC WMI 通信的控制库:负责探测兼容机型、读写电源模式 / G 模式 / TCC 偏移、 读取传感器温度与风扇转速,上层工具通过 AlienFan_SDK::Control 接口直接操作硬件。

1. 键值是怎么传进固件的

所有模式切换最终都落到 WMI 命名空间 root\WMI 下的 AWCCWmiMethodFunction 类。固件通过 ACPI 方法 \_SB.AMWW.WMAX 暴露这些 WMI 方法,底层数据通道是同一个。

与电源/散热相关的有三个方法族(括号内是对应的 ACPI 操作码):

WMI 方法ACPI 操作码用途
Thermal_Information0x14读取:传感器温度、风扇转速、当前模式
Thermal_Control0x15写入:切换模式、设置附加风扇转速
GameShiftStatus0x25读取/写入:G 模式(Game Shift)状态

其中 Thermal_ControlApplyThermalMode 子功能就是”切换模式”的入口,它的参数编码规则是:

arg2 = (thermalMode << 8) | 1

低字节 1 是”应用模式”这个子功能号,高字节就是要写入的模式键值。

在 SDK 源码里,这个 { 子功能, 参数1, 参数2, 保留 } 的字节结构被封装成一个 4 字节联合体 ALIENFAN_INTERFACE

union ALIENFAN_INTERFACE {
    struct { byte sub, arg1, arg2, reserved; };
    DWORD args;
};

sub1 即 ApplyThermalMode,arg1 即 thermalMode。所以 SetPower(0xA1) 实际发出的是 Thermal_Control(0xA101)


2. 核心键值映射表

综合固件 WMI 枚举定义与 G15 5530 实测,ApplyThermalMode 的 thermalMode 键值如下:

键值 (hex)十进制枚举名模式
0x000Custom自定义(手动)
0x96150Quiet静音
0x97151Balanced平衡
0x98152Performance性能
0x99153FullSpeed全速
0xA0160USTT_Balanced平衡
0xA1161USTT_Performance性能
0xA2162USTT_Cool冷却
0xA3163USTT_Quiet静音
0xA4164USTT_FullSpeed全速
0xA5165USTT_BatterySaver电池节能
0xAB171G_ModeG 模式

G15 5530 实际生效的档位

G15 5530 探测出的档位对应的硬编码中文名:

std::wstring PowerModeName(int index, int rawValue) {
    switch (rawValue) {
    case 0xa0: return L"平衡";
    case 0xa1: return L"性能";
    case 0xa3: return L"静音";
    case 0xa5: return L"电池";
    }
    return Format(L"BIOS 档位 %d", index);
}

G15 5530 使用 0xA0~0xA5 这一组 USTT 键值空间,加上:

  • 0x00 → 自定义(手动模式,即禁用 BIOS 自动调档)
  • 0xAB → G 模式

3. 两组键值空间:0x960x990xA00xA5

表格里出现两组”静音/平衡/性能/全速”,这不是笔误,而是固件里并存着两套模式枚举

键值空间典型机型备注
0x96~0x99老款 Alienware(m 系列等)经典 Quiet/Balanced/Performance/FullSpeed
0xA0~0xA5(USTT)Dell G15 5530 / G16 等较新机型多了 USTT_Cool 冷却 与 USTT_BatterySaver 电池节能

AWCC 的代码里对这两套空间用的是同一套处理逻辑,只是固件报告哪个、你就用哪个。第三方工具不要硬编码名称为下标,正确的做法是像 SDK 那样先枚举出固件支持的键值列表,再按需写入。

SDK 的探测逻辑(alienfan-SDK.cpp)正是如此:

powers.push_back(0); // 先加入 Manual 手动模式
while ((funcID = CallWMIMethod(getPowerID, fIndex)) > 0) {
    byte vkind = funcID & 0xff;
    if (funcID > 0x8f) {
        powers.push_back(vkind);   // 高位 > 0x8f 视为电源模式,低字节即模式键值
    }
    ...
    fIndex++;
}

注意还有一个特殊分支:sysType 为 1 的老接口(如 R7 台式机)会兜底补上 12 两个档位(Manual + 1 + 2,共 3 种)。


4. G 模式(0xAB)是个特例

G 模式(Game Shift)不只是往 Thermal_Control0xAB,它是一个双通道操作

开启 G 模式:
    GameShiftStatus  → {1, 0x01}    (置位 G 模式状态)
    Thermal_Control  → {1, 0xAB}    (把模式切到 G 模式)

关闭 G 模式:
    GameShiftStatus  → {1, 0x00}    (复位 G 模式状态)
    Thermal_Control  → {1, 0xA0}    (切回平衡模式)

这正是 ArchWiki 上 G15 5530 页面的 ACPI 实测(Linux 下用 acpi_call 模块):

# 开启
echo "\_SB.AMWW.WMAX 0 0x25 {1, 0x01, 0x00, 0x00}" > /proc/acpi/call
echo "\_SB.AMWW.WMAX 0 0x15 {1, 0xab, 0x00, 0x00}" > /proc/acpi/call

# 关闭
echo "\_SB.AMWW.WMAX 0 0x25 {1, 0x00, 0x00, 0x00}" > /proc/acpi/call
echo "\_SB.AMWW.WMAX 0 0x15 {1, 0xa0, 0x00, 0x00}" > /proc/acpi/call

注意操作码 0x15 = Thermal_Control0x25 = GameShiftStatus,花括号里第一个数字是子功能号 1,第二个就是键值。

在 SDK 源码里,SetGMode(true) 的流程也验证了这一点——先 SetPower(0xAB) 把模式写进去,再调用 G 模式状态方法:

int Control::SetGMode(bool state) {
    if (isGmode) {
        if (state)
            SetPower(0xab);               // 先切到 G 模式档位
        return CallWMIMethod(setGMode, state);  // 再同步 GameShift 状态
    }
    return -1;
}

另外有两个值得注意的行为:

  1. G 模式关闭时要切回:工具提供的 CLI/GUI 在关闭 G 模式后,会把电源模式切回之前选中的档位(GUI 默认写死切回性能 0xA1)。
  2. 判断 G 模式是否开启:参考实现用”当前模式键值是否为 0xAB”来判断(GetGModereturn pm == 0xab),而不是读 GameShiftStatus

5. 使用示例

方案 A:用 SDK 配套的命令行工具 alienpower-cli

alienpower-cli list              # 列出探测到的全部模式及原始键值
alienpower-cli power=1           # 按下标切换
alienpower-cli power=performance # 切到最后一个档位(最高/性能)
alienpower-cli gmode=toggle      # G 模式开关

方案 B:用 PowerShell 直接调 WMI

# 连接 AWCC WMI 命名空间
$awcc = Get-CimInstance -Namespace root\WMI -ClassName AWCCWmiMethodFunction

# 读取当前模式(Thermal_Information, GetPower = 0x0b00)
$awcc.Thermal_Information(0x0b00)

# 切到性能模式(Thermal_Control, ApplyThermalMode = (0xA1<<8)|1 = 0xA101)
$awcc.Thermal_Control(0xA101)

方案 C:Python(pywin32)

import win32com.client

wmi = win32com.client.Dispatch("WbemScripting.SWbemLocator")
svc = wmi.ConnectServer(".", "root\\WMI")
obj = svc.Get("AWCCWmiMethodFunction")()
obj.Instance()

# 当前模式
print(obj.Thermal_Information(0x0b00).ReturnValue)
# 切到平衡模式
obj.Thermal_Control(0xA001)
# 切到 G 模式
obj.Thermal_Control(0xAB01)

注意:这些调用都需要管理员权限,因为 WMI 通道受系统权限保护。


6. 键值写入后到底发生了什么

Thermal_Control 写进去的不是一个”名字”,而是让固件把整条散热/供电策略切换到对应预设:

模式典型效果
0x00 自定义关闭 BIOS 自动调档,风扇交给软件/手动控制
0xA1 性能放开功耗墙(PL1/PL2),风扇曲线激进,噪声高
0xA3 静音压低风扇转速,优先安静,性能受限
0xA5 电池限制 GPU/CPU 功耗,优先续航
0xAB G 模式风扇拉满 + 性能释放,发热大户

这也是为什么 Dell 官方文档会提到:在静音模式或电池模式下,G15 5530 的 GPU 功耗可能被限制到 30W 左右——这不是故障,而是对应键值(0xA3 / 0xA5)背后的功耗策略在生效。


参考资料


本文档基于 G15 5530(Intel)实测与社区逆向资料整理,键值空间对同代 AWCC 机型(G16、部分 Alienware)通用。不同 BIOS 版本枚举结果可能不同,请以工具探测结果为准。