Вопрос или проблема
Я пытаюсь смонтировать 1[МБ] флэш-памяти как файловую систему JFFS2 в среде openwrt, используя 128[МБ] NAND-флэш (ECC 4 бита).
Я использую следующую последовательность –
flash_eraseall -j dev/mtd6
mount -t jffs2 -o noatime /dev/mtdblock6 /ИМЯ_КАТАЛОГА_МОНТА
После выполнения этой последовательности, кажется, что монтирование завершено, и я могу получать доступ, читать и записывать
в смонтированную область.
Проблема начинается, когда я перезагружаю систему, во время загрузки появляется следующее сообщение:
jffs2: mtd->read(0x800 bytes from 0x60000) вернул ошибку ECC
jffs2: уведомление: (667) read_dnode: неверная контрольная сумма данных в узле данных на 0x00060000: прочитано 0xf7a2ee2c, рассчитано 0x2f2a8b04
Я также попробовал создать файл nvm.jffs2 с помощью mkfs.jffs2 и записать его на запрашиваемый раздел – но проблема все еще возникла.
Я буду признателен за любые идеи или мысли.
Спасибо всем заранее!
Проблема возникла из-за clearmarker.
Во время монтирования clearmarker был установлен в начале блока.
Однако, когда происходила запись в блок, oob-данные добавлялись в конце блока
и поэтому не содержали clearmarker, что в свою очередь привело к неверному отчету о контрольной сумме CRC.
Быстрое решение заключается в том, чтобы записать clearmarker в каждый флэш-блок один раз во время загрузки, а затем clearmarker
будет добавлен к нему, и все будет работать хорошо.
Ответ или решение
Проблема, с которой вы столкнулись при работе с файловой системой JFFS2 на OpenWRT, действительно может быть связана с корректным управлением маркерами очистки (clearmarker) в использовании с NAND-флеш-памятью.
Ваша последовательность команд для форматирования и монтирования JFFS2 выглядит правильно, но сообщение об ошибке, связанное с верностью данных CRC, указывает на то, что не было корректной обработки маркеров очистки.
Рекомендации по решению проблемы:
-
Подготовка заранее Clearmarker:
Перед тем как писать данные в JFFS2, убедитесь, что все блоки памяти содержат маркер очистки. Вы можете сделать это, написав маркер очистки в каждый блок после загрузки системы и перед монтированием файловой системы.Например, добавьте следующую команду в скрипт инициализации, который выполняется после запуска системы:
# Сначала проверьте, существует ли файловая система JFFS2 if [ ! -e /dev/mtdblock6 ]; then echo "MTD device does not exist." exit 1 fi # Запись clearmarker в каждый блок for i in {0..3}; do # Каждый блок имеет размер 128KiB (или 0x20000 байт), корректируйте при необходимости echo "Writing clearmarker to block $i" dd if=/dev/zero of=/dev/mtdblock6 seek=$((i * 0x20000)) bs=1 count=0 flash_erase /dev/mtd6 $((i * 0x20000)) 0x20000 done # Теперь монтируем JFFS2 mount -t jffs2 -o noatime /dev/mtdblock6 /NAME_OF_MOUNT
-
Убедитесь, что ваш код не игнорирует OOB данные:
Проблемы с ECC ошибками могут также возникать из-за неверного управления out-of-band (OOB) данными NAND флеш-памяти. Проверьте настройки вашего NAND-диска и убедитесь, что OOB данные правильно обрабатываются. -
Разделение и использование mtd partitions:
Убедитесь, что пространство между и другими разделами корректно задано и что JFFS2 не пересекается с другими файловыми системами на вашей NAND-флэш. -
Используйте правильную версию u-boot:
Убедитесь, что используемая вами версия bootloader поддерживает правильный подход к данному устройству и управлению NAND. -
Тестируйте на различных уровнях очистки:
Если вы продолжаете видеть ошибки, возможно, стоит протестировать комбинации команд flash_erase и mount, чтобы убедиться, что никакие данные не остались за пределами ваших ожиданий.
Применяя вышеуказанные рекомендации, вы сможете устранить проблему с ошибками JFFS2 и ECC. Удачи в ваших усилиях!