Программный доступ к процессору вентилятора на ноутбуке? (Windows)
Есть ли в Windows стандартный способ сделать такие вещи, как "запустить вентилятор", "уменьшить скорость" или тому подобное, из C/C++?
У меня есть подозрение, что это может быть ACPI, но я хрупкий смертный и не могу читать такую документацию.
Редактировать: например, Windows 7 позволяет вам выбирать в своем плане электропитания такие параметры, как "пассивное охлаждение" (только когда что-то нагреется?) Или "активное охлаждение" (поддерживать проактивное охлаждение ЦП?). Кажется, у ОС есть способ управлять вентилятором в целом.
5 ответов
Сейчас я работаю над проектом, который, помимо прочего, контролирует поклонников компьютеров. В основном, вентиляторы управляются чипом superIO вашего компьютера. Мы обращаемся к микросхеме напрямую, используя IO с отображением портов, и оттуда мы можем добраться до логического устройства вентилятора. Использование сопоставленного с портом ввода-вывода требует, чтобы код выполнялся в режиме ядра, но Windows не предоставляет никаких драйверов для универсального ввода-вывода порта (по уважительной причине, поскольку это очень мощный инструмент), поэтому мы написали наш собственный драйвер и использовали его.
Если вы хотите пойти по этому пути, вам в основном нужны знания в двух областях: разработка драйверов и способы доступа и интерпретации информации о чипах superIO. Когда мы начинали проект, мы ничего не знали ни в одной из этих областей, поэтому он изучал, просматривая, читая и, наконец, делая. Чтобы получить знания, нам особенно помогли, посмотрев на эти ссылки:
- WDK, который является Windows Driver Kit. Это необходимо для компиляции любого драйвера, который вы пишете для Windows. Он содержит множество исходного кода, например, драйверы, включая драйвер для общего ввода-вывода с отображением портов, называемый portio.
- WinIO имеет исходный код для драйвера на C, DLL в C, которая программно устанавливает и загружает этот драйвер, и некоторый код C# для GUI, который загружает DLL и читает / записывает в порты. Драйвер очень похож на тот, что в portio.
- lm-sensor - это проект linux, который, помимо прочего, обнаруживает ваш суперио-чип. /prog/ Detect/ Sensor-Detection - это Perl-программа, которая выполняет обнаружение, и мы потратили некоторое время на изучение кода, чтобы понять, как взаимодействовать с чипом superIO.
- Когда мы просматривали код lm- sensor, было очень приятно иметь такие инструменты, как RapidDriver и RW-everything, поскольку они позволяли нам моделировать серию датчиков-детекторов. Последний является более мощным и очень полезен для визуализации пространства ввода-вывода, тогда как первый обеспечивает более легкий доступ к некоторым операциям, которые лучше сопоставляются с теми, которые используются при обнаружении датчиков (чтение / запись байта в порт)
- Наконец, вам нужно найти таблицу данных вашего чипа superIO. Из примеров, которые я видел, контроллеры среды каждого чипа предоставляют схожую функциональность (скорость вращения вентилятора, скорость чтения, напряжение чтения чипа), но различаются в какие регистры нужно записывать, чтобы получить доступ к этим функциям., В этом месте были все таблицы, в которых мы нуждались до сих пор.
Если вы хотите что-то очень быстрое, чтобы просто опустить вентиляторы до уровня, когда вы знаете, что вещи не будут перегреваться, для этого есть программа speedfan. Изучение того, как настроить его в ранних версиях для автоматического снижения вентиляторов до 50% при запуске компьютера, было настолько болезненным, что мой первый подход состоял в том, чтобы просто пропатчить его, чтобы запустить единственный управляемый суперио вентилятор, который был у меня на более низкой скорости. Новые версии все еще немного сложны, но это выполнимо - есть графическая система слайдеров, которая похожа на звуковой эквалайзер, за исключением того, что ось x - это температура, а y - скорость вращения вентилятора. Вы перетаскиваете их один за другим. После того, как вы выясните, как получить ручное управление нужным вентилятором, это следующий шаг.
Есть проект для мониторинга оборудования (например, фанатов) с помощью C#: http://code.google.com/p/open-hardware-monitor/
Я не смотрел подробно на него, но исходный код и использование WinRing0.sys по крайней мере создает впечатление, что если вы знаете, какой у вас контроллер вентилятора, и у вас есть таблица данных, она должна быть модифицируемой, чтобы также устанавливать значения, а не просто получать их, Я не знаю, какой инструмент подходит (помимо отладчика ядра), чтобы посмотреть, что делает Speedfan, если вы предпочитаете подглядывать и имитировать speedfan вместо того, чтобы смотреть на таблицы данных и пробовать что-то.
Да, это будет ACPI, и, насколько мне известно, окна не дают большого / какого-либо контроля над этим из пространства пользователя. Таким образом, вы должны начать работать с драйверами, что практически невозможно на Windows.
Тем не менее, Google показывает, что есть несколько библиотек Windows с открытым исходным кодом для этого для конкретного оборудования... поэтому, в зависимости от вашего оборудования, вы можете найти что-то.
Библиотека инструментария управления WIndows (WMI) предоставляет класс Win32_Fan и даже метод SetSpeed. Увы, в документах говорится, что это не реализовано, поэтому я думаю, что это не очень полезно. Но вы можете контролировать вещи, устанавливая состояние питания.
ACPI может или не может позволить вам настроить параметры вентилятора. Некоторые реализации BIOS могут не разрешать этот контроль - они могут принудительно управлять в зависимости от настроек BIOS/CMOS. Один из них может оказаться трудным для хорошего случая использования, когда управление BIOS (даже настроенное) недостаточно. Я сталкивался с ситуациями, когда управление BIOS действительно было недостаточным, но не для всех возможных плат материнских плат.