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

	/*
 * Serial port configuration.
 *    0 .. 3 = USART0 .. USART3
 *    4      = DBGU
 */
static struct at91_uart_config __initdata dk_uart_config = {
        .console_tty    = 0,                            /* ttyS0 */
        .nr_tty         = 2,
        .tty_map        = { 4, 1, -1, -1, -1 }          /* ttyS0, ..., ttyS4 */
};

Если требуется изменить параметры инициализации портов (например включить режим RS485) - смотрим в arch/arm/mach-at91rm9200/devices.c. Там находится код инициализации уартов.

2. В файле arch/arm/mach-at91rm9200/board-dk.c надо поправить строчку описания машины. Иначе на EVM9200 не запустится и будет орать о неверном коде платформы: поменять:

	MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK")

на:

	MACHINE_START(AT91RM9200, "uCrouter EVM9200")

3. Если хочется использовать две Dataflash на плате - то первую вешаем на CS0 (с нее будет идти загрузка). Вторую вешаем на CS3. Для поддержки второй флэшки надо включить поддержку "Dataflash Card" в ядре.

Загрузка из Dataflash (вообще без паралельной Flash)

Для загрузки из Dataflash я взял Atmel-овский romboot. От оригинального отличается лишь правленными настройками клоков. Свободно компилируется собраным toolchain-ом.

Как загрузить его:

  1. Ставим J11 (который около DBGU порта) в правое положение (в сторону ближе к процу, дальше от разъемов DB9). Это отключит CS паралельной Flash.
  2. Если в Dataflash-е еще нет загрузчика - ставим J14 (вроде как... в общем тот, что около Dataflash-ки) в нижнее положение (это ближе к процу). Это включит CS для Dataflash-а.
  3. Если в Dataflash-е уже есть загрузчик, который не функционирует как надо - ставим J14 в верхнее положение (отключаем CS для Dataflash-а). Как только проц включится на свой boot - поставим его на горячую в нормальное положение.
  4. В консоли (115200 8N1) на порту DBGU побегут буковки 'C' (английская большая 'Ц'). Это значит, что активирован встроенный Xmodem.
  5. Загружаем romboot.bin по Xmodem-у.
  6. После загрузки, romboot запустится и будет возможность залить его же в Dataflash:
    Даем команду: "1 C0000000"
    Побегут буковки 'C' - по Xmodem-у отправляем опять romboot.bin
    Если все прошло нормально - romboot скажет, что он записал в Dataflash и поправил 6-й вектор.
  7. Теперь можно нормально грузиться с Dataflash-а. Не забываем в течение секунды после появления приглашения нажать любую кнопку, чтоб не пошел процесс автоматического запуска u-boot-а, а выйти в меню romboot-а.

U-boot

Я собирал u-boot 1.1.1 с патчем от Дмитрия Черкашина ("Dmitriy I.Cherkashin")

Распаковываем u-boot 1.1.1 и накатываем патчи от Черкашина.

Далее надо поправить конфигурацию в файле include/configs/RM9200.h:
Установить: #define CFG_ENV_IS_IN_DATAFLASH. Убедиться, что больше нигде оно не переопределено.

Поправить адреса для Ethernet. Не забыть про MAC-адрес. Именно u-boot его устанавливает, а ядро потом пользуется уже установленным.

Включить поддержку Dataflash: #define CONFIG_HAS_DATAFLASH 1

Поправить адрес конфигурации в Dataflash:

	#if defined(CFG_ENV_IS_IN_DATAFLASH)
#define CFG_ENV_OFFSET 0x28000			<--- вот тут
#define CFG_ENV_ADDR (CFG_DATAFLASH_LOGIC_ADDR_CS0 + CFG_ENV_OFFSET)
#define CFG_ENV_SIZE 0x2000  /* 0x8000 */

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

Для сборки воспользуемся собранным gcc 2.95.3 (он лежит в arm-gcc-2.95.3.tgz). Поправим Makefile на предмет переменной CROSS_COMPILE:

	ifeq ($(ARCH),arm)
CROSS_COMPILE = /opt/uClinux/bin/arm-elf-
endif

Теперь собираем: make

Если все удачно - у нас получится файл u-boot.bin (gzip-версия не понадобится, т.к. romboot не держит gzip. я пробовал его привернуть, но приходится откручивать все прелести консольной работы с dataflash).

Загрузка U-boot

Запускаем EVM9200 и входим в romboot. Загружаем U-boot в dataflash:
Даем команду "1 C0008000", далее грузим u-boot.bin по Xmodem-у.
U-boot будет лежать в Dataflash со смещения 0x8000.
После окончания загрузки попробуем дать команду "3" - должен загрузиться U-boot.

Если все нормально - то после ресета - u-boot будет грузиться автоматически (если ничего не нажимать)

Карта памяти

Ниже привожу карту памяти в EVM9200 (для моей конфигурации):

	Dataflash:
C000 0000 - romboot (32kb - 0x8000)
C000 8000 - u-boot (128kb - 0x20000)
C002 8000 - u-boot config (8kb - 0x2000)
C002 A000 - kernel (1240kb - 0x136000)
C016 0000 - initrd (2Mb - 0x200300)
C036 0300 - filesystem (4.9Mb - 0x4DFD00) - обязательно должен начинаться с нового сектора (адрес кратен 1056)

RAM:
2000 8000 - kernel (0x280000)
2028 8000 - initrd (0x500000)
20A0 0000 - compressed kernel (0x200000)
20C0 0000 - compressed initrd (0x200000)
20F0 0000 - u-boot

tftpd для передачи файлов u-boot-у

Все нижеследующее надо делать только в случае, если в системе еще не стоит tftpd (посмотреть для начала на /etc/inetd.conf на предмет tftp и поглядеть, есть ли файлы, на которые конфиг ссылается).

Собирается все предельно просто и прозрачно (файл tftpd.tar.gz в комплекте):

	tar xvzf tftpd.tar.gz
cd ftpd
make
cp ./tftpd /usr/sbin
cp ./tftpd.8 /usr/man/man8

Прописываем в /etc/inetd.conf строчку для tftpd:

	tftp    dgram   udp     wait    nobody  /usr/sbin/tcpd  tftpd /tftproot

Создаем каталог для tftp:

	mkdir /tftproot

Если inetd уже запущен, то перезапускаем его:

	killall -1 inetd

Если не запущен - запускаем.

Загрузка ядра Linux-а

Мы уже получили готовое ядро в arch/arm/boot/Image. Теперь надо сделать загрузочный образ ядра для u-boot.
Для этого существует утилита mkimage из поставки u-boot (лежит в подкаталоге tools).
Для начала сожмем ядро в gzip:

	gzip Image

Получим файл Image.gz. Из него то и будем делать образ:
С помощью mkimage делаем образ ядра для u-boot:

	./mkimage -A arm -O linux -C gzip -a 0x20008000 -e 0x20008000 -d Image.gz uImage

Полученный файл uImage положим в каталог для tftp (у меня это /tftproot).