Sei sulla pagina 1di 10

Programador SPI con Motherboard

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.

Breve introducción teórica.

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.

El diagrama básico de un sistema SPI es el siguiente, en él se tiene un dispositivo que actúa en


modo Master y otro u otros que se comportan como Slave (Esclavo). Puntualmente en el caso de
este proyecto el dispositivo que actúa como Master sería la placa madre de la PC mientras que el
dispositivo Slave sería el integrado de la BIOS.
Como se ve en la imagen el protocolo SPI consta básicamente de 4 buses, aunque en el integrado
de la placa veremos un total de 6 sin contar las líneas VCC y GND.

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.

El programador surgió de la necesidad de programar ciertas memorias que en un programador


CH341A presentaban múltiples errores de lectura, escritura y borrado. La idea es que sea lo más
económico posible para su rápida implementación y que le envidie la menor cantidad de
características posibles a un programador de los “Ad-Hoc”, modelos comerciales chinos. A
continuación el circuito.

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.

Aquí una imagen del programador en funcionamiento.

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

Ahora veamos cómo se programa una memoria.


En primer lugar se enciende la PC con el interruptor en la posición “A” para que dicha memoria sea
leída y permita el arranque, una vez arrancado y ya dentro del S.O se puede mover el interruptor a
la posición “B” sin ningún riesgo, el equipo seguirá funcionando normalmente ya que la memoria
solo se utiliza durante el arranque.

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.

Aclaraciones y ventajas encontradas:


La lectura y programación es extremadamente rápida en comparación a un programador USB
como el CH341A, con la placa madre utilizada “Gigabyte GA-945GCM-S2C” pude alcanzar tasas de
lectura del orden de 1Mb/s (Se leyó una memoria 25Q128 en 15 segundos y se la grabó en
aproximadamente 30 segundos. (Una de las características que no esperaba y me parecieron
excelentes)
La interfaz es completamente nativa del protocolo SPI lo que garantiza programaciones perfectas
el 100% de las veces, sin errores. Podría decirse que el programador es “marca Intel”.
Su implementación es rápida y muy económica, cualquier persona tiene una placa antigua que
puede reciclar para este fin con muy buenos resultados.
Se necesita muy poca experiencia, solo electrónica básica y conocimientos de Linux básicos.
Como “desventaja” se podría decir que no posee interfaz gráfica pero como dije anteriormente
tampoco le hace tanta falta, la lectura y escritura es realmente rápida, en caso de que se demore
más de un minuto en leer o escribir sabríamos que hay un problema porque en condiciones
normales jamás demora tanto (Eso al menos en la placa que yo utilicé, en otra placa donde realicé
las mismas pruebas los tiempos fueron un tanto mayores pero en ningún caso demoró lo que
demora un CH341A.
Hasta acá llegamos, espero que les haya sido de utilidad y puedan implementarlo.
Saludos.
Elvis.

S
IO
XB

Potrebbero piacerti anche