Анатолий Беляев (aka Mr.ALB). Персональный сайт

Столкнулся с некоторой проблемой – в одной плате Ардуино не все ячейки EEPROM работали на запись, поэтому написал программку, которая проверяет способность микроконтроллера записывать и считывать значения в каждую ячейку EEPROM.
Собственно программка не большая, всего на 3 кБ. Пользоваться просто: загружаете скетч в ардуинку и включаете монитор серийного порта в среде разработки IDE. На экране вы увидите построчно и последовательно перебор всех ячеек EEPROM, в которые будут записываться случайно выбранное значение и затем оно же будет из ячейки считываться.
Если записанное и считанное значения совпадают, то переходим к проверке следующей ячейки памяти, а если не совпадают, то программа будет остановлена и на экране будет выведено соответствующее сообщение.
С помощью этой программки отловил битые ячейки памяти в одной Ардуинке, и перестроил программу для неё так, чтобы не использовать эти неисправные ячейки.
С тех пор, прежде чем писать отзыв в магазине, все покупаемые платы Ардуино проверяю этой программой, что и вам рекомендую делать.
Скетч для проверки EEPROM
Ниже привожу скетч и после него уже архив со скетчем для IDE.
Весь код подробно закомментирован, с его пониманием, надеюсь, проблем не будет.
- ATMega168 – 512 ячеек,
- ATMega328 – 1024 ячейки,
- ATMega2560 – 4096 ячейки,
- LGT8F328P – 1020 ячеек.
Соответствующее число передаётся переменной EEPROM_max.
Библиотека < EEPROM . h > имеет функцию проверки максимального размера EEPROM, поэтому использовал такую функцию для автоматического определения EEPROM_max. Проверял на микроконтроллерах AVR и на микроконтроллере LGT8F328P. Замечу, что этот китайский микроконтроллер требует некоторой настройки библиотеки. Полная библиотека для работы с EEPROM для LGT8F находится в Приложении.
/*********************************************************** * Проверка работоспособности EEPROM * 2019-10-22 Mr.ALB v1 * 2019-11-19 Mr.ALB v2 Переделка функции fnTxRx * Для вывода сообщений на русском языке в * Мониторе порта - установите кодировку скетча * в UTF-8 * 2020-03-23 Mr.ALB v2.1 Добавил для ATMega2560 * 2022-02-16 Mr.ALB v3 автоматическое определение * 2022-02-17 Mr.ALB v3 Автоматическое определение * размера EEPROM * через функцию length() для AVR * и через функцию size() для LGT8F **********************************************************/ // Для Работы с AVR закомментируйте строку ниже //#define USE_LGT_EEPROM_API // Для работы с LGT8F #include EEPROM.h> byte val, val_rx; int count_error = 0; int EEPROM_max; int address; char choice; // Переменная выбора действия void setup() < //Установка начала псевдослучайного числа randomSeed(analogRead(1)); // Инициализация порта для монитора Serial.begin(9600); while (!Serial); // Автоматическое определение максимального размера EEPROM #if defined(USE_LGT_EEPROM_API) EEPROM_max = EEPROM.size(); // Для LGT8F #else EEPROM_max = EEPROM.length(); // Для AVR #endif Serial.println(F("Проверка Arduino EEPROM Test v3.1")); Serial.println(F("http://mralb.ru/sections/programming/arduino_10.php")); Serial.print(F("Размер EEPROM: ")); Serial.println(EEPROM_max); > void loop() < Serial.println(); Serial.println(F("Выбор действия: Отправить значение в порт")); Serial.println(F("1. Проверка всех ячеек EEPROM")); Serial.println(F("2. Проверка EEPROM выборочно")); Serial.println(F("3. Очистить весь EEPROM")); // Читаем значение из последовательного порта while (1) < choice = Serial.read(); if (choice == '1') < Serial.println(F("Выбрано: проверка EEPROM")); fnCheckEEPROM(); break; > if (choice == '2') < Serial.println(); Serial.println(F("Выбрано: проверка EEPROM выборочно")); address = 26; byte s = fnTxRx(address, random(0, 256)); break; > if (choice == '3') < Serial.println(F("Выбрано: Очистить EEPROM")); fnClearEEPROM(); break; > > > /****************************** Проверка всех ячеек EEPROM *****************************/ void fnCheckEEPROM() < // Перебор всех ячеек EEPROM в цикле for (int i = 0; i EEPROM_max; i++) < val = random(0, 256); // Случайное число // Записываем val и считываем val_rx по адресу i val_rx = fnTxRx(i, val); // Проверим совпадение записанного и считанного if (val != val_rx) < // Если записанное число не совпадает со считанным Serial.print(F("\t")); Serial.println(F("Не совпадает!")); // Сообщение count_error++; > > // Вывод сообщения о результате проверки Serial.println(); Serial.println(F("Версия программы v3.1")); Serial.println(F("Проверка EEPROM завершена.")); if (count_error > 0) < Serial.print(F("Повреждено: ")); Serial.print(count_error); Serial.println(F(" ячеек EEPROM")); Serial.println(F("В них считанные значения не совпадают с записанными.")); > else < Serial.print(F("Считанные значения совпадают")); Serial.println(F(" с записанными во всех ячейках EEPROM.")); > > /************************** Очистка EEPROM записываем в ячейки 255 ***************************/ void fnClearEEPROM() < Serial.println(); Serial.println(F("Очистка EEPROM")); for (int i = 0; i EEPROM_max; i++) < Serial.print(i); Serial.print(F("\t")); Serial.print(F("Было: ")); Serial.print(EEPROM.read(i)); Serial.print(F("\t")); EEPROM.write(i, 255); // Записываем число 255/0xFF в EEPROM Serial.print(F("Стало: ")); Serial.println(EEPROM.read(i)); > Serial.println(); Serial.println(F("Очистка EEPROM завершена.")); > /* Функция записи и считывания числа в и из EEPROM */ byte fnTxRx(int i, byte v) < byte v_rx, eData; Serial.print(i); Serial.print(F("\t")); Serial.print(F("Было: ")); eData = EEPROM.read(i); // Начальное число в ячейке Serial.print(eData); Serial.print(F("\t")); EEPROM.write(i, v); // Записываем число в EEPROM Serial.print(F("Записано: ")); Serial.print(v); // Выводим записанное число Serial.print(F("\t")); v_rx = EEPROM.read(i); // Считываем записанное число из ячейки Serial.print(F("считано: ")); Serial.print(v_rx, DEC); // Выводим десятичное значение Serial.print(F("\t")); EEPROM.write(i, eData); // Записываем начальное число в EEPROM Serial.print(F("Восстановлено: ")); Serial.println(EEPROM.read(i)); return v_rx; >
Приложение
- Библиотека для LGT8F: E2PROM.rar
- Скетч: eeprom_test.zip
- Скетч: my_eeprom_test.rar 2022-02-17
Примечание
Небольшое замечание: если у вас в Мониторе порта вместо русских букв выводятся разные крякозябры, то скорее всего ваш скетч имеет кодировку не UTF-8, а WINDOWS-1251 или какую-то другую. Запишите скетч в кодировке UTF-8.
Ещё такое может быть, если в программе/скетче задана скорость обмена через последовательный (Serial) порт не соответствующая вашей плате или открытому окну последовательного порта. Попробуйте изменить скорость обмена данными, возможно это решит проблему. У меня некоторые платы работали на скорости 2400 бод, тогда как в скетче было установлена скорость 9600 бод.

2019-10-22 . Mr.ALB
| Страница 11 |
Тест памяти EEPROM на битые ячейки

Приветствую вас, сегодня я делюсь с вами моим тестом, а точнее тестами энергонезависимой памяти EEPROM на наличие битых или испорченных байтов. На мой взгляд, полезный тест на проверку работоспособности памяти EEPROM после долгой эксплуатации, а так же проверка, если ваши данные, настройки и прочее начали неожиданно сбиваться.
Скетч
#include "EEPROM.h" void setup() < byte eData, tData1, tData2, tData3 = 0; Serial.begin(9600); Serial.println("Arduino EEPROM Test v1.0"); Serial.println("http://arduino.on.kg"); // Проходим в цикле всю память EEPROM. for (int i = 0; i < EEPROM.length(); i++) < // Запоминаем то, что записано в EEPROM. eData = EEPROM.read(i); // Записываем в ячейку EEPROM нули. EEPROM.write(i, 0); tData1 = EEPROM.read(i); if (tData1 != 0) < Serial.print("Cell "); Serial.print(i); Serial.println(" is corrupted (Test 1)."); continue; >// Записываем в ячейку EEPROM единицы. EEPROM.write(i, 255); tData2 = EEPROM.read(i); if (tData2 != 255) < Serial.print("Cell "); Serial.print(i); Serial.println(" is corrupted (Test 2)."); continue; >// Восстанавливаем данные в EEPROM. EEPROM.write(i, eData); tData3 = EEPROM.read(i); if (tData3 != eData) < Serial.print("Cell "); Serial.print(i); Serial.println(" is corrupted (Test 3)."); continue; >> Serial.println("The test is completed."); > void loop() < // Пустой цикл. >
Как проверить eeprom на работоспособность
Внутренняя программа микроконтроллера AVR может читать и записывать любой байт EEPROM памяти. Однако при программировании EEPROM`a внешним программатором чтение и запись осуществляется постранично. В зависимости от типа микроконтроллера страницы EEPROM памяти имеют разный размер. Например, у микроконтроллера atmega16 размер страницы EEPROM памяти равен 4-ем байтам.
Существует мнение, что заявленный производителем ресурс EEPROM памяти AVR микроконтроллеров, равный 100000 циклов запись/чтение, относится не к единичной ячейке памяти, а к целой странице. То есть если мы в один байт EEPROM`а atmega16 запишем 100000 раз, остальные три ячейки страницы памяти потеряют свой ресурс, будучи вроде ни разу не тронутыми.
Мне стало интересно узнать, соответствует ли это действительности, и я провел небольшой тест EEPROM памяти atmega16. Понятно, что этот тест не является каким-то глубоким научным исследованием, но это все же лучше, чем ничего.
Суть теста была предельно проста. В заданный байт EEPROM`a записывалось произвольное число, затем из этой же ячейки производилось чтение. Далее программа сравнивала записанное и считанное значение, и по результату сравнения увеличивался или счетчик удачных записей, или счетчик ошибок. Произвольное число генерировалось с помощью встроенной Си функции, а запись-чтение EEPROM`a производилось самописными функциями (чтобы можно было обращаться к EEPROM по конкретным адресам).
Каждые 10000 удачных записей в терминал выводилось сообщение с адресом тестируемой ячейки, числом произведенных записей и последним записанным числом. Таким образом, я контролировал, что микроконтроллер тестирует память, и каждый раз записывает разные числа. Также в терминал выводилось сообщение при появлении ошибок, чтобы отследить момент первого сбоя и посмотреть, как они накапливаются.
Ячейки тестировались в порядке возрастания адреса. Сначала «убивалась» 0-я ячейка, затем 1, 2 и так далее. То есть когда доходила очередь до последнего байта страницы (3 и 7 байты), предыдущие три были уже испорчены.
Результаты теста EEPROM
Всего я проверил 8 байтов EEPROM памяти atmega16, то есть две страницы. Да, это не так много, но вопреки моим ожиданиям ячейки оказались очень стойкими, и на тест одного байта уходило полдня. Полученные данные я свел в два графика.
Первый график отображает число циклов запись/чтение до появления первой ошибки. Из графика видно, что число циклов перезаписи для каждой ячейки составило не меньше 3 миллионов. Довольно большое число, но вряд ли ему стоит удивляться. Во-первых, заявленный ресурс EEPROM`a (100 тысяч), естественно, берется с большим запасом. Во-вторых, он указывается для всего рабочего температурного диапазона микроконтроллера, а я проводил тест только для комнатной температуры.
Как видите, ресурс одной ячейки никак не зависит от ресурса другой. Если бы от одной испорченной ячейки портилась вся страница, соседние ячейки EEPROM`a в лучшем случае не показали бы такой же результат, а в худшем начинали сбоить практически сразу. Этого не было. Например, 2-ой байт вообще побил все рекорды, выдержав 6 миллионов записей, а ведь он тестировался третьим по счету. Делайте выводы.

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

Выводы
Заявленный фирмой Atmel ресурс EEPROM памяти микроконтроллеров AVR, равный 100 тысячам циклов запись/чтение, относится к ресурсу одного байта памяти, а не к целой странице.
Анатолий Беляев (aka Mr.ALB). Персональный сайт
Столкнулся с некоторой проблемой – в одной плате Ардуино не все ячейки EEPROM работали на запись, поэтому написал программку, которая проверяет способность микроконтроллера записывать и считывать значения в каждую ячейку EEPROM.
Собственно программка не большая, всего на 3 кБ. Пользоваться просто: загружаете скетч в ардуинку и включаете монитор серийного порта в среде разработки IDE. На экране вы увидите построчно и последовательно перебор всех ячеек EEPROM, в которые будут записываться случайно выбранное значение и затем оно же будет из ячейки считываться.
Если записанное и считанное значения совпадают, то переходим к проверке следующей ячейки памяти, а если не совпадают, то программа будет остановлена и на экране будет выведено соответствующее сообщение.
С помощью этой программки отловил битые ячейки памяти в одной Ардуинке, и перестроил программу для неё так, чтобы не использовать эти неисправные ячейки.
С тех пор, прежде чем писать отзыв в магазине, все покупаемые платы Ардуино проверяю этой программой, что и вам рекомендую делать.
Скетч для проверки EEPROM
Ниже привожу скетч и после него уже архив со скетчем для IDE.
Весь код подробно закомментирован, с его пониманием, надеюсь, проблем не будет.
- ATMega168 – 512 ячеек,
- ATMega328 – 1024 ячейки,
- ATMega2560 – 4096 ячейки,
- LGT8F328P – 1020 ячеек.
Соответствующее число передаётся переменной EEPROM_max.
Библиотека < EEPROM . h > имеет функцию проверки максимального размера EEPROM, поэтому использовал такую функцию для автоматического определения EEPROM_max. Проверял на микроконтроллерах AVR и на микроконтроллере LGT8F328P. Замечу, что этот китайский микроконтроллер требует некоторой настройки библиотеки. Полная библиотека для работы с EEPROM для LGT8F находится в Приложении.
Приложение
- Библиотека для LGT8F: E2PROM.rar
- Скетч: eeprom_test.zip
- Скетч: my_eeprom_test.rar 2022-02-17
Примечание
Небольшое замечание: если у вас в Мониторе порта вместо русских букв выводятся разные крякозябры, то скорее всего ваш скетч имеет кодировку не UTF-8, а WINDOWS-1251 или какую-то другую. Запишите скетч в кодировке UTF-8.
Ещё такое может быть, если в программе/скетче задана скорость обмена через последовательный (Serial) порт не соответствующая вашей плате или открытому окну последовательного порта. Попробуйте изменить скорость обмена данными, возможно это решит проблему. У меня некоторые платы работали на скорости 2400 бод, тогда как в скетче было установлена скорость 9600 бод.
Arduino.ru
Скетч для проверки работоспособности портов и EEPROM
- Войдите на сайт для отправки комментариев
Написал универсальный скетч для проверки работоспособности портов и EEPROM памяти. Ищутся добровольцы для проверки в железе и доработки тестовой программы. Мой код проверен на ATmega128A, ATmega8A при этом никаких правок в коде делать не нужно. Количество цифровых и аналоговых выводов определяется автоматически.
Что еще нужно сделать:
1. Проверка аппаратных прерываний, таймеров, прерываний по переполнению таймера.
2. Прошивка на асме для проверки RAM, Stack Pointer Register, Status Register, регистров R0-R25, X,Y,Z
Что уже было сделано: Мой код при запуске ничего не делает, он ждет команду по UART. В терминал нужно отправить одну английскую букву для запуска нужного теста. Когда какой то тест был запушен, ч тобы его прервать нажмите кнопку ресет. Список комманд :
v — Выводит версию программы и краткое описание доступных тестов.
a — АЦП тест . Выводит значения всех аналоговых входов. Для этого вы подключаете переменный резистор поочередно к каждому аналоговому входу и смотрите как меняются значения.
i — Inputs test . В этом тесте включена подтяжка всех входов (INPUT_PULLUP). Тест в ыводит значения всех входов с низким уровнем на них. Вы берете провод подключенный на землю и через резистор 1КОм по очереди качаетесь каждого входа, в терминале должна появиться только одна надпись LOW с номером вывода. Этот тест позволяет найти замкнутые между собой пины или дорожки с обрывом (а также выводы со сгоревшими внутренними PULLUP резисторами )
o — Outputs test . Устанавливает все порты как выход с 1 на них. Вы берете тестер или светодиод с резистором и проверяете наличие высокого уровня на каждом выходе.
b — Blink . Тест наплатного светодиода.
0 — ZEROFILL встроенного EEPROM (тоесть заполнение нулями 0x00 во все ячейки ). Тест закончится, когда будет выведено «Done» в консоль. После этого запустите комманду » e » для вывода содержимого EEPROM в консоль и проверьте нет ли бытых ячеек
1 — 0xFF заполнение встроенного EEPROM. Тест закончится, когда будет выведено «Done» в консоль. После этого запустите комманду » e » для вывода содержимого EEPROM в консоль и проверьте нет ли бытых ячеек
p — Тест ШИМ на наплатном светодиод е . Тест надо полностью переписать, текущая реализация мне не нравится.
e — Выводит все содержимое EEPROM в терминал.
Цифровые порты 0 и 1 не тестируются. Этот тест предполагает, что выводы 0 ( RX ) и передачи данных 1 ( TX ) данных в порядке , раз у вас получилось загрузить скетч .
Как вытащить прошивку из любого устройства

Вы наверное как и я любили в детстве все разбирать и изучать, как и что работает. Некоторые повзрослели, а я все еще люблю этим заниматься )). В этой статье, я расскажу о том, как вытащить прошивку с любого устройства и как разрабы пытаются это предотвратить.
У старых ламповых приемников не было вообще никаких прошивок, а единственная защита, которая у них была — это анодное напряжение. В наше время все иначе: мне попадаются гаджеты, которые пытаются противодействовать уже на этапе вскрытия корпуса. Начнем наше увлекательное путешествие.
Осмотр платы устройства
Если вскрытие не показало, что пациент умер от вскрытия, я сначала осматриваю плату в поисках пинов отладочных интерфейсов — обычно это JTAG или UART. Главная проблема не в том, что нужные контакты могут быть в очень неожиданных местах, а в том, что обычно они отключены. Конечно, даже в 2021 году все еще хватает уникумов, которые отправляют в прод устройства с включенным UART, но количество таковых стремительно падает.

Если тебе не повезло — вариантов немного: или плакать в подушку, или искать чип памяти на борту и читать его непосредственно.
И вот с этим тебя ожидает уйма интересного! Думал, нужно просто вытащить восьминогую микруху в DIP-корпусе, похожую на старый чип с BIOS? Как бы не так! Сейчас есть минимум четыре относительно широко применяемых вида памяти, и некоторые из них могут быть похожи друг на друга так, что не различишь.
Память
Прежде чем я расскажу, что и как делать с памятью, давай сначала разберемся, какая она вообще бывает и как ее отличить от других компонентов на плате.

По опыту процессор (на скриншоте выше по центру) обычно квадратной формы и исполняется в BGA, а память прямоугольная и делается в SOP-корпусах.
Часто в ультрапортативных вычислительно мощных устройствах (смартфонах, например) используется бутерброд из процессора и памяти — так меньше размеры и задержки при работе. Форм‑фактор, конечно, BGA — просто потому, что ничего другого в крохотный корпус запихнуть нельзя.

ROM — постоянную память — отличить довольно легко. Предположим, чип с ней ты уже нашел. Теперь давай разберемся, какая она бывает.
Нас интересует EEPROM (Electrically Erasable Programmable Read-Only Memory), FRAM (сегнетоэлектрическая память) и NOR/NAND flash — они тебе уже и так знакомы. Из них ты мог не слышать только о FRAM — ее начали применять около пяти лет назад, так что она еще не особо популярна.
EEPROM
Среди особенностей этой памяти — побайтовые чтение и запись. Такая память самая долговечная: по расчетам, она может сохранять информацию в течение примерно двухсот лет! Но за надежность приходится платить — главным образом объемом, с котором у этого вида памяти все плохо: типичный объем такого чипа измеряется в килобайтах. Из‑за низкого объема для хранения прошивок этот тип памяти почти не применяется. Ну а раз заговорили о минусах — стоит и о низкой скорости сказать.

Устройство ячейки памяти EEPROM
Ресурс ячейки — около миллиона циклов перезаписи. По сравнению с современными ячейками NAND, у которых этот показатель находится в пределах нескольких десятков тысяч циклов, EEPROM-память просто нереально надежная.
FRAM — это совсем новый тип энергонезависимой памяти. Промышленно его применять стали всего несколько лет назад, так что шанс встретить именно FRAM в каком‑нибудь умном холодильнике небольшой, но скоро все может поменяться. Пока что основная проблема в цене, которая несколько выше, чем у других типов памяти.

Устройство FRAM-ячейки. Похоже на DRAM, правда?
От EEPROM отличается фундаментально другим принципом запоминания информации: хранится не заряд на затворе, а знак поляризации сегнетоэлектрика. При приложении напряжения она меняется на противоположную, что позволяет читать такую память и писать в нее.
Из‑за нового принципа работы такая память значительно быстрее, чем EEPROM, но ее долговечность осталась практически неизменной.
NOR/NAND Flash
NOR/NAND-флеш‑память — это просто EEPROM, собранный в массив. NOR от NAND отличается только способом упаковки в массив, но это небольшое различие ведет к достаточно сильным отличиям в такой памяти.

NOR быстрее и надежнее, чем NAND, но стоит дороже из‑за меньшей плотности компоновки. NAND же, напротив, дешевый как мусор, но имеет проблемы с надежностью.
NOR- и NAND-память используется в SSD и всяких флешках. Из‑за низкой надежности NAND-памяти такие накопители в обязательном порядке имеют большой пул запасных ячеек, недоступных для обычного использования, и умный контроллер, который всем этим хозяйством рулит. Держать такой оверхед в ширпотребных умных мультиварках непростительно дорого, так что применяется обычно NOR, а NAND остается для пользовательских накопителей, где проблемы надежности можно переложить на пользователя, который не делает бэкапы. Хотя нет — даже в дешевых роутерах он все чаще применяется благодаря программным механизмам защиты целостности.

Сводная таблица NOR NAND FRAM EEPROM
NOR был бы идеален, если бы не его цена, так что рыночек порешал — и теперь у нас всех используется NAND почти везде. Даже во встраиваемой технике уже почти научились с ним безопасно работать — контрольные суммы, ECC-коды и резервные блоки. Красота!
Корпуса микросхем
Как видишь, с корпусами у памяти все плохо: помимо показанных на картинке вариантов, можно запросто вспомнить еще с десяток, и не факт, что производитель не решил использовать нечто эксклюзивное, у чего может вообще не быть названия.

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

Если маркировка есть — немал шанс встретить ее именно в таком формате, как показан на картинке выше. Первые две буквы — код вендора, потом тип памяти в чипе, потом внутренний номер серии — и дальше уже четкой логики не прослеживается.
Так как единого стандарта нет и не предвидится, производители вольны писать на своих чипах, что считают нужным. Это порой приводит к коллизиям, вроде того, что представлено на той же картинке: два чипа разных производителей, оба 29-й серии, но один NOR, а другой — NAND. Короче, не угадаешь, и такие чипы приходится пробивать в поисковиках, чтобы выяснить хоть что‑то.
Типовой дизайн
Устройства одного сегмента проектируются очень похожими — это вполне очевидно. Например, все бытовые роутеры изнутри выглядят почти одинаково. Та же ситуация на рынке устройств SCADA, у которых свои каноны, но они прослеживаются везде без особых изменений.
Я расскажу о пяти категориях устройств, с которыми тебе, возможно, придется иметь дело:
- ПК;
- сетевое оборудование бытового сегмента (роутеры, свитчи, точки доступа);
- оборудование для ответственных применений (на заводах);
- IoT — интернет вещей;
- смартфоны.
Само собой, мир крутится не только вокруг смартфонов да компьютеров, но с ними у тебя шанс встретиться куда больше, чем с каким‑нибудь контроллером для управления ракетными двигателями. Поэтому давай рассмотрим типовое устройство только этих пяти категорий девайсов.
Устройство обычных ПК подразумевает модульность, то есть почти все детали можно легко вынуть. Из‑за этого на матплате из элементов памяти есть только флешка с BIOS/UEFI. При этом BIOS обычно сидит на микросхемах 24-й серии — I2C EEPROM, а в новых моделях стоит 25-я серия SPI NOR flash с UEFI.

Если же установлен взрослый интеловский процессор с поддержкой ME — на плате можно найти вторую такую же флешку, но с прошивкой для ME. Это делается в целях безопасности: находящуюся на физически отдельной микросхеме прошивку заразить или подменить сложнее.
Intel ME
Intel Management Engine — это особая система для UEFI-совместимых ПК на базе процессоров Intel. Она имеет свою выделенную микросхему памяти и собственный процессор, а также собственные каналы доступа к сетевым адаптерам и основной оперативной памяти. Может без ограничений взаимодействовать почти с чем угодно в составе компьютера, что очень сильно повышает требования к ее защите.
Бытовые роутеры
С роутерами потребительского класса все довольно просто: тут ставят память SPI NOR 25-й серии, если требуется не больше 8 Мбайт, или NAND-память объемом побольше. Изредка можно найти eMMC, но мне такое пока не попадалось.

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

Логи обычно пишутся в EEPROM или FRAM 24-й серии, загрузчик лежит на NOR 25-й серии, а все встроенное ПО кладут на NOR 26-й, 29-й серии. NAND используют редко, а если используют — сразу большими массивами с резервированием.
Сейчас понятие IoT слишком растяжимое: по сути, туда можно записать вообще все умное домашнее и даже не очень домашнее. Из‑за этого память там может быть любая: хоть EEPROM, хоть eMMC — это когда NAND с хост‑контроллером упакованы в один чип.

Смартфоны
В смартфонах обычно все самое передовое: тут тебе и eMMC, и eUFS, и даже NVMe SSD, как у Apple. При этом, как ни крути, все эти чипы выглядят плюс‑минус одинаково, так что ты их ни с чем не спутаешь.

Расшифровка имени
Теперь, когда нашли нужный чип и прочитали маркировку, ее нужно декодировать. Кстати, маркировка далеко не всегда читается целиком: часть может быть случайно или намеренно скрыта, а то и вовсе подделана, как любят устраивать китайцы со своими деталями на Али.
Особо крупные производители могут предоставлять на своих сайтах декодеры имени микросхемы, но почти никто так не делает.
Похвальный пример — производитель Micron, который дал на сайте внятную инструкцию и форму для получения даташита на свои микросхемы.

Если же декодера нет, придется выкручиваться. Можно попробовать разобраться по схеме на скриншоте ниже, но, естественно, безо всяких гарантий успеха. Возможно, даже лучше сразу идти к японцам — они очень любят неадекватно запутанные названия без известной логики. Она, конечно, есть, но пока что никто ее не смог понять.

Поиск документации
Гуглить, думаю, ты и сам умеешь, но для поиска документации ко всяким экзотическим чипам это может быть бесполезно. Во‑первых, более эффективен поиск по первым N символам названия микросхемы. Во‑вторых, часто проще найти по коду на Aliexpress или других крупных торговых площадках.
Если уж любишь Google, попробуй поиск по картинкам — там порой можно найти то, что текстом не ищется.
Еще огромные базы чипов есть в ПО для программаторов — я использую ПО компании Elnec. Зачастую там даже есть даташиты, но слишком на это надеяться не стоит.
И еще одно хорошее место для поисков — GitHub. С большим шансом там найдется что‑нибудь по запросу в духе «X microcircuit read poc». Дальше можно выдрать ссылку на даташит или что‑то еще полезное. Мне попадались даже скрытые сервисные команды для блокировки/разблокировки чипа, что, конечно, очень приятно при изучении.
Оборудование
Тут можно только сказать, чего делать не стоит: не надо брать дешевые инструменты и расходники. Из моего любимого — припой, который плавится при совершенно неожиданных температурах, проводящий флюс (!) и одноразовые пинцеты.
Подробнее хочется рассказать о дешевом флюсе. Как пример — ТТ, также известный как розовый гель. Он хорош, но он не отмывается и проводит ток на высоких частотах. Это не проблема в советском радио или даже современном блоке питания, но вот на платах компьютеров с гигагерцами частоты он категорически противопоказан.
Снятие компаунда — это вопрос температуры. Я обычно грею феном на
250 градусов, но есть одна проблемка. И состоит она в том, что под компаундом компоненты могут быть припаяны низкотемпературным припоем, вроде сплавов Розе или Вуда. Да, компаунд ты снимешь, но вместе с ним сойдет половина платы. А хитрая флешка может не завестись без кучи рассыпухи, которую обратно уже не собрать.
При снятии компаунда не забывай о вытяжке — твое здоровье важнее любой микросхемы!
Что делать, если плата покрыта лаком? Можно попробовать свести его ацетоном, но он может повредить текстолит. Делай так, только если тебе терять нечего. Для остальных случаев — просто снимать скальпелем в нужных местах, а остальное не трогать.
При пайке ориентируйся на график термопрофиля в конце даташита на микросхему. Он там размещается не просто так, и на моей памяти действительно были случаи, когда микросхема умирала от перегрева при извлечении. Как известно, люди делятся на тех, кто не смотрит графики в документации, и тех, кто уже смотрит.

К заводскому припою часто имеет смысл примешать менее тугоплавкий сплав Розе или ПОС63, ну или сплав Вуда, если все совсем плохо. Это значительно понизит температуру пайки и увеличит шансы не сжечь микруху.
Подготовка к чтению прошивки
После выпайки ни в коем случае нельзя устраивать микросхеме температурные испытания: пусть полежит и остынет сама, а не в спирте — так шансы сохранить работоспособность куда выше. Дальше нужно проверить, все ли лапки чипа находятся в одной плоскости и не образовались ли от припоя перемычки между ножками. Их нужно убрать, чтобы не спалить программатор, не имеющий защиты от такого, и сам чип тоже.

С BGA нужно убрать старый припой и нанести новые шарики. Когда чип очищен и подготовлен к чтению, не вздумай пихать его в программатор с прижимом прямо в чип — велик шанс просто раздавить его!
Чтение прошивки
Помни, что память NOR flash идет с завода без битых ячеек, а у NAND есть допустимый процент брака, так что, если в NAND видны битые ячейки, не спеши расстраиваться.

Программатор перед чтением нужно правильно настроить. В частности, надо заставить его читать все, включая системные страницы в начале и конце памяти — они бывают крайне важны!
Разработчики чипа настоятельно рекомендуют разработчикам устройства использовать свои чипы в соответствии с некоторыми правилами. Но вторые вольны не подчиняться первым, так что системные страницы порой оказываются хранилищем ключей шифрования или каких‑то других данных. В общем, читай все — лишним точно не будет.
Вот теперь у тебя есть образ, который можно грузить в IDA и ковыряться дальше, но это уже тема для отдельной статьи.
Статья написана по мотивам доклада Демида Узенькова — специалиста компании ИНФОРИОН. Выступление состоялось на конференции RuCTFE 2020. За помощь в подготовке публикации редакция благодарит команду «Хакердом».
Похожие публикации:
- Откуда фаза на заземлении
- Как выглядит vga кабель
- Избыток электронов какой заряд
- Почему в электричке выключается свет гаснет
Введение
Внутренняя программа микроконтроллера AVR может читать и записывать любой байт EEPROM памяти. Однако при программировании EEPROM`a внешним программатором чтение и запись осуществляется постранично. В зависимости от типа микроконтроллера страницы EEPROM памяти имеют разный размер. Например, у микроконтроллера atmega16 размер страницы EEPROM памяти равен 4-ем байтам.
Существует мнение, что заявленный производителем ресурс EEPROM памяти AVR микроконтроллеров, равный 100000 циклов запись/чтение, относится не к единичной ячейке памяти, а к целой странице. То есть если мы в один байт EEPROM`а atmega16 запишем 100000 раз, остальные три ячейки страницы памяти потеряют свой ресурс, будучи вроде ни разу не тронутыми.
Мне стало интересно узнать, соответствует ли это действительности, и я провел небольшой тест EEPROM памяти atmega16. Понятно, что этот тест не является каким-то глубоким научным исследованием, но это все же лучше, чем ничего.
Суть теста была предельно проста. В заданный байт EEPROM`a записывалось произвольное число, затем из этой же ячейки производилось чтение. Далее программа сравнивала записанное и считанное значение, и по результату сравнения увеличивался или счетчик удачных записей, или счетчик ошибок. Произвольное число генерировалось с помощью встроенной Си функции, а запись-чтение EEPROM`a производилось самописными функциями (чтобы можно было обращаться к EEPROM по конкретным адресам).
Каждые 10000 удачных записей в терминал выводилось сообщение с адресом тестируемой ячейки, числом произведенных записей и последним записанным числом. Таким образом, я контролировал, что микроконтроллер тестирует память, и каждый раз записывает разные числа. Также в терминал выводилось сообщение при появлении ошибок, чтобы отследить момент первого сбоя и посмотреть, как они накапливаются.
Ячейки тестировались в порядке возрастания адреса. Сначала «убивалась» 0-я ячейка, затем 1, 2 и так далее. То есть когда доходила очередь до последнего байта страницы (3 и 7 байты), предыдущие три были уже испорчены.
Результаты теста EEPROM
Всего я проверил 8 байтов EEPROM памяти atmega16, то есть две страницы. Да, это не так много, но вопреки моим ожиданиям ячейки оказались очень стойкими, и на тест одного байта уходило полдня. Полученные данные я свел в два графика.
Первый график отображает число циклов запись/чтение до появления первой ошибки. Из графика видно, что число циклов перезаписи для каждой ячейки составило не меньше 3 миллионов. Довольно большое число, но вряд ли ему стоит удивляться. Во-первых, заявленный ресурс EEPROM`a (100 тысяч), естественно, берется с большим запасом. Во-вторых, он указывается для всего рабочего температурного диапазона микроконтроллера, а я проводил тест только для комнатной температуры.
Как видите, ресурс одной ячейки никак не зависит от ресурса другой. Если бы от одной испорченной ячейки портилась вся страница, соседние ячейки EEPROM`a в лучшем случае не показали бы такой же результат, а в худшем начинали сбоить практически сразу. Этого не было. Например, 2-ой байт вообще побил все рекорды, выдержав 6 миллионов записей, а ведь он тестировался третьим по счету. Делайте выводы.

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

Выводы
Заявленный фирмой Atmel ресурс EEPROM памяти микроконтроллеров AVR, равный 100 тысячам циклов запись/чтение, относится к ресурсу одного байта памяти, а не к целой странице.