Сброка 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.
Чтобы подмонтировать файл как диск:
- Распаковать его: gunzip myfs.ext2.gz
- Подмонтировать (надо, чтобы в ядре был включен loop block device): mount -o loop myfs.ext2 /mnt
После изменений - не забываем отмонтировать !
Чтобы самому сделать образ файловой системой:
- Создать пустой файл: dd if=/dev/zero of=myfs.ext2 bs=1K count=5000 (если что-то непонятно - man dd)
- Создать файловую систему: mkfs.ext2 myfs.ext2
- Подмонтировать: mount -o loop myfs.ext2 /mnt
- Скопировать все файлы на диск (например из FS.tgz)
- Отмонтировать: umount /mnt
Для создания образа для u-boot-а делаем:
- Сжимаем образ файловой системы: gzip myfs.ext
- Создаем образ: ./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.
В качестве заключения
Выражаю благодарность за оказанную помощь:
- Дмитрию Черкашину (dch@ucrouter.ru, http://ucrouter.ru/)
- Николаю Жгулеву (NJgulev@newmail.ru)
- Charles M. "Chip" Coldwell (http://frank.harvard.edu/~coldwell/toolchain/)
Автор
Автор - Алексей Пресняков heavy@smtp.ru
- 61271 просмотр
Новые записи в блогах
- Устранение дребезга контактов на основе вертикальных счетчиков
- Диагностика Imprecise Bus Faults в микроконтроллерах Cortex-M3/M4/M4F
- Self-powered камера
- Фоновый модулятор: беспроводная связь из ничего (перевод)
- Texas Instruments Analog Applications Journal SLYT612 "Снижение искажений в аналоговых КМОП ключах" (перевод)
- USB MSD. Часть 6. Команды SCSI (перевод)
- USB MSD. Часть 3. USB класс накопителей данных (перевод)
- Texas Instruments Application Report SBAA042 "Кодовые схемы, используемые в аналогово-цифровых преобразователях" (перевод)
- 10 принципов правильного интерфейса
- Релиз SDK на русский микропроцессор КРОЛИК
Recent comments
7 лет 43 недели назад
8 лет 6 недель назад
8 лет 16 недель назад
8 лет 18 недель назад
8 лет 26 недель назад
8 лет 50 недель назад
8 лет 52 недели назад
9 лет 2 недели назад
9 лет 13 недель назад
9 лет 45 недель назад