8-900-374-94-44
[email protected]
Slide Image
Меню

Spi flash что это – Проникновение в BIOS ROM: осваиваем SPI Flash №1

Содержание

Проникновение в BIOS ROM: осваиваем SPI Flash №1

Содержание статьи

Эта статья продолжает тему, связанную с угрозой искажения BIOS материнской
платы вредоносными программами. В ранее опубликованном материале
«Проникновение в BIOS ROM»
N1 и N2 был
приведен пример программы, выполняющей запись в микросхему BIOS, рассмотрены
механизмы защиты, используемые производителями материнских плат и причины, по
которым данные механизмы часто оказываются неэффективными. Напомним, что эта
проблема возникла более 10 лет назад, когда в качестве носителя BIOS начали
использовать микросхемы Flash ROM, допускающие перезапись содержимого без
физического вмешательства в компьютер. Таким образом, возможность оперативной
перезаписи (обновления) BIOS, привела к побочному эффекту – риску его случайного
или преднамеренного искажения.

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

искажения, и, конечно, новых уязвимостей. В ранее опубликованном материале,
ссылка на который приведена в начале статьи, рассматриваемая тема раскрыта на
примере платформы, использующей микросхему SST 49LF004A, подключенную к
интерфейсу LPC (Low Pin Count). Сегодня, ему на смену пришел интерфейс SPI
(Serial Peripheral Interface)
. Напомним, что для перезаписи содержимого
микросхемы BIOS, программа должна взаимодействовать с двумя блоками регистров:
регистры интерфейса Flash ROM, расположенные в составе «южного моста» чипсета и
регистры, входящие в состав самой микросхемы Flash ROM. При переходе от
интерфейса LPC к SPI, архитектура двух указанных блоков существенно изменилась.
Поэтому есть смысл рассмотреть взаимодействие программ с микросхемой BIOS,
механизмы защиты и их уязвимости применительно к современным платформам.
Материал снабжен примерами на ассемблере. Для экспериментов использовалась
материнская плата Gigabyte GA-965P-S3, построенная на чипсете Intel 965,
описанном в [2-3]. В качестве носителя BIOS на данной плате используется
микросхема SST 25VF080B, описанная в [5]. Эта микросхема имеет объем 8 Мегабит
(1 Мегабайт) и подключается к интерфейсу SPI. Некоторые микросхемы других
производителей, использующих тот же интерфейс, описаны в [4,6,7]. Описание
интерфейса SPI приведено в [8,9]. При взаимодействии с контроллером SPI, нам
потребуется использовать механизмы доступа к конфигурационному пространству,
описанные в документах [10-12].

 

Интерфейс SPI: историческая справка

Как известно, быстродействие микросхемы постоянного запоминающего устройства
(Flash ROM), используемой в качестве носителя BIOS, практически не влияет на
общую производительность компьютера. Это связано с тем, что при старте
материнской платы, BIOS переписывается (или распаковывается) в оперативную
память Shadow RAM и при обращении к BIOS в сеансе ОС, программы работают с

оперативной памятью, а не с микросхемой Flash ROM. Поэтому, в отличие от
процессора, памяти, графической подсистемы, эволюция которых сопровождается
ростом производительности, микросхемы Flash ROM и их интерфейсы развиваются в
другом направлении. Здесь главными критериями являются уменьшение стоимости,
потребляемой мощности и занимаемой площади на материнской плате. Главный метод
достижения этих целей – уменьшение количества проводников между микросхемой BIOS
и контроллером, обычно входящим в состав «южного моста» чипсета. С точки зрения
метода подключения микросхемы BIOS, можно выделить три поколения материнских
плат:

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

2) С появлением чипсетов Intel 810, 815, на основе «хабовой» архитектуры,
шина ISA ушла в прошлое. Ряд устройств материнской платы, ранее подключаемых к
ISA (контроллер гибких дисков, порты COM и LPT, микросхема BIOS), «переехали» на
интерфейс Low Pin Count или LPC, название которого переводится как «малое
количество сигналов». Сигналы адреса, данных и управления в этом интерфейсе
передаются по пяти линиям (не считая сигналов сброса, тактирования и линий
питания), в режиме мультиплексирования во времени. Микросхемы BIOS, используемые
в таких платформах, иногда называют Firmware Hub или FWH. Пример программы
стирания и записи микросхемы BIOS, приведенный в ранее опубликованной статье
«Проникновение в BIOS ROM» N1 и N2″ предназначен для таких платформ.

3) Начиная с чипсета Intel 945, в состав «южного моста» включен контроллер
специализированной последовательной шины Serial Peripheral Interface или SPI,

использующий передачу данных чтения и записи, а также управляющей и статусной
информации по однобитному последовательному каналу. Это позволило использовать
8-контактный корпус для микросхемы BIOS. Данная статья посвящена рассмотрению
именно таких платформ.

Отметим, что интерфейс LPC также поддерживается современными чипсетами и
разработчик материнской платы может использовать для подключения микросхемы BIOS
как LPC, так и SPI. Сфера применения интерфейса SPI не ограничивается
материнскими платами компьютеров. Внимательный читатель мог обратить внимание на
то, что из-за перехода к последовательному формату данных, каждый из описанных
интерфейсов использует больше тактов для выполнения операций чтения и записи,
чем его предшественник, что чревато снижением быстродействия. Но этого не
происходит, так как указанное обстоятельство компенсируется ростом частоты и
оптимизацией форматов данных. Шина ISA работает на частотах 5-8MHz, LPC на

33MHz, SPI на 33-50 MHz.

 

Архитектура микросхемы SPI Flash ROM

Микросхемы SPI Flash, в частности SST25VF080B, используют три сигнала для
приема и передачи данных. SCK (Serial Clock) – вход для тактирования
передаваемых или принимаемых данных. SI (Serial Input) – вход для передачи
данных от контроллера к микросхеме, по этой линии побитно передаются адрес,
данные для записи, и коды команд управления микросхемой. SO (Serial Output) –
выход для передачи данных от микросхемы к контроллеру, по этой линии побитно
передаются читаемые данные, а также информация о состоянии микросхемы.
Контроллер управляет микросхемой посредством команд, инициирующих операции
чтения и записи данных, стирания, чтения идентификаторов микросхемы, чтения и
записи регистра статуса и т.п.

Назначение каждого из восьми контактов микросхемы, описание всех команд, а
также другие подробности содержатся в [5].

 

Архитектура контроллера SPI

Контроллер SPI, входящий в состав «южного моста» Intel ICH8, содержит более

20 регистров управления и состояния. Регистры адресуются в пространстве памяти с
использованием технологии memory-mapped I/O, рассмотренной в ранее
опубликованной статье «Устройства системной поддержки. Исследовательская работа
N [7-9]». Описание всех регистров и команд контроллера SPI выходит за рамки
данной статьи, рассмотрим основные отличия программной модели интерфейса SPI от
его предшественника — интерфейса LPC, акцентируя внимание на регистрах,
используемых при выполнении основных операций – чтении идентификаторов, записи и
стирании Flash ROM.

Напомним, что физический доступ к микросхеме BIOS (не путать с областью
Shadow RAM) осуществляется посредством окна, примыкающего к верхней границе
диапазона 0-4GB. Например, Flash ROM размером 1 Мбайт будет доступен в диапазоне
FFF00000h-FFFFFFFFh. В платформах, использующих интерфейсы ISA и LPC, через тот
же диапазон, при выполнении операций стирания и записи выполняется передача

команд и записываемых данных для микросхемы Flash ROM, а также чтение ее
статуса. Платформа, использующая интерфейс SPI, рассматриваемая в данной статье,
также поддерживает чтение содержимого микросхемы BIOS через указанный диапазон,
но для передачи управляющей и статусной информации во время записи и стирания
Flash ROM, используется другой метод доступа. Информация для выполнения цикла на
шине SPI (адрес и данные) записывается в специальные регистры контроллера SPI
(Flash Address и Flash Data соответственно), затем в регистр Software Sequencing
Flash Control передается команда на выполнение цикла обращения к Flash ROM
(чтения или записи). После этого, через регистр Software Sequencing Flash Status
можно определить момент завершения операции и проконтролировать наличие ошибок.
Данные, прочитанные из Flash ROM, находятся в регистре Flash Data.

В платформах с интерфейсами ISA и LPC, передача команд выполнялась путем

прямой записи байта кода команды в адресный диапазон Flash ROM. Интерфейс SPI
использует косвенный метод передачи команд посредством 8-байтного регистра
OpCode Menu. Каждый из байтов этого регистра хранит код одной из команд для
управления Flash ROM (запись, стирание, чтение идентификатора и т.п.). Для
запуска требуемой операции, программа должна передать номер байта (от 0 до 7),
который содержит код этой операции. Этот номер передается в 3-битном поле COP
(Cycle Opcode Pointer), которое является частью 32-битного кода, записываемого в
регистр Software Sequencing Flash Control для запуска команды на выполнение.
Блок регистров OpCode Menu обычно инициализирует BIOS при старте платформы.
Расположение байтов кодов операций в 8-байтном блоке зависит от реализации BIOS
и может быть произвольным, поэтому программа должна просканировать данный блок и
определить, под каким номером расположена в нем требуемая команда. Этот номер и
будет использован при заполнении поля COP.

Рассмотрим использование регистров Software Sequencing Flash Status и
Software Sequencing Flash Control подробнее. Регистр Software Sequencing Flash
Status имеет разрядность 8 бит и расположен по смещению 90h относительно
базового адреса контроллера SPI (SPIBAR+90h). Регистр Software Sequencing Flash
Control имеет разрядность 24 бит и расположен по смещению 91h. При
программировании контроллера, к двум указанным регистрам удобно обращаться одной
32-битной операцией чтения или записи по адресу 90h. При этом биты 0-7
соответствуют регистру Software Sequencing Flash Status, а биты 8-31 — регистру
Software Sequencing Flash Control. Именно такой метод доступа используется в
ассемблерных примерах, прилагаемых к статье. Рассмотрим назначение битов в
соответствии с нумерацией, описанной выше.

Бит 0 (SPI Cycle In Progress) – используется для определения момента
завершения операции на шине SPI. «0» означает, что шина SPI свободна и программа

может запускать следующий цикл. «1» означает, что шина SPI занята, выполняется
транзакция. Бит устанавливается и сбрасывается аппаратно, доступен только для
чтения.

Бит 1 (Reserved) – не используется.

Бит 2 (Cycle Done Status) – устанавливается в «1» аппаратно, при
завершении транзакции на шине SPI. Для сброса, программа должна записать «1» в
данный бит.

Бит 3 (Flash Cycle Error) – устанавливается в «1» аппаратно, если при
выполнении транзакции имели место ошибки: защита записи или попытка запуска
следующей транзакции до завершения предыдущей. Для сброса, программа должна
записать «1» в данный бит.

Бит 4 (Access Error Log) – устанавливается в «1» аппаратно, если имели
место попытки обращения к микросхеме BIOS, нарушающие права доступа к заданным
диапазонам адресов, запрограммированным в конфигурационных регистрах контроллера
SPI.

Биты 5-7 (Reserved) – не используются.

Бит 8 (Reserved) – не используется. Как было показано выше, биты 8-31
рассматриваемого 32-битного слова соответствует битам 0-23 регистра Software
Sequencing Flash Control.

Бит 9 (SPI Cycle Go) – запуск транзакции на SPI. Запись «1» в этот бит
запускает выполнение транзакции, тип и содержание которой определяются
состоянием битов 10-31 этого же регистра.

Бит 10 (Atomic Cycle Sequence) – при передаче приказа на выполнение
транзакции, запись «1» в этот бит запрещает внешним событиям вмешиваться в
процессы, происходящие на интерфейсе SPI до тех пор, пока не будут выполнены три
фазы: передача префиксной команды, передача основной команды и завершение
выполнения основной команды.

Отметим, что таким образом реализуется один из механизмов защиты от
случайного искажения содержимого микросхемы BIOS. Так называемые префиксные
команды (например, Write Enable) должны предшествовать командам, изменяющим
содержимое микросхемы (например, Write, Erase). Получив код команды, содержащий
«1» в данном бите, все три фазы контроллер выполняет аппаратно, без
вмешательства процессора до завершения выполнения основной команды.

Бит 11 (Sequence Prefix Opcode Pointer) – при использовании префиксных
команд (когда бит 10 установлен в «1», см. выше), этот бит выбирает один из двух
байтов, который будет передан в качестве префиксной команды для микросхемы SPI
Flash. При «0» выбирается младший байт регистра Prefix Opcode Configuration
Register, при «1» – старший.

Бит 12-14 (Cycle Opcode Pointer) – это битовое поле выбирает один из
восьми байтов, который будет передан в качестве основной команды для микросхемы
SPI Flash. Указанные байты находятся в регистре Opcode Menu Configuration
Register.

Бит 15 (Reserved) – не используется.

Биты 16-21 (Data Byte Count) – задает количество байтов данных для
операций чтения или записи данных. Количество равно значению этого поля плюс 1.
Например: 000000b=1 байт, 111111b=64 байта.

Бит 22 (Data Cycle) – Задает наличие байтов данных в команде. «0»
означает, данные отсутствуют (например, в команде стирания), «1» означает, что
данные присутствуют (например, в команде чтения статуса, данными является
содержимое регистра статуса).

Бит 23 (SPI SMI# Enable) – разрешение формировать запрос на прерывание
System Management Interrupt после завершения транзакции, 0=запрещено,
1=разрешено.

Биты 24-26 (SPI Cycle Frequency) – задает частоту битовой
синхронизации при выполнении транзакции на SPI. Используются два значения
(остальные зарезервированы): 000b=20MHz, 001b=33MHz.

Биты 27-31 (Reserved) – не используются.

Отметим, что предварительное заполнение восьми байтов регистра Opcode Menu
Configuration Register и двух байтов регистра Prefix Opcode Configuration
Register выполняет BIOS при старте платформы. Поэтому, при формировании битовых
полей, выбирающих код команды и код префикса, программа должна просканировать
указанные регистры и найти, под каким номером в них находятся коды требуемых
операций. Варианты заполнения могут быть разными, даже среди материнских плат
одной модели, использующих различные версии BIOS. Некоторые утилиты перезаписи
Flash изменяют содержимое указанных регистров.

Детальное описание всех регистров и команд контроллера SPI приводится в [3].
Описание команд микросхемы SPI Flash приводится в [4-7]. Информация, изложенная
выше, также проиллюстрирована ассемблерными примерами, прилагаемыми к статье.

 

Механизмы доступа к Flash ROM и защита записи

В общем случае, для инициирования операций стирания или перезаписи микросхемы
BIOS, программа должна выполнить четыре действия:

  1. Настроить регистры «южного моста» чипсета, управляющие размещением
    микросхемы BIOS в адресном пространстве для обеспечения доступа к полному
    объему микросхемы.
  2. Выключить режим защиты записи BIOS, реализуемый средствами «южного моста»
    чипсета.
  3. Выключить режим защиты записи BIOS, реализуемый средствами микросхемы
    Flash ROM.
  4. Передать команду стирания или записи микросхеме Flash ROM.

Рассмотрим подробнее эти процедуры, механизмы защиты, препятствующие их
несанкционированному выполнению и, конечно, уязвимости этих механизмов.

Как было сказано выше, при выполнении операций записи и стирания, программный
доступ к микросхеме SPI Flash осуществляется посредством регистров контроллера
SPI, без использования диапазона адресов, в котором доступен образ микросхемы
BIOS. Поэтому перенастройка чипсета для доступа к диапазону FFF00000h-FFFFFFFFh
в данном примере не потребуется.

Защита записи, реализуемая «южным мостом» Intel ICH8 построена по такой же
схеме, как и в платформах предыдущих поколений, отличаются только адреса
регистров. Следовательно, процедура снятия этой защиты подобна процедуре
рассмотренной в предыдущих публикациях. Доступом к микросхеме BIOS управляет
8-битный регистр BIOS_CNTL (его координаты в конфигурационном пространстве
Bus=0, Device=1Fh, Function=0, Register=DCh). Бит 0 этого регистра (бит BIOSWE,
BIOS Write Enable) управляет разрешением записи в микросхему BIOS, 0=запрещена,
1=разрешена. Бит 1 того же регистра (бит BLE, BIOS Lock Enable) обеспечивает
перехват несанкционированного выключения защиты. Если бит BLE=1, то при попытке
установить бит BIOSWE=1 будет генерироваться прерывание SMI (System Management
Interrupt) с вызовом специальной процедуры, входящей в состав BIOS. Причем, если
BIOS при старте установит бит BLE=1, программно обнулить его чипсет не
позволяет, режим перехвата будет выключен только после аппаратного сброса (по
сигналу RESET). Подробности в [3].

Практика показывает, что данный механизм «защиты от снятия защиты» обычно не
активируется разработчиками BIOS. Во всех материнских платах, исследованных
автором, бит BLE=0, поэтому для снятия защиты записи достаточно установить бит
BIOSWE=1, эта операция не будет перехвачена.

Микросхема Intel ICH8 также поддерживает защиту содержимого микросхемы BIOS,
путем задания адресных диапазонов, защищенных от чтения и (или) записи.
Теоретически, на базе данного механизма можно реализовать эффективную защиту,
так как запрет программно включается процедурами BIOS при старте платформы, и
может быть снят только при аппаратном сбросе. Но и этот механизм обычно не
активируется разработчиками BIOS.

(Продолжение следует)

 

Источники информации

Электронные документы, доступные на сайте
developer.intel.com.

1) Intel Low Pin Count (LPC) Interface Specification. Revision 1.1. Document
Number 251289-001.
2) Intel P965 Express Chipset Family Datasheet – For the Intel 82P965 Memory
Controller Hub (MCH). Document Number: 313053-001.
3) Intel I/O Controller Hub 8 (ICH8) Family Datasheet – For the Intel 82801HB
ICH8 and 82801HR ICH8R I/O Controller Hubs. Document Number: 313056-001.

Электронные документы, доступные на сайте
www.superflash.com или
ssti.com.

4) 1 Mbit SPI Serial Flash SST25VF010 Data Sheet. Document Number:
S71233-01-000.
5) 8 Mbit SPI Serial Flash SST25VF080B Data Sheet. Document Number:
S71296-01-000.

Электронные документы, доступные на сайте
winbond.com.tw.

6) W25X10A, W25X20A, W25X40A, W25X80A 1M-bit, 2M-bit, 4M-bit and 8M-bit
Serial Flash Memory with 4KB sectors and dual output SPI Data Sheet.

Электронные документы, доступные на сайте
macronix.com.

7) MX25L802 8M-bit [8Mx1] CMOS Serial Flash EEPROM Data Sheet.

Электронные документы, доступные на сайте
datakey.com.

8) SPI EEPROM Interface Specification. Part Number 223-0017-004 Revision H.

Электронные документы, доступные на сайте
vtitechnologies.com.

9) SPI Interface Specification. Technical Note 15.

Электронные документы, доступные на сайте
pcisig.com.

Документы [11], [12] на сайте pcisig.com доступны только для членов PCI
Special Interest Group. Воспользовавшись поисковыми системами, можно найти
данные документы для свободной загрузки.
10) PCI BIOS Specification. Revision 2.1.
11) PCI Local Bus Specification. Revision 3.0.
12) PCI-to-PCI Bridge Architecture Specification. Revision 1.1.

xakep.ru

Программатор Spi Flash своими руками

Микропрограммное обеспечение предварительно установлено в устройства флэш-памяти перед изготовлением печатной платы, поддерживая высокую пропускную способность. Тем не менее есть преимущества в программировании флэш-памяти уже после ее выпуска, то есть до того, как она была припаяна к плате. Программатор Spi Flash (SF) с дискретной флэш-памятью имеет существенные преимущества перед обычными SD. Его цена обычно не превышает 1/10 стоимости флешки, использует гораздо меньший форм-фактор и требует небольшого количества специального оборудования.

Выбор: SF & SD

Существует множество причин для выбора дискретной флэш-микросхемы вместо подсистемы SD или, наоборот, поэтому пользователю необходимо выбирать компромиссы перед приобретением устройства. Приведенный ниже список содержит несколько аргументов, которые нужно знать, перед выбором DIP-чипа или полноценного SD-решения:

  1. Аппаратная сложность, преимущество имеет SF. DIP-пакет с дискретной флеш-микросхемой намного проще использовать, чем SD.
  2. Сложность программного обеспечения, преимущество имеет SF. Подсистема флэш-памяти SD обычно опирается на библиотеки SD Fat16/32. Хотя устройства являются интерфейсом SPI, имеет смысл использовать FAT, поскольку любой ПК/MAC может считывать карту. Эти библиотеки большие и могут занимать драгоценное пространство EEPROM на малых встроенных контроллерах.
  3. Емкость и портативность, преимущество имеет SD. Можно использовать SD-карту большей емкости в существующем дизайне без изменений. Дискретная SPI имеет более низкие пределы плотности.
  4. Стоимость, преимущество имеет SF.
  5. Мощность, преимущество имеет SF. SD-карты обычно имеют более высокую мощность утечки из-за более высокой плотности и высокой динамической мощности из-за скорости доступа.
  6. Скорость, преимущество имеет SD. SD-флэш-память поставляется во многих различных SKU, основанных на скорости в основном из-за требований цифровой фотографии и использования необработанных форматов изображений.

Флэш-память SPI

Флэш-память SPI- это тип энергонезависимой памяти, основанный на технологии MOSFET. Энергонезависимое означает, что устройство сохраняет все данные, в том числе, когда не включено. Флэш-память работает, перенося группу носителей заряда на диэлектрик. Это называется программированием и обычно выполняется с более высоким напряжением. Процесс не безобидный, он на самом деле повреждает материал, и после 100 тыс. циклов устройство выходит из строя. Чтобы снять носители заряда с диэлектрика, при одинаковом высоком напряжении на обратном потенциале снимают носители с затвора. Это называется стиранием.

Запрограммированный флэш-бит имеет значение 0, а стертый бит имеет значение 1, стертый флэш-байт равен 0xFF в шестнадцатеричном формате. В настоящее время флэш-память может хранить несколько битов на ячейке, с использованием уровней напряжения. С учетом роста требований к объему памяти это становится все более сложным выполнить конструкционно.

Преимущество Spi Flash программаторов USB заключается в простоте программного обеспечения, код в основном сдвигает данные выводов DI и DO, соответственно по переднему фронту тактовой частоты. Часы контролируются хостом, для них не требуется причудливая схема синхронизации: фазы могут быть настолько асимметричными, насколько нужно, при условии соблюдения минимальных требований к ширине цикла устройства.

Утилита для идентификации

Flashrom — это утилита для идентификации, чтения, записи, проверки и удаления флеш-чипов. Она предназначена для прошивки образов BIOS/EFI/coreboot/firmware/optionROM на материнских платах, картах контроллера сети/графики/хранения и на различных других устройствах программирования. Функциональные возможности:

  1. Поддерживает более 476 чипов флэш-памяти, 291 наборов микросхем, 500 материнских плат, 79 устройств PCI, 17 устройств USB и различные программаторы Spi Flash на основе параллельных/последовательных портов.
  2. Поддерживает параллельные интерфейсы, интерфейсы флэш-памяти LPC, FWH и SPI и различные пакеты микросхем (DIP32, PLCC32, DIP8, SO8/SOIC8, TSOP32, TSOP40, TSOP48, BGA и другие).
  3. Физический доступ не требуется, root-доступ достаточен или вообще не требуется для некоторых программаторов.
  4. Не требуется загрузочная дискета, CD-ROM или другой носитель.
  5. Клавиатура и мониторы не требуются, просто перепрошиваются удаленно через SSH.
  6. Не требуется мгновенная перезагрузка.
  7. Переписывают чип в работающей системе и проверяют его, новая прошивка будет работать при следующей загрузке.
  8. Доступна частичная поддержка Windows.

DIY: универсальные программы создания

Это лучший для микроконтроллеров PIC и AVR программатор Spi Flash, своими руками, может быть, его создать не получится, но устройство не дорогое, стоит меньше 10 $ и выполняется из легко доступных компонентов.

Преимущества:

  1. Бесплатное ПО с открытым исходным кодом.
  2. Нет необходимости устанавливать дополнительные драйверы, использует драйвер HID (Human Interface Device), который обычно применяется для клавиатуры и мыши.
  3. Поддерживает много устройств PIC и AVR.
  4. Поддерживает платформы Windows и Linux.
  5. Состоит из микроконтроллера PIC18F2550 — мозга программатора Spi Flash.
  6. Разъем USB-B подключается к компьютеру.
  7. Имеется два светодиодных индикаторов, один для индикации подключения программатора, другой показывает статус программирования.

Микроконтроллер PIC18F2550

Основные три последовательных заголовка (J1, J2 и J3) используются для связи с ведомым устройством микроконтроллера. Использование выводов различно в разных микроконтроллерах. Переключатель сброса добавлен к блоку контроллера для установки сброса программатора. PIC18F2550 мигает с помощью шестнадцатеричного кода прошивки, можно использовать другие последовательные или параллельные программаторы Spi Flash PIC.

Он проверяет связь между микроконтроллером и ПК. Требуется провести тестирование HID-обнаружения (Human Interface Device), которое устранит много ошибок, таких как проблемы с микроконтроллером, кристаллами и USB. Перед началом использования программы убеждаются, что мигает светодиод LED, который затем замедляет процесс мигания. Если программатор не обнаружен, проверяют перекрестные соединения и инструкции. Если он обнаружен, переходят к следующему шагу.

Программирование через OpenProg

Устанавливают программу OpenProg на ПК, запускают и проверяют подключенное устройство. Последовательность прошивки программатора Spi Flash:

  1. Подключают USB-разъем к ПК.
  2. Открывают OpenProg и убеждаются, что программатор обнаружен.
  3. Нажимают «Параметры» -> «Проверка оборудования».
  4. Выполняют аппаратный тест. Он проверяет все контакты программирования, и пользователь может легко отлаживать устройство при обнаружении ошибок.
  5. Аппаратный тест показывает напряжение на VODU, VPPU, CLK, DATA, PGM в разные моменты времени, что важно учитывать при выполнении своими руками программатора Spi Flash на SMD.
  6. Измеряют напряжение между выводами VODU, VPPU, CLK, DATA, PGM и проверяют его значениями на экране.
  7. VPP может иметь разницу в 1 В из-за преобразования переменного тока в постоянный.
  8. Если напряжение этих выводов части контроллера и то, что отображается на экране, схожи, программатор работает отлично.
  9. Если напряжение отличается, проверяют цепь соответствующих контактов.

Дизайн печатной платы

Эта печатная плата разработана в Eagle 7.2. Размер пластины 7,5 х 7 см, она выполнена на автоматическом травильном станке. Печатная плата также может быть изготовлена с помощью химического травления в домашних условиях.

Компоненты JA, JB, JC являются перемычками. По схеме тщательно проверяют это и сначала, во время сборки компонентов, устанавливают перемычки. Для обеспечения безопасности PIC18F2550 во время пайки используют 28-контактное основание IC.

Плата расширения связывает программатор с микроконтроллером. Различные серии микроконтроллеров имеют разные контакты и конфигурацию для программирования. Это дает пользователям преимущество в простоте программирования микроконтроллера.

Плата расширения может быть легко сделана с использованием перфорированной доски или в специальных заготовок для плат, приобретенных в торговой сети. Для серий микроконтроллеров используется разные платы расширений. Для LVICP от 5 В до 3,3 В необходим регулятор напряжения, такой как LM1117 или аналогичный ему.

Устройство 3.3 В должно быть запрограммировано только с использованием платы расширения 3.3 В, в противном случае может произойти необратимое повреждение. Некоторые из плат имеют вариант 5 В. Если нужно запрограммировать на 5 В, можно выбрать опцию «Не требовать платы низкого напряжения». Также не рекомендуется размещать 24F-33F в гнездо 30F, которое работает при 5 В.

Завершение процесса создания

После изготовления части контроллера и платы расширения, можно сразу перейти к программированию устройства:

  1. Находят устройство и серию устройства для программирования.
  2. Выбирают подходящую плату расширения устройства.
  3. Подключают устройство к плате расширения.
  4. Присоединяют плату расширения к блоку контроллера.
  5. Подключают соединительный кабель USB B к программатору и к ПК.
  6. Открывают OpenProg.exe и убеждаются, что программатор обнаружен.
  7. Открывают устройства и выбирают нужное для программирования.
  8. Нажимают зеленую стрелку в верхней части, чтобы прочитать устройство.
  9. Для записи/прошивки нажимают левую кнопку сверху, чтобы выбрать код «.hex», и нажимают «Ok».
  10. Нажимают красную кнопку со стрелкой рядом с зеленой кнопкой со стрелкой, чтобы запрограммировать устройство.
  11. Убеждаются, что LED мигает во время программирования, показывая статус процесса.
  12. Проверяют результат и убеждаются, что мигание прошло успешно.

Последовательная SPI AT45DB161D

Простой Spi Flash программатор SPI (AT45DB161D) представляет собой 16-мегабитную (2 МБайт) 2,5 В или 2,7 В флэш-память с последовательным интерфейсом, идеально подходящего для широкого спектра приложений, предназначенных для хранения программного кода и данных.

Всего 2097152 байта (0x1FFFFF) организованы в 4096 страниц с 512 байтами на страницу. Несмотря на то, что чип предлагает различные варианты стирания, библиотека программного обеспечения поддерживает стирание блоков, причем один блок содержит 4 Кбайт.

Чтобы перезаписать существующие данные, сначала необходимо удалить соответствующий блок. Чтение и запись данных осуществляется довольно простым способом, в основном путем предоставления адреса чтения/записи (от 0 до 0x1FFFFF) и информации о длине данных. Используя существующие базовые функции, можно расширить код для поддержки обширной системы доступа к файлам.

USB- накопитель EEPROM

Программатор Spi Flash EEPROM серии 25 с программным обеспечением и поддержкой драйверов и 25-SPI флэш-память 8-контактный/16-контактный имеет следующие функциональные возможности:

  1. Автоматическая идентификация модели чипа 25 серия.
  2. Поддержка USB в TTL.
  3. Автоматическое определение чипа серии 25.
  4. Поддержка загрузки STC серии.
  5. Процедура однокристального микроконтроллера STC программатора Spi Flash ch441a поддерживает полный спектр загрузки программ для разнообразного ПО: резервного копирования, стирания, программирования, калибровки и других перемещений.
  6. Обеспечивает выход питания 5 В — 3,3 В.
  7. Размер: 70 мм х 27 мм
  8. Ch441SER.EXE — самостоятельная установка архива с USB на последовательный драйвер.

Устранение сбоев работы микроконтроллеров

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

  1. При любом сбое вначале проверяют блок питания. Иногда случается так, что источник питания не подходит к программатору и требуется внешний источник питания.
  2. Выбирают правильный последовательный порт в программном обеспечении.
  3. Прежде чем использовать программатор, необходимо установить драйверы, необходимые для его функционирования. Когда подключается программатор в первый раз, он автоматически устанавливает их, если есть соединение с интернетом, иногда потребуется указать расположение драйверов.
  4. Повышение напряжения. Многие микроконтроллеры требуют подтягивания в своей цепи, прежде чем могут быть запрограммированы, так микроконтроллер пикасе требует 10 кОм подтягивающего резистора на последовательном выводе, иначе показывает ошибку.
  5. Программное обеспечение для программирования не обнаруживает микроконтроллер — это опять-таки проблема с блоком питания, проверяют БП снова и подключают программатор к компьютеру.

После выполнения своими руками USB программатора Spi Flash пользователь получит SF, выполненную собственноручно для системного программирования. Она будет легко управляться компьютером через шину USB благодаря удобному интерфейсу и мощным функциями.

fb.ru

Программатор SPI Flash своими руками

#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;

  }

}

skproj.ru

Проникновение в BIOS ROM: осваиваем SPI Flash №2

Содержание статьи

Микросхемы SPI Flash ROM, в частности микросхема SST 25VF080B, используемая в
рассматриваемой платформе поддерживают сигнал защиты записи WP# (Write Protect).
В отличие от одноименного сигнала микросхем LPC Flash, для SPI Flash этот сигнал
не управляет непосредственно разрешением записи информации, а действует в
сочетании с битами BP0-BP3 (Block Protect) и BPL (Block Protect Lock) регистра
статуса. Четыре бита в регистре статуса BP0-BP3 выбирают один из 16 вариантов
защиты микросхемы BIOS, среди этих вариантов – полный запрет записи по всем
адресам, разрешение записи по всем адресам, а также варианты, обеспечивающие
избирательную защиту блоков. Разумеется, сама по себе такая защита не
эффективна, поскольку программа может изменить содержимое битов BP0-BP3 и
разрешить запись. Чтобы этого не произошло, используется бит BPL и внешний
сигнал защиты записи WP#. Установка бита BPL=1 делает биты BPL и BP0-BP3
недоступными для перезаписи. Данная защита действует только при наличии сигнала
логического «0» на вход WP#, а при наличии логической «1» на входе WP#, биты BPL
и BP0-BP3 доступны для перезаписи независимо от состояния бита BPL.

Таким образом, защитой содержимого микросхемы BIOS можно программно управлять
посредством регистра статуса, а объектом аппаратной защиты, реализуемой сигналом
WP#, является содержимое регистра статуса, а не записанная информация.
Подробности в [5].

Для активации данного механизма защиты, BIOS при старте платформы должен
записать значение битов BP0-BP3 в соответствии с требуемым режимом защиты, а
также установить бит BPL=1 для предотвращения последующей модификации битов
BP0-BP3 и BPL. Затем требуется обеспечить подачу логического «0» на вход WP#.
Желательно, чтобы метод программного управления сигналом WP# был уникален для
каждой модели материнской платы, это осложнит работу «вирусописателей».

К сожалению, и этот механизм защиты, поддерживаемый микросхемами SPI Flash,
реально не используется разработчиками BIOS и материнских плат. Во всех
платформах, исследованных автором, в регистре статуса Flash, бит BPL=0, то есть
защита не используется и статусный регистр доступен для перезаписи.

 

Примечание

Символ «#» после названия сигнала означает, что активным уровнем является
низкий. Например, рассматриваемый сигнал защиты записи WP# (Write Protect),
интерпретируется следующим образом: Логический «0» означает наличие защиты
записи, логическая «1» – отсутствие защиты. В цифровой схемотехнике такие
сигналы называют инверсными.

Запуск операций стирания и записи содержимого микросхемы SPI Flash
выполняется в два этапа. Сначала передается команда Write Enable, затем команда,
непосредственно запускающая стирание или запись. Если заданная
последовательность операций не соблюдена, содержимое микросхемы не изменяется.
Такой механизм эффективно защищает BIOS от случайного искажения в результате
программного сбоя, однако препятствием для «вирусописателей» он не является, так
как требуемая последовательность операций описана в открытой документации на
микросхемы SPI Flash, например [4-7].

 

Меры предосторожности

При отладке предлагаемых процедур, выполняющих стирание и перезапись
содержимого микросхемы Flash ROM, неизбежно существует риск искажения BIOS с
последующим отсутствием старта материнской платы. Примеры, содержащиеся в
прилагаемом каталоге WORK, рассчитаны на специалистов, имеющих квалификацию и
оборудование для восстановления BIOS, если это потребуется. Идеальное рабочее
место для отладки предлагаемых программ – это материнская плата, в которой
микросхема BIOS установлена в «панельку», допускающую извлечение микросхемы без
использования пайки, в сочетании с программатором. Исходное содержимое
микросхемы желательно сохранить в виде двоичного файла. Заметим, что если будет
искажен BIOS Boot Block, процедуры самовосстановления, рекламируемые
производителями материнских плат, окажутся неработоспособными. Напомним, что во
время рабочего сеанса используется копия BIOS в Shadow RAM, поэтому если
содержимое микросхемы BIOS будет искажено, это проявится только при очередной
перезагрузке. Таким образом, чтобы избежать необходимости аварийного
восстановления BIOS, перед сбросом или выключением питания следует восстановить
исходное содержимое Flash ROM.

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

 

Замечания по совместимости

Операции, рассматриваемые в примерах 1-3, требуют программирования
конфигурационных регистров и ресурсов платформы, реализация которых различается
в разных чипсетах. Разумеется, рассмотреть все наборы системной логики в рамках
одной статьи невозможно, поэтому автор остановился на конкретном примере:
материнская плата Gigabyte GA-965P-S3 (чипсет Intel 965, микросхема BIOS SST
25VF080B). Примеры 1-3 предназначены только для плат с указанной элементной
базой. Используя предлагаемый материал, заинтересованный читатель может
реализовать библиотеку процедур для поддержки более широкой номенклатуры
платформ.

 

Пример 1. Процедура чтения идентификатора и регистра статуса Flash ROM.

Как и в ранее опубликованных статьях данного цикла, в целях монопольного и
беспрепятственного взаимодействия программы с оборудованием при работе с
предлагаемым примером, автор применил «древнюю» технологию отладки под DOS.
Аргументация такого шага и рекомендации по организации рабочего места приведены
в ранее опубликованной статье «64-битный
режим под DOS: исследовательская работа № 1″. Прежде чем рассматривать
процедуры стирания и записи содержимого микросхемы BIOS, рассмотрим более
простой пример – чтение идентификатора и статуса этой микросхемы.

Каталог WORK\ID_FLASH содержит следующие файлы:

ASM_TD.BAT – обеспечивает ассемблирование, линковку и запуск программы
под отладчиком. При запуске TASM и TLINK используются опции, обеспечивающие
добавление отладочной информации в EXE файл.

ASM_EXE.BAT – обеспечивает ассемблирование и линковку. Генерируется
EXE файл.

FLASH_ID.ASM – основной модуль программы.

A20.INC – Библиотека для управления и контроля состояния адресной
линии A20 с использованием выходного порта контроллера клавиатуры.

BIGREAL.INC – Библиотека поддержки режима Big Real Mode, для
использования 32-битных адресов в диапазоне 0-4 Гб. Этот режим, как и управление
адресной линией A20, необходимы для работы данной программы, так как в
рассматриваемой платформе, регистры контроллера SPI используют технологию
Memory-mapped I/O, то есть адресуются в пространстве памяти.

SPIFLASH.INC – Библиотека процедур для взаимодействия с микросхемой
BIOS, подключенной к интерфейсу SPI. Реализация контроллера SPI в различных
чипсетах отличается, данная библиотека предназначена для поддержки микросхемы
Intel ICH8, то есть «южного моста» чипсета Intel 965. Для полного понимания
работы процедур данной библиотеки, следует обратиться к документу [3].

OUTPUT.INC – Библиотека процедур для вывода текстовых сообщений с
использованием функций DOS и перевода шестнадцатеричных чисел в текстовое
представление.

DATASEGS.INC – Сегменты данных. Содержит сегмент переменных, сегмент
текстовых строк и сегмент стека.

Рассмотрим выполнение программы чтения идентификатора и статуса микросхемы
BIOS. Нумерация пунктов приведенного ниже алгоритма соответствует нумерации
пунктов в комментариях к исходному тексту программы. См. файл
WORK\ID_FLASH\flash_id.asm.

1) Установка адреса стека, загрузка регистров SS и SP.

2) Выдача сообщения о начале выполнения программы.

3) Проверка режима работы процессора (Real или Protected). Так как данная
программа использует непосредственное взаимодействие с регистрами чипсета и
другими системными ресурсами, процессор должен быть в режиме Real Mode. Если
процессор в режиме Protected Mode, переходим к пункту 15 (завершение с ошибкой).

4) Подготовка к адресации памяти выше 1 MB. Для этого разрешаем адресную
линию A20 и включаем режим Big Real Mode, обеспечивающий использование 32-битной
адресации в реальном режиме. Это необходимо для доступа к регистрам диапазона
SPIBAR. Подробности в [3]. Если при управлении адресной линией A20 возникли
ошибки, переходим к пункту 15 (завершение с ошибкой).

5) Детектирование чипсета материнской платы, получение адреса диапазона RCBA
(Root Complex Base Address). Вначале проверяем наличие поддержки функций
PCIBIOS, затем, используя PCIBIOS, проверяем наличие «южного моста» Intel ICH8
по кодам PCI Vendor ID, PCI Device ID. Если чипсет не распознан, переходим к
пункту 14 (завершение с ошибкой). Напомним, что текущая версия программы
поддерживает платформы только с данным типом «южного моста». Считываем базовый
адрес диапазона RCBA.

6) Установка разрешения циклов записи для интерфейса SPI. Устанавливаем бит 0
в регистре BIOS_CNTL. Подробности в [3].

7) Установка указателей и сегментных регистров. DS:EBX далее будет
использоваться как базовый адрес блока регистров контроллера SPI (SPIBAR). Этот
указатель является входным параметром для подпрограмм SPI_Read и
Scan_Opcode_Menu. По правилам Big Real Mode, DS=0, а EBX содержит 32-битный
физический адрес. Базовый адрес блока регистров управления контроллера SPI равен
RCBA+3020h. Сегмент ES будет использоваться для генерации строк текстовых
сообщений.

8) Считываем и визуализируем идентификатор микросхемы Flash ROM.
Идентификатор содержит два байта. Первый байт – Vendor ID (синоним Manufacturer
ID) идентифицирует производителя микросхемы, в нашем примере он равен BFh, этот
код присвоен фирме SST. Второй байт – тип микросхемы, для 25VF080B он равен 8Eh.
Процедура чтения идентификатора состоит из передачи микросхеме кода команды (90h
для команды Read ID) и считывания двух байт идентификатора.

Напомним, что контроллер SPI не позволяет непосредственно передать код
команды микросхеме Flash ROM, это делается косвенно, посредством блока регистров
OpCode Menu. Каждый байт 8-байтного блока OpCode Menu содержит один из кодов
команд для микросхемы Flash ROM (чтение идентификатора, чтение статуса, запись,
стирание, и т.п.). Этот блок инициализирует BIOS при старте платформы. Для
передачи команды, программа должна передать контроллеру номер байта в 8-байтном
блоке OpCode Menu, содержащего код этой команды. Так как расположение кодов в
ячейках OpCode Menu зависит от реализации BIOS и может быть произвольным,
программа сначала должна просканировать OpCode Menu и найти номер ячейки, в
которой хранится код требуемой команды (90h для Read ID). Эту функцию выполняет
подпрограмма Scan_OpCode_Menu. Затем, полученный 3-битный номер ячейки
используется как битовое поле COP (Cycle Opcode Pointer) при формировании
32-битного кода операции для контроллера SPI. Кроме COP, код операции также
содержит информацию о количестве передаваемых байт данных, частоте битовой
синхронизации и т.п. Сформированный 32-битный код операции является входным
параметром для подпрограммы SPI_Read, которая записывает его в регистр Software
Sequencing Flash Control Register, инициируя начало выполнения транзакции на
шине SPI. Перед этим необходимо записать адрес в регистр Flash Address Register.
Затем, циклически опрашиваем регистр Software Sequencing Flash Status Register
для определения момента завершения транзакции. После этого, из регистра Flash
Data 0 Register, считываем полученные данные, в нашем случае это два байта
идентификатора микросхемы Flash ROM. Подробности в [3,5].

9) Считываем и визуализируем регистр состояния микросхемы Flash ROM. Этот
регистр содержит один байт, его побитное описание приведено в [5]. Код команды
Read Status – 05h, количество читаемых байт – 1. В остальном, данная процедура
аналогична процедуре чтения идентификатора, описанной в пункте 8.

10) Восстанавливаем исходное значение регистра BIOS_CNTL, сохраненное перед
его перенастройкой в пункте 6.

11) Восстанавливаем исходное состояние адресной линии A20 и выключаем режим
32-битной адресации (Big Real Mode).

12) Вывод сообщения об успешном выполнении программы и завершение. Эта точка
выхода используется при отсутствии ошибок.

13) Начало последовательности, используемой для завершения программы при
ошибках. Восстанавливаем исходное значение регистра BIOS_CNTL, сохраненное перед
его перенастройкой в пункте 6. Сюда управление передается, если произошли ошибки
после перенастройки регистра BIOS_CNTL и требуется его восстановление перед
завершением программы.

14) Восстанавливаем исходное состояние адресной линии A20 и выключаем режим
32-битной адресации (Big Real Mode).

15) Вывод сообщения об ошибках и завершение программы. При передаче
управления на этот пункт, регистр BP должен содержать указатель на строку
сообщения об ошибке.

 

Пример 2. Процедура чтения Flash ROM.

Ассемблерный пример, выполняющий чтение содержимого микросхемы BIOS в файл,
находится в каталоге WORK\RD_FLASH. Программа выполняет
сохранение области адресного пространства FFF00000h-FFFFFFFFh в файл размером 1
Мб и фиксированным именем BIOS.BIN. Файл создается в текущем каталоге. Размер
сохраняемого блока не зависит от реального размера используемой микросхемы BIOS,
распознавание типа и размера микросхемы не реализовано в данной версии.
Поддерживаются только материнские платы с «южным мостом» Intel ICH8. Для
гарантированного включения полного объема микросхемы BIOS в адресное
пространство, программа использует установку битов FWH_F8_EN, FWH_F0_EN в
регистре FWH_DEC_EN1, чем и обусловлена ее привязка к конкретному чипсету.
Подробности в [3].

Отметим, что в большинстве платформ, для чтения содержимого SPI Flash можно
использовать «старый» метод доступа посредством окна в адресном пространстве,
это и реализовано в данном примере. А операции, требующие передачи команд
микросхеме SPI Flash (чтение идентификатора или статуса, запись, стирание) могут
быть выполнены только с использованием регистров контроллера SPI. Такой метод
использован в примерах 1 и 3.

 

Пример 3. Процедура стирания и перезаписи Flash ROM.

Ассемблерный пример, выполняющий стирание и перезапись микросхемы BIOS,
находится в каталоге WORK\WR_FLASH. Программа выполняет
запись содержимого файла с фиксированным именем BIOS.BIN и размером 1 Мб в
микросхему BIOS. Файл должен находиться в текущем каталоге.

 

Заключение

В очередной раз подчеркну, что целью данного цикла публикаций не является
обучение «вредителей». Материалы будут полезны специалистам по информационной
безопасности, разработчикам аппаратного и системного программного обеспечения.
Выработка механизмов для противодействия какой-либо угрозе невозможна без
детального изучения самой угрозы.

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

 

Источники информации

Электронные документы, доступные на сайте
developer.intel.com.

1) Intel Low Pin Count (LPC) Interface Specification. Revision 1.1. Document
Number 251289-001.
2) Intel P965 Express Chipset Family Datasheet – For the Intel 82P965 Memory
Controller Hub (MCH). Document Number: 313053-001.
3) Intel I/O Controller Hub 8 (ICH8) Family Datasheet – For the Intel 82801HB
ICH8 and 82801HR ICH8R I/O Controller Hubs. Document Number: 313056-001.

Электронные документы, доступные на сайте
www.superflash.com или
ssti.com.

4) 1 Mbit SPI Serial Flash SST25VF010 Data Sheet. Document Number:
S71233-01-000.
5) 8 Mbit SPI Serial Flash SST25VF080B Data Sheet. Document Number:
S71296-01-000.

Электронные документы, доступные на сайте
winbond.com.tw.

6) W25X10A, W25X20A, W25X40A, W25X80A 1M-bit, 2M-bit, 4M-bit and 8M-bit
Serial Flash Memory with 4KB sectors and dual output SPI Data Sheet.

Электронные документы, доступные на сайте
macronix.com.

7) MX25L802 8M-bit [8Mx1] CMOS Serial Flash EEPROM Data Sheet.

Электронные документы, доступные на сайте
datakey.com.

8) SPI EEPROM Interface Specification. Part Number 223-0017-004 Revision H.

Электронные документы, доступные на сайте
vtitechnologies.com.

9) SPI Interface Specification. Technical Note 15.

Электронные документы, доступные на сайте
pcisig.com.

Документы [11], [12] на сайте pcisig.com доступны только для членов PCI
Special Interest Group. Воспользовавшись поисковыми системами, можно найти
данные документы для свободной загрузки.
10) PCI BIOS Specification. Revision 2.1.
11) PCI Local Bus Specification. Revision 3.0.
12) PCI-to-PCI Bridge Architecture Specification. Revision 1.1.

xakep.ru

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

Не столь давно приключилась со мной одна неприятность. Нужно было обновить 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 вольта):

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

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

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

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

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

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

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

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

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

Программа 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 разъем, либо напрямую, любой поддерживаемой микросхемы.

www.toolgir.ru

программирование SPI Flash · Tuxotronic

FlashROM — консольная утилита для идентификации, чтения, записи, проверки и стирания микросхем Flash памяти.

Основное назначение — это перепрошивка BIOS, etc, а потому в списке устройств программирования много весьма специфичных. Но так же поддерживаются распространённые программаторы/адаптеры:

  • ft2232_spi,
  • serprog,
  • buspirate_spi,
  • rayer_spi,
  • pony_spi

Адаптеры rayer и pony подключается на LPT порт, так что в современных реалиях их использование затруднительно.

SerProg

serprog это не конкретный адаптер, а протокол взаимодействия с адаптером по UART интерфейсу (или через эмуляцию UART на USB).

Для этого протокола существуют разные реализации адаптеров, требующие минимум обвязки для микроконтроллера. Я быстро создал прототип SerProg STM32VCP использовав готовую devboard на stm32f103rbt6 с разведённым USB:

SPI Flash подключается непосредственно к процессору:

  • PA4/SPI1_NSS (20) — #CS
  • PA5/SPI1_SCK (21) — SCLK
  • PA6/SPI1_MISO (22) — SO
  • PA7/SPI1_MOSI (23) — SI

При желании можно подключить светодиод индикации режима на ногу PA0 (14).

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

flashrom -p serprog:dev=/dev/ttyACM0:4000000 -r backup-firmware.bin flashrom -p serprog:dev=/dev/ttyACM0:4000000 -w firmware.bin

В некоторых случаях flashrom не может однозначно определить с каким чипом он имеет дело, в этом случае он предложит варианты, и необходимо указать тип чипа явно:

/usr/sbin/flashrom -p serprog:dev=/dev/ttyACM0:4000000
-c MX25L6445E -w fw.bin

Ch441A USB конвертер

“Народный программатор” за свою низкую цену построен на базе USB конвертера Ch441A и позволяет работать с протоколами UART, EPP, I2C и SPI. Вариантов программатора множество, но отличаются они по большому счёту только внешним видом и качеством исполнения.

Поддержка программатора добавлена во “flashrom” относительно недавно, если мне не изменяет память версии этак с “0.9.4” Чтение не вызывает затруднений и происходит достаточно быстро:

$ time flashrom -p ch441a_spi -r tmp_firmware_4mb.bin
flashrom v0.9.9-r1954 on Linux 4.4.0-1-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Calibrating delay loop... OK.
Found PMC flash chip "Pm25LQ032C" (4096 kB, SPI) on ch441a_spi.
Reading flash... done.

real	1m6.870s
user	0m2.096s
sys	0m2.420s

Запись тоже не вызывает проблем.

$ time flashrom -p ch441a_spi -w tmp_firmware_16mb.bin 
flashrom v0.9.9-r1954 on Linux 4.4.0-1-amd64 (x86_64)
flashrom is free software, get the source code at https://flashrom.org

Calibrating delay loop... OK.
Found Winbond flash chip "W25Q128.V" (16384 kB, SPI) on ch441a_spi.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.

real	19m17.848s
user	0m25.116s
sys	0m36.900s

Подробнее с программатором можно ознакомиться на отдельной странице ch441a.

BusPirate

Если есть под рукой BusPirate (как у меня), можно воспользоваться им, но это плохой вариант, потому как BusPirate очень-очень медленный. Так полный цикл записи (чтение старой прошивки, стирание памяти, запись новой, верификация) SPI Flash на 16Mb у меня заняло более 20 минут.

Пример чтения содержимого микросхемы памяти:

/usr/sbin/flashrom -p buspirate_spi:dev=/dev/ttyACM0,spispeed=1M
-r backup_firmware.bin

FT2232 based adapters

FT2232 должен быть хорошим вариантом, но у меня его нет. Поддерживаются различные JTAG адаптеры. http://flashrom.org/Supported_hardware#USB_Devices

Please enable JavaScript to view the comments powered by Disqus.comments powered by

tuxotronic.org

Клон программатора SPI-Flash «BlackcatUSB» — Меандр — занимательная электроника

Для прошивки Flash-памяти BIOS материнских плат, винчестеров, а также своих любительских конструкций мне потребовался программатор. Любимый PonyProg поддерживает только до 256кбит, кроме того LPT-порт теперь редкость, поискав по Интернету, нашел довольно простой USB-вариант «BlackcatUSB»:

Программатор предназначен для чтения/записи SPI-Flash чипов памяти объемом от 1 Мбита и выше (т.е. более 128кбайт) популярных серий 25ххх, 26ххх.

По протоколу JTAG (требуется перепрошивка) CFI-Flash чипов — 25ххх, 28ххх, 29ххх, 39ххх, 49ххх, 58ххх, а так же K8D17ххх, K8D32ххх.

Его основой является микроконтроллер AT90USB162, имеющий USB-загрузчик, поэтому первоначальная его прошивка и обновление ПО производится по шине USB. Для перепрошивки не требуется дополнительных программ — это можно сделать прямо из его собственной программы. ПО распространяется свободно, более того. разработчики предоставляют файлы прошивок и исходники программы. Поддерживается система скриптов для добавления новых алгоритмов. Можно вручную выбирать все параметры работы с неизвестной памятью. Программа не требует установки, просто запускаем и работаем.

Внешний вид фабричного варианта:

На оригинальной плате имеются перемычки для выбора напряжения SPI — 3,3V / 5V, кнопка сброса и переключатели выбора режима загрузки: обычный / загрузчик. В повседневной работе сброс и перепрошивка программатора крайне редко требуются, поэтому для клона кнопка и переключатели были исключены. Вместо 10-штырькового разъема установлен DIP-сокет, а разъем USB выполнен продолжением печатной платы:

 

Чтобы «разъем USB» не болтался в гнезде, он должен быть толщиной 2,5мм, Мне удалось найти кусочек текстолита такой толщины, а для платы в 1,5мм придется приклеивать «подкладку» 1мм. Она должна быть обязательно неметаллической — на случай случайной вставки в разъем «вверх ногами».

  Схема:

При установке перемычки J1 в положение 1-2 питание микроконтроллера осуществляется от линии 5V USB, при установке 2-3 — от внутреннего стабилизатора 3,3V.

Внимательно смотрите даташит памяти перед выбором напряжения программирования — большинство трехвольтовых чипов выйдут из строя при питании от 5V.

Собранный без ошибок клон сразу определится системой как AT90USB162 в режиме DFU. Запускаем оболочку BlackcatUSB и убеждаемся в этом:

Если микроконтроллер не «чистый», то принудительно переводим его в режим загрузчика:

1) замыкаем на корпус контакт RESET

2) замыкаем на корпус контакт BOOT

3) отпускаем RESET

4) отпускаем BOOT

Важно, чтобы BOOT был отпущен чуть позже, чем RESET.

Далее переходим во вкладку AVR Firmware, выбираем файл прошивки BCUSB.1.09.SPI.hex и кнопкой «Program» запускаем процесс прошивки:

По окончании процесса (пара секунд), жмем «Start Application». Программатор определится системой и потребует драйвер — находим его в папке Drivers. После его установки видим готовый к работе программатор:

Теперь можно проверить его в работе.

ВАЖНО! Если горит (или мигает) светодиод режима, то вставлять и вынимать память из сокета нельзя — он под напряжением, это может испортить информацию!

Поэтому просто вынимаем клон из разъема USB, вставляем память в сокет и пробуем:

Память определилась и появилась вкладка SPI Flash, на которой можно ее прочесть и записать:

Для режима JTAG потребуется другая прошивка — BCUSB.6.03.EJTAG.hex., а так же разъем-переходник DIP-сокет — JTAG. Новое назначение выводов можно увидеть в документации к программе.

P.S. Программатор «BlackcatUSB» на сегодняшний момент не поддерживается разработчиком — вместо него выпускается обновленная версия «FlashcatUSB»:

Из «железных» обновлений только замена мк на более емкий вариант — ATmega32U2. В программной части обновлений больше — поддержка большей номенклатуры чипов, в том числе NAND. Новые версии программы доступны на сайте разработчика.

 Новые прошивки NAND (FCUSB.1.07.NAND.hex) и JTAG (FCUSB.7.05.EJTAG_16K.hex) подходят и для нашего клона — во всяком случае запускаются и определяются, функционал не проверял — просто не на чем.

   Судя по документации, назначение переключателей изменилось, возможно есть изменения и в печатной плате. Если кто-то соберет вариант на ATmega32U2 (чипы по ножкам совместимы), просьба отписаться о результатах.

Возможно, вам это будет интересно:

meandr.org

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

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