Jump to content

    
Sign in to follow this  
ZAA

Вопрос про nandflash и UBIFS

Recommended Posts

Партишны для нанд-флеша задаются в специфичном для вашей платы файле. В виде такой вот структуры

static struct mtd_partition __initdata ek_nand_partition[] = {
        {
                .name   = "Linux Kernel",
                .offset = 0,
                .size   = SZ_16M,
        },
        {
                .name   = "Root FS",
                .offset = MTDPART_OFS_NXTBLK,
                .size   = 120 * SZ_1M,
        },
        {
                .name   = "FS",
                .offset = MTDPART_OFS_NXTBLK,
                .size   = 120 * SZ_1M,
        }
};

Это я привел код из презентации http://free-electrons.com/doc/flash-filesystems.odp

 

Загрузиться с другого носителя и создать файловую систему можно. Еще можно сделать минимальный образ рам-диска. Но проще загрузиться с усб-флешки (например) и сделать все операции оттуда. Потом просто поменять root= в строке ядра и все.

 

Теоретиески с ubifs умеет работать u-boot.

Share this post


Link to post
Share on other sites

Я на своих железках делаю именно так, как сказал Dron_Gus, управляя загрузкой параметрами среды U-boot:

- гружусь с usb-флэшки, естесственно указывая set bootargs root=/dev/sda1 rootwait ro и предварительно загрузив ядров ОЗУ

- у меня ubifs разбит на mtd1 и mtd2, один для ядра, второй для rootfs

- после загрузки с usb-флэшки делаю flashcp -v /uImage /dev/mtd1 , чтобы зашить ядро в mtd1

- для продключения раздела встроенной флэш выполняю ubiattach /dev/ubi_ctrl -m 2

- создаю том ubimkvol /dev/ubi0 -m -N rootfs

- монтирую mount -t ubifs ubi:rootfs /mnt/root

- потом копирую в смонтированное место все, что требуется

- перегружаюсь и меняю параметры окружения u-boot set bootargs ubi.mtd=2 root=ubi:rootfs rootfstype=ubifs

 

Что у Вас не получилось с ubiattach?

Share this post


Link to post
Share on other sites
one_man_show, раз уж защел разговор в это русло. Небольшой оффтоп вопрос к Вам. Я особо с у-бутом не разбирался, но может можно сделать, чтобы у-бут автоматом грузился с флешки (или ммс-карты), если она присутствует. В противном случае - nand. Очень удобно было бы для апдейста системы.

Share this post


Link to post
Share on other sites

Насколько я понимаю, u-boot производит некоторую настройку оборудования. bootstrap (в 9260) очень маленький и инициализирует только память, не инициализируя SPI и другое. Поэтому не понятно, кто и как должен инициализировать эту периферию и передавать управление и загружать с флэш или mmc-карты u-boot.

Share this post


Link to post
Share on other sites

Не тосно выразился. Имел ввиду, что у-бут то один. Просто он, при наличии усб-флешки грузит ядро с нее и передает соответственно одну строку ядру. А при отсутствии - грузит ядро из нанда и передает соответственно другую строку.

Share this post


Link to post
Share on other sites

Спасибо всем большое за советы и ответы)) Похоже наметились позитивные сдвиги.

ДЕлаю так:

1) Разрешаю в ядре опцию Command line partition table parcing, чтобы можно было делить nandflash на разделы с помощью параметров, передаваемых ядру.

2) Записываю в nandflash по адресу 0x400000 образ файловой системы jffs2. Загружаюсь, передав ядру следующие параметры:

set bootargs 'console=ttyS0,115200 mtdparts=atmel_nand:4096k(MyRootfs),40960k(Ubifs) root=/dev/mtdblock1 rw rootfstype=jffs2'

где MyRootfs - это раздел, куда записан мой образ файловой системы, Ubifs - раздел, который я отвожу под будущую систему ubifs.

 

3) Загружаюсь в свою файловую систему. Чтобы убедиться в правильности создания разделов:

cat /proc/mtd                                              
dev:    size   erasesize  name                                                   
mtd0: 00400000 00020000 "MyRootfs"                                               
mtd1: 02800000 00020000 "Ubifs"                                                  
mtd2: 00840000 00000420 "spi0.0-AT45DB642x"

Таким образом, продолжать работать будем с /dev/mtd1.

 

4)Указываем путь до ubi-utils, скомпилированных под ARM и скопированных на флешку:

export PATH=/media/sda1/home/root/ubi-utils

 

5)Далее следующая последовательность действий:

Форматируем нужный раздел под ubifs

ubiformat /dev/mtd1
ubiattach /dev/ubi_ctrl -m 1

Создаем том на отформатированном разделе

ubimkvol /dev/ubi0 --name=rootfs -m

Эти данные (ubi0 и rootfs мы потом будем использовать для указания ядру, откуда монтировать файловую систему)

Монтируем наш раздел на /mnt/ubifs

mount -t ubifs ubi0:rootfs /mnt/ubifs/

Заходим в папку /mnt/ubifs и распаковываем туда за'tar'енный архив файловой системы, предварительно созданный на ПК и скопированный на флешку

cd /mnt/ubifs
tar xvf /media/sda1/home/root/myfs.rootfs.tar

 

6) Перезагружаемся и передаем ядру новые параметры:

set bootargs 'console=ttyS0,115200 mtdparts=atmel_nand:4096k(MyRootfs),40960k(Ubifs) ubi.mtd=1 root=ubi0:rootfs rootfstype=ubifs rw'

 

Пока исследования остановились на этом...KErnel Panic уже нет, что очень радует))) В понедельник продолжу)

Share this post


Link to post
Share on other sites

ZAA, где продолжение? У Вас получилось классное развернутое описание шагов.

 

Dron_Gus, сам был бы раз запустить u-boot в озу, чтобы он оттуда смог загрузить ядро. Сейчас столкнулся с тем, что на плате флэш с доп.защитой, для которой нет описания, но известно, что линуксовая утилита flashcp умеет с такими работать. А начальный загрузчик не изменишь, так как неизвестны параметры флэш.

Share this post


Link to post
Share on other sites
ZAA, где продолжение? У Вас получилось классное развернутое описание шагов.

 

Прошу прощения, сегодня вечером отпишусь обязательно. Возникли другие неотложные дела)))

Share this post


Link to post
Share on other sites

1.Записываем в Dataflash файл образа первичного загрузчика Bootstrap, скомпилированного для загрузки из dataflash по адресу 0x00000000.

2.Записываем в Dataflash файл образа вторичного загрузчика U-Boot по адресу 0x00008400.

3.Записываем в Dataflash файл образа ядра linux по адресу 0x00042000.

4.Во вкладке sam-ba выбираем nandflash и выполняем скрипты Enable Nandflash->EraseAll.

5.На съемном носителе (flash-карта памяти) создаем файловую систему из собранного с помощью Openembedded образа:

cd /media/disk

tar -xvf Angstrom-x11-gpe-image-glibc-ipk-2009.X-stable-at91sam9263ek.rootfs.tar

6.Включаем питание платы. Устанавливаем значение переменной окружения U-Boot:

set bootargs 'console=ttyS0,115200 root=/dev/sda1 rw rootdelay=10 mtdparts=atmel_nand:2048k(Unused), 2048k(Kernel),-(rootfs)'

где root=/dev/sda1 — указание ядру, откуда монтировать файловую систему;

mtdparts=atmel_nand:2048k(Unused),2048k(Kernel),-(rootfs) — это указание ядру создать на устройстве atmel_nand три раздела со следующими названиями — Unused (неиспользуемое пространство на nandflash от адреса 0х00000000 до адреса 0х00200000), Kernel (пространство на nandflash, отведенное для ядра, начинающееся с адреса 0x00200000, заканчивающееся адресом 0х00400000), rootfs (все оставшееся пространство, начинающееся адресом 0х00400000).

7.Загружаемся, передав U-Boot команду boot.

8.Зайдя в систему под логином root, начинаем создание файловой системы UBIFS.

9.Чтобы убедиться в правильности создания ядром разделов на nandflash, в консоли набираем cat /proc/mtd:

dev: size erasesize name

mtd0: 00200000 00020000 "Unused"

mtd1: 00200000 00020000 "Kernel"

mtd2: 0fc00000 00020000 "rootfs"

mtd3: 00840000 00000420 "spi0.0-AT45DB642x"

10.В папку на флешке предварительно были скопированы инструменты для работы с UBIFS, скомпилированные под ARM-платформу. Указываем путь до них.

export PATH=/home/root/ubi-utils/:$PATH

11.Форматируем раздел, отведенный для файловой системы (rootfs):

ubiformat /dev/mtd2

12.Присоединяем:

ubiattach /dev/ubi_ctrl -m 2

13.Создаем логический том:

ubimkvol /dev/ubi0 --name=rootfs -m

14.Создаем папку для монтирования будущей UBIFS-файловой системы:

mkdir /mnt/ubifs

15.Монтируем еще пока пустую файловую систему:

mount -t ubifs ubi0:rootfs /mnt/ubifs/

16.Переходим в папку /mnt/ubifs:

cd /mnt/ubifs

17.Разархивируем в эту папку tar-архив файловой системы, предвартельно скопированный на флешку:

tar xvf /home/root/x11.rootfs.tar

18.Отмонтируем файловую систему:

umount /mnt/ubifs

19.Выключаем питание платы.

20.Включаем плату и через sam-ba записываем в Dataflash образ первичного загрузчика Bootstrap, скомпилированного для загрузки из nandflash, по адресу 0x00000000.

21.В nandflash записываем образ ядра по адресу 0х00200000.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this