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

Комментарии

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

Содержание этого поля является приватным и не предназначено к показу.
  • 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>
  • Использовать как разделитель страниц.

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