Подключение nand flash к usb
(7097) 4.92 (13) Оценки, комментарии
2021-02-11 Дата последнего изменения: 2021-02-28
В статье в предельно доступной форме рассматриваются особенности применения микросхем NAND FLASH.
3. Магия ЕСС.
Все наверное знают, что такое CRC. Код CRC (еще иногда (ошибочно) называют "контрольная сумма") — это такой специальный код, который позволяет найти ошибку в данных.
Кратко опишем как выглядит работа кодера/декодера ЕСС:
- Берется порция данных, например, 2048 байт, записывается в страницу NAND.
- Рассчитывается код ЕСС и тоже записывается (назовем его ECC1) (именно для записи таких кодов страница сделана чуть больше!)
- Затем читаем страницу 2048 байт.
- Опять рассчитываем код ЕСС (назовем его ECC2).
- Читаем записанный код ЕСС1 и сравниваем ECC1 и ECC2.
- Если коды совпадают, значит ошибок нет.
Вот до этого места коды CRC и ECC не сильно отличаются, магия ЕСС начинается дальше:
Вот и вся магия. Мы просто исправляем ошибки.
2. Коварство NAND. Ошибки.
При работе микросхемы NAND возникновение ошибок — это норма. "Как так? Как можно работать с такой микросхемой?!" — скажете вы. Как можно работать с такой памятью? Способы есть, но об этом позже, а сейчас о типичном заблуждении начинающих:
- Пользователь ставит микросхему в программатор.
- Читает её. Читает еще раз.
- Сравнивает. О ужас! Обнаружено более тысячи ошибок!
- Паника! Микросхема не работает. Программатор не работает.Ничего не работает.
- Нужно срочно звонить нам (производителю) и требовать ремонта программатора!
Спокойно, дружище, спокойно. Это NAND, она так работает.
Сейчас типичная страница наиболее распространенных NAND равна двум килобайтам плюс дополнительные байты. Очень многие микросхемы при чтении дают до 16-ти одиночных ошибок на одну страницу. И это нормально. Берем, например, микросхему на 2 гигабайта. Нехитрое вычисление. Получаем, что при считывании микросхемы может быть до 16 777 216 ошибок!
Еще раз: 16 миллионов! Ошибок в микросхеме! Как с этим жить?! Как может что-то работать вообще? Об этом поговорим чуть позже.
А сейчас поясним понятие "одиночные ошибки".
"Одиночная ошибка" — это не одна единственная ошибка на страницу или микросхему, это ошибка в одном бите. Таких ошибок может быть много, вопреки слову "одиночная". Применительно к памяти такие ошибки правильнее было бы называть однобитными, но термин "одиночный" пришёл из теории передачи данных по линиям связи, где ошибки выявляют и исправляют такими же способами, что и в NAND.
Все оценки, комментарии
Михаил [14 декабря 2021, 20:14:03]
Гость
Илья [16 августа 2021, 14:36:09]
Гость
★★★★★ Очень нужная статья. Где продолжение?
Алексей [15 апреля 2021, 22:46:11]
Гость
★★★★★ Отличная статья, спасибо за полезную информацию.
Николай [11 апреля 2021, 15:16:07]
Гость
★★★★★ Очень познавательно, спасибо.
[26 февраля 2021, 12:47:06]
Гость
[21 февраля 2021, 16:43:42]
Гость
Собрал недавно программатор NAND Flash памяти.
Программатор разработала организация НТП "Тиком".
"USB программатор ChipStar‑Janus
USB программатор ChipStar‑Janus — простой внутрисхемный программатор для микроконтроллеров (PIC, AVR, MCS51 и других) и микросхем FLASH памяти с возможностью расширения.
Через адаптер расширения позволяет программировать микросхемы NAND FLASH.
Программатор ChipStar-Janus создан специально для специалистов, нуждающихся в простом и недорогом, но близком к профессиональному, программаторе с фирменной поддержкой.
Таким образом, этот программатор в некоторых случаях будет достаточен для разработки и ремонта современного радиоэлектронного оборудования." — текст описания с сайта производителя.
Программатор можно купить готовый, либо собрать самому, на сайте производителя есть подробнейшая инструкция и вся документация для сборки.
Сайт производителя
Есть 2 варианта печатной платы, для smd(двухсторонняя) и для DIP.
Прошивка и ПО доступны после регистрации на сайте.
МК PIC25k50 я прошивал программатором JDM Extrapic, а ПО picpgm.
Единственная проблема при сборке программатора у меня была с выставлением конфиг. битов, picpgm сама не смогла их корректно распознать :(. В документации на программатор конфиг. битов я не нашел, и начал пробовать вытянуть их из HEX файла. Начал читать, узнавать где они там хранятся и т.д. Попутно задал вопрос в тех. поддержку производителя, а дело было в 22 часа примерно, пятница, ну думаю пока до понедельника далеко, буду пробовать сам из прошивки вытянуть, по итогу через минут 40 вытянул конфиг биты из файла прошивки и вижу письмо пришло новое, открываю, а это к слову было 23 часа, а там подробный ответ на несколько моих вопросов по программатору. Я был приятно шокирован скоростью ответа тех.поддержки, при том что вопрос был по БЕСПЛАТНОМУ программатору, а не купленой версии. Сравнил полученные биты с вытянутыми, все сошлось. Прошил МК и продолжил сборку.
Программатор сразу заработал.
Еще одно приятное впечатление оставила тестовая программа для отладки и проверки программатора. Эта программа вручную выставляет напряжение программирования на выходах питания, выставляет низкий или высокий уровень на линиях данных, прослушивает входы, и для каждого действия обозначены контрольные точки на схеме для проверки, схема с точками показана на вкладке в программе, очень удобно.
Сделал себе сразу 3 адаптера, для 24х, 25х, 93х, NAND(делал под впайку микросхемы в адаптер, пока не куплю панельку)
ПО много чего умеет, преобразует BIN файл в формат нанд.
Микросхемы которых нет можно добавлять самостоятельно, все описано в инструкции.
Схема, платы, инструкция по сборке, все доступно БЕЗ регистрации, а регистрация нужна для получения прошивки и ПО под прошивку, там еще дается период бесплатного обновления, и для каждой прошивки он свой, если шить мою прошивку, то вы потеряете то количество дней, которое прошло с момента моей регистрации. Так что крайне рекомендую регистрироваться и скачивать свою прошивку.
Собрал недавно программатор NAND Flash памяти.
Программатор разработала организация НТП "Тиком".
"USB программатор ChipStar‑Janus
USB программатор ChipStar‑Janus — простой внутрисхемный программатор для микроконтроллеров (PIC, AVR, MCS51 и других) и микросхем FLASH памяти с возможностью расширения.
Через адаптер расширения позволяет программировать микросхемы NAND FLASH.
Программатор ChipStar-Janus создан специально для специалистов, нуждающихся в простом и недорогом, но близком к профессиональному, программаторе с фирменной поддержкой.
Таким образом, этот программатор в некоторых случаях будет достаточен для разработки и ремонта современного радиоэлектронного оборудования." — текст описания с сайта производителя.
Программатор можно купить готовый, либо собрать самому, на сайте производителя есть подробнейшая инструкция и вся документация для сборки.
Сайт производителя
Есть 2 варианта печатной платы, для smd(двухсторонняя) и для DIP.
Прошивка и ПО доступны после регистрации на сайте.
МК PIC25k50 я прошивал программатором JDM Extrapic, а ПО picpgm.
Единственная проблема при сборке программатора у меня была с выставлением конфиг. битов, picpgm сама не смогла их корректно распознать :(. В документации на программатор конфиг. битов я не нашел, и начал пробовать вытянуть их из HEX файла. Начал читать, узнавать где они там хранятся и т.д. Попутно задал вопрос в тех. поддержку производителя, а дело было в 22 часа примерно, пятница, ну думаю пока до понедельника далеко, буду пробовать сам из прошивки вытянуть, по итогу через минут 40 вытянул конфиг биты из файла прошивки и вижу письмо пришло новое, открываю, а это к слову было 23 часа, а там подробный ответ на несколько моих вопросов по программатору. Я был приятно шокирован скоростью ответа тех.поддержки, при том что вопрос был по БЕСПЛАТНОМУ программатору, а не купленой версии. Сравнил полученные биты с вытянутыми, все сошлось. Прошил МК и продолжил сборку.
Программатор сразу заработал.
Еще одно приятное впечатление оставила тестовая программа для отладки и проверки программатора. Эта программа вручную выставляет напряжение программирования на выходах питания, выставляет низкий или высокий уровень на линиях данных, прослушивает входы, и для каждого действия обозначены контрольные точки на схеме для проверки, схема с точками показана на вкладке в программе, очень удобно.
Сделал себе сразу 3 адаптера, для 24х, 25х, 93х, NAND(делал под впайку микросхемы в адаптер, пока не куплю панельку)
ПО много чего умеет, преобразует BIN файл в формат нанд.
Микросхемы которых нет можно добавлять самостоятельно, все описано в инструкции.
Схема, платы, инструкция по сборке, все доступно БЕЗ регистрации, а регистрация нужна для получения прошивки и ПО под прошивку, там еще дается период бесплатного обновления, и для каждой прошивки он свой, если шить мою прошивку, то вы потеряете то количество дней, которое прошло с момента моей регистрации. Так что крайне рекомендую регистрироваться и скачивать свою прошивку.
Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет
Я думаю человек имел ввиду NAND-Flash и работает она не по SPI.
вариантов тут несколько.
1 - ищем чипы (такие которые стоят в USB флэшках и делаем обыкновенную флешку)
2 - берем ARM с шиной EBU (могу ошибаться) цепляем флэш на эту шину.
арм к ЮЗБ - и делаем свою флэш.
3 - ваяем на той же атмеге софтовую шину и получаем очень тормознутый обмен с флешкой.
p.s. у меня самого лежат 2 USB Flash с убитыми контроллерами а память 2 по 4 GB и 2 по 512 MB целая. тоже хочется что нибудь с ней натворить
На вебинаре были представлены линейка компонентов для электропитания и интерфейсные модули. Мы рассмотрели популярные группы изолированных и неизолированных (PoL) DC/DC-преобразователей последних поколений, новые компактные модульные источники питания, устанавливаемые на печатную плату (открытые и корпусированные), источники питания, монтируемые как на шасси (в кожухе и открытые), так и на DIN-рейку.
Вариант с АТмегой мне как то больше подуше. Вообще как бы идея моя такая. Привязать сие флеш карту к АТмеге и к VS1001 и запустить плеер. А то что такое добро пропадает.
Вот тема похожая. Я открывал, Но мы в итоге так ни к чему не пришли. Может поможет чем.
Встраиваемые ИП LM(F) производства MORNSUN заслуженно ценятся производителями во всем мире, поскольку среди широчайшего ассортимента продукции компании можно найти источник питания для любых задач. Представители семейств LM и LMF различаются по мощности и выходному напряжению, их технические и эксплуатационные характеристики подходят для эксплуатации в любых электрических сетях и работают в широком диапазоне условий окружающей среды. Неизменными остаются высокое качество и демократичная цена.
не смотрел MLC или SLC эта флешка, но для атмеги достаточно сложно будет сделать алгоритм ECC коррекции.
обычно сие дело ваяют на плисах или контроллерах которые имеют аппаратную шину для этих флешей.
и второй вопрос а как вы ее заливать будете? (rs232? 1гб?)
pirotehnick, посмотрел я Vinculum и мне показалось, что он может интерфейсить флешку, даже с разбором FAT, однако предлагает обмениваться с ней через UART, SPI или FIFO, а к USB его как устройство или функцию не подключишь, чтоль?
Он так же выполняет функцию хост-контроллера USB. Т.е. его можно подрубить к компу и общаться с ним с помощь соответствующих функций. Софт под него, как обычно, можно посмотреть на сайте производителя.
А есть ли смысл его вообще к АВР подключать? Тормозить-же будет огого. И вообще чего добиться-то хотите?
Желаний то много, например USB Mass Storge или mp3 плеер, или еще что нибудь, простор мысли ведь велик, а почему эт будет тормозить?
_________________
Даташит - библия моя.
Часовой пояс: UTC + 3 часа
Кто сейчас на форуме
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y
Дабы немного развеять иллюзии, попробуем методами реверс-инжиниринга проанализировать алгоритмы работы NAND контроллера производства SKYMEDI SK6211 на примере готового изделия в виде USB flash 8Gb, выпущенной компанией Kingston.
рис. 1
Для полноценного анализа сначала создадим имитацию использования накопителя посредством записи большого числа файлов с последующим частичным случайным удалением и повторными записями. Следом пропишем половину LBA диапазона нулями, но кроме нулей в каждый «сектор» поместим по смещению 0x0 DWORD с его номером. Вторую половину логического диапазона пропишем паттерном 0x77 (данный паттерн относительно удобен для анализа алгоритмов зашумливания данных).
На рис. 2 показан принцип нумерации блоков (блок состоит из 128 страниц). Стоит отметить, что данная микросхема может одновременно выполнять операции программирования/стирания сразу в двух плоскостях (вариации 0,1 и 2,3). Те, кто желает более подробно изучить особенности микросхем и нюансы работы с ними могут поискать техническую документацию (datasheet), которая в данное время уже доступна широкой публике K9HBG08U1M.pdf.
Для чтения микросхем используем NAND reader входящий в состав комплекса Flash Extractor. В те времена, когда контроллер SK6211 был популярен, этот комплекс, предназначенный для восстановления данных, был практически единственным аналитическим инструментом, который был в свободной продаже.
Приступая к анализу алгоритмов распределения данных контроллером SK6211, узнаем о его возможностях параллельной работы с микросхемами из рекламных источников, а также о несколько отличающихся двух видах кодов коррекции ошибок (ЕСС). В данной публикации, в силу обширности темы, опустим описание особенностей работы кодов коррекции ошибок, и всю математическую составляющую, связанную с ними.
Первая задача в анализе данных установить признаки зашумливания записываемых в память данных. Для этого выполним поиск записанного нами паттерна 0x77 и попробуем обнаружить множество страниц, сплошь заполненных оным. Но результаты поиска к успеху не приводят, что позволяет сделать вывод, что данные записаны в измененном виде. При пролистывании дампов обнаруживаем большое количество страниц, заполненных значением 0x88 кроме последних 64 байт, а также большое количество страниц, заполненных сплошь 0xFF кроме 4 байт в начале каждого 512 байтного блока и последних 64 байт (в границах страницы 2112 байт). Исходя из того, какие паттерны мы записывали на USB flash, вынесем предположение, что имеет место инверсия данных. Прежде, чем выполнять инвертирование данных, проведем анализ содержимого NAND страниц для установления расположения служебных данных. В местах заполнения паттерном весьма просто отличить наше инвертированное однородное значение от служебных данных, которые не состоят сплошь из одинаковых последовательностей байт.
На рис. 5 видно, что упорядоченными остаются первые 4 байта, и хаотичное содержимое располагается в остальных 12. Исходя из этого, можно предположить, что последние 12 байт в каждой строке содержат код коррекции ошибок. Зная, что блок, которым оперирует NAND микросхема, равен 128 страницам, произведем расчет размера блока 2112*128=270 336 (0x42000) байт. От 0x00108000 шагнем на один блок вперед, то есть к странице по адресу 0x0014a000.
из содержимого рис. 5 и рис. 6 очевидно, что 3-й байт играет роль номера страницы для блока NAND памяти. Это предположение не опровергается при просмотре всех непустых блоков NAND памяти.
В 0 и 1 байтах служебных данных в каждой странице на протяжении двух блоков неизменные значения. Можно предположить, что эта пара байт отведена для номера блока. Выведем все значения для всех блоков и обнаружим, что в младшем полубайте первого байта используются значения от 0x0 до 0x3, а в нулевом байте пробегают значения от 0x00 до 0xFF. Значения старшего полубайта в первом байте имеют более разнообразные значения. Предположим, что для нумерации используется 10 бит, которые формируются из двух младших битов первого байта служебной зоны в качестве старшей части и 8 бит из нулевого байта в качестве младшей части. Проверим достоверность предположений посредством вывода номеров для первых 0x400 блоков. Отсортировав их в порядке возрастания, заметим, что последовательно выстраивается цепочка из номеров от 0x000 до 0x3C3, что подтверждает корректность предположения. Выполнив аналогичные проверки для остальных групп по 0x400 блоков окончательно исключим вероятность ошибочной интерпретации.
Выполним инвертирование данных, за исключением служебных, и проанализируем механизм распараллеливания данных. Проверим предположение о симметричности записи в разные банки посредством анализа логических номеров в блоках в каждом дампе. В случае SK6211 предположение о симметричной записи подтверждено. Найдем блок с логическим номером 0x000, в котором каждый 512 блок данных содержит порядковый номер и нули в качестве содержимого. Опираясь на фактическое расположение записанных нами данных, построим таблицу положения данных.
Согласно размещения данных можем заметить, что контроллер для данного набора микросхем реализует максимально эффективное распараллеливание для получения высокой производительности. С учетом механизма распараллеливания данных рассчитаем размер блока, которым оперирует система трансляции в микрокоде накопителя 0x42000*8=0x210000 байт. Если отбросить служебные данные, то размер блока 0x40000*8=0x200000 (2 097 152) байт.
Для дальнейшего анализа нам необходимо устранить разброс данных и собрать их в цельные блоки по 2 МБ.
Первый шаг – устранение распараллеливания между плоскостями посредством постраничного объединения четных блоков с нечетными.
Второй шаг – объединение с удвоенным размером страницы 0 и 1 банков каждой из микросхем NAND памяти.
Третий шаг – объединение с учетверенным размером страницы обеих микросхем NAND памяти.
При анализе содержимого блоков по 2МБ в результирующем дампе наблюдается монотонно возрастающая последовательность пронумерованных нами «секторов», что подтверждает корректность анализа алгоритма распараллеливания данных.
Далее на сборном дампе выясним порядок расположения блоков и организацию в логические банки.
Произведем поиск нескольких десятков блоков и сбор по порядковому номеру. По результатам сбора удостоверяемся, что наша нумерация секторов в блоках стыкуется. И сделанное ранее предположение о том, что 10 бит из первых двух служебных байт являются номером блока, верно.
Полный размер микросхем 8 858 370 048 (0x210000000) байт размер блока в трансляторе 2 162 688 (0x210000). Всего блоков 0x210000000/0x210000=0x1000 (4096). Исходя из разрядности используемых чисел и фактической нумерации, номера блоков не могут превышать 0x400 (1024) из этого можно сделать вывод о существовании 4 логических банков в трансляции. Условно разделим результирующий дамп на 4 равные части (по 0x400 блоков), оценим в каждой части номера блоков и на основании этого предположим количество блоков, включенных в трансляцию в каждом логическом банке.
Обратим внимание, что размер каждого логического банка заметно меньше 0x400. Эта необходимость диктуется тем, что «лишние» блоки в некотором количестве нужны для служебных структур и, самое главное, для эффективной работы механизма выравнивания износа. Механизм реализуется по принципу, что каждый блок, в котором изменяется содержимое, будет исключен из трансляции и попадет в резервные, а его место займет блок, который до записи в него измененных данных не был включен в трансляцию и числился резервным. С учетом счетчиков записи в каждый блок механизм работает достаточно эффективно. Ахиллесовой пятой данного алгоритма будет обилие неизменяемых данных, тогда при записях в ротации будет участвовать относительно небольшое число блоков.
Данный принцип весьма наглядно подтверждается расположением блоков в дампе. Согласно рис. 10 можно заметить, насколько нелинеен разброс блоков, из которых реализуется логическое пространство. Припаяв микросхемы NAND памяти обратно и подключив USB flash к компьютеру, выполним некоторое число записей в первые 4096 «секторов», снова выпаяем и прочитаем микросхемы NAND памяти, проведем сбор и оценим порядок блоков в результирующем дампе.
Как можем заметить при неизменном порядке остальных блоков, блок с логическим номером 0x000 «перекочевал» в другое место. По старому адресу все страницы блока, как в области пользовательских данных, так и в области служебных сплошь заполнены 0xFF, что свидетельствует об очистке данного блока и исключении из трансляции.
Сравнивая оба результирующих дампа, кроме измененных данных в нулевом блоке будут изменения и в служебных данных, проанализировав которые мы можем установить, каким образом сформирована структура транслятора.
Подобный метод анализа позволяет получить достаточно данных об алгоритме работы USB NAND контроллера, чтобы применять их для восстановления информации из поврежденных накопителей, основанных на исследуемом контроллере, а также позволяет увидеть в действии механизмы распараллеливания данных и выравнивания износа. Также, основываясь на устройстве транслятора и анализе USB flash (дополнительные мероприятия по анализу проводим на накопителе, отформатированном в FAT32 и заполненном несколькими тысячами файлов), можно заметить, что для блоков со структурами файловой системы нет какого-либо привилегированного выделения блоков.
4. Коварство NAND. Магия ЕСС есть, но она не работает.
"Так просто?" — скажете вы. "Тогда почему программатор не использует ЕСС для исправления ошибок?! Я из раза в раз читаю микросхему и все время ошибки".
Да. Действительно, почему?
- Какими порциями (128, 256, 512, 1024 или 2048) в вашем приборе (не в микросхеме NAND, а именно в приборе. ) разработчик прибора решил записывать данные и вычислять ЕСС.
- Какой алгоритм ЕСС он решил использовать.
- Какой порождающий полином он решил использовать.
- Как разработчик разбил страницу NAND на порции и куда решил записывать сами коды ЕСС.
Как? Вы это не знаете?! Вот и мы не знаем. И, возможно, никто, кроме разработчика прибора, не знает.
Если из этого списка 1-й и 4-й пункты можно попытаться выяснить, анализируя прошивку микросхемы, а порождающий полином (пункт 3) - подобрать, то с пунктом 2 (алгоритм ECC) все очень плохо.
1. Коварство NAND. Структура.
NAND организованы следующим образом: страницы –> блоки –> логические модули –> кристаллы.
На рисунке ниже показан типичный пример организации микросхемы NAND с одним логическим модулем и одним кристаллом.
В чем коварство NAND? В адресации.
Даже начинающий радиолюбитель знает, что к любой ячейке микросхемы памяти можно обратиться, указав её адрес. Перебирая по порядку все адреса с первого до последнего, можно считать или записать всю микросхему (именно так поступает программатор).
При считывании NAND всегда происходит чтение всей страницы целиком, страница перемещается во внутренний буфер (page register), а уже из буфера можно прочитать содержимое страницы байт за байтом или в произвольном порядке.
То же самое при записи — сначала заполняется внутренний буфер (целиком или частично), затем страница записывается целиком. Размер буфера равен размеру страницы. Коварство адресации в том, что размер страницы не кратен степени двух. То есть просматривать содержимое микросхемы байт за байтом не получится.
8. "Ваш программатор полный отстой, вот другие программаторы решают эту проблему".
Нет. У других производителей программаторов (во всяком случае у всех, которые нам известны на данный момент) всё точно так же. Те же предложения: "Cкажите какой ЕСС и мы все реализуем".
Те же методы верификации с "терпимостью" ошибок ЕСС. У некоторых производителей есть настройка с выбором алгоритмов из встроенного стандартного набора, с необходимостью указания полинома, разметки страницы и кучи других параметров. В практической жизни это вам не сильно поможет.
CОДЕРЖАНИЕ:
NAND не совсем обычные микросхемы, поэтому те инженеры, которые с ними сталкиваются впервые, часто бывают обескуражены. Более подробно, хотя и очень примитивно, особенности NAND описаны в статьях "Программирование NAND FLASH" и "Программирование SPI NAND".
Здесь же я постараюсь изложить суть использования NAND еще проще.
Тому, кто собирается работать с NAND профессионально, материала из этой статьи будет явно недостаточно, но для любителя, который решил отремонтировать 2–3 прибора, в которых используется микросхема типа NAND, это может очень помочь.
5. Почему алгоритмов расчета ECC так много.
На данный момент самые распространённые коды исправляющие ошибки это:
Математические теории кодов достаточно сложные, но основные приемы работы с кодами известны, порождающие полиномы легко найти. Казалось бы, мы легко сможем подобрать нужный алгоритм ECC, просто анализируя прошивку. Сначала мы тоже так решили, однако всё оказалось сложнее.
Большинство современных встроенных систем базируются на Linux. Linux для работы накопителей на основе FLASH памяти, как правило, использует драйвер MTD. В драйвере MTD реализовано программное кодирование для NAND кодом BCH с вполне известным набором полиномов. Всё будто просто, но в реальной жизни (в реальных прошивках) такое кодирование не встречается. Почему? Всё упирается в деньги. Вернее, в желание производителей аппаратуры их сэкономить.
Почему вместо обычной памяти FLASH, работающей безошибочно, используются NAND, производящие кучу ошибок? Потому что это в разы дешевле. За разработку алгоритма кодирования/декодирования ЕСС заплатить нужно ОДИН раз, за память без ошибок нужно платить КАЖДЫЙ раз в КАЖДОМ устройстве.
Ровно по этой же причине в реальных устройствах (особенно массовых) никогда не используется чисто программное декодирование ЕСС – это декодирование является очень ресурсозатратным. Получается: ставим дешевую память – получаем или медленно работающее устройство, или нужно ставить мощный процессор, стоимость которого сводит на нет выгоды от использования дешевой памяти.
Поэтому декодированием ЕСС в современных системах занимаются специальные сопроцессоры или контроллеры. Придумываются и реализуются более совершенные коды ЕСС. Часто используются комбинированные коды CRC/ECC. Код CRC рассчитывается быстрее, чем ЕСС, это позволяет использовать CRC-часть для обнаружения ошибок, а полное декодирование ЕСС — только при их наличии.
Все эти коды и алгоритмы являются предметом авторского права и собственностью компаний, их разработавших. Ежедневно патентуются все более совершенные коды и все более быстрые алгоритмы их расчета. И никто не спешит делиться своими секретами.
Как итог — мы видим прошивку. Часто мы видим как страница разбита на подстраницы. Мы видим где находятся коды ЕСС подстраниц. Но не знаем, каким алгоритмом они рассчитаны, и поэтому не можем их использовать для исправления ошибок .
Для тех, кого посетит мысль о том, что взломать алгоритм ECC не сложно, хочу напомнить, что для шифрования данных и расчета кодов исправления ошибок используется идентичный математический аппарат.
6. Коварство NAND. Магия ЕСС есть, но она не работает. Что делать?
Очень часто нам приходится слышать один и тот же вопрос: "Что делать, если NAND всегда читается с огромным количеством ошибок? Как прочитать без ошибок?"
Проблема может быть успешно преодолена, если вы нам скажете, какой алгоритм ЕСС использует ваше устройство. В этом случае мы сделаем расчет ЕСС по вашему алгоритму и у вас всё будет работать без ошибок при чтении NAND для этого устройства.
Вы не знаете алгоритм? Тогда есть только один способ: толерантность к ошибкам (и этот способ успешно работает).
Просто читаете микросхему. Она будет считана с ошибками. При верификации требуется задать допустимое количество ошибок на страницу микросхемы. (Для всех вновь добавленных микросхем значение по умолчанию уже задано. Если не задано – нужно смотреть документацию или просить нас, чтобы мы внесли данные ЕСС в базу).
Программа будет сверять микросхему и подсчитывать количество ошибок. Если количество ошибок не превысит заданное значение — значит всё в порядке. Ошибка сравнения не будет выдана, вы просто будете проинформированы о количестве "исправимых" ошибок.
Но не все так однозначно.
Вот небольшая задачка:
Допустим, микросхема записывается всегда правильно, а все ошибки возникают только при чтении (чаше всего, это именно так). Предположим при каждом чтении каждой страницы всегда возникает ровно 3 ошибки при допустимых для данной микросхемы 4-х ошибках.
Понятно, что пример несколько искусственный, но на нём проще объяснить.
Случай 1:Запись эталона в NAND
Мы записали в микросхему эталонную (точно не содержащую ошибок) прошивку. При верификации получаем 3 ошибки на страницу. Программа предупреждает об исправимых ошибках, но верификация проходит успешно.
Рисунок 1.
Если вы эту микросхему NAND поставите в ваш прибор, он исправно заработает, поскольку встроенный в прибор алгоритм ЕСС обязан(!) исправлять не менее 4-х ошибок на страницу (это паспортные характеристики данной NAND и прибор просто обязан справляться с таким количеством ошибок).
Случай 2:Чтение микросхемы NAND
Мы считали прошивку из исправной микросхемы, стоящей в приборе (напомню, мы получаем по 3 ошибки на страницу). Далее мы еще раз считывали прошивку. Мы опять получили 3 ошибки на страницу.
Рисунок 2.
Но ошибки не возникают в одних и тех же местах! При сравнении результатов 1-го и 2-го считывания может получиться до 6-ти ошибок на страницу. Это превысит допустимые 4 для данной микросхемы, но это вовсе не означает, что микросхема неисправна!
Случай 3:Копирование микросхемы NAND
Мы считали прошивку из исправной микросхемы, стоящей в приборе (получая по 3 ошибки на страницу). Далее записали полученную прошивку в чистую микросхему.
Рисунок 3.
При верификации получим по 3 ошибки на страницу. Это вроде бы меньше 4-х. Но заработает ли прибор? Не факт. Всего ошибок может быть до 6-ти на страницу (3 при считывании образца плюс 3 при работе микросхемы в приборе), но ЕСС прибора исправит только 4.
На самом деле, в реальной жизни, количество ошибок по страницам в микросхемах сильно колеблется. В новых микросхемах количество ошибок не превышает одной-двух, да и то не на каждой странице. Заявленное число ошибок (в нашем примере 4) это уже в сильно изношенной микросхеме. Беда только в том, что в ремонт с формулировкой "слетела прошивка" именно такие приборы и попадают.
9. "Я все прочитал и ничего не понял.
Вы сможете наконец что-то сделать, чтобы NAND читались "нормально"?"
Мы над этим работаем. До сих пор мы не оставляем надежды на создание способа автоматического восстановления алгоритма ЕСС (хакинга) только на основании анализа прошивки.
Понятно, что для всех случаев его создать никогда не удастся, но если нам удастся восстановить алгоритм ЕСС хотя бы в четверти случаев, мы будем просто счастливы.
Что для этого нужно? Присылайте нам свои считанные прошивки. Присылайте нам как можно больше считанных прошивок. Я знаю, что они для вас представляют ценность, но мы не собираемся их распространять или использовать как-то кроме их анализа на предмет ЕСС и таблиц плохих блоков. Если вы опасаетесь, можно скрывать название системы, в которой прошивка используется.
Всё что нас интересует — это название микросхемы, из которой прошивка считана. Для лучшей защиты своих интересов вы можете прислать прошивку не полностью. Если вы опасаетесь — не присылайте. Это только просьба.
Еще очень желательно знать марку контроллера NAND, используемого в системе или марку центрального процессора, то есть название микросхемы, к которой NAND подключена.
Собрав достаточную базу прошивок, я надеюсь, нам удастся "хакнуть" ЕСС и сильно облегчить вам работу с NAND.
Только совместными усилиями мы сможем добиться значительных результатов в работе!
4.92 (13)
Вы можете оценить статью
7. Практический совет по выбору порога ошибок.
Можно порекомендовать простой алгоритм выбора количества допустимых ошибок при верификации (настройка порога толерантности):
Случай 1. Очень оптимистичный. У вас есть эталонная прошивка и она точно без ошибок.
Такую прошивку можно писать и верифицировать с порогом ошибок, заданным в документации на микросхему (во всех наших примерах – это 4).
Случай 2. Реальный. У вас нет эталонной прошивки.
Вы считываете прошивку из микросхемы. Чтобы ее можно было уверенно использовать, количество ошибок на страницу не должно превышать половины лимита (т.е. для нашего примера — это 2 ошибки). Далее вы пишете эту прошивку в микросхему. При верификации записанной микросхемы ошибок тоже не должно быть более 2-х.
Рисунок 4.
Чем больше вы ошибок получаете при считывании эталона и верификации записи, тем меньше вероятность того, что алгоритм ЕСС справится с исправлением ошибок и прибор заработает. Здесь уже как повезет. :)
Читайте также: