Во время обновления 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.

Комментарии (8)


  1. GennPen
    13.05.2023 11:11
    +1

    Первые два способа мне не подошли из-за модели материнкой платы,

    Как это не подошли?

    Из инструкции на PRIME H270-PLUS

    SPI-флешки обычно рассчитаны на 3.3V реже на 1.8V, но ели нет 3.3V от можно и 5V.

    Замечательный подход. Учитывая еще то, что логика у ардуины 5-вольтовая, то не удивительно что "программатор может иногда не работать".


    1. ciuafm
      13.05.2023 11:11
      +1

      SPI-флешки обычно рассчитаны на 3.3V реже на 1.8V, но ели нет 3.3V от можно и 5V.

      Я думал тут появится преобразователь уровней, а тут такое! Это Хабр или дзен какой-то?


      1. SomeAnonimCoder
        13.05.2023 11:11

        Вопрос от диванного пытателя паяльника: а какой шанс что такой манёвр пройдёт без последствий для флешки? Или 100% сгорит?


        1. GennPen
          13.05.2023 11:11

          Не раз по запарке подключал 1.8В флешки к программатору на 3.3В без переходника. И вроде даже определялись нормально, но при чтении дампа - полный мусор. Скорее всего при подключении 3.3В флешки на 5В ситуация аналогичная: на небольшое время - выживут, но рисковать в любом случае не стоит.

          Вопрос в другом, если подключаться напрямую к флешке (через специальную колодку как на материнке из статьи, или через "прищепку") то как организована схема питания устройства материнки и есть ли чувствительные элементы по питанию. Как правило, если есть подобные колодки для прямого подключения, то должна быть блокировка подачи питания (например через диод) на остальные участки устройства.


        1. ABy
          13.05.2023 11:11

          Довольно высокий, но лучше подстраховаться.


        1. RikoMinase
          13.05.2023 11:11
          +1

          Микросхема SPI-Flash с большой долей вероятности и выживет, а вот подключенные по тем же линиям питания хаб и мультиконтроллер могут не оценить такую щедрость.


  1. Arhammon
    13.05.2023 11:11
    +2

    Добавлю то, что забыли авторы...


  1. azudem
    13.05.2023 11:11

    Статья, которая предлагает костыльное решение уже решённой проблемы (которое может спалить объект починки), небрежно оформленная, на ломаном русском ("школа процесса" уже во втором предложении) имеет положительный рейтинг. Типичный Хабр.