Доступ к встроенному контроллеру вентилятора ноутбука программно?

Я хочу получить доступ к встроенному контроллеру моего (Windows) ноутбука, чтобы контролировать скорость вращения вентилятора. В настоящее время я делаю это вручную, используя RW Everything - как я могу получить доступ к встроенному контроллеру, например. используя С? Спасибо за любую подсказку!

Обратите внимание: я знаю, что RW Everything можно использовать из командной строки, но вызывать его каждую секунду для чтения какого-либо регистра не так уж и приятно...


person stefan.at.wpf    schedule 21.02.2012    source источник
comment
Проверьте stackoverflow.com/q/485448/1098754 - кажется хорошей отправной точкой.   -  person David Pointer    schedule 22.02.2012
comment
спасибо Дэвид. грустно, это так сложно на окнах. в linux это очень просто, думаю, мне следует установить linux на свой ноутбук :D   -  person stefan.at.wpf    schedule 22.02.2012
comment
Могу я спросить, зачем вам нужно управлять вентилятором?   -  person LastStar007    schedule 25.07.2012
comment
Может быть, Speedfan подойдет для того, что вы хотите сделать, вы проверяли? спидфан   -  person rx_tx    schedule 26.07.2012
comment
@stefan.at.wpf, не могли бы вы предоставить некоторые конкретные данные (учебник или документы) о точном методе управления скоростью вентилятора с помощью «RW Everything»? Я бы тоже хотел протестировать. Спасибо.   -  person Sopalajo de Arrierez    schedule 10.06.2014
comment
@SopalajodeArrierez Google для управления вентиляторами Acer, есть инструмент с таким названием, и где-то есть документация. К сожалению, у меня его больше нет, но он все еще должен быть где-то в сети.   -  person stefan.at.wpf    schedule 10.06.2014
comment
Вы когда-нибудь видели, как два человека одновременно пытаются управлять одним и тем же мотоциклом? Первый шаг — запретить Windows делать что-либо, связанное с управлением скоростью вращения вентилятора (возможно, в том числе запретить Windows касаться каких-либо регистров EC, которые вряд ли будут атомарными).   -  person Brendan    schedule 11.07.2021


Ответы (2)


Если вы используете RWEverything для простого изменения битов в адресах физической памяти, вы всегда можете сопоставить физическую память с пространством локальной памяти процесса с помощью MmMapIoSpace или любой другой API-функции Windows, которая предоставляет вам RW-доступ к физической памяти. После отображения раздела пространства, к которому вам нужен доступ, вы можете напрямую обратиться к нему и изменить его.

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

person Sniggerfardimungus    schedule 26.07.2012

Программно вам нужно будет создать драйвер режима ядра, который использует MmMapIoSpace и обрабатывает IOCTL из основной функции IRP_MJ_CONTROL, а затем вызывает для него StartServiceManager, CreateService и StartService, а затем отправляет IOCTL с помощью DeviceIoControl для выполнения задач, которые управляют базовой физической памятью / пространством ввода-вывода. / МСР. См.: https://stackoverflow.com/a/40449498/7194773. Вы больше не можете запрограммировать вентилятор. Обратите внимание на ответ Маргарет:

Стоит отметить, что 9 лет спустя SuperIO исчезли в ноутбуках, их заменили EC. EC имеют свою прошивку и используют интерфейс PECI для чтения DTS ЦП. HW PWM EC доступен только из EC, ОС больше не может контролировать FAN ЦП, если не путем настройки политики регулирования ЦП.

Раньше вы могли выбрать логическое устройство SuperIO, записав 07h в порт ввода-вывода 2Eh (индексный регистр), что заставляло южный мост генерировать циклы LPC, которые заставляли SIO выбирать регистр LDN (по смещению 07h в общем пространстве: смещения 00h–30h), а затем запишите LDN в порт 2Fh (регистр данных), чтобы сгенерировать циклы LPC, которые заставят SIO выбрать этот LDN. Это приведет к тому, что конфигурационное пространство LDN со смещением 30h–FFh будет отображено на портах, к которым затем можно получить доступ с помощью индекса, а затем чтение/запись в регистр данных. Бит в мосте LPC на PCH используется для выбора того, следует ли выставлять порты 2F/2E или 4F/4E.

В EC регистры были разделены на представление хоста и представление EC. Все регистры PWM и PECI больше не являются логическими устройствами, и их регистры отображаются только в пространство MMIO встроенного ЦП EC, оставляя только несколько общих регистров в обычном пространстве ввода-вывода, видимых хосту. Некоторые LDN предоставляют регистры базового адреса ввода-вывода в своем собственном пространстве (смещение 30h–FFh), что позволяет отображать дополнительные регистры. Прошивка EC использует шину PECI для считывания DTS ЦП и соответствующей регулировки скорости вращения вентилятора при известных смещениях регистров в его пространство MMIO.

person Lewis Kelsey    schedule 02.05.2020