Можно ли увеличить размер логического блока стирания устройства MTD?

Минимальный размер блока стирания для jffs2 (mtd-utils версия 1.5.0, mkfs.jffs2 версия 1.60), кажется, 8 КБ:

Erase size 0x1000 too small. Increasing to 8KiB minimum

Однако я использую Linux 3.10 с at25df321a,

m25p80 spi32766.0: at25df321a (4096 Kbytes),

и размер стираемого блока составляет всего 4 КБ:

mtd5
Name:                           spi32766.0
Type:                           nor
Eraseblock size:                4096 bytes, 4.0 KiB
Amount of eraseblocks:          1024 (4194304 bytes, 4.0 MiB)
Minimum input/output unit size: 1 byte
Sub-page size:                  1 byte
Character device major/minor:   90:10
Bad blocks are allowed:         false
Device is writable:             true

Есть ли способ заставить систему mtd рассматривать несколько блоков стирания как один? Может быть, какой-нибудь ioctl или параметр модуля?

Если я прошиваю изображение jffs2 с большим размером стираемого блока, я получаю множество сообщений об ошибках ядра, отсутствующих файлах и иногда испытываю панику.

обходной путь

я нашел это flasherase --jffs2 в результате получается работающая файловая система, несмотря на размер стираемого блока 4 КБ. Поэтому я взломал mkfs.jfss2.c файл и полученное изображение, кажется, работают нормально. Я дам ему некоторое тестирование.

diff -rupN orig/mkfs.jffs2.c new/mkfs.jffs2.c
--- orig/mkfs.jffs2.c   2014-10-20 15:43:31.751696500 +0200
+++ new/mkfs.jffs2.c    2014-10-20 15:43:12.623431400 +0200
@@ -1659,11 +1659,11 @@ int main(int argc, char **argv)
                                                  }
                                                  erase_block_size *= units;

-                                                 /* If it's less than 8KiB, they're not allowed */
-                                                 if (erase_block_size < 0x2000) {
-                                                         fprintf(stderr, "Erase size 0x%x too small. Increasing to 8KiB minimum\n",
+                                                 /* If it's less than 4KiB, they're not allowed */
+                                                 if (erase_block_size < 0x1000) {
+                                                         fprintf(stderr, "Erase size 0x%x too small. Increasing to 4KiB minimum\n",
                                                                          erase_block_size);
-                                                         erase_block_size = 0x2000;
+                                                         erase_block_size = 0x1000;
                                                  }
                                                  break;
                                          }

1 ответ

http://lists.infradead.org/pipermail/linux-mtd/2010-September/031876.html

JFFS2 должен иметь возможность разместить хотя бы один узел для стирания. Максимальный размер узла составляет 4 КБ + несколько байтов. Вот почему минимальный размер стираемых блоков составляет 8 КБ.

Но на практике даже 8 КБ - это плохо, потому что вы теряете много места в конце eraseblocks.

Вы должны объединить несколько erasblock в один виртуальный eraseblock объемом 64 или 128 КиБ и использовать его - это будет более оптимальным.

Некоторые драйверы уже реализовали это. Я знаю о

MTD_SPI_NOR_USE_4K_SECTORS

Вариант конфигурации Linux. Он должен быть установлен в "n", чтобы включить большие сектора стирания размером 0x00010000.

Другие вопросы по тегам