2009-01-27 21 views
17

¿Existe una forma estándar de Windows para hacer cosas como "iniciar ventilador", "disminuir velocidad" o similar, desde C/C++?¿Acceder mediante programación al ventilador de la CPU en una computadora portátil? (Windows)

Tengo la sospecha de que podría ser ACPI, pero soy un mortal frágil y no puedo leer ese tipo de documentación.

Editar: p. Windows 7 le permite seleccionar en su plan de energía opciones como "enfriamiento pasivo" (¿solo cuando las cosas se calientan?) Vs. "enfriamiento activo" (¿mantiene la CPU proactivamente fría?). Parece que el sistema operativo tiene una forma de controlar el ventilador de forma genérica.

Respuesta

20

Estoy trabajando en este momento en un proyecto que, entre otras cosas, controla los ventiladores de la computadora. Básicamente, los ventiladores están controlados por el chip superIO de su computadora. Accedemos al chip directamente usando IO mapeado por puerto, y desde allí podemos acceder al dispositivo de ventilador lógico. El uso de port-mapped IO requiere que el código se ejecute en modo kernel, pero windows no proporciona ningún controlador para el puerto genérico IO (con buenas razones, ya que es una herramienta muy poderosa), así que escribimos nuestro propio controlador y lo usamos.

Si desea seguir este camino, básicamente necesita conocimientos en dos áreas: desarrollo de controladores y cómo acceder e interpretar la información del chip superIO. Cuando comenzamos el proyecto, no sabíamos nada en ninguna de estas áreas, por lo que ha estado aprendiendo navegando, leyendo y finalmente haciendo. Para obtener el conocimiento, nos ha ayudado especialmente al mirar estos enlaces:

  1. El WDK, que es el Kit de controladores de Windows. Necesita esto para compilar cualquier controlador que escriba para Windows, con esto viene una gran cantidad de código fuente, por ejemplo, controladores, incluido un controlador para IO general mapeado en puerto, llamado portio.
  2. WinIO tiene un código fuente para un controlador en C, un dll en C que instala y carga programáticamente ese controlador, y algún código C# para una GUI, que carga el dll y lee/escribe en los puertos. El controlador es muy similar al de portio.
  3. lm-sensors es un proyecto de Linux que, entre otras cosas, detecta su chip superIO./prog/detect/sensors-detect es el programa perl, que hace la detección, y hemos pasado un tiempo revisando el código para ver cómo interactuar con un chip superIO.
  4. Cuando estábamos revisando el código lm-sensors, era muy bueno tener herramientas como RapidDriver y RW-everything, ya que nos permitían simular una carrera de detección de sensores.Este último es el más poderoso y es muy útil para visualizar el espacio IO, mientras que el primero proporciona un acceso más fácil a algunas operaciones que se correlacionan mejor con las detecciones de sensores (leer/escribir bytes en el puerto)
  5. Finalmente, usted Necesito encontrar la hoja de datos de tu chip superIO. A partir de los ejemplos que he visto, los controladores de entorno de cada chip proporcionan una funcionalidad similar (velocidad del ventilador r/w, temperatura de lectura, voltaje del chip de lectura), pero varían en qué registros debe escribir para obtener esta funcionalidad . This lugar ha tenido todas las hojas de datos, que hemos necesitado hasta ahora.
+1

¿Dónde entra ACPI en acción aquí? Teóricamente, uno podría parchear el DSDT, compilar con el compilador ASL, cargar la tabla parcheada, y luego la velocidad del ventilador sería controlada por esa lógica parcheada. Otra opción es usar nhc.exe, que tiene un modelo de complemento, algo así como, que permite a un desarrollador escribir código para controlar los objetos administrados por ACPI. – Cheeso

1

Sí, Sería ACPI, y para mi conocimiento las ventanas no le dan mucho/ningún control sobre eso desde el espacio del usuario. Por lo tanto, tendrías que comenzar a extraer los controladores, lo que es casi imposible en Windows.

Dicho esto, google reveals hay algunas bibliotecas de código abierto de Windows para esto para hardware específico ... por lo que dependiendo de su hardware es posible que pueda encontrar algo.

0

ACPI puede o no permitirle ajustar la configuración del ventilador. Sin embargo, algunas implementaciones del BIOS pueden no permitir ese control: pueden forzar el control dependiendo de la configuración del BIOS/CMOS. Uno podría estar en apuros para un buen caso de uso donde el control del BIOS (incluso personalizado) es insuficiente. Me he encontrado con situaciones en las que el control de BIOS era insuficiente, pero no para todas las plataformas de placa base posibles.

0

La biblioteca de instrumentos de administración de Windows (WMI) proporciona un Win32_Fan Class e incluso un método SetSpeed. Por desgracia, los documentos dicen que esto no está implementado, así que supongo que no es muy útil. Pero puede controlar las cosas configurando el estado de energía.

2

Si desea algo realmente rápido para reducir los ventiladores a un nivel en el que sabe que las cosas no se sobrecalentarán, existe el programa Speedfan para hacerlo. Descubrir cómo configurarlo en las primeras versiones para bajar automáticamente a los ventiladores al 50% en el arranque de la computadora fue tan doloroso que mi primer enfoque fue simplemente parcharlo por bytes para iniciar el único ventilador superio administrado que tenía a menor velocidad. Las versiones más nuevas todavía son un poco difíciles, pero es factible: hay un sistema deslizante gráfico que se parece al ecualizador de audio, excepto que el eje x es temp yy es la velocidad del ventilador. Los arrastras uno por uno. Después de averiguar cómo obtener el control manual para el ventilador que desea, este es el próximo paso.

Hay un proyecto para monitorear el hardware (como ventiladores) con C#: http://code.google.com/p/open-hardware-monitor/

no extensivamente lo he mirado, pero el código fuente y el uso de al menos WinRing0.sys da la impresión de que si sabe qué controlador de ventilador tiene y tiene la hoja de datos, también debe ser modificable para establecer valores en lugar de solo obtenerlos. No sé qué herramienta es adecuada (al lado del depurador del kernel) para ver lo que hace Speedfan, si prefieres husmear e imitar a speedfan en lugar de mirar las hojas de datos y probar cosas.

Cuestiones relacionadas