Сброка 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