среда, 3 октября 2012 г.

NAND FLASH, UBIFS и с чем это едят

UBIFS это новая файловая система для NAND и NOR носителей. 
Подробней она описана здесь.

Что бы протестировать возможности сей прекрасной ФС нужно:
 - включить поддержку оной в ядре (Device Drivers -> 
Memory Technology Device (MTD) Supportas -> Enable UBI - Unsorted block images )
( File Systems -> Miscellaneous filesystemsas -> UBIFS file system support)
 - скачать снимок mtd-utils с git (здесь) и собрать из исходников
Для компиляции mtd-utils потребуются пакеты: libacl-devel и zlib-devel, 
а так же библиотеки zlib, lzo и uuid.

Для Ubuntu: sudo apt-get install libacl1-dev zlib1g-dev liblzo2-dev uuid-dev

Но прежде чем мы сможем воспользоватся всеми преимуществами данной файловой
системы, нужно внести некоторые изменения в исходники ядра. На плате которую  я использую для экспериментов (BeagleBone Rev.A3) нет распаяной NAND flash, потому мы ее подключим. Рассказ о подключение не столь интересен, но нам нужно поправить загрузочную конфигурацию ядра, вся нужна информация расположенна в файле 
/linux-3.2.0-patched/arch/arm/mach-omap2/board-am335xevm.c:

/* Make some additions to configs */
/* Beaglebone Rev A3 and after */
static struct evm_dev_cfg beaglebone_dev_cfg[] = {
 {tps65217_init, DEV_ON_BASEBOARD, PROFILE_NONE},
 {mii1_init, DEV_ON_BASEBOARD, PROFILE_NONE},
 {usb0_init, DEV_ON_BASEBOARD, PROFILE_NONE},
 {usb1_init, DEV_ON_BASEBOARD, PROFILE_NONE},
 {mmc0_init, DEV_ON_BASEBOARD, PROFILE_NONE},
 {i2c2_init, DEV_ON_BASEBOARD, PROFILE_NONE},
 {ehrpwm_init,   DEV_ON_BASEBOARD, PROFILE_NONE},
 {uart1_init,    DEV_ON_BASEBOARD, PROFILE_NONE},
 {gpio_led_init, DEV_ON_BASEBOARD, PROFILE_NONE},
 {evm_nand_init, DEV_ON_BASEBOARD, PROFILE_NONE},
 {NULL, 0, 0},
};

Тут diff файл, а тут про подключение nand flash к beaglebone.
как видно тут в список инициализации добавлена nand(а так же UART1, ehrpwm), причем сменился ее тип.
Кстати nand flash в отличии от блочных устройств имеет софтварное разбиение на разделы и эти разделы захардкорженны в этом же файле:

/* NAND partition information */
static struct mtd_partition am335x_nand_partitions[] = {
  /* All the partition sizes are listed in terms of NAND block size */
  {
    .name           = "SPL",
    .offset         = 0, /* Offset = 0x0 */
    .size           = SZ_128K,
  },
  {
    .name           = "SPL.backup1",
    .offset         = MTDPART_OFS_APPEND, /* Offset = 0x20000 */
    .size           = SZ_128K,
  },
  {
    .name           = "SPL.backup2",
    .offset         = MTDPART_OFS_APPEND, /* Offset = 0x40000 */
    .size           = SZ_128K,
  },
  {
    .name           = "SPL.backup3",
    .offset         = MTDPART_OFS_APPEND, /* Offset = 0x60000 */
    .size           = SZ_128K,
  },
  {
    .name           = "U-Boot",
    .offset         = MTDPART_OFS_APPEND, /* Offset = 0x80000 */
    .size           = 15 * SZ_128K,
  },
  {
    .name           = "U-Boot Env",
    .offset         = MTDPART_OFS_APPEND, /* Offset = 0x260000 */
    .size           = 1 * SZ_128K,
  },
  {
    .name           = "Kernel",
    .offset         = MTDPART_OFS_APPEND, /* Offset = 0x280000 */
    .size           = 40 * SZ_128K,
  },
  {
    .name           = "File System",
    .offset         = MTDPART_OFS_APPEND, /* Offset = 0x780000 */
    .size           = MTDPART_SIZ_FULL,
  },
};

Ну и на закуску, два различных способа "залить" информацию во флеш описанны здесь.

Комментариев нет:

Отправить комментарий