Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
En este proyecto se intentó utilizar la interfaz SPI que utiliza una placa madre para leer el
integrado que contiene el BIOS y posteriormente poder borrarlo y regrabarlo, todo esto sin
interferir en el funcionamiento del equipo y permitiendo regrabar cualquier integrado de la familia
25XXX.
S
Sería muy sencillo hacer un documento con los diagramas y alguna que otra explicación pero se
dejaría atrás mucha información útil, se aprendería muy poco y solo le sería útil a un eventual flojo
con pocas ganas de leer y aprender. Por lo tanto aquí se agrupa toda la información que utilice
para desarrollar el programador, un poco resumida para no alargar tanto el documento pero
suficiente para entender los principios que utilicé para construirlo.
IO
Protocolo SPI (Serial Peripheral Interface) - Wikipedia
El Bus SPI (del inglés Serial Peripheral Interface) es un estándar de comunicaciones, usado
principalmente para la transferencia de información entre circuitos integrados en equipos
electrónicos. El bus de interfaz de periféricos serie o bus SPI es un estándar para controlar casi
cualquier dispositivo electrónico digital que acepte un flujo de bits serie regulado por un reloj
XB
(comunicación sincrónica).
Incluye una línea de reloj, dato entrante, dato saliente y un pin de chip select, que conecta o
desconecta la operación del dispositivo con el que uno desea comunicarse. De esta forma, este
estándar permite multiplexar las líneas de reloj.
Muchos sistemas digitales tienen periféricos que necesitan existir pero no ser rápidos. La ventajas
de un bus serie es que minimiza el número de conductores, pines y el tamaño del circuito
integrado. Esto reduce el coste de fabricar, montar y probar la electrónica. Un bus de periféricos
serie es la opción más flexible cuando se tiene tipos diferentes de periféricos serie. El hardware
consiste en señales de reloj, data in, data out y chip select para cada circuito integrado que tiene
que ser controlado. Casi cualquier dispositivo digital puede ser controlado con esta combinación
de señales.
SCLK: (Clock): Pulso que marca la sincronización. Con cada pulso se lee o se envía un bit.
MOSI - DO: (Master Output Slave Input): Salida de datos del Master y entrada de datos al Slave.
MISO - DI: (Master Input Slave Output): Salida de datos del Slave y entrada al Master.
SS/Select o CS: Para seleccionar un Slave, o para que el Master le diga al Slave que se active.
S
Esas serían básicamente las funciones de cada bus.
En la siguiente imagen podemos ver la distribución de los pines de cualquier memoria utilizada en
las placas madres de cualquier PC o Laptop. Como podemos ver se encuentran presentes los
mismos buses aunque en las memorias para placa madre se agregan dos buses más, /WP (Pin 3) y
IO
HOLD (Pin 7). Se obviaron los pines 8 y 4 por ser los de alimentación y porque cumplen funciones
obvias para cualquier circuito.
XB
/WP: Se utiliza para evitar la escritura accidental de la memoria, lo que dañaría el contenido de la
misma haciendo que el equipo no funcione. Durante la programación este pin se utiliza para
desactivar la protección contra escritura y permitir la modificación del contenido de la misma.
HOLD: Se podría decir que pausa el integrado cuando el mismo está seleccionado por el
dispositivo Master como activo a través del pin /CS (Pin 1).
Ahora que se entendió muy básicamente el funcionamiento del protocolo vayamos a los que no
importa, el programador.
S
IO
Como se puede apreciar el circuito consta de solamente de cinco componentes, dos resistencias,
XB
dos memorias y un interruptor. El programador intenta interferir lo menos posible en el
funcionamiento del equipo por lo tanto permite que el mismo arranque de manera normal y
posteriormente poder grabar cualquier memoria. Para eso consta de dos zócalos, el zócalo A es
fijo y contiene la memoria original de la placa madre con su BIOS original, esto permite el normal
arranque, mientras que en el zócalo B se ubican las memorias a grabar, todo esto se conecta a la
placa madre en el mismo lugar donde antes se ubicaba la memoria de la BIOS. (Sección verde)
El interruptor lo que hace es intercambiar entre una memoria y la otra a través del pin 1 (Chip
Select). Al memento de arrancar el equipo el interruptor se deja en la posición “A”, una vez
arrancado se mueve a la posición “B” para grabar la memoria que se insertó, cuando el equipo se
apaga o se reinicia se vuelve a colocar el interruptor en la posición del chip “A” para que la placa
madre lea el integrado y arranque el equipo, en caso de encontrarse en la posición “B” el equipo
simplemente no arranca y basta con colocar el interruptor en la posición “A” y reiniciar la placa
para que se produzca el arranque de manera normal. Las resistencias de 10K se utilizan mientras
cada integrado no está activo y mantienen el Pin 1 en un estado alto (Es decir que si el interruptor
se encuentra en la posición “A” el Pin 1 del integrado “B” se mantiene en estado alto a través de la
resistencia, desactivando totalmente el mismo. Lo que garantiza que en ningún momento se
habilite el integrado no seleccionado y así se evita que se puedan producir errores de
programación o daños a la información de ambos integrados, solo se utiliza uno a la vez.
Como verán el funcionamiento es extremadamente sencillo y fácil de implementar. No tiene
mayores explicaciones ni hace falta incurrir en descripciones aún más técnicas. Básicamente todos
tenemos un programador en nuestras PC’s. y podemos utilizarlo sin arriesgar tanto e invirtiendo
muy poco dinero.
S
IO
XB
Hasta aquí se describió el protocolo SPI y el programador que se construyó. Ahora solo queda
describir el software y los pasos a seguir para programar una memoria.
Software
El programa que se utilizó es Flashrom v0.9.9, es una utilidad para identificar, leer, escribir,
verificar y borrar chips flash. Está diseñado para grabación de imágenes BIOS, UEFI, Coreboot
firmware u optionROM en placas madre, tarjetas de red, tarjetas gráficas y controladores de
almacenamiento, su compatibilidad es realmente alta, es compatible con 476 chips flash, 291
chipsets, 500 placas madres, 79 dispositivos PCI y 17 programadores USB además de ser
compatible con varios programadores por puerto paralelo y serie como el programador de Rayer.
Es de código abierto y actualmente se encuentra en un grado bastante alto de madurez y
estabilidad, es compatible con muchos modelos de chipsets, excepto los de laptop en donde no se
S
garantiza su funcionamiento. No posee interfaz gráfica pero tampoco la necesita ya que es
extremadamente fácil de utilizar y por líneas de comandos se pueden llevar a cabo todas sus
funciones. Se ejecuta sobre sistemas Windows y Linux, este último fue el elegido para ejecutarlo.
Ubuntu 14.04 LTS 32 bits por funcionar mucho mejor en Linux que en Windows. (Flashrom no es
compatible con sistemas x64)
IO
XB
Lo primero que hacemos es ejecutar Flashrom para comprobar su funcionamiento. Como vemos
en la imagen Flashrom nos pide que como primera medida identifiquemos que programador
vamos a utilizar ya es que compatible con muchos modelos inclusive el CH341A. En nuestro caso
por ser una placa madre de PC el parámetro a usar es “internal” ya que no existe programador
externo sino la misma interfaz que utiliza el chipset para leer la BIOS.
S
IO
XB
Una vez que ejecutamos Flashrom con el parámetro “internal” podemos ver cómo nos detecta el
modelo del chipset, el de la memoria además de indicarnos su capacidad. En la imagen se pueden
ver dos detecciones una corresponde a la BIOS original de la PC con el interruptor en posición “A”
y vemos que el modelo detectado es MX25L4005 (512Kb, SPI). Luego se cambia el interruptor a la
posición “B” y se vuelve a ejecutar el comando, en este caso detecta una memoria A25L40PT/PU.
Justo en este caso no pudo especificar automáticamente si se trata de una memora A25L40PT o
A25L40PU por lo tanto nos pide que a la hora de programar o leerla especifiquemos con el
parámetro “-c <modelo>” el modelo de la memoria.
S
IO
Como podemos ver con solo cambiar el interruptor Flashrom puede detectar diferentes memorias
sin necesidad de mayores esfuerzos.
Ahora veamos cómo se realiza una backup.
XB
S
IO
En la imagen podemos ver que se ejecuta flashrom “sudo ./flashrom”, se especifica que el
programador es el interno “-p internal”, se especifica el modelo de la memoria (esto solo se realiza
XB
cuando Flashrom no puede determinar el modelo exacto) “-c A25L40PU” y por último se realiza la
lectura y volcado a un archivo llamado “bios.bin” con el parámetro “-r bios.bin”. Más abajo
podemos leer “Reading flash…done” lo que significa que leyó sin problemas toda la memoria.
Inmediatamente después se procede a verificar que el contenido del archivo “bios.bin” coincida
con los datos almacenados en la memoria. Para ello se ejecuta el mismo comando anterior pero
en lugar del parámetro “-r bios.bin” se utiliza el parámetro “-v bios.bin”. Flashrom vuelve a leer el
contenido y realiza la comparación, si los datos coinciden más abajo se puede leer “Verifying
flash…VERIFIED” lo que significa que los datos son iguales tanto en la memoria como en el archivo.
Por último se procede al borrado y grabación de la memoria con la actualización correspondiente.
S
IO
Se ejecuta flashrom, se especifica la memoria pero se agrega el parámetro “-E” el cual produce el
borrado de toda la memoria (este proceso es irreversible). Más abajo podemos leer “Erasing and
XB
writing flash chip…Erase/write done.” Lo que significa que la memoria se borró sin problemas.
Por último se vuelven a ejecutar los mismos comandos pero esta vez con el parámetro “-w
update.bin” lo que hace que Flashrom grabe el archivo “update.bin” que se encuentra en la misma
carpeta. Y para finalizar Flashrom vuelve a leer el contenido y lo compara con el del archivo
elegido para la grabación, si todo salió bien podemos leer “Verifying flash…VERIFIED” y con eso
concluye la programación. Una vez realizado esto ya podemos apagar el equipo, no sin antes
volver el interrutor a la posición “A” el interruptor.
S
IO
XB