Сброка toolchain для ARM и запуск Linux на AT91RM9200.

Теперь надо загрузить образ ядра в Dataflash (следует убедиться, что сеть работает в u-boot-е, например командой ping).

Входим в u-boot и даем команду загрузки по tftp:

u-boot> tftpboot 20800000 /tftproot/uImage

Проверяем, что образ нормальный:

u-boot> iminfo 20800000

## Checking Image at 20800000 ...
Image Name:
Image Type: ARM Linux Kernel Image (gzip compressed)
Data Size: 1124113 Bytes = 1.1 MB
Load Address: 20008000
Entry Point: 20008000
Verifying Checksum ... OK

После того, как образ загружен в память - записываем его в Dataflash:

u-boot> cp.b 20800000 C002A000 136000

Пока попробуем запустить ядро без загрузки файловой системы. Для этого надо установить переменные окружения (для удобства я разделил первую строку на несколько - реально должна быть одна):

setenv bootargs "root=/dev/ram rw initrd=0x20288000,0x500000 ramdisk_size=5000
mtdparts=AT45DB642.spi0:0x2A000(boot)ro,0x136000(kernel)ro,0x200300(initrd)ro,-(filesystem)
console=ttyS0,115200 mem=32M"
setenv bootcmd "cp.b C002A000 20A00000 200000; bootm 20A00000"
saveenv

Теперь дадим команду загрузки:

boot

Некоторое время u-boot будет молчать - это копируется образ из Dataflash в память (почему-то команда bootm не хочет грузить ядро напрямую из Dataflash - может в новых u-boot-ах и поправили, но новые что-то у меня не работют :( ).

Если все нормально - пойдет грузиться ядро:

u-boot> boot
## Booting image at 20a00000 ...
Image Name:
Image Type: ARM Linux Kernel Image (gzip compressed)
Data Size: 1124113 Bytes = 1.1 MB
Load Address: 20008000
Entry Point: 20008000
Verifying Checksum ... OK
Uncompressing Kernel Image ... OK

Starting kernel ...

Linux version 2.6.16 (root@heavy) (gcc version 3.4.6) #16 Sat May 6 16:31:56 MSD 2006
CPU: ARM920Tid(wb) [41129200] revision 0 (ARMv4T)
Machine: Atmel AT91RM9200-DK
Memory policy: ECC disabled, Data cache writeback
Clocks: CPU 179 MHz, master 44 MHz, main 18.432 MHz
.....

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

Busybox

Для нормального функционирования Linux-а необходим некоторый набор консольных утилит (минимум - init).
Для этого проще всего использовать пакет busybox. Он представляет практически все необходимые консольные утилиты в небольшом бинарнике (~300kb, зависит от конфигурации).

Сборка Busybox-а довольно простая:

make menuconfig (там правильно указываем кросс-компилятор и куда устанавливать - $SYSROOT)
make
make install

Получится бинарник busybox и куча симлинков на него.

Файловая система

Файловая система собирается из того, что получилось в $SYSROOT (/usr/local/arm/sysroot) и файлов обвески (их можно взять практически в любом дистрибутиве линукса). На бинарнике (в т.ч. и на .so) не забываем сделать arm-linux-strip (чтобы убрать debug-info). Это экономит примерно 80% места.

Каких-то конкретных правил для сборки нет. Каждый собирает то, что ему нужно. Можно за основу взять мою базовую файловую систему и что-то добавлять/убавлять.

Готовый собранный образ ramdisk-а лежит в myfs.ext2.gz. Исходные файлы в FS.tgz.
Чтобы подмонтировать файл как диск:

  1. Распаковать его: gunzip myfs.ext2.gz
  2. Подмонтировать (надо, чтобы в ядре был включен loop block device): mount -o loop myfs.ext2 /mnt

После изменений - не забываем отмонтировать !

Чтобы самому сделать образ файловой системой:

  1. Создать пустой файл: dd if=/dev/zero of=myfs.ext2 bs=1K count=5000 (если что-то непонятно - man dd)
  2. Создать файловую систему: mkfs.ext2 myfs.ext2
  3. Подмонтировать: mount -o loop myfs.ext2 /mnt
  4. Скопировать все файлы на диск (например из FS.tgz)
  5. Отмонтировать: umount /mnt

Для создания образа для u-boot-а делаем:

  1. Сжимаем образ файловой системы: gzip myfs.ext
  2. Создаем образ: ./mkimage -A arm -O linux -C gzip -T ramdisk -a 0x20288000 -d myfs.ext2.gz fsImage

Созданный образ (fsImage) кладем в каталог tftpd: cp fsImage /tftproot

Загружаем u-boot и заливаем образ файловой системы в Dataflash:

tftpboot 20800000 /tftproot/fsImage
cp.b 20800000 C0160000 200000

Правим переменные окружения для нормальной загрузки с ramdisk-а:

setenv bootcmd "cp.b C002A000 20A00000 200000; cp.b C0160000 20C00000 200000; bootm 20A00000 20C00000'
saveenv

Теперь загружаемся и радуемся :)

boot

Dataflash как диск

В моей конфигурации неипользуемый участок Dataflash-а виден в системе как mtd3. Можно использовать его просто как блочное устройство /dev/mtdblock3 и писать в него из своего софта, заливать стандартные файловые системы итд.

Но по мне - так лучше повесить файловую систему JFFS2. Читаем mtd-jffs-howto.txt :)
Там на самом деле все просто. Главное включить в ядре поддержку jffs2.

В качестве заключения

Выражаю благодарность за оказанную помощь:

Автор

Автор - Алексей Пресняков heavy@smtp.ru 

Комментарии

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

Содержание этого поля является приватным и не предназначено к показу.
  • Syntax highlight code surrounded by the {syntaxhighlighter SPEC}...{/syntaxhighlighter} tags, where SPEC is a Syntaxhighlighter options string or "class="OPTIONS" title="the title".
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <p> <span> <s> <strike> <div> <h1> <h2> <h3> <h4> <h5> <h6> <img> <map> <area> <hr> <br> <br /> <ul> <ol> <li> <dl> <dt> <dd> <table> <caption> <tbody> <tr> <td> <em> <b> <u> <i> <strong> <del> <ins> <sub> <sup> <quote> <blockquote> <pre> <address> <code> <cite> <embed> <object> <param> <strike>
  • Использовать как разделитель страниц.

Подробнее о форматировании