LINUX.ORG.RU
решено ФорумAdmin

создание ubifs в buildroot

 , , , ,


0

1

В общем, вопрос к знающим толк во встраиваемом оборудование, конкретно к знатокам ubi и ubifs, есть 2 stm32 платы, на них установлена разная nand память MT29F2G08ABAEAWP собирается в билдруте и работает, вот даташит: https://ru.mouser.com/datasheet/2/671/micron_technology_mict-s-a0001032698-1-1759218.pdf

при сборке ubifs используются следующие параметры:

(0x20000) physical eraseblock size
(2048) sub-page size
(0x1f000) logical eraseblock size
(0x800) minimum I/O unit size
(2048) maximum logical eraseblock count

образ ubifs работает нормально

на другом контроллере используется nand память MT29F2G08ABAGAWP, вот даташит: https://datasheetspdf.com/pdf-file/1301571/Micron/MT29F2G08ABAGAWP-ITG/1

разница только в OOB size, в первой 64б, во второй 128б

ubifs собирается в билдруте с теме же параметрами, но получаю следующую ошибку:

ubi0 warning: ubi_io_read: error -74 (ECC error) while reading 64 bytes from PEB 0:0, read only 64 bytes, retry

эта ошибка повторяется большое количество раз и в конце выходит вот такая:

ubi0 warning: ubi_io_read: error -74 (ECC error) while reading 22528 bytes from PEB 589:4096, read only 22528 bytes, retry
...
ubi0 error: vtbl_check: bad CRC at record 2: 0xf116c36b, not 0x000000
[  264.616664] Volume table record 2 dump:
[  264.621243] 	reserved_pebs   0
[  264.624514] 	alignment       0
[  264.628059] 	data_pad        0
[  264.631616] 	vol_type        0
[  264.635160] 	upd_marker      0
[  264.638687] 	name_len        0
[  264.642236] 	name            NULL
[  264.646110] ubi0 error: vtbl_check: bad CRC at record 2: 0xf116c36b, not 0x000000
ubi0 error: ubi_read_volume_table: both volume tables are corrupted
...
Please append a correct "root=" boot option; here are the available partitions:
[  264.776973] 1f00            3072 mtdblock0 
[  264.777435]  (driver?)
[  264.784645] 1f01             512 mtdblock1 
[  264.784744]  (driver?)
[  264.791942] 1f02             512 mtdblock2 
[  264.792042]  (driver?)
[  264.799501] 1f03            8192 mtdblock3 
[  264.799609]  (driver?)
[  264.807086] 1f04             512 mtdblock4 
[  264.807186]  (driver?)
[  264.814629] 1f05            8192 mtdblock5 
[  264.814733]  (driver?)
[  264.822171] 1f06          122880 mtdblock6 
[  264.822274]  (driver?)
[  264.829710] 1f07          118272 mtdblock7 
[  264.829812]  (driver?)

в общем, не знаю, куда смотреть, вроде параметры для ubifs должны совпадать, однако на одной памяти нормально грузится, на другой, вообще, судя по всему, непонятно что читает или вообще ничего не читает, судя по этому сообщению: ubi0 error: vtbl_check: bad CRC at record 2: 0xf116c36b, not 0x000000 подскажите, какие параметры в билдруте выставлять, читал вот это: http://www.linux-mtd.infradead.org/doc/ubi.html

вроде параметры правильно рассчитаны

★★★

А на втором NAND точно тот же размер страниц? Я глянул даташиты, и у меня возникли сомнения.

Так же пишут, что OOB обычно кратен размеру страницы 1/32

The OOB is traditionally 1/32 of the size of the In-Band area, although some modern NANDs require a larger OOB. It is used for Error Correcting Code (ECC) and metadata.

Может попробуешь добавить размер для второго чипа?

И, да, конечно не помешало бы ещё проверить сырые запись/чтение/сравнение, чтобы убедиться в целости памяти.

bad CRC at record 2: 0xf116c36b, not 0x000000

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

apt_install_lrzsz ()
Ответ на: комментарий от splinter

конфиг ядра

https://pastebin.com/51shCSHk

дтс большой, я его сгенерировал из блоба, который взял из готовой прошивки

https://pastebin.com/rCZ1SMdw

дтс для imx28

IvanR ★★★ ()
Последнее исправление: IvanR (всего исправлений: 1)
Ответ на: комментарий от IvanR

При присоединении (attach) раздела UBI в журнал ядра должны выводится параметры раздела. Смотри в консоли или dmesg сразу после «ubiX: attaching mtdY». Эти значения должны использоваться при создании образа UBI. Сравни на двух платах, чем они отличаются, и что используется при создании образа.

anonymous ()
Ответ на: комментарий от anonymous

на заводской прошивке, PEB, LEB и page size и I/O unit size совпадают

UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size:   131072 bytes (128 KiB)
UBI: logical eraseblock size:    126976 bytes
UBI: smallest flash I/O unit:    2048
UBI: VID header offset:          2048 (aligned 2048)
UBI: data offset:                4096
UBI: attached mtd1 to ubi0
UBI: MTD device name:            "gpmi-nfc-general-use"
UBI: MTD device size:            236 MiB
UBI: number of good PEBs:        1888
UBI: number of bad PEBs:         0
UBI: max. allowed volumes:       128
UBI: wear-leveling threshold:    4096
UBI: number of internal volumes: 1
UBI: number of user volumes:     1
UBI: available PEBs:             0
UBI: total number of reserved PEBs: 1888
UBI: number of PEBs reserved for bad PEB handling: 18
UBI: max/mean erase counter: 1/0
UBI: image sequence number: 1206036082
UBI: background thread "ubi_bgt0d" started, PID 644
IvanR ★★★ ()
Ответ на: комментарий от anonymous

в общем, загрузился с nfs, вополнил следующие команды:

# ubiformat /dev/mtd6
# ubiattach -p /dev/mtd6
# ubimkvol /dev/ubi0 -N filesystem -s 50MiB
# ubiupdatevol /dev/ubi0_0 /rootfs.ubifs
# mount -t ubifs ubi0:filesystem /mnt

ниодной ошибки, вывод, проблема, видимо, в том, как u-boot прошивает nand, обновить u-boot и проблема будет решена.

IvanR ★★★ ()
Ответ на: комментарий от splinter

отключил ecc в ядре и в uboot, отключал так в uboot

sed -i 's/nand->ecc.mode = .*/nand->ecc.mode = NAND_ECC_NONE;/g' $(find . -type f -exec egrep -l '.*nand->ecc.mode =.*' {} \;)

в ядре

static enum nand_ecc_engine_type
of_get_rawnand_ecc_engine_type_legacy(struct device_node *np)
{
        enum nand_ecc_legacy_mode {
                NAND_ECC_INVALID,
                NAND_ECC_NONE,
                NAND_ECC_SOFT,
                NAND_ECC_SOFT_BCH,
                NAND_ECC_HW, 
                NAND_ECC_HW_SYNDROME,
                NAND_ECC_ON_DIE,
        };
        const char * const nand_ecc_legacy_modes[] = {
                [NAND_ECC_NONE]         = "none",
                [NAND_ECC_SOFT]         = "soft",
                [NAND_ECC_SOFT_BCH]     = "soft_bch",
                [NAND_ECC_HW]           = "hw",
                [NAND_ECC_HW_SYNDROME]  = "hw_syndrome",
                [NAND_ECC_ON_DIE]       = "on-die",
        };
        enum nand_ecc_legacy_mode eng_type;
        const char *pm;
        int err;

        err = of_property_read_string(np, "nand-ecc-mode", &pm);
        pr_emerg("!!!!!!!!!!!!err is %d, properti is: %s\n", err, pm);
        if (err)
                return NAND_ECC_ENGINE_TYPE_NONE;
                /*return NAND_ECC_ENGINE_TYPE_INVALID;*/

        printk(KERN_EMERG "properties is: %s\n", pm);
        for (eng_type = NAND_ECC_NONE;
             eng_type < ARRAY_SIZE(nand_ecc_legacy_modes); eng_type++) {
                if (!strcasecmp(pm, nand_ecc_legacy_modes[eng_type])) {
                        switch (eng_type) {
                        case NAND_ECC_NONE:
                                return NAND_ECC_ENGINE_TYPE_NONE;
                        case NAND_ECC_SOFT:
                        case NAND_ECC_SOFT_BCH:
                                return NAND_ECC_ENGINE_TYPE_SOFT;
                        case NAND_ECC_HW:
                        case NAND_ECC_HW_SYNDROME:
                                return NAND_ECC_ENGINE_TYPE_ON_HOST;
                        case NAND_ECC_ON_DIE:
                                return NAND_ECC_ENGINE_TYPE_ON_DIE;
                        default:
                                break;
                        }
                }
        }

добавил отладочных сообщений, печатет, что properties none, до того, как добавил в dts nand-ecc-mode = "none"; печатало, что err is %d, properti is: %s\n", в общем, не none было

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

IvanR ★★★ ()
Ответ на: комментарий от Harald

есть подозрение, что загрузчик вообще не умеет работать с этой nand, обновил загрузчик до последней версии и все равно пишет, что OOB Size 64, вроде отключил ecc checking и в ядре и в uboot, не помогло, не уверен, что отключил правильно, по поводу dts, спасибо за идею, на модуле установлена функционирующая ос, попробую dts оттуда выдрать

IvanR ★★★ ()
Ответ на: комментарий от Harald

если грузить плату с nfs, то под ядром nand нормально прошивается и после перезагрузки нормально монтируется. кто-то из 2-х работает не правильно, в dts отключил проверку ecc и в uboot вроде отключил, ошибка не пропала

IvanR ★★★ ()
Ответ на: комментарий от Harald

заработало !!!

diff -Naur uboot-2017.11_orig/drivers/mtd/nand/nand_base.c uboot-2017.11/drivers/mtd/nand/nand_base.c
--- uboot-2017.11_orig/drivers/mtd/nand/nand_base.c	2021-08-05 17:50:55.136923003 +0300
+++ uboot-2017.11/drivers/mtd/nand/nand_base.c	2021-08-06 14:10:22.395612680 +0300
@@ -3440,7 +3440,7 @@
 			mtd->oobsize = 448;
 			break;
 		case 3:
-			mtd->oobsize = 64;
+			mtd->oobsize = 128;
 			break;
 		case 4:
 			mtd->oobsize = 32;
@@ -3467,8 +3467,7 @@
 		mtd->writesize = 1024 << (extid & 0x03);
 		extid >>= 2;
 		/* Calc oobsize */
-		mtd->oobsize = (8 << (extid & 0x01)) *
-			(mtd->writesize >> 9);
+		mtd->oobsize = 128;
 		extid >>= 2;
 		/* Calc blocksize. Blocksize is multiples of 64KiB */
 		mtd->erasesize = (64 * 1024) << (extid & 0x03);
@@ -3488,7 +3487,7 @@
 				nand_is_slc(chip) &&
 				(id_data[5] & 0x7) == 0x6 /* 24nm */ &&
 				!(id_data[4] & 0x80) /* !BENAND */) {
-			mtd->oobsize = 32 * mtd->writesize >> 9;
+			mtd->oobsize = 128;
 		}
 
 	}

не красиво, но чтобы сделать красиво, нужна документация по памяти, а ее у меня нет

IvanR ★★★ ()
Последнее исправление: IvanR (всего исправлений: 1)
Ответ на: комментарий от Harald

проблема решается одной строчкой

diff -Naur '--exclude=*.swp' uboot-2017.11_orig/include/configs/mx28evk.h uboot-2017.11/include/configs/mx28evk.h
--- uboot-2017.11_orig/include/configs/mx28evk.h        2021-08-05 17:50:55.188923037 +0300
+++ uboot-2017.11/include/configs/mx28evk.h     2021-08-11 17:30:03.768568293 +0300
@@ -12,6 +12,8 @@
 #define __CONFIGS_MX28EVK_H__

 /* System configurations */
+/*#define CONFIG_POST*/
+#define CONFIG_SYS_NAND_ONFI_DETECTION
 #define CONFIG_MX28                            /* i.MX28 SoC */
 #define CONFIG_MACH_TYPE       MACH_TYPE_MX28EVK

IvanR ★★★ ()