Samsung NAND flash K9F4G08U0M Copy Back Routine. Где должно лежать ECC ? Я использую Samsung NAND flash K9F4G08U0M (512MB=4096 Blocks x 64 Pages x (2048+64) байт) для хранения данных.
Реализую сейчас на ней Bad Block Management.
Для этого хотелось бы использовать команды 00h-35h-85h-10h (Copy Back Program) для того чтобы не использовать ОЗУ при замене блока, и потом 7Bh (Read EDC Status).
Насколько я понял из описания при выполнении команд 00h-35h (Read for Copy Back) флешка автоматически обнаруживает ошибки, и если испорчен только 1 бит из 528 байт, автоматически исправляет эту ошибку.
Но в даташите не написано, где именно в Spare Area должно лежать ECC, и как оно должно вычисляться.
На сайте Samsunga я нашел NAND Flash Spare Area Assignment Standard (http://www.samsung …ssignment_standard.pdf) и ECC Sample Source Code for 512 Byte (http://www.samsung …or_512byte_256word.txt).
Проверил, что использование этих самунговских процедур, действительно позволяет исправлять одиночные ошибки. Но эти процедуры не говорят, где должно лежать ECC.
Я расположил 4 ECC по адресам 8,24,40,56 в Spare Area, как и указано в NAND Flash Spare Area Assignment Standard. Всю остальную часть Spare забиваю FFh. Но при этом команда Copy Back не исправляет одиночную ошибку. В команде Read EDC status бит 2 всегда равен 0. Т.е. Validity of EDC status Invalid.
Что я делаю не так? Может быть ECC надо не там располагать? Или ее надо по другому считать? Или может быть остальную часть Spare Area надо не FFh забивать, а располагать там LSN (логические номера секторов - я их не использую) и для них свое ECC ?
Файловые системы типа UFFS не предлагать, так как они кушают много ОЗУ, а у меня всего 8КБ. У меня ATXmega128A1.
Ранее я уже реализовывал подобную систему на ATmega128 с 4КБ ОЗУ и K9F1208U0M (64MB=4096 Blocks x 32 Pages x (512+16) байт), но эта флешка не поддерживала Copy Back, поэтому таких вопросов не возникало.