Установка Linux на at91 - ARM 9 от atmel

 

at91

 

Плата atmel at91sam9263ek - исходный отладочный набор (http://www.at91.com/)
На ее основе mentor - плата. http://wiki.mentorel.ru/doku.php?id=wiki:me-ms1000b
Руководство для поднятия всей системы из нор-памяти.

me-ms1000


Программа для первичной прошивки процессора - SAM-BA от Atmel 

SAM-BA нужна для записи в память прошивки-загрузчика, когда чип совсем пустой.

- Установить сам-ба. Для работы с платой ментора необходимо пропатчить По (патч от ментора http://wiki.mentorel.ru/doku.php?id=wiki:sam-ba)
- Установить драйвера ftd-devices для COM портов.
- Подсоединиться к dbgu-порту, запустить терминал (hyperterm windows), для нашей платы скорость обмена 115200, 8, 1, без паритета.
- Далее все будет отражаться в терминале

 

Кросс-компиляторы

Используем кросс-компиляторы и библиотеки от CodeSourcery (бесплатный arm-none-linux-gnueabi компилятор). Также на сайте codecourcery есть eabi компилятор - он тоже под arm, но не линукс, используется для сборки загрузчиков. Рекомендуется собирать компилятором arm2009q1 ядро, ФС и все что связано с linux arm-2007q1 - для загрузчиков. Существует мнение, что более поздние компиляторы создают больший по размеру код, но более ранние могут некорректно собирать проект. В любом случае лучше использовать один компилятор для загрузчиков, другой для всех утилит linux-системы, чтобы потом не искать ошибки, связанные со сборкой системы разными компиляторами.

Загрузчики Bootstrap u-boot

Bootstrap - первичный загрузчик, производит начальную инициализация контроллера и загружает второй загрузчик - u-boot. Загрузчики можно собирать и из исходных кодов, можно взять уже готовые бинарные файлы, если нет необходимости доработки загрузчиков. Про сборку загрузчиков часть информации есть на сайте производителя.

Для того чтобы прошить первичный загрузчик вытаскиваем перемычки загрузки из внешней памяти, открываем терминал dbgu-порта, включаем питание. В этом случае контроллер начнет ROM-загрузку, то есть войдет в режим прошивки загрузчика. Далее открываем SAM-BA, открываем вкладку нор-память, выполняем следующие действия:
  - Execute память - разрешаем запись (то же относится и нанд и датафлеш - обязательно очищать перед записью)
Т.к. Bootstrap является первичным загрузчиком (первой исполняемой программой), он записывается по 0 адресу во флеш-память. Прошиваем файл bootstrap.bin.

u-boot пишется по адресу 0х08400 в dataflash, в norflash по адресу 0х10000. Это адрес, на который bootstrap перепрыгнет, выполнив начальную инициализацию. Если u-boot собирается из исходных кодов, необходимо перед компиляцией задать адрес старта u-boot и размеры (подробнее у ментора на сайте), если адрес задать неверно (например, там не окажется u-boot или u-boot будет больше указанного размера) ничего после выполнения bootstap происходить не будет. Следует понимать, что u-boot не обязательн, bootstrap может сразу грузить ядро Linux, но из u-boot намного проще обновлять ядро Linux и файловую систему по сети, что важно если после изменений в КФС Linux проиозошли изменения и Linux перестал грузится. Если обновлять Linux не имеет смысл, то u-boot можно вырезать, но тогда часть кодов u-boot придется переносить в bootstrap. Также отсутствие второго загрузчика значительно сокращает время загрузки устройства, что часто важно для встраиваемых систем.
   Далее устанавливаем джамперы включения памятей, подаем напряжение на плату заново. Смотрим терминал.
Start AT91Bootstrap...  - Значит bootstrap грузится корректно. Далее идет загрузка u-boot.


U-Boot 1.3.4 (Jan 25 2011 - 12:49:27)

DRAM: 64 MB
Flash: 64 MB
In: serial
Out: serial
Err: serial
Net: macb0
macb0: Starting autonegotiation...
macb0: Autonegotiation complete
macb0: link up, 100Mbps full-duplex (lpa: 0x4de1)
Hit any key to stop autoboot: 0

- U-boot загрузился. Могут быть и другие строчки еще, в зависимости от функционала и сборки u-boot. В данном варианте u-boot не работает с нанд (при этом linux работать будет с norflash).

Далее при помощи u-boot будем устанавливать ядро и файловую систему (ФС) (linux состоит из двух частей - ядро и ФС) по сети ethernet при помощи tftp - trival file transfer protocol.

Установить на PC tftp-сервер, с которого будем качать ядро и фс. Расшариваем папку на tftp сервере (у меня это папка под названием "1") на PC, втыкаем ethernet кабель в девайс и компьютер.  

Устанавливаем переменные в u-boot (CRC-ошибка на самом деле не ошибка, просто не заданы переменные окружения u-boot, когда зададим, ошибка пропадет).  

u-boot> setenv ipaddr 169.254.216.190
u-boot> setenv serverip 169.254.216.190

- стоит заметить, что для этого надо знать ip своего PC (возможно стоит задать статический ip адрес для компьютера, если такого нет по умолчанию) 
u-boot> setenv ethaddr 1 
- Мак-адрес девайса. Вобщем-то 1 подходит для наших целей, по большому счета в сети компьютер-девайс адреса особого значения не имеют.

u-boot>saveenv
- Записываем переменные окружения в память (около половины минуты) 
Проверяем что записалось
U-Boot> printenv
bootdelay=3
baudrate=115200
ethact=macb0
ethaddr=1
initrd=10400000
init=10400000
bootargs=console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2
filesize=149414
fileaddr=22000000
ipaddr=169.254.216.190
serverip=169.254.216.198
bootcmd=cp.b 10100000 22000000 149414 ; bootm 22000000

Environment size: 288/131068 bytes

Примерно такой лог должен быть, когда все прошло правильно.  

u-boot> tftp 22000000 1/uImage
- Загрузка ядра Linux из папки компьютера 1 по tftp. u-boot выдаст размер ядра в десятичном виде и 16-ом в скобках. 
u-boot> erase 10100000 +
u-boot> cp.b 22000000 10100000
Ждем несколько минут для 1.5 Мб ядра, size - размер ядра 
u-boot> setenv bootcmd cp.b 10100000 22000000 \; bootm 22000000
u-boot> saveenv


Далее аналогично закачиваем ФС. (а сайте ментора подробно) 
И задаем bootargs.
Размер ФС - около 30 Мб. cp.b выполнятся примерно 30 минут... И при этом ничего в консоль не выводится, не стоит думать что процессор завис.

Немного про ядро и ФС linux. 

Проще всего взять готовые скрипты с сайта производителя (у меня это папка me_rootfs) и сборку файловой системы и ядра запуском скриптов.
sudo ./build_fs.sh - ФС
sudo ./build_kernel.sh - ядро
Добавлять поддержку оборудования можно в me_rootfs/linux/linux-2.6.27/arch/arm/mach-at91/board-sam9263ek.с.
Скачать ядро linux-2.6.xx. В моем случае xx = 27. make ARCH=arm menuconfig - конфигурирования ядра. Многое есть в поддержке. Нор-память добавлена в скриптах, не является стандартной для данной платы.
По поводу ФС. ФС есть штука в некотором смысле универсальная и фактически определяет систему. Для встраиваемых систем (малый объем памяти и ресурсы) придумали busybox - "швейцарский нож". После загрузки ядра управление передается busybox. Busybox - быстрый вариант командной строки, содержит много системных утилит (mount, mkdir, ls, cp). То есть вместо множества программ mount, ls p, mkdir будет одна - busybox, которая выполнет функции всех основных программ (каких именно задаеся конфигом перед компиляцией busybox).
Я использовал собранный Busybox производителем. Так же в ФС производителя есть все необходимые файлы и папки для инициализации linux.

Если загрузка linux прошла успешно, система спросит логин и пароль через консоль DBGU. По дефолту у многих встраиваемых простых систем linux - пользователь root, пароль пустой. При помощи busybox можно по tftp, flash-usb, SD-Card переносить и модернизировать ФС на системе. После входа в систему мы находимся в пустой папке пользователя.  

* Компилятор обычно лежит в /opt/arm-2008q1. Если компилятор не тот или лежит где-то еще, надо править скрипты build_fs.sh и build_kernel.sh - в самом начале лежит путь к компиляторам. ФС должна быть преобразовать к виду .jffs2 использую специальные утилиты. После этого можно загружать linux и настраивать.

Некоторые особенности кросс-компиляции.

Обычно сборка приложения для linux-системы производится тремя командами:

./configure
make
make install

В этом случае все соберется под х86 машину (ну или ту, на которой вы работаете). Нам же надо кросс-компилировать. Для такой нестандартной задачи делаем команду ./configure --help И вылезает help, который подробно расскажет нам что мы можем включать, что нет. Если непонятно, что обозначают некоторые вещи - google по названию.
Далее определяем переменные, такие как библиотеки для кросс-компиляции, путь кросс-компилятору и т.д.  http://tw.myblog.yahoo.com/stevegigijoe/article?mid=317&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+BeagleBoard+%28BeagleBoard.org%29 Некто собирает веб-сервер под beagle-board (тоже арм, но кортекс a8) У него как раз прописано как и что надо предопределять перед тем как собирать. Все ключи я собрал в исполняемый файл my_arm_config.sh, чтобы не набивать все вручную в консоли. 
* Не получилось собрать с первого раза - make clean и можно опять собрать заново.
Получившиеся файлы переносим их на платформу, я использовал для этого tftp.

Почему не стоит заниматься сборкой софта прямо на латформе (ARM)? Ответ простой: слишком мало ресурсов, слишком слабый процессор, сборка программы hello_world занимает около половины минуты, да еще надо собрать или найти gcc, make и т.д. под платформу.

Про сборку Toolchain, если кого-то не устраивает от CodeSourcery:

http://www.emb-linux.narod.ru/tion-pro-270/building-toolchain.html 

Особенности некоторых команд в busybox


tftp

tftp -g -l tftp_server_folder\file 169.254.216.198

Получить файл с тфтп сервера.

ifconfig 

ifconfig - найстройка сети. При старте я выполняю в inittab несколько конфигурирований ethernet'a 
ifconfig eth0 down
ifconfig eth0 169.254.216.190 up
Настройка сети с IP адресом 169.254.216.190

 

Подключение CAN-драйвера, из переписки с mentorel.com

Ядро линукса я взял 2.6.36
При конфигурирование ядра включить драйвера CAN.
В корневую фс включить пакет iproute2, из меню Networking applications. И вот после этого начинается интересно. В системе появятся две утилиты ip одна в директории /bin, из состава busybox, а другая в /sbin из пакета iproute2. busybox-вая про CAN ничего не знает, но при вызове из командной строки запускается именно она. Поэтому путь до нужной утилиты прописывать надо полностью:
1 Вкл. устройство
# /sbin/ip link set can0 type can
2. Настройка бит тиминга (если при конфигарации ядра не включена опция "CAN bit-timing calculation") при включенной не надо.
# /sbin/ip link set can0 type can tq 125 prop-seg 6
phase-seg1 7 phase-seg2 2 sjw 1
3. Установка скорости bit-rate
# /sbin/ip link set can0 type can bitrate 1000000
4. Старт
# /sbin/ip link set can0 up
Можно посмотреть, что получилось
# /sbin/ip -details -statistics link show can0

Пример программы в
/Documentation/networking/can.txt
или en.wikipedia.org/wiki/Socketcan