skweez.net

BIOS wiederherstellen mit Arduino

by mks
07.07.2011

Vor einiger Zeit habe ich mein nur wenige Monate altes Mainboard gebrickt, indem ich versehentlich eine falsche BIOS-Version eingespielt habe. Leider kam die Erleuchtung zu spät: Never change a running system! Gut, dass ich noch ein Notebook habe und dass ich eh schon immer mal etwas mit einem Arduino machen wollte. Jetzt schien mir die richtige Gelegenheit dafür.

Warnung: Der Artikel ist etwas lang. Für Individuen der Twitter-Generation mit einer auf 140 Zeichen verkürzten Aufmerksamkeitsspanne hier die Kurzform:

Hab es geschafft: #bios #flashen mit #Arduino https://github.com/michaelkanis/arduino_bios_flash

Vorbereitung

Zunächst war ich mal erleichtert, als ich gesehen habe, dass der Chip gesockelt und nicht gelötet ist. Das machte das Vorhaben um einiges einfacher. Den Aufkleber des Mainboard-Herstellers vom Chip entfernt, gibt dieser seine Typenbezeichnung preis. Wenn man ein bisschen nach den vielen Nummern googlet, findet man schnell raus, um welchen Chip es sich handelt. Meiner ist ein Macronix MX25L8006E. Eine Makroaufnahme mit einer einfachen Digicam hilft, die winzige Schrift lesbar zu machen.

Das Datenblatt des Herstellers erwies sich als sehr hilfreich. Erste Erkenntnis: der Chip wird per Serial Peripheral Interface (SPI) angesprochen. Der Arduino unterstützt dieses Protokoll ebenfalls von Haus aus. Würde er das nicht, könnte man es per Bit-Banging implementieren.

Mein größtes Problem war nun, dass der Arduino mit 5V-Pegeln arbeitet, der Macronix-Chip aber nur 3,3V-Pegel unterstützt. Das Risiko, den Chip durch eine zu hohe Spannung zu zerstören, wollte ich angesichts der schweren Beschaffbarkeit in Deutschland nicht eingehen. Allerdings bin ich Software-Entwickler und kenne mich im Prinzip überhaupt nicht mit Elektronik aus. Das nur als Anmerkung, falls jemand meine Lösungsversuche saudämlich findet. :-)

Meine grundlegende Vorgehensweise sollte so aussehen: Schaltung aufbauen. Software schreiben in drei Schritten: Chip auslesen, löschen, neu beschreiben. (EEPROM-Chips werden in zwei Schritten zunächst gelöscht und können dann erst neu beschrieben werden)

Erster Versuch: Spannungsteiler

Eine einfache Möglichkeit, aus einer höheren Spannung eine Niedrigere zu machen, ist ein Spannungsteiler. Weil ich mehrere Leitungen absenken musste, entschied ich mich, stattdessen den Ground-Level zu erhöhen. Da der erhöhte Ground-Level nun die LOW-Spannung auf ca. -1,7V abgesenkt hat, habe ich Dioden eingebaut, die daraus wieder 0V machen sollten. Nach einigem Basteln hatte ich nun eine scheinbar funktionstüchtige Schaltung. Natürlich habe ich den Chip erst eingesteckt, nachdem ich mit dem Multimeter sämtliche Spannungen an allen Pins (mehrmals) überprüft hatte.

Das Schreiben der Software zum Auslesen des Chips ging relativ flott, hier war ich wieder in "meinem Element". Zunächst sah es auch so aus, als wäre ich am Ziel. Das Auslesen klappte. Meistens. Manchmal. Irgendwie nicht zuverlässig. Bits gingen verloren. Mist.

Die Lösung: Zufall

Durch Zufall fand ich heraus, dass mein Arduino auf den 5V-Leitungen nur 3,3V ausgibt, wenn man ihn mit einem Netzteil statt über USB mit Strom versorgt, obwohl das Netzteil auch 5V hat. Ob das ein Bug oder ein Feature ist, weiß ich nicht, für mich ist es ein Feature. Da ich die USB-Verbindung trotzdem brauchte, um die BIOS-Datei zum Arduino zu übertragen, kappte ich in einem USB-Kabel die 5V-Leitung. Dann entfernte ich den Spannungsteiler und schloss den Chip direkt an den Arduino an. Jetzt klappte das Auslesen reproduzierbar perfekt. Was ich jetzt noch brauchte, war ein Stück Software auf Laptop-Seite, dass dem Arduino das BIOS in kleinen Happen schickt und wartet, da der BIOS-Chip zum flashen eine gewisse Zeit braucht. Nach ca. 10 Minuten war der Chip neu geflasht und mein Rechner startete wieder. Die Performance wäre vielleicht noch ausbaufähig, aber ich war ja am Ziel. Deswegen ist die Software auch nicht sonderlich schön. Insbesondere fehlt jede Fehlerbehandlung. Ich stelle sie trotzdem auf Github, vielleicht kann sie ja mal noch jemand gebrauchen. Lizenz: Beerware. Tut damit, was Ihr wollt und flattrt mir ein Bier, wenn Ihr mögt. Oder auch nicht. Gewähr gibt es natürlich keine, wenn ihr damit mehr kaputt macht, seid ihr selbst Schuld. :-)

Falls jemand mit Ahnung von Elektronik das hier liest: Warum klappt es mit dem Spannungsteiler nicht? Ist da ein Bauteil zu langsam? Ich habe auch gelesen, dass man aus so einer Schaltung nicht viel Strom ziehen darf. Könnte es daran liegen?

Könnte man stattdessen in jeder Leitung drei Silizium-Dioden in Reihe vorschalten, um die Spannung um (3 * 0,6V) = 1,8V auf 3,2V zu verringern?