Во время обновления BIOS на материнской плате PRIME H270-PLUS c помощью утилиты ASUS EZ Flash 3 Utility компьютер завис. Шкала процесса установки зависла и не двигалась уже 30 минут. Было принято решение перезагрузить компьютер и надеяться на нормальную загрузку BIOS. Но чуда не произошло, материнская плата пришла во временно нерабочее состояние. Педагог дополнительного образования Международного центра компетенций Казанского техникума ИТ и связи Динар Мурсалимов рассказывает, как решил задачу.
Есть несколько способов для восстановления BIOS при неудачной прошивке:
ASUS BIOS Flashback и Flash BIOS Button
На материнской плате есть специально обозначений USB-слот, который и используется для аварийного восстановления BIOS, а также специальная кнопка, после нажатия на которою и будет запущен процесс обновления BIOS.
![](https://habrastorage.org/getpro/habr/upload_files/6e9/18d/bf2/6e918dbf24f72ed8e27b6a5fb24af98c.png)
Очень удобная технология у современных материнских плат Asus и MSI.
Dual BIOS
На плате имеются два чипа с одинаковыми прошивками: M_BIOS и B_BIOS (main/backup), которыми программно управляет чипсет. Если контрольная сумма основного BIOS искажена, то хост подключает к пространству системной памяти резервную микросхему и подает сигнал сброса Reset. Машина перезагружается уже с кодом бэкап-биоса и предлагает восстановить Main.
![](https://habrastorage.org/getpro/habr/upload_files/8f0/9e8/549/8f09e8549210fba497a3d13bbbde42b1.png)
Эта технология реализована только на некоторых материнских платах.
Использовать программатор для восстановления BIOS
![](https://habrastorage.org/getpro/habr/upload_files/d8d/b25/b3c/d8db25b3c5dca8847af166c2ef30bf3e.png)
Первые два способа мне не подошли из-за модели материнской платы, а покупать программатор чтобы прошить один BIOS, тоже не хотелось.
Возможным выходом из ситуации стал программатор на Arduino. Схема подключения Arduino UNO с микросхемой BIOS выглядит так:
![](https://habrastorage.org/getpro/habr/upload_files/471/ae9/bb5/471ae9bb599e1d2944d60568767d0290.png)
SPI-флешки обычно рассчитаны на 3.3V реже на 1.8V, но ели нет 3.3V от можно и 5V.
На некоторых платах имеется разъем JSP11 для прошивки BIOS.
После того, как прозвонил контакты мультиметром, подцепил провода, тем самым нет необходимости выпаивать микросхему BIOS.
![](https://habrastorage.org/getpro/habr/upload_files/b21/c35/17b/b21c3517b0d7beb361a8569715463da3.png)
![](https://habrastorage.org/getpro/habr/upload_files/eb4/5d7/40c/eb45d740c4dbdea00874f0f320c8ab27.png)
![](https://habrastorage.org/getpro/habr/upload_files/71a/4d3/12f/71a4d312fa9b81d38f8b2d529966428d.png)
Программа-программатор под Windows.
Выбираем COM порт и объём микросхемы BIOS.
![](https://habrastorage.org/getpro/habr/upload_files/ef2/cc5/494/ef2cc549405e02e7e486abfc77ee21d7.png)
![](https://habrastorage.org/getpro/habr/upload_files/d77/6b4/6a0/d776b46a0fa0c13c26a3c0fd8e53f4ed.png)
Для прошивания образа необходимо обязательно поставить курсор на адрес 0, после чего нажать кнопку «Вставить файл в текущую позицию».
Сама программа-программатор. Библиотеки к программе.
Загружаем скетч для Arduino
#include "SPIFlash.h"
#include <SPI.h>
#include <avr/wdt.h>
//////////////////////////////////////////
// flash(SPI_CS, MANUFACTURER_ID)
// SPI_CS - CS pin attached to SPI flash chip (8 in case of Moteino)
// MANUFACTURER_ID - OPTIONAL, 0x1F44 for adesto(ex atmel) 4mbit flash
// 0xEF30 for windbond 4mbit flash
//////////////////////////////////////////
SPIFlash flash(2, 0);
byte buf[1024];
void setup() {
Serial.begin(115200);
while (!Serial);
if (flash.initialize())
Serial.println("Init OK!");
else
Serial.println("Init FAIL!");
}
void loop() {
char cmd;
if (!Serial.available()) return;
cmd = Serial.read();
if (cmd == 't') {
Serial.print("COM ok\n");
return;
}
if (cmd == 'i')
{
Serial.print("DeviceID: ");
Serial.print(flash.readDeviceId(), HEX);
Serial.print('\n');
return;
}
if (cmd == 'a')
{
flash.chipErase();
while (flash.busy());
Serial.print("OK");
Serial.print('\n');
return;
}
if (cmd == 'e')
{
long sector = Serial.parseInt();
Serial.read(); // разделитель
flash.blockErase4K(sector);
Serial.print("OK");
Serial.print(sector);
Serial.print('\n');
return;
}
if (cmd == 'w')
{
long addr = Serial.parseInt();
Serial.read(); // разделитель
for (int bufsz = 0; bufsz < 128; bufsz++)
{
while (Serial.available() == 0);
buf[bufsz] = Serial.read();
}
flash.writeBytes(addr, buf, 128);
Serial.print("OK");
Serial.print(addr);
Serial.print('\n');
return;
}
if (cmd == 'r') {
long addr = Serial.parseInt();
Serial.read(); // разделитель
for (int i = 0; i < 4; i++)
{
flash.readBytes(addr + (i * 1024) + 0, buf, 1024);
for (int j = 0; j < 1024; j++)
Serial.write(buf[j]);
}
return;
}
}
У ASUS файлы BIOS имеют расширение «.CAP», который указывает штатной программе прошивки от ASUS, какие файлы принимать или «видеть» при поиске на накопителях, а какие – нет. Что касается разницы в размере файлов, то она заключается в первых 2048 байтах. Там находятся данные для программы прошивки – сведения о версии, модели платы и другое.
При подготовке файла для прошивки на программаторе необходимо всего лишь отрезать начало файла размером в 2048 байт в любом HEX редакторе, и записать получившийся файл программатором в ПЗУ. Или воспользоваться программой ASUS CAP_to_BIN.
![](https://habrastorage.org/getpro/habr/upload_files/f3e/a4b/795/f3ea4b795d1f7569b2cecb5c0c1e1a1c.png)
Как выяснилось, программатор может иногда не работать. Причин может быть несколько:
Слишком длинные провода к флешке (нормально 8-15 см)
Китайская ардуина (например, Arduino Nano V3)
Нерабочая флешка.
После обновления необходимо отключить разъем JSP11от Arduino, и после этого запустить компьютер для проверки обновления BIOS.