Linux 内核 Alienware WMI 驱动(AWCC 接口)技术指南:平台档位、温控与风扇控制实战
【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux
本指南围绕 Linux 内核drivers/platform/x86/dell/目录下的 alienware-wmi 驱动展开,解读其针对 Dell 游戏本内嵌WMAX WMI 设备的双套接口实现,并重点深入较新的AWCC(Alienware Command Center)接口:它负责热力档位(Platform Profile)、温度/风扇传感器(HWMON)与超频相关功能。读完本文,你将掌握在 Alienware M/X 系列、Alienware Aurora 台式机及 Dell G 系列笔记本上启用、定位并操作"alienware-wmi"平台档位与"alienware_wmi" HWMON 节点的方法,也能理解驱动在无官方文档情况下对固件接口逆向的实现原理与模块参数、DMI 表探测机制。
WMAX WMI 设备与 alienware-wmi 驱动的来龙去脉
Alienware WMI 驱动的核心对象是一个名为WMAX的 WMI 设备,它存在于大多数 Dell 游戏本中。根据 Linux 内核管理指南原始文档,随着 ~2018 年 M 系列笔记本推出,该设备的功能被彻底"改造"过:
- 早期设备(M 系列之前):WMAX 控制基础 RGB 灯效、深睡眠(deep sleep)模式、HDMI 信号源切换以及外置显卡放大器(amplifier)状态;
- 后期设备:WMAX 被完全重新利用,主要负责热力配置档位(thermal profiles)、传感器监测和超频。这一套接口被称为AWCC,即 Dell 的 AWCC OEM 应用(Alienware Command Center)用来操控上述特性的固件接口。
alienware-wmi驱动同时驱动这两套接口:早期 RGB/HDMI/深睡眠功能与后期 AWCC 功能。对应源码分布在 drivers/platform/x86/dell/alienware-wmi-base.c、alienware-wmi-wmax.c、alienware-wmi-legacy.c,公共头文件为 alienware-wmi.h。
双接口如何被选择:从 GUID 到 DMI 探测
从 alienware-wmi-base.c 的模块入口逻辑可以看到驱动的初始化路线:
- 首先执行
dmi_check_system(),依据 DMI 表挑选老式 AlienFX(RGB)灯光功能所需的 quirk(如 RGB zone 数量、是否具备 HDMI mux / 放大器 / 深睡眠能力); - 随后调用
wmi_has_guid(WMAX_CONTROL_GUID)判断固件中是否存在 WMAX 设备:- 存在 → 注册 WMAX WMI 驱动(
alienware-wmi-wmax,内部再按 DMI 表决定走 AWCC 功能还是老式灯光功能); - 不存在 → 退回注册 LEGACY 驱动(
alienware-wmi-alienfx)。
- 存在 → 注册 WMAX WMI 驱动(
WMAX 设备的 GUID 在 alienware-wmi.h 中定义为A70591CE-A997-11DA-B012-B622A1EF5492,老式接口使用的两个 GUID 分别为A90597CE-A997-11DA-B012-B622A1EF5492(LEGACY 控制)与A80593CE-A997-11DA-B012-B622A1EF5492(LEGACY 电源控制)。
AWCC 接口:支持机型与探测机制
AWCC 是本文档主题中的"现代"接口,目前确认支持的设备包括:
- Alienware M 系列笔记本
- Alienware X 系列笔记本
- Alienware Aurora 台式机
- Dell G 系列笔记本
这些型号并非"探测到 WMAX 就能启用 AWCC",而是通过一组 DMI 匹配条目来精确启用。在 alienware-wmi-wmax.c 中定义了awcc_dmi_table(即管理指南文档中提到的awcc_dmi_table),每条记录携带一组 quirk,决定该型号是否启用 HWMON、Platform Profile 与 G-Mode。从源码可见三类 quirk:
static struct awcc_quirks g_series_quirks = { .hwmon = true, .pprof = true, .gmode = true, /* G 系列:支持 G-Mode */ }; static struct awcc_quirks generic_quirks = { .hwmon = true, .pprof = true, .gmode = false, /* 一般 M/X 型号:不支持 G-Mode */ };表内收录的型号示例包括 "Alienware m15/m16 R1/R2/m17/m18"、"Alienware x15/x16/x17"、"Alienware Area-51m"、"Alienware 16/18 Area-51"、"Alienware 16/16X Aurora",以及 "Dell Inc. G15 / G16 / G3 / G5" 等。驱动初始化时通过dmi_first_match(awcc_dmi_table)匹配当前主机,命中则把对应 quirk 挂到全局awcc上。
当你的机器不在表中:强制探测模块参数
如果你确信自己的设备支持 AWCC 接口,却看不到文档描述的任一功能,可以尝试以下 alienware-wmi 模块参数强制探测:
force_platform_profile=1:强制探测 Platform Profile 支持;force_hwmon=1:强制探测 HWMON 支持。
以 alienware-wmi-wmax.c 中的定义为准,它们都是module_param_unsafe的布尔参数,其加载逻辑位于alienware_wmax_wmi_init()(第 1657 行起):如果 DMI 表未命中(awcc为空),强制参数会把awcc指向一个空的empty_quirks,再逐个打开对应能力位,从而绕过 DMI 白名单。
给内核贡献者的提示:如果模块在上述参数下能正常加载,说明你的机型确实具备 AWCC 能力,可以考虑提交补丁,把自己的型号追加到
drivers/platform/x86/dell/alienware-wmi-wmax.c的awcc_dmi_table中,或联系维护者(文档作者 Kurt Borja,联系方式见文档头部)获取进一步指引。
Platform Profile:热力档位与 G-Mode 控制
AWCC 接口向固件暴露了一系列由固件定义的热力配置档位,内核侧通过Platform Profile 类接口将其呈现给用户空间。该驱动导出的 platform-profile 类设备名为"alienware-wmi",其路径可用管理指南提供的命令定位:
grep -l "alienware-wmi" /sys/class/platform-profile/platform-profile-*/name | sed 's|/[^/]*$||'从 Platform Profile 选项到固件 ID 的映射
内核的通用 Platform Profile 语义(PLATFORM_PROFILE_*,见 sysfs-class-platform-profile ABI 文档)与 AWCC 固件内部的热力档位 ID 并不一一对应。驱动在 awcc_profile_to_pprof() 中完成双向转换:
- 固件 Legacy/USTT 的 Quiet(0x96/0xA3)→ 用户态
quiet; - Balanced(0x97/0xA0)→
balanced; - Balanced Performance(0x98/0xA1)→
balanced-performance; - Performance(0x99/0xA4)与 G-Mode(0xAB)→
performance; - USTT Cool(0xA2)→
cool;USTT Low Power(0xA5)→low-power; - Custom(0x00)→
custom。
档位的枚举、读取与切换
枚举发生在 awcc_platform_profile_probe():驱动按"风扇数 + 温度传感器数 + 未知资源数"算出偏移量后,用Thermal_Information操作 0x03 逐个列出资源 ID(固件按"风扇 ID → 温度 ID → 未知 ID → 热力档位 ID"的顺序排列),遇到无法映射的 ID 就跳过;部分设备上报的档位数不准导致列表提前结束,驱动遇到-EBADRQC也会安全中断。值得注意的实现细节:
- G-Mode 档位不参与常规枚举——它并非在所有型号的资源列表中都稳定出现,因此驱动统一通过 quirk(
awcc->gmode)处理,在支持机型上把performance档位映射到固件 ID 0xAB; - Custom(0x00)档位被假定为所有型号都支持,探测结束后无条件补入
choices。
读取当前档位:profile_get回调调用Thermal_Information操作 0x0B(AWCC_OP_GET_CURRENT_PROFILE)拿到当前固件档位 ID,再经awcc_profile_to_pprof()转成内核枚举返回。
切换档位:profile_set回调调用Thermal_Control操作 0x01(AWCC_OP_ACTIVATE_PROFILE)激活目标档位 ID。若设备支持 G-Mode,驱动还会在 awcc_platform_profile_set() 中联动GameShiftStatus:
- 选择
performance档位而 G-Mode 未开启 → 先 toggle G-Mode 再激活档位; - 切离
performance档位而 G-Mode 仍开启 → 先 toggle 关闭 G-Mode。
G-Mode 与模块参数
如果设备支持 G-Mode,在选中performance档位时它会一并被打开。管理指南补充了一个强制手段:
可以设置
force_gmode模块参数,让驱动总是尝试切换 G-Mode,而不去检查当前型号是否支持。在源码中该参数只有在awcc(即 Platform Profile 能力)存在时才生效,否则会打印警告force_gmode requires platform profile support。
HWMON:传感器监测与风扇手动控制
AWCC 接口同时支持传感器监测与手动风扇控制,两者通过标准的HWMON 接口暴露给用户空间。该驱动导出的 hwmon 类设备名为"alienware_wmi",可用下列命令定位:
grep -l "alienware_wmi" /sys/class/hwmon/hwmon*/name | sed 's|/[^/]*$||'标准 HWMON 属性(temp*_input、fan*_input等)的语义参见 sysfs-class-hwmon ABI 文档。
温度与风扇数据的组织方式
从 HWMON 初始化代码 可以看到驱动在注册 hwmon 设备前先做了一套"拓扑枚举":
- 温度传感器:通过
Thermal_Information操作 0x03 从"风扇 ID 偏移之后"的位置列出所有温度传感器 ID,放入位图temp_sensors; - 风扇数据:对每个风扇读取最小 RPM(操作 0x08)、最大 RPM(操作 0x09),并用
GetFanSensors操作 0x01/0x02 查询与它关联的温度传感器,算出自动温控通道位图(暴露为pwm*_auto_channels_temp); - 最终以名称"alienware_wmi"调用
devm_hwmon_device_register_with_info()注册 hwmon 设备。
awcc_hwmon_read_string() 为传感器与风扇提供了可读标签:温度传感器按固件 ID 标注为CPU(0x01)、Front(0x03)、GPU(0x06)或Unknown;风扇则按 AWCC_FAN_TYPES 枚举 标注为 CPU/GPU/PCI/Mid/Top/Side/U.2/Front/Bottom Fan 等(如 CPU_1=0x32、GPU_1=0x33、TOP_1=0x36 等,共 16 种预定义位置)。温度读数经固件返回值乘以 1000 转换为毫摄氏度(MILLIDEGREE_PER_DEGREE)后上报。
手动风扇控制:它其实是 fan "boost" 值
AWCC 接口并不直接暴露风扇 PWM,而是允许驱动操控一个风扇boost 值。这个 boost 值对最终 PWM 的影响近似为:
pwm = pwm_base + (fan_boost / 255) * (pwm_max - pwm_base)即 boost=0 时风扇回到基准 PWM,boost=255 时拉到最大 PWM,中间按线性比例插值。因此,驱动没有把 boost 塞进标准pwm*写接口,而是暴露为下述自定义 hwmon sysfs 属性(对应 sysfs-platform-alienware-wmi ABI 文档):
| 名称 | 权限 | 说明 |
|---|---|---|
fan[1-4]_boost | RW | 风扇 boost 值。取 0 到 255 之间的整数 |
fan_boost_store()的实现在 alienware-wmi-wmax.c:先用kstrtoul解析用户输入,再经clamp_val(val, 0, 255)截断到 [0, 255],随后调用Thermal_Control操作 0x02(AWCC_OP_SET_FAN_BOOST)下发。读取路径则走Thermal_Information操作 0x0C 查询当前 boost。源码中静态定义了fan1_boost~fan6_boost六个属性,最终由fan_boost_attr_visible()按实际枚举到的风扇数决定暴露几个。
另外,驱动的电源管理回调在挂起/恢复时会自动保存并恢复 boost 值:awcc_hwmon_suspend()逐风扇缓存当前 boost 并清零,awcc_hwmon_resume()再写回缓存值,避免手动风扇设置跨越一次 suspend/resume 后丢失。
注意:在部分设备上,手动风扇控制只有在选中
custom(自定义)platform profile 时才可靠工作。如果你设置了 boost 但风扇转速没有变化,请先把 platform profile 切到custom再试。
AWCC 固件接口的逆向工程细节
Dell 没有提供 AWCC 固件接口的任何官方文档,这套名为AWCCMethodFunction的新接口是社区逆向出来的(详细记载见 WMI 设备文档,管理指南也将其作为该驱动的 WMI 设备文档入口)。下面摘要其核心发现,可帮助你理解驱动行为的底层依据。
MOF 描述与 WMI 方法 ID
WMAX 设备的接口描述可借由 bmfdec 工具从其内嵌的二进制 MOF(bmof)中解码。解码得到的AWCCWmiMethodFunction类带 GUID{A70591CE-A997-11DA-B012-B622A1EF5492},其中与本文主题相关的方法及其在驱动源码中的宏对应关系如下:
| WMI 方法(MOF 名) | MOF 方法 ID | 驱动宏(16 进制) |
|---|---|---|
| GetFanSensors | 19 | AWCC_METHOD_GET_FAN_SENSORS(0x13) |
| Thermal_Information | 20 | AWCC_METHOD_THERMAL_INFORMATION(0x14) |
| Thermal_Control | 21 | AWCC_METHOD_THERMAL_CONTROL(0x15) |
| FWUpdateGPIOtoggle | 32 | AWCC_METHOD_FWUP_GPIO_CONTROL(0x20) |
| ReadTotalofGPIOs | 33 | AWCC_METHOD_READ_TOTAL_GPIOS(0x21) |
| ReadGPIOpPinStatus | 34 | AWCC_METHOD_READ_GPIO_STATUS(0x22) |
| GameShiftStatus | 37 | AWCC_METHOD_GAME_SHIFT_STATUS(0x25) |
通用参数结构
所有方法都接受uint32输入,且结构高度相似:第一个字节通常表示该方法的某个具体"操作(operation)",后续字节是传给该操作的参数。例如某操作码为 0x01 且需要 ID 0xA0,那么传入方法的整型参数就是 0xA001。驱动在 awcc 命令封装 中用struct wmax_u32_args { u8 operation, arg1, arg2, arg3; }对这个布局做了封装,并统一把固件返回的0xFFFFFFFF/0xFFFFFFFE两个失败码转成-EBADRQC。
Thermal_Information(0x14)操作清单
| 操作(Byte 0) | 说明 | 参数 |
|---|---|---|
| 0x02 | 读取系统描述,返回结构:Byte0=风扇数,Byte1=温度传感器数,Byte2=未知,Byte3=热力档位数 | 无 |
| 0x03 | 列出给定索引处的资源 ID;按"风扇 ID、温度 ID、未知 ID、热力档位 ID"顺序排列,需先用 0x02 得知各段长度 | Byte1=索引 |
| 0x04 | 读取某温度传感器的当前温度 | Byte1=传感器 ID |
| 0x05 | 读取某风扇当前 RPM | Byte1=风扇 ID |
| 0x06 | 读取风扇转速百分比(并非所有型号实现) | Byte1=风扇 ID |
| 0x08 | 读取某风扇最小 RPM | Byte1=风扇 ID |
| 0x09 | 读取某风扇最大 RPM | Byte1=风扇 ID |
| 0x0A | 读取 balanced 热力档位 ID | 无 |
| 0x0B | 读取当前热力档位 ID | 无 |
| 0x0C | 读取某风扇当前 boost 值 | Byte1=风扇 ID |
其余如 0x01、0x07 等操作含义未知。驱动实际只调用其中已确认安全的子集(系统描述、资源枚举、温度、RPM、min/max、当前档位、boost)。
Thermal_Control(0x15)操作清单
| 操作(Byte 0) | 说明 | 参数 |
|---|---|---|
| 0x01 | 激活指定热力档位 | Byte1=档位 ID |
| 0x02 | 为指定风扇设置 boost 值 | Byte1=风扇 ID,Byte2=boost |
已确认的热力档位编码
| 热力档位 | 类型 | ID |
|---|---|---|
| Custom | 特殊 | 0x00 |
| G-Mode | 特殊 | 0xAB |
| Quiet | Legacy | 0x96 |
| Balanced | Legacy | 0x97 |
| Balanced Performance | Legacy | 0x98 |
| Performance | Legacy | 0x99 |
| Balanced | USTT | 0xA0 |
| Balanced Performance | USTT | 0xA1 |
| Cool | USTT | 0xA2 |
| Quiet | USTT | 0xA3 |
| Performance | USTT | 0xA4 |
| Low Power | USTT | 0xA5 |
要点:
- 支持 USTT(User Selectable Thermal Tables)档位的型号不再支持 Legacy 档位,反之亦然(源码 AWCC_THERMAL_TABLES 区分两类表,枚举
awcc_thermal_profile完整保留上述 12 个编码); - 所有型号都支持Custom(0x00);
- G-Mode 在 Dell G 系列上取代 Performance;
- GameShiftStatus(0x25)操作 0x01 为 toggleGame Shift、0x02 为读取状态。它并不改变风扇转速曲线,可能属于某种 CPU/GPU 功耗策略(官方未做基准测试);该方法只出现在 Dell G 系列上,且它的存在意味着该机型提供 GMODE 档位——即使 Thermal_Information 操作 0x03 的资源列表里没列出它。G 系列键盘上的 G-key 也会切换 Game Shift 状态,两者直接关联。
调试接口:debugfs 下的 AWCC 内部数据
为了方便验证,驱动在 debugfs 中(/sys/kernel/debug/alienware-wmi-<wmi 设备名>/)还暴露了一组只读调试节点(详见 debugfs-alienware-wmi ABI 文档),对应实现位于 awcc_debugfs_init():
system_description:WMAX 设备上报的原始系统描述数值(RO);hwmon_data:HWMON 私有数据,包含风扇数、温度传感器数、内部风扇 ID 与温度 ID(RO);pprof_data:Platform Profile 私有数据,包含各平台档位与固件热力档位 ID 的内部映射(RO);gpio_ctl/total_gpios与gpio_ctl/pinX:设备上报的 GPIO 总数与引脚状态读写节点(pinX 为 RW)。
管理指南未展开介绍这些节点,但值得知晓其存在——当你怀疑驱动枚举出的拓扑不对时,hwmon_data与pprof_data是排查枚举结果的直接入口。
综合排查路径与使用小结
当你的 Alienware/Dell G 系列在 Linux 下"缺功能"时,可按以下顺序定位(均为查看与配置操作,不涉及内核源码修改):
- 确认驱动已绑定 WMAX 设备:检查
/sys/bus/wmi/devices/A70591CE-A997-11DA-B012-B622A1EF5492/是否存在; - 确认 AWCC 能力被启用:DMI 表未收录的机型默认走 RGB/深睡眠功能而非 AWCC。此时可加载模块参数重试,例如:
modprobe alienware_wmi force_platform_profile=1 force_hwmon=1 - 定位 Platform Profile 节点(设备名
alienware-wmi)并查看/切换档位:grep -l "alienware-wmi" /sys/class/platform-profile/platform-profile-*/name | sed 's|/[^/]*$||' cat /sys/class/platform-profile/platform-profile-*/profile echo performance > /sys/class/platform-profile/platform-profile-*/profile注意 G 系列选择
performance时会联动开启 G-Mode; - 定位 HWMON 节点(设备名
alienware_wmi)并读取温度/RPM、调整风扇 boost:grep -l "alienware_wmi" /sys/class/hwmon/hwmon*/name | sed 's|/[^/]*$||' cat /sys/class/hwmon/hwmon*/temp*_input echo 128 > /sys/class/hwmon/hwmon*/fan1_boost若 boost 不生效,先切到
custom档位;若确认机型具备 AWCC 能力且当前内核尚未收录,可考虑向awcc_dmi_table提交补丁。
延伸阅读:接口层完整的逆向说明见 Documentation/wmi/devices/alienware-wmi.rst;属性语义见 sysfs-platform-alienware-wmi 与 debugfs-alienware-wmi;平台档位与 HWMON 的通用 ABI 分别见 sysfs-class-platform-profile 与 sysfs-class-hwmon;驱动实现源码集中在 drivers/platform/x86/dell/(WMAX/AWCC)、alienware-wmi-base.c(公共/老式 RGB)与 alienware-wmi-legacy.c。
【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考