Программатор SPI Flash на Arduino для BIOS: как вернуться в рабочее состояние

от автора

Во время обновления 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, тоже не хотелось.

    Возможным выходом из ситуации стал программатор на 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.


ссылка на оригинал статьи https://habr.com/ru/articles/734748/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *