Как стать автором
Обновить
0
Команда Цифровой Трансформации Татарстана
Министерство цифрового развития Татарстана

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

Время на прочтение3 мин
Количество просмотров6.2K

Во время обновления 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: ↑6 и ↓2+6
Комментарии9

Публикации

Информация

Сайт
digital.tatarstan.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия

Истории