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 设备的双套接口实现并重点深入较新的AWCCAlienware 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 表挑选老式 AlienFXRGB灯光功能所需的 quirk如 RGB zone 数量、是否具备 HDMI mux / 放大器 / 深睡眠能力随后调用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-B622A1EF5492LEGACY 控制与A80593CE-A997-11DA-B012-B622A1EF5492LEGACY 电源控制。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。从源码可见三类 quirkstatic 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_profile1强制探测 Platform Profile 支持force_hwmon1强制探测 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 的 Quiet0x96/0xA3→ 用户态quietBalanced0x97/0xA0→balancedBalanced Performance0x98/0xA1→balanced-performancePerformance0x99/0xA4与 G-Mode0xAB→performanceUSTT Cool0xA2→coolUSTT Low Power0xA5→low-powerCustom0x00→custom。档位的枚举、读取与切换枚举发生在 awcc_platform_profile_probe()驱动按风扇数 温度传感器数 未知资源数算出偏移量后用Thermal_Information操作 0x03 逐个列出资源 ID固件按风扇 ID → 温度 ID → 未知 ID → 热力档位 ID的顺序排列遇到无法映射的 ID 就跳过部分设备上报的档位数不准导致列表提前结束驱动遇到-EBADRQC也会安全中断。值得注意的实现细节G-Mode 档位不参与常规枚举——它并非在所有型号的资源列表中都稳定出现因此驱动统一通过 quirkawcc-gmode处理在支持机型上把performance档位映射到固件 ID 0xABCustom0x00档位被假定为所有型号都支持探测结束后无条件补入choices。读取当前档位profile_get回调调用Thermal_Information操作 0x0BAWCC_OP_GET_CURRENT_PROFILE拿到当前固件档位 ID再经awcc_profile_to_pprof()转成内核枚举返回。切换档位profile_set回调调用Thermal_Control操作 0x01AWCC_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 标注为CPU0x01、Front0x03、GPU0x06或Unknown风扇则按 AWCC_FAN_TYPES 枚举 标注为 CPU/GPU/PCI/Mid/Top/Side/U.2/Front/Bottom Fan 等如 CPU_10x32、GPU_10x33、TOP_10x36 等共 16 种预定义位置。温度读数经固件返回值乘以 1000 转换为毫摄氏度MILLIDEGREE_PER_DEGREE后上报。手动风扇控制它其实是 fan boost 值AWCC 接口并不直接暴露风扇 PWM而是允许驱动操控一个风扇boost 值。这个 boost 值对最终 PWM 的影响近似为pwm pwm_base (fan_boost / 255) * (pwm_max - pwm_base)即 boost0 时风扇回到基准 PWMboost255 时拉到最大 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操作 0x02AWCC_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 方法 IDWMAX 设备的接口描述可借由 bmfdec 工具从其内嵌的二进制 MOFbmof中解码。解码得到的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_Information0x14操作清单操作Byte 0说明参数0x02读取系统描述返回结构Byte0风扇数Byte1温度传感器数Byte2未知Byte3热力档位数无0x03列出给定索引处的资源 ID按风扇 ID、温度 ID、未知 ID、热力档位 ID顺序排列需先用 0x02 得知各段长度Byte1索引0x04读取某温度传感器的当前温度Byte1传感器 ID0x05读取某风扇当前 RPMByte1风扇 ID0x06读取风扇转速百分比并非所有型号实现Byte1风扇 ID0x08读取某风扇最小 RPMByte1风扇 ID0x09读取某风扇最大 RPMByte1风扇 ID0x0A读取 balanced 热力档位 ID无0x0B读取当前热力档位 ID无0x0C读取某风扇当前 boost 值Byte1风扇 ID其余如 0x01、0x07 等操作含义未知。驱动实际只调用其中已确认安全的子集系统描述、资源枚举、温度、RPM、min/max、当前档位、boost。Thermal_Control0x15操作清单操作Byte 0说明参数0x01激活指定热力档位Byte1档位 ID0x02为指定风扇设置 boost 值Byte1风扇 IDByte2boost已确认的热力档位编码热力档位类型IDCustom特殊0x00G-Mode特殊0xABQuietLegacy0x96BalancedLegacy0x97Balanced PerformanceLegacy0x98PerformanceLegacy0x99BalancedUSTT0xA0Balanced PerformanceUSTT0xA1CoolUSTT0xA2QuietUSTT0xA3PerformanceUSTT0xA4Low PowerUSTT0xA5要点支持 USTTUser Selectable Thermal Tables档位的型号不再支持 Legacy 档位反之亦然源码 AWCC_THERMAL_TABLES 区分两类表枚举awcc_thermal_profile完整保留上述 12 个编码所有型号都支持Custom0x00G-Mode 在 Dell G 系列上取代 PerformanceGameShiftStatus0x25操作 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_descriptionWMAX 设备上报的原始系统描述数值ROhwmon_dataHWMON 私有数据包含风扇数、温度传感器数、内部风扇 ID 与温度 IDROpprof_dataPlatform Profile 私有数据包含各平台档位与固件热力档位 ID 的内部映射ROgpio_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_profile1 force_hwmon1定位 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、调整风扇 boostgrep -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),仅供参考