Программный доступ к вентилятору CPU на ноутбуке? (Windows)

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

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

Edit: например, Windows 7 позволяет выбрать в вашем плане питания такие параметры, как" пассивное охлаждение " (только когда становится жарко?) против " активного охлаждения "(держите CPU проактивно прохладным?). Кажется, у ОС есть способ контролировать вентилятор генетически.

5 ответов


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

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

  1. на WDK, который является набором драйверов Windows. Вам это нужно скомпилируйте любой драйвер, который вы пишете для windows, с ним приходит много исходного кода, например, драйверов, включая драйвер для общего IO с сопоставлением портов, называемый portio.
  2. WinIO имеет исходный код для драйвера в C, dll в C, который программно устанавливает и загружает этот драйвер, и некоторый код C# для GUI, который загружает dll и читает/записывает в порты. Водитель очень похож на водителя в portio.
  3. lm-сенсоры является проектом linux, это, среди прочего, обнаруживает ваш чип superIO. / prog/detect / sensors-detect-это программа perl, которая выполняет обнаружение, и мы потратили некоторое время, просматривая код, чтобы увидеть, как взаимодействовать с чипом superIO.
  4. когда мы проходили код lm-датчиков, было очень приятно иметь такие инструменты, как RapidDriver и RW-все, так как они позволили нам имитировать запуск датчиков-обнаружить. Последнее является более мощным и очень полезно в визуализации пространства ввода-вывода, в то время как первый обеспечивает более легкий доступ к некоторым операциям, которые лучше сопоставляются с датчиками-обнаружение (чтение/запись байта в порт)
  5. наконец, вам нужно найти техническое описание вашего чипа superIO. Из примеров, которые я видел, контроллеры среды каждого чипа обеспечивают аналогичную функциональность (скорость вращения вентилятора r/w, температура чтения, напряжение считывания чипа), но различаются в том, в какие регистры вы должны писать, чтобы добраться до этой функциональности. этой у места были все таблицы данных, которые нам нужны до сих пор.

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

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

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


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

Что сказал: google показывает есть несколько библиотек windows с открытым исходным кодом для этого для конкретного оборудования... поэтому в зависимости от вашего оборудования вы можете что-то найти.


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


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