news 2026/9/8 17:36:04

Linux 内核 Alienware WMI 驱动(AWCC 接口)技术指南:平台档位、温控与风扇控制实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 内核 Alienware WMI 驱动(AWCC 接口)技术指南:平台档位、温控与风扇控制实战

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 的模块入口逻辑可以看到驱动的初始化路线:

  1. 首先执行dmi_check_system(),依据 DMI 表挑选老式 AlienFX(RGB)灯光功能所需的 quirk(如 RGB zone 数量、是否具备 HDMI mux / 放大器 / 深睡眠能力);
  2. 随后调用wmi_has_guid(WMAX_CONTROL_GUID)判断固件中是否存在 WMAX 设备:
    • 存在 → 注册 WMAX WMI 驱动(alienware-wmi-wmax,内部再按 DMI 表决定走 AWCC 功能还是老式灯光功能);
    • 不存在 → 退回注册 LEGACY 驱动(alienware-wmi-alienfx)。

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.cawcc_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*_inputfan*_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]_boostRW风扇 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 进制)
GetFanSensors19AWCC_METHOD_GET_FAN_SENSORS(0x13)
Thermal_Information20AWCC_METHOD_THERMAL_INFORMATION(0x14)
Thermal_Control21AWCC_METHOD_THERMAL_CONTROL(0x15)
FWUpdateGPIOtoggle32AWCC_METHOD_FWUP_GPIO_CONTROL(0x20)
ReadTotalofGPIOs33AWCC_METHOD_READ_TOTAL_GPIOS(0x21)
ReadGPIOpPinStatus34AWCC_METHOD_READ_GPIO_STATUS(0x22)
GameShiftStatus37AWCC_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读取某风扇当前 RPMByte1=风扇 ID
0x06读取风扇转速百分比(并非所有型号实现)Byte1=风扇 ID
0x08读取某风扇最小 RPMByte1=风扇 ID
0x09读取某风扇最大 RPMByte1=风扇 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
QuietLegacy0x96
BalancedLegacy0x97
Balanced PerformanceLegacy0x98
PerformanceLegacy0x99
BalancedUSTT0xA0
Balanced PerformanceUSTT0xA1
CoolUSTT0xA2
QuietUSTT0xA3
PerformanceUSTT0xA4
Low PowerUSTT0xA5

要点:

  • 支持 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_gpiosgpio_ctl/pinX:设备上报的 GPIO 总数与引脚状态读写节点(pinX 为 RW)。

管理指南未展开介绍这些节点,但值得知晓其存在——当你怀疑驱动枚举出的拓扑不对时,hwmon_datapprof_data是排查枚举结果的直接入口。

综合排查路径与使用小结

当你的 Alienware/Dell G 系列在 Linux 下"缺功能"时,可按以下顺序定位(均为查看与配置操作,不涉及内核源码修改):

  1. 确认驱动已绑定 WMAX 设备:检查/sys/bus/wmi/devices/A70591CE-A997-11DA-B012-B622A1EF5492/是否存在;
  2. 确认 AWCC 能力被启用:DMI 表未收录的机型默认走 RGB/深睡眠功能而非 AWCC。此时可加载模块参数重试,例如:
    modprobe alienware_wmi force_platform_profile=1 force_hwmon=1
  3. 定位 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;

  4. 定位 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 17:35:33

IA-LUT:4D查找表破解暗光视频增强的实时与一致性难题

暗光视频增强在业内一直是个“做了很多年但落地很难”的方向。单帧图像增强的论文层出不穷&#xff0c;效果也确实越做越好&#xff0c;但一旦从图片切到视频&#xff0c;各种问题就冒出来了——最典型的就是实时性不够和帧间闪烁严重。我最早接触这个方向的时候&#xff0c;试…

作者头像 李华
网站建设 2026/9/8 17:34:28

大疆无人机对接指南:从SDK选型到实战踩坑全解析

“大疆无人机对接”这几个字&#xff0c;如果你不是圈内人&#xff0c;第一眼看到可能觉得不就是把飞机连上手机或遥控器么。但真做起来你会发现&#xff0c;这个“对接”二字涵盖的东西远比想象中复杂——它可能是指用Mobile SDK把航拍画面和飞行数据接进自家App&#xff0c;也…

作者头像 李华
网站建设 2026/9/8 17:30:49

OrinX上安装jtop

OrinX上采用sudo pip3 install githttps://github.com/rbonghi/jetson_stats.git 安装jetson_stats如果github网站不能访问或者OrinX上的python版本不够高&#xff0c;大概率会卡死等待不动。先科学上网把jetson_stats代码下载到OrinX本地&#xff0c;然后安装支持软件:sudo ap…

作者头像 李华
网站建设 2026/9/8 17:30:33

微信小程序UI自动化测试实践:从技术选型到稳定性优化

有一段时间&#xff0c;我们团队发布微信小程序版本前最怕听到一句话&#xff1a;“回归过了吗&#xff1f;”。十几个核心页面&#xff0c;登录、首页流转、列表筛选、下单、支付回调&#xff0c;手工点一遍少说也得大半天&#xff0c;临发版前改一行样式都得重跑。后来我把这…

作者头像 李华
网站建设 2026/9/8 17:30:03

List、NumPy数组与PyTorch张量:从shape到reshape全解析

最近在调试一个PyTorch训练脚本时&#xff0c;我又遇到了那个熟悉的画面&#xff1a;数据最初是Python的list&#xff0c;中间转成了np.array&#xff0c;最后又被封装成torch.Tensor&#xff1b;shape从(128,)变成(128,3,32,32)&#xff0c;最后在模型输出里变成torch.Size([1…

作者头像 李华