Программный доступ к процессору вентилятора на ноутбуке? (Windows) - PullRequest
18 голосов
/ 28 января 2009

Есть ли в Windows стандартный способ сделать такие вещи, как «запустить вентилятор», «уменьшить скорость» или тому подобное, из C / C ++?

У меня есть подозрение, что это может быть ACPI, но я хрупкий смертный и не могу читать такую ​​документацию.

Редактировать: например, Windows 7 позволяет вам выбирать в своем плане электропитания такие параметры, как «пассивное охлаждение» (только когда все становится жарко?) Или «активное охлаждение» (поддерживать проактивное охлаждение процессора?). Похоже, в ОС есть способ общего управления вентилятором.

Ответы [ 5 ]

22 голосов
/ 03 июня 2010

Сейчас я работаю над проектом, который, помимо прочего, управляет поклонниками компьютеров. В основном, вентиляторы управляются чипом superIO вашего компьютера. Мы обращаемся к микросхеме напрямую, используя IO с отображением портов, и оттуда мы можем добраться до логического устройства вентилятора. Использование сопоставленного с портом ввода-вывода требует, чтобы код выполнялся в режиме ядра, но Windows не предоставляет никаких драйверов для универсального ввода-вывода порта (по уважительной причине, поскольку это очень мощный инструмент), поэтому мы написали наш собственный драйвер и использовали его.

Если вы хотите пойти по этому пути, вам в основном нужны знания в двух областях: разработка драйверов и способы доступа и интерпретации информации о чипах superIO. Когда мы начинали проект, мы ничего не знали ни в одной из этих областей, поэтому он изучал, просматривая, читая и, наконец, делая. Чтобы получить знания, нам особенно помогли, просмотрев эти ссылки:

  1. WDK , который является Windows Driver Kit. Это необходимо для компиляции любого драйвера, который вы пишете для Windows. Он содержит множество исходного кода, например, драйверы, включая драйвер для общего ввода-вывода с отображением портов, называемый portio.
  2. WinIO имеет исходный код для драйвера на C, dll на C, который программно устанавливает и загружает этот драйвер, и некоторый код C # для графического интерфейса, который загружает dll и читает / записывает в порты , Драйвер очень похож на тот, что в portio.
  3. lm-sensor - это проект linux, который, помимо прочего, обнаруживает ваш чип superIO. / prog / Detect / Sensor-Detect - это Perl-программа, которая выполняет обнаружение, и мы потратили некоторое время на изучение кода, чтобы понять, как взаимодействовать с чипом superIO.
  4. Когда мы просматривали код lm-sensor, было очень приятно иметь такие инструменты, как RapidDriver и RW-everything , поскольку они позволяли нам моделировать пробег датчиков -detect. Последний является более мощным и очень полезен для визуализации пространства ввода-вывода, в то время как первый обеспечивает более легкий доступ к некоторым операциям, которые лучше сопоставляются с теми, которые используются при обнаружении датчиков (чтение / запись байта в порт)
  5. Наконец, вам нужно найти таблицу данных вашего чипа superIO. Из примеров, которые я видел, контроллеры среды каждого чипа предоставляют схожую функциональность (скорость вращения вентилятора, скорость чтения, напряжение чтения чипа), но различаются тем, в какие регистры нужно записывать, чтобы получить доступ к этой функциональности. , В этом месте были все таблицы данных, которые нам были нужны до сих пор.
3 голосов
/ 22 января 2014

Если вы хотите что-то действительно быстрое, чтобы просто опустить вентиляторы до уровня, когда вы знаете, что вещи не будут перегреваться, для этого есть программа speedfan. Изучение того, как настроить его в ранних версиях для автоматического снижения вентиляторов до 50% при запуске компьютера, было настолько болезненным, что мой первый подход состоял в том, чтобы просто пропатчить его, запустив единственный управляемый вентилятор, который у меня был на более низкой скорости. Новые версии все еще немного сложны, но это выполнимо - есть графическая система слайдеров, которая похожа на звуковой эквалайзер, за исключением того, что ось x - это температура, а y - скорость вращения вентилятора. Вы перетаскиваете их один за другим. После того, как вы выясните, как получить ручное управление нужным вентилятором, это следующий шаг.

Существует проект для мониторинга оборудования (например, вентиляторов) с помощью C #: http://code.google.com/p/open-hardware-monitor/

Я не очень внимательно смотрел на него, но исходный код и использование WinRing0.sys по крайней мере создает впечатление, что если вы знаете, какой у вас контроллер вентилятора, и у вас есть таблица данных, она должна быть модифицируемой, чтобы также устанавливать значения вместо просто получаю их. Я не знаю, какой инструмент подходит (помимо отладчика ядра), чтобы посмотреть, что делает Speedfan, если вы предпочитаете подглядывать и имитировать speedfan вместо того, чтобы смотреть на таблицы данных и пробовать что-либо.

2 голосов
/ 28 января 2009

Да, это будет ACPI, и, насколько мне известно, окна не дают большого / какого-либо контроля над этим из пространства пользователя. Так что вам придется начинать работать с драйверами, что практически невозможно в Windows.

Тем не менее, Google показывает Есть несколько библиотек Windows с открытым исходным кодом для этого для конкретного оборудования ... поэтому в зависимости от вашего оборудования вы можете найти что-то.

0 голосов
/ 28 января 2009

Библиотека инструментария управления WIndows (WMI) предоставляет класс Win32_Fan и даже метод SetSpeed. Увы, в документах говорится, что это не реализовано, поэтому я думаю, что это не очень полезно. Но вы можете контролировать вещи, устанавливая состояние питания.

0 голосов
/ 28 января 2009

ACPI может или не может позволить вам настроить параметры вентилятора. Некоторые реализации BIOS могут не разрешать этот контроль - они могут принудительно управлять в зависимости от настроек BIOS / CMOS. Можно было бы жестко нажимать на хороший вариант использования, когда управление BIOS (даже настроенное) недостаточно. Я сталкивался с ситуациями, когда управление BIOS действительно было недостаточным, но не для всех возможных плат материнских плат.

...