- Embeddedsoft.ru
- Установка Linux на at91 — ARM 9 от atmel
- Программа для первичной прошивки процессора — SAM-BA от Atmel
- Кросс-компиляторы
- Загрузчики Bootstrap u-boot
- Немного про ядро и ФС linux.
- Некоторые особенности кросс-компиляции.
- Особенности некоторых команд в busybox
- ifconfig
- Подключение CAN-драйвера, из переписки с mentorel.com
- Инсталляция Linux на ARM9 микроконтроллер AT91RM9200
- Комментарии ( 10 )
- Построение системы для ARM платы
- Re: Построение системы для ARM платы
- Re: Построение системы для ARM платы
Embeddedsoft.ru
Установка Linux на at91 — ARM 9 от atmel
Плата atmel at91sam9263ek — исходный отладочный набор (http://www.at91.com/)
На ее основе mentor — плата. http://wiki.mentorel.ru/doku.php?id=wiki:me-ms1000b
Руководство для поднятия всей системы из нор-памяти.
Программа для первичной прошивки процессора — 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:
Особенности некоторых команд в busybox
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
Источник
Инсталляция Linux на ARM9 микроконтроллер AT91RM9200
На своем сайте выложил описание былых нароботок по установке OS Linux на ARM9 микроконтроллер — Инсталляция Linux на ARM9 микроконтроллер AT91RM9200.
В 2007м году мне приходилось разрабатывать одно устройство на базе ARM9 микроконтроллере AT91RM9200, в тот момент была написана инструкция. Правда написана была не полностью. но тем не менее на 95% завершена, а потом мне просто стало лень ее дописывать… В общем, дабы не затерялась полезная наработка я ей решил поделиться, ага, 5 лет спустя…
Также прицеплю *.doc файл оригинал, чуть ниже. Всё дело в том что в оригинальном документе также присутсвуют скриншоты и рисунки…
Оригинал документа там-же. По сути там пошаговая инструкция. Уверен многим пригодится на пользу…
Плюсуйте ;):)
Комментарии ( 10 )
А я с ним уже наигрался. Хотя для тестов радиомодулей можно будет оживить.
Там помню какие-то нехорошие баги были. Контроллер sdram очень неторопливый. Инверсия порядка байт в SD/MMC контроллере, надо лопатить весь буфер софтверно. И что-то где-то ресетить постоянно надо было.
А порт линукса не плох.
Контроллер SDRAM не умеет burst режим, точнее его длина ограничена однима словом. Если правильно помню. Так что реальная скорость доступа к памяти даже не близка к расчетной. Даже на простых тестах последовательного чтения/записи.
А инверсия байт сделана в драйвере linux, я же свой писал, для загрузчика (u-boot не использовал).
Источник
Построение системы для ARM платы
Добрый день. Я начинаю работать с архитектурой ARM, и мне нужно создать arm9-based компьютер с LCD и сенсорным экраном, строю планы на Qtopia, м.б. в перспективе будем делать свой arm-комп. У нас есть отладочная плата atmel at91sam9263-ek. Поскольку начинают всегда с начала, я занялся созданием образа системы(вначале консоль) для at91sam9263-ek, но вот нигде нет howto get arm9 working. Ессно, я гуглил, и вот какие у меня представления о мире:
1) Cross Linux from scratch — берёшь исходники linux и основных пакетов, берёшь кросскомпилер и компилишь. Затем создаёшь на своём диске образ ФС и кидаешь туда то, что накомпилилось. При этом как учитываются особенности архитектуры(хотя бы bootstrap), непонятно. Не для новичка.
2) Установка Debian — качаешь debian-40r1-arm-xfce-CD-1.iso, заливаешь на at91sam9263-ek какое-то ПО, позволяющее запуститься с CD и устанавливаешь Debian. Непонятно, где взять это ПО. Документации нет абсолютно.
3) OpenEmbedded — есть некий набор инструментов, в котором есть две кнопки: «настроить. » и «собрать образ». Настройка, видимо, не так проста, т.к. документации для разработчиков больше, чем для пользователей.
4) Arm Linux — опять же некий набор инструментов, про который я не могу прочитать, т.к. сайт http://www.arm.linux.org.uk/ у меня не грузится, хотя и пингуется.
5) at91sam9 BSP от TimeSys — некий набор инструментов(free 1-month subscription), который должен заработать быстрее всех(т.к. заточка под моё железо), но я его пока не могу загрузить из-за какой-то ошибки регистрации.
А вопросы такие:
i) Верны ли мои представления о мире и правильно ли я выбрал 5й вариант?
ii) Обязательно ли в остальных вариантах ставить патчи под свой конкретный процессор или есть некая универсальная конфигурация наподобие i386?
iii) Можно ли собрать консольную систему за недельку? 🙂
Спасибо если прочитали, ещё большее спасибо если написали ответ.
Re: Построение системы для ARM платы
AFAIK у самого Атмела есть своя сборка Linux под их железки. по опыту очевидцев вроде вполне работает, хотя лично я не пробовал.
Re: Построение системы для ARM платы
> i) Верны ли мои представления о мире и правильно ли я выбрал 5й вариант?
У меня нет никакого опыта построения компьютеров на ARM. Я собирал дистрибутивы GNU/Linux для себя для NEC MobilePro 780 (NEC VR4121) и HP iPAQ 4700 (Intel PXA270). Из средств для сборки пробовал OpenEmbedded, buildroot и Gentoo. Сейчас больше всего понравился Gentoo. Попробую кратко описать каждую из систем:
* OpenEmbedded ставит кросс-средства для сборки пакетов, сам их настраивает, ими всё компилит;
* buildroot работает почти так же, как и OpenEmbedded, но написан значительно проще, под него меньше пакетов, зато он заточен под uClibc;
* Gentoo собирается на target device, для ускорения сборки можно использовать distcc и кросс-средства на build host;
Gentoo понравился тем, что мне не нужно больше патчить ./configure-скрипты, чтобы заставить их проходить тесты (они иногда пытаются скомпилировать что-то target-компилятором и запустить на build host, после чего, конечно же, обламываются), не нужно хранить staging версии библиотек;
> ii) Обязательно ли в остальных вариантах ставить патчи под свой конкретный процессор или есть некая универсальная конфигурация наподобие i386?
Есть универсальная конфигурация «arm», если я правильно понял вопрос. Практически всегда приходится патчить ядро для поддержки нужного железа (LCD-контроллер, устройства ввода, сенсоры батареи, звук). Рекомендуется (хотя часто и не обязательно) патчить компилятор патчами под конкретный процессор, чтобы ускорить работу некоторых программ за счёт использования всяких хитрых специфичных для него инструкций (например, iwmmxt на PXA270).
> iii) Можно ли собрать консольную систему за недельку? 🙂
OpenEmbedded вполне собирается с GPE (X11 desktop environment) за день. Gentoo можно собрать на ARM PXA270 620MHz/64Mb RAM за неделю (если без distcc). С distcc — за 2-3 дня.
Источник