Во время обновления BIOS на материнской плате PRIME H270-PLUS c помощью утилиты ASUS EZ Flash 3 Utility компьютер завис. Шкала процесса установки зависла и не двигалась уже 30 минут. Было принято решение перезагрузить компьютер и надеяться на нормальную загрузку BIOS. Но чуда не произошло, материнская плата пришла во временно нерабочее состояние. Педагог дополнительного образования Международного центра компетенций Казанского техникума ИТ и связи Динар Мурсалимов рассказывает, как решил задачу.
Есть несколько способов для восстановления BIOS при неудачной прошивке:
ASUS BIOS Flashback и Flash BIOS Button
На материнской плате есть специально обозначений USB-слот, который и используется для аварийного восстановления BIOS, а также специальная кнопка, после нажатия на которою и будет запущен процесс обновления BIOS.

Очень удобная технология у современных материнских плат Asus и MSI.
Dual BIOS
На плате имеются два чипа с одинаковыми прошивками: M_BIOS и B_BIOS (main/backup), которыми программно управляет чипсет. Если контрольная сумма основного BIOS искажена, то хост подключает к пространству системной памяти резервную микросхему и подает сигнал сброса Reset. Машина перезагружается уже с кодом бэкап-биоса и предлагает восстановить Main.

Эта технология реализована только на некоторых материнских платах.
Использовать программатор для восстановления BIOS

Первые два способа мне не подошли из-за модели материнской платы, а покупать программатор чтобы прошить один BIOS, тоже не хотелось.
Возможным выходом из ситуации стал программатор на Arduino. Схема подключения Arduino UNO с микросхемой BIOS выглядит так:

SPI-флешки обычно рассчитаны на 3.3V реже на 1.8V, но ели нет 3.3V от можно и 5V.
На некоторых платах имеется разъем JSP11 для прошивки BIOS.
После того, как прозвонил контакты мультиметром, подцепил провода, тем самым нет необходимости выпаивать микросхему BIOS.



Программа-программатор под Windows.
Выбираем COM порт и объём микросхемы BIOS.


Для прошивания образа необходимо обязательно поставить курсор на адрес 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.

Как выяснилось, программатор может иногда не работать. Причин может быть несколько:
Слишком длинные провода к флешке (нормально 8-15 см)
Китайская ардуина (например, Arduino Nano V3)
Нерабочая флешка.
После обновления необходимо отключить разъем JSP11от Arduino, и после этого запустить компьютер для проверки обновления BIOS.