Прошивка BIOS через SPI интерфейс

Автор ToolGIR. Опубликовано в Компьютерное

SPI-on-commando

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

Немного предыстории:

Материнская плата ASUS Commando, без, модного нынче, Dual BIOS. Только Boot Block – небольшая область BIOS, не затрагиваемая записью, которая позволяет, в случае необходимости, инициализировать минимальный набор компонентов, необходимых для включения компьютера, произвести поиск BIOS на съемных носителях. Обычно подходят Floppy или флешка с файлом прошивки, переименованным в AMIBOOT.ROM (зависит от BIOS и материнской платы, точнее написано в инструкции к плате), либо CD с драйверами из комплекта поставки. Обнаружив подходящий файл, boot block запишет его в BIOS и, если все прошло правильно, компьютер после перезагрузки оживет. Неплохая фишка, несколько раз выручала, но в данном случае она не сработала, видимо, оказался поврежден и boot block.

Пришлось искать другие решения. Так как в своем арсенале инструмента у меня не было паяльной станции и стационарного программатора для разных eeprom’ок, пришлось искать более доступные решения. Рассматривая плату, я обнаружил на ней небольшой разъем SPI_J1, а микросхема флеш памяти как раз с SPI интерфейсом. Поиск в Интернет показал, что существуют вполне приличные заводские девайсы и немало самоделок для прошивки SPI микросхем через USB (об универсальных программаторах с поддержкой SPI даже не говорю, это само собой). Правда, поиск по местным магазинам, СЦ и форумам в отличии от Google ничего не дал, а заказывать и ждать месяц очень не хотелось.

Еще немного поиска, и вот оно, решение – статья чешского комрада (на чешском) о предельно простом программаторе и софтине к нему для прошивки микросхем флеш памяти с SPI интерфейсом! Ничего сложного, минимум компонентов.

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

Сборка устройства

Для сборки нам понадобится:

  • 1 разъем DB25P, можно отрезать от ненужного шнура от принтера
  • 4 шт. резисторы по 150 Ом
  • 1 любой электролитический конденсатор емкостью 100 мкФ или более и рабочим напряжением на 6.3 В или больше (нужен при запитке от БП)
  • Кусок плоского шлейфа с IDC разъемом на 10 контактов (он идеален при наличии SPI разъема на плате)
  • Штекер molex (как на жестких дисках ATA), либо гнездо для батарейки CR2032

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

Схема с сайта автора, при подключении непосредственно к чипу (для флеш-памяти с рабочим напряжением 3 вольта):

Прошивка BIOS через SPI: Схема spipgm

Программатор SPIPGM может использоваться и для микросхем флеш-памяти с рабочим напряжением 1.8 Вольт. Автор применяет для этого дополнительный модуль (своего рода переходник), который подключается к основному модулю и состоит из дополнительных резисторов для гашения напряжения и каскада усиления на транзисторах BC547 для выходного сигнала чипа (схемы на сайты автора по ссылке выше). Ниже приводится адаптация схемы подключения, сразу предназначенная для работы с чипами на 1.8В. Для получения напряжения питания в 1.8 Вольта применен делитель напряжения (на схеме серые резисторы, желательно 1/4 Ватт), делитель при желании может быть пересчитан на другие номиналы (я указываю варианты 10 и 12 Ом, или 100 и 120 Ом), а еще лучше заменен подходящим DC-DC преобразователем (например, TLV70018). Диоды любые, нужны они для минимизации ошибок и, в принципе, можно обойтись без них.

Схема spipgm для чипов памяти на 1.8В

Мы же будем подключать программатор не к чипу, а к разъему SPI_J1.

Если разъем 7 контактный, то подключается к нему следующим образом:

Схема подключения SPI к 7-ми контактному разъему
1. -> питание +3.3v
2. -> земля от питания и вывод 18 на LPT
3. -> резистор -> LPT 7
4. -> резистор -> LPT 8
5. -> резистор -> LPT 10
6. -> резистор -> LPT 9

Так же, на некоторых материнских платах бывают 9 контактные разъемы, там схема подключения немного отличается:

Схема подключения SPI к 9-ти контактному разъему

Разъем DB25P хорош тем, что внутри него можно разместить все необходимые детали. Желательно использовать максимально короткую длину кабеля, иначе будут ошибки записи. Неплохо было бы закрыть провода экраном, либо от антенного кабеля, либо просто обмотав фольгой от шоколадки, не забыв подсоединить экран к земле (GND).

Расположение элементов программатора внутри DB25P

При питании от батарейки конденсатор можно исключить. Лично я брал с +5 шины блока питания (красный провод), подключив к нему через разъем molex и погасив напряжение диодами до ~3.3v (двух-трех диодов будет достаточно).

Схема подключения диодов
Блок питания все же надежней батарейки. Имея отдельный БП можно запитать напрямую от шины +3.3 (оранжевый провод ATX разъема). Чтобы запустить блок питания без компьютера нужно замкнуть зеленый и черный провода.

Девайс в сборе:

Собранный SPI программатор

Программа SPIPGM

Теперь можно переходить к программному обеспечению.

Программа поддерживает большое количество чипов (полный список в файле Readme.txt) и по заявлению автора работает быстрей аналогов. Скачать свежую версию можно с сайта автора, либо отсюда:

Проект, кстати, развивается и по сей день, автор частенько выкладывает обновленные версии программы с информацией о новых чипах, доработками и исправлениями.

В архиве следующие файлы:

SPIPGM – исполняемый файл для Linux
SPIPGM.EXE – исполняемый файл для DOS/Win9x
SPIPGMW.EXE – исполняемый файл для Win9x/NT/2k/XP/Vista/7 (только х32, поддержки х64 нет)
IOPERM.DLL – библиотека для низкоуровневого доступа в Win9x/NT/2k/XP/Vista/7(без UAC)

Надежней всего прошивать из DOS, загрузившись с Hiren или любого другого подходящего загрузочного CD/Flash. Но можно и из Windows.

Синтаксис и основные команды:

Синтаксис: spipgmw /<команда> [имя файла] [адрес] [размер] [/l=адрес] [/d=задержка]

Основные команды:

i – идентификация флеш памяти
d имя файла – считать содержимое флеш памяти в файл
p имя файла – записать флеш память из файла прошивки (без стирания)
v имя файла – сравнить содержимое флеш памяти с файлом прошивки
e – полное стирание флеш памяти
b – проверка стирания флеш памяти
u – разблокировать защиту от записи (зависит от сигнала WP#)
Имя файла — полное имя файла, например: file.bin, file.rom и т.п. Расширение роли не играет, главное чтобы это был корректный файл образа и правильно указано имя.

Прошивка BIOS через SPI:

spipgmw /i – идентификация чипа. Для проверки все ли правильно подключено, программа должна определить тип установленной памяти. Если этого не происходит, проверьте правильность подключения и поддержку чипа программой.

spipgmw /d BIOS.bak – если нужно сохранить резервную копию имеющегося BIOS.

spipgmw /u – разрешение записи.

spipgmw /e – стирание.

spipgmw /p FILE.rom – запись прошивки («FILE.rom» – имя файла прошивки, нужно чтобы файл находился в одной папке с программой)

…ждем процесс записи…

spipgmw /v FILE.rom – сравниваем записанные данные с файлом прошивки. Либо можно сделать дамп spipgmw /d test.rom и сравнить его содержимое с оригинальным файлом прошивки в каком-нибудь Hex-редакторе.

Возможно наличие небольшого количество ошибок. Зависит от длинны кабеля, стабильности питания, типа памяти. Конечно, желательно, чтобы ошибок не было вовсе, но даже с некоторым количеством ошибок компьютер скорей всего запустится, а там уже можно прошить BIOS штатными средствами.

Данный способ подходит не только для прошивки BIOS материнских плат, но и любых других устройств, имеющих SPI разъем, либо напрямую, любой поддерживаемой микросхемы.

Теги: , , ,

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

  • Печаль

    |

    А что делать, если 5 бинов у SPI?

    Ответить

    • ToolGIR

      |

      Изучить. Может там земля не выведена. Может это вообще не SPI. Или к чипу напрямую подключаться.

      Ответить

  • Михаил

    |

    Ох, обещал, заглядывать, ссылку сами найдёте, или подсказать? Райан выпустил в конце мая 2.28.

    Ответить

    • ToolGIR

      |

      Спасибо, что напомнили ) Обновил.

      Ответить

      • Михаил

        |

        Райер выпустил 06.10 2,28 под х64. Что-то у меня не пошло. Он проверял под 10.

        Ответить

        • ToolGIR

          |

          У меня тоже не работает на 10 (последнее обновление 1809, на других проверить не могу пока). С десяткой куча танцев с бубном: нужно UAC отключить, проверку цифровой подписи драйверов отключить (для этого может потребоваться Secureboot отключить в UEFI), запускать строго от админской CMD а не с PowerShell. И не факт что еще заработает.
          Намного проще скачать с интернета загрузочный диск с XP и быстренько сделать дело.

          Ответить

  • Михаил

    |

    Списался с Мартином, автором. IOPORT.DLL, драйвер грузится динамически, поэтому regserv32 бла-бла не прокатывает. Пришлось воспользоваться, чтобы взвести для Асус бит S9 QuadEnable в регистре статуса. Всё получилось, мать стартанула. Попутно прошил и верифицировал всю прошивку целиком, под ЛОС и WIN x64. Всё на УРА.

    Ответить

      • Михаил

        |

        Ошибочка, там ЛОС-ДОС!!! У меня раздел всегда досовский под рукой, я начинал на РК-86 CP/M ставить, электронный диск, магнитофон с контроллерами 580ВВ51, ВИ53, ВК28-38. Сейчас с UEFI BIOS на короткой ноге, с помощью ребят, чего-то достиг. Например, в Асус биос смог запихнуть вместо прошивальщика бестолкового EZ нормальный Shell.efi. Как-то так. Я захожу периодически.

        Ответить

        • Михаил

          |

          А, микрокоды любые куда угодно ручками вставляю, причём с проверками. Т.е., никаких ошибок. Есть интересная тема, на сокете 1150 поставить с помощью китайских переходников BGA-1150 ноутбучный процессор i7-4980hq. + кеш L4 + разгон по желанию. Из буста сделать постоянную работу. Цена вопроса у парня из Рязани 11.000. С гарантией. Обзор —
          https://overclockers.ru/blog/ATRChannel/show/22333/crystalwell-bolshoj-faq

          Ответить

          • ToolGIR

            |

            Я как-то последнее время отошел от всех этих модификаций, допиливаний, припиливаний. Да и производители материнок не стоят на месте, за последние годы все нормально шьеться через встроенный прошивальщик на любых матерях. Что еще надо )
            Ну а вообще поковыряться это всегда прикольная тема. =)

            Ответить

  • Петр

    |

    Добрый день.
    Спаял, запускаю, определение проходит четко, разблокировка не проходит, стирание тоже, попытка записать и считать выводит только нули. Что может быть? Напряжение 3,5в, чуть поднимал и опускал, ничего не меняется…
    Что может быть?

    f:\SPIPGMW.EXE -i

    SPI FlashROM Programmer 2.28 (C) 2008-2018 by Martin Rehak; rayer@seznam.cz
    Compiled by GCC 8.1.0 at 11:48:02, Oct 6 2018
    (Win9x/NT/64 compatability)

    SPI connected to LPT port at I/O base address: 378h, SCK pulse width: t+0us
    FlashROM JEDEC ID, type: EF4016h
    Winbond W25Q32BV/FV (4MB)
    S/N = DE6710659F875821h
    Status = 3A00h (SUS,CMP,LB3,LB2,LB1,-,QE,SRP1,SRP0,SEC,TBP,BP2,BP1,BP0,WEL,BSY)
    0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0

    f:\SPIPGMW.EXE -u

    SPI FlashROM Programmer 2.28 (C) 2008-2018 by Martin Rehak; rayer@seznam.cz
    Compiled by GCC 8.1.0 at 11:48:02, Oct 6 2018
    (Win9x/NT/64 compatability)

    SPI connected to LPT port at I/O base address: 378h, SCK pulse width: t+0us
    FlashROM JEDEC ID, type: EF4016h
    Winbond W25Q32BV/FV (4MB)
    S/N = DE6710659F875821h
    Status = 3A02h, WE bit is enabled, blocks protection is enabled
    Unlocking…
    Status = 3A00h, unlock failed, maybe OTP lock or try to set WP# pin at high level

    f:\SPIPGMW.EXE -e

    SPI FlashROM Programmer 2.28 (C) 2008-2018 by Martin Rehak; rayer@seznam.cz
    Compiled by GCC 8.1.0 at 11:48:02, Oct 6 2018
    (Win9x/NT/64 compatability)

    SPI connected to LPT port at I/O base address: 378h, SCK pulse width: t+0us
    FlashROM JEDEC ID, type: EF4016h
    Winbond W25Q32BV/FV (4MB)
    S/N = DE6710659F875821h
    Status = 3A02h, WE bit is enabled, blocks protection is enabled
    ERROR: FlashROM is locked, run unlock command first!

    f:\SPIPGMW.EXE -p flash1.bin

    SPI FlashROM Programmer 2.28 (C) 2008-2018 by Martin Rehak; rayer@seznam.cz
    Compiled by GCC 8.1.0 at 11:48:02, Oct 6 2018
    (Win9x/NT/64 compatability)

    SPI connected to LPT port at I/O base address: 378h, SCK pulse width: t+0us
    FlashROM JEDEC ID, type: EF4016h
    Winbond W25Q32BV/FV (4MB)
    S/N = DE6710659F875821h
    Programming page at: 003FFF00h (100%)

    f:\SPIPGMW.EXE -d flash4.bin

    SPI FlashROM Programmer 2.28 (C) 2008-2018 by Martin Rehak; rayer@seznam.cz
    Compiled by GCC 8.1.0 at 11:48:02, Oct 6 2018
    (Win9x/NT/64 compatability)

    SPI connected to LPT port at I/O base address: 378h, SCK pulse width: t+0us
    FlashROM JEDEC ID, type: EF4016h
    Winbond W25Q32BV/FV (4MB)
    S/N = DE6710659F875821h
    Reading sector at: 003FF000h (100%)

    f:\

    Ответить

    • ToolGIR

      |

      Здравствуйте.
      Ответ в этой строке — Status = 3A00h, unlock failed, maybe OTP lock or try to set WP# pin at high level
      Разблокировка не прошла, соответственно делать с памятью программатор ничего не может.
      Пишет, что либо пароль на памяти, либо нет напряжения на WP#. Проверьте наличие напряжения 3.3 на 3й ножке. Некоторым помогает подать напряжение на мат.плату.

      Ответить

  • Петр

    |

    Спасибо за совет, видимо память сдохла, с неё все и началось, приставка DC1301HD перестала загружаться, первый раз помогло штатное обновление прошивки с флешки, через три месяца все повторилось, только до обновления прошивки уже не дошло, надпись DCOLOR и перезагрузка. Подцепился ком портом, пробовал обновить через командную строку, стереть стерлась(кажется), при заливке новой — failed и failed… В итоге после выключения питания — кирпич. Попытки оживить через другой программатор(чужой самодельный), успеха не принесли, хотя память 24 серии на нем успешно программировалась. В итоге купил новую, два дня на том программаторе успеха не дали, не пишет и не читает. Сегодня подцепил к параллельному порту, вообще не определяет, проверил ножки, мда, пришепка не катит, часть ножек в воздухе. Извратился, добился полного контакта, и о чудо, заработало! Со второй попытки образ записался и прочитался без ошибок! Ура!

    Ответить

    • ToolGIR

      |

      Вау )) целый приключенческий рассказ :-D
      Вот это по-нашему! Все же добиться результата. Рад, что получилось. =)

      Ответить

  • Michael

    |

    Могу ли я заходить без пре- модерации? Расскажу, как ставить WIN с флешки NTFS, а не FAT32. Это для подготовленных

    Ответить

    • ToolGIR

      |

      Можно без премодерации, главное имя и имейл чтоб тот же был.
      А смысл всех этих телодвижений? Есть Rufus — который прекрасно создает загрузочные флешки хоть FAT32, хоть NTFS. В том числе под UEFI (что нынче важно).

      Ответить

  • Михаил

    |

    Теперь про суть.
    Первое, списался с Мартином Райером, чехом, автором SPI_Programmer. IOPERM.DLL как бы это комично не выглядело — DLL,дайнемик лодейбл либрери, подгружается ТОЛЬКО динамически, на время работы. regserv32 не прокатывает.
    Второе. Во всех старых и новых биосах от ВСЕХ производителей лежит драйвер DXE NTFS от AMI. Запускаю UEFI Shell, Команда DIR или LS показывает часть содержимого моего 1 Тб неактивного, незагрузочного. Меняю DXE AMI на GRUB NTFS — вижу всё. Далее, замена драйвера DXE в биос, флешка NTFS, 1903 ставится без проблем.
    Но!!! Ссылку могу дать на FFS модуль, замена, боюсь, неподготовленные окирпичат свои ПК.
    Нужны пояснения, ссылка — непременно отвечу, здесь или в личке. Удачи. На сайте атмосфера доброжелательная.

    Ответить

  • Михаил

    |

    Я это к чему, миф об обязательной флешке в формате FAT32 меня не устраивает,осталось проверить USB FlashBack с зашитым в биос драйвером DXE GRUB. Похоже, косяк от AMI. Их драйвер кочует до сих пор.

    Ответить

  • Михаил

    |

    Ну вот нет у меня мамки с FlashBack! Испытатателю вылижу биос. Ещё. Есть драйверы для FAT32 от GRUB. Есть такая вещь,очень тяжело стартует FlashBack, люди подбирают флеш-стик. Может замена драйвера FAT от GRUB изменит ситуацию?

    Ответить

  • Михаил

    |

    Насчёт FlashBack я погорячился, это работает МЕ, хаб. Всё до вектора старта биос. Ведь без CPU и плашек памяти. Это далее всё выполняется в кеще процессора, до инит памяти. Это PEI модули далее инит продолжают.

    Ответить

  • Сергей

    |

    Здравствуйте! Очень благодарен вам за подробную и наглядную инструкцию! Спасибо! Сделал программатор под 9тиножечную SPI для прошивки BIOS на мат.плате MSI, но, к сожалению, ничего не получилось, перепаивал провода на более короткие и качественные, но и это не помогло, программа не видит чип: FFFF00FFh — parity error!. Как думаете, если я, всё же некачественно спаял провода, хотя это и маловероятно, но хоть как то программа должна же была определить чип? Или всё же мёртвая флешка? Так хотелось восстановить сложное тех.устройство своими руками, и ничего — 2 дня мучился и одно расстройство :-(

    Ответить

    • ToolGIR

      |

      Здравствуйте. Могу посоветовать что-то из этого: 1. попробовать более стабильный источник питания, поиграть с напряжением, если есть возможность. 2. подать напряжение на материнку (просто воткнуть разъемы питания чтобы дежурка пошла) — некоторым это помогает.

      Ответить

Оставить комментарий

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