Leer o establecer registros en la placa base

Con los microcontroladores es bastante fácil encender/apagar un LED escribiendo en un registro.

Esta pregunta es, en cambio, un intento de escribir en un registro de dispositivo PCI en una computadora de escritorio.

De manera similar, me gustaría leer/escribir los registros en la placa base para controlar los ventiladores (encendido, apagado o incluso la velocidad) o los LED de alimentación o del disco duro, o los sensores de temperatura.

Dada, por ejemplo, una placa base Asus y un sistema operativo Linux, ¿es posible? ¿Y qué tipo de hoja de datos se debe leer, si existe, para obtener los nombres de registro en la placa base? Nunca encontré para una placa base de consumo algo como la hoja de datos de un microcontrolador.

Eche un vistazo a las hojas de datos del conjunto de chips de la placa base Intel en su sitio web.
Para Linux, eche un vistazo a "sensores de película".
Led de alimentación, cableado. LED HD, cableado, ventiladores, solo si no cableado, sensores de temperatura, solo lectura. Nada de lo que desea generalmente está controlado por gpio por la mayoría de las placas base.
Si busca hablar con la placa base a través de un bus PCI, necesitará algo como esto. ics.uci.edu/~harris/ics216/pci/PCI_22.pdf

Respuestas (2)

La documentación sin duda existe. No siempre está disponible gratuitamente, pero existe.

Siempre hay un código fuente de linux y bsd que también puede leer si son compatibles con estos periféricos, ahí lo tiene (sí, sé que no siempre es una lectura fácil).

Si ya existe un controlador de dispositivo para este periférico, obtenga información sobre cómo comunicarse con ese controlador de dispositivo. lm-sensors como pjc50 comentó es un ejemplo.

Si no, a menudo puede atravesar la protección del sistema operativo con mmap() y desde la aplicación hablar directamente con las cosas. Dependiendo de lo que intente hacer (equipo de prueba de placa base, equipo de prueba de tarjeta pcie, etc.), eso puede ser suficiente. La forma correcta de hacerlo es modificar o escribir un controlador del kernel y hablar con él/a través de él para llegar al periférico, puede ser un controlador tan delgado o grueso como desee, pero al menos la última milla de escrituras/lecturas proviene del espacio del núcleo no aplicación.

Tenga en cuenta que DOS todavía se usa para la placa base y otras pruebas, ya que es uno de los mejores sistemas operativos bare metal (oxímoron intencional), y si está trabajando en estrecha colaboración con una empresa de placa base, es posible que le proporcionen la fuente o los fragmentos de código de sus programas de prueba que parpadean. o leer el sensor de temperatura, etc.

Sí, la documentación de la placa base, incluso si tiene acceso, no es lo mismo que un microcontrolador, la audiencia es diferente, a menudo son solo los programadores de BIOS (contratistas) y la gente de prueba interna los que necesitan la documentación, y eso es todo, por lo que podría ser garabatos. una pizarra

Al ser una PC, lo que necesita un sistema operativo se define por convención o detectable, por lo que no necesita documentación, solo busca cosas mediante programación y encuentra lo que está presente. Según sea necesario, según lo que encuentre, vaya al sitio de ese proveedor de chips específico para obtener la hoja de datos (que se lee como un microcontrolador) para esa parte. algún chip de puente pcie de Intel, allí mismo en el sitio web de Intel. Un puente USB o maestro, el mismo trato. Tarjeta de video, bueno, es posible que no sean tan abiertas. Controlador de disco duro, busque la hoja de datos. Ethernet, encuentre la hoja de datos y léala. lspci es tu amigo. lsusb es tu amigo. Google es tu amigo.

A diferencia de lspci, es posible que no haya programas de línea de comandos existentes que atraviesen la protección del sistema operativo que le permitan hurgar en lo que desee. Dependiendo de qué y dónde sea, es posible que deba escribir un programa y ahí es donde entra en juego mmap().

Escribir código para Linux es muy diferente a escribir código para un microcontrolador . En un sistema operativo moderno, realiza llamadas a través del sistema operativo, a un controlador, que luego se comunica con un hardware específico, sin hacer todo este trabajo directamente.

Un microcontrolador pequeño puede tener una hoja de datos de 600 páginas... las hojas de datos no se hacen sobre una computadora completa porque tendría diez mil páginas o más, y sería diferente para cada cambio de hardware. Además, algunos circuitos integrados utilizados en el interior, como la GPU, contienen propiedad intelectual , lo que significa que el proveedor no quiere compartir cómo funciona. Ellos crean los conductores. Pero con el tiempo, muchas de las funciones principales de la computadora se han estandarizado en ciertas direcciones, como COM1 siendo 0x3F8 y LPT1 siendo 0x3BC. (UEFI es otra historia). En Linux, intente esto para encontrar las direcciones de los dispositivos. Tenga en cuenta que el BIOS de la computadora establece muchas de estas direcciones, pero los sistemas operativos modernos no tienen que usar el BIOS en absoluto.

La única forma en que una computadora y un microcontrolador son remotamente comparables es a nivel de lenguaje ensamblador . E incluso entonces hay muchas diferencias entre ellos, pero al menos comparten registros físicos, direcciones de E/S e instrucciones. Para Linux, la programación en ensamblador probablemente se haga usando NASM . La búsqueda en la web aparece mucho, como el acceso directo a la tarjeta de sonido en NASM (sin sistema operativo) . Incluso un sistema operativo completo ( MenuetOS ) se ha escrito en ensamblador, sin embargo, utiliza una sintaxis ligeramente diferente (FASM). Aún así, podría ser interesante ver cómo acceden a las cosas, solo por curiosidad. Para usuarios de MS Windows, consulte MASM32 y GoASM .

Ensamblador todavía se puede usar hoy para todo, desde la programación de aplicaciones hasta el desarrollo del sistema operativo, pero es bastante anticuado. Espere una curva de aprendizaje muy empinada si elige el ensamblador... no porque el ensamblador sea inherentemente difícil, sino porque probablemente quiera usar un sistema operativo, y eso agrega una gran cantidad de ambigüedad y complicación al ensamblador. Del mismo modo, el desarrollador de MenuetOS ha estado trabajando en su sistema operativo desde 2005. C y otros lenguajes de nivel superior ocultan gran parte de esta complejidad, por lo que la mayoría de las personas lo prefieren.

Pero parece que lo que quieres hacer es escribir un controlador. Los conductores pueden acceder al hardware. Se puede encontrar mucha información buscando cómo+escribir+controlador+Linux como este , pero lo que probablemente desee es más como Escribir controladores de dispositivos en Linux . Lo cual es demasiado largo para colocarlo aquí. Baste decir que un buen libro (moderno) sobre cómo escribir controladores de dispositivos en Linux sería su mejor opción.