30 янв. 2012 г.

Установка Linux с нуля на SK-AT91SAM9260-SIM300 (part 1 - инструментальные средства)

Как очевидно, данная серия постов будет посвящена процессу установки Линукса на отладочную плату SK-AT91SAM9260-SIM300. Особенностью данных постов является то, что я не буду использовать готовую инструментальную среду, которая поставляется вместе с платой на прилагаемом диске в виде образа VMWare. Кросскомпиляторы, загрузчики, ядро и корневую файловую систему я буду патчить и компилировать сам, используя оригинальные исходные коды с сайтов разработчиков.
Эта серия постов, увы, ориентирована в первую очередь на меня - чтобы я не забыл как делается то или иное действие. Поэтому, возможно некоторые, очевидные для меня моменты будут пропускаться. Если же я в чем-то не разобрался или в чем-то не уверен, то я отдельно напишу об этом в тексте поста и если у вас есть ответ на мой вопрос - пишите его в комментариях!

Предварительно, я дам ссылку на ресурс, который мне очень помог: .http://dmilvdv.narod.ru/AT91SAM9260/index.html

Итак, поехали. Сначала, в первом посте я опишу как получить используемые мной инструментальные средства - кросскомпилятор, загрузчик прошивок и так далее и покажу как всем этим пользоваться.

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

В своей работе по запуску линукса не на x86 мы будем использовать парочку кросскомпиляторов. Кросскомпилятор - это компилятор, который создает исполняемый файл для запуска на машине с архитектурой, отличной от архитектуры той машины, на которой запущен кросскомпилятор. Так например, при помощи кросскомпилятора AVR я могу на своем ноутбуке с Intel CoreDuo сделать исполняемый файл пригодный для запуска на микроконтроллере ATMega8.

Первый из кросскомпиляторов, который нам нужен - этот тот, который может сделать исполняемый файл, пригодный для запуска на "голом" железе, без многозадачности, без динамически подключаемых библиотек, без операционной системы и остальных, предлагаемых ею сервисов - кросскомпилятор для архитектуры ARM. Я когда-то писал как собрать его самостоятельно, и собирал его по этим инструкциям, и оно даже работало, но теперь, после получения некоторого опыта, данный способ был признан мной слишком трудоемким и вообще неправильным.
Есть два пути:
  • скачать уже готовый кросскомпилятор для ARM с сайта какой-нибудь компании, занимающейся продажей коммерческих решений для разработки под ARM. Обычно, они продают свою среду разработки, а компилятор, как правило, можно скачать отдельно и совершенно бесплатно. Пример - CodeSourcery G++ Lite Edition;
  • второй - наш путь - воспользоваться наработками опенсорного сообшества и скачать те же самые, готовые бинарники без регистрации и смс отсюда: http://www.gnuarm.com/files.html. На этом же сайте есть описание процесса самостоятельной сборки кросскомпилятора (http://www.gnuarm.com/support.html, секция build process). Пользуясь этим описанием, я и получил свой кросскомпилятор.
Второй кросскомпилятор, который нам понадобится - тот который соберет исполняемый файл, предназначенный для запуска под Линуксом, который, в свою очередь, работает на ARM'е. Процесс его сборки я затрону в одной из следующих статей, вместе с описанием процесса сборки корневой файловой системы, с помощью buildroot.

Отмечу, что все эти компиляторы (и заодно сопутствующие утилиты) различаются по префиксам:
  • оригинальный компилятор из вашей системы: gcc. Вместе с ним идут ar, ld и прочие утилиты;
  • ARM-кросскомпилятор для бинарников, который будут работать на "голом" железе: arm-elf-gcc. Вместе с ним: arm-elf-ar, arm-elf-ld;
  • Кросскомпилятор бинарников для ARM-линукса: arm-linux-gcc...


SAM-BA

После того, как мы получили бинарник, его нужно как-то залить в микроконтроллер, либо же в подключенную к нему память.
Для Atmel'ов традиционно используется утилита под названием sam-ba. Данная утилита, в версии 2.10 была портирована под линукс и скачать ее можно здесь: http://www.atmel.com/dyn/resources/prod_documents/sam-ba_2.10.zip. Для работы требуются установленные библиотеки Tcl и Tk.

У данной утилиты, есть одна особенность, она прошивает платы, только если они видны в системе как устройство /dev/ttyUSBx. Но иногда случается так, что устройство распознается как /dev/ttyACMx - в таком случае необходимо сделать символическую ссылку вида /dev/ttyUSBx, где x - первый свободный номер.
Кроме того будет полезно, если вы не хотите давать данной утилите права root'а, разрешить для себя доступ на чтение и на запись к устройству в /dev/, в качестве которого распозналась ваша плата.

Пара слов, о процессе прошивки программ в плату. Во-первых, нужно снять перемычки с линий CS (Chip Select) на Nand и Dataflash - J13 и J14. Затем - выключить и включить питание - на кнопку reset жать бесполезно, это не даст нужного эффекта. Потом, нужно выставить соответствующие права на подключившееся к системе устройство так, как я уже писал выше.
Теперь можно запустить самбу и указать ей нашу плату (at91sam9260-ek - идентична нашей плате) и порт подключения.
После успешного подключения к плате можно и нужно вернуть снятые перед этим перемычки на место.
В главном окне самбы нужно выбрать вкладку с тем типом памяти, который установлен на плате. У меня был распаян лишь Nandflash, поэтому я выбрал его - туда я установлю и загрузчик и линукс. Теперь нужно активировать его выбрав скрипт "Enable NandFlash" и нажав на Execute.

Процесс прошивки программы во NandFlash протекает незатейливо - выбирается необходиый файл в "Send File Name", вводится адрес, по которому он должен "лечь" во флешку и жмется кнопка "Send File".

Прошивка программы (например загрузчика) во внутреннюю флеш-память микроконтроллера протекает несколько иначе - запускается скрипт SendBootFile, который попросить у вас указать путь к соответствующему бинарнику и сам прошьет его куда надо.



Терминальная программа

Чтобы посмотреть, что происходит с платой на начальных этапах загрузки, используются терминалки - ведь и линукс и загрузчики бодро рапортуют сообщениями о всем, что происходит, в последовательный порт. Достаточно подключиться к нему, чтобы увидеть, а то и оказать свое воздействие на процесс загрузки.
Терминалок есть великое множество, в том числе и под линукс. Я использую minicom.

Настройки последовательного порта следующие - скорость 15200 бод, 8 бит данных, один стоповый бит, биты четности отсутствуют, как и управление потоком, что программное, что аппаратное.
Minicom я запускаю следующей командой: minicom -D /dev/ttyUSB0 -o (у меня USB<->COM преобразователь) и после нажатия на reset вижу следующее:
Это значит, что оба загрузчика на нашей плате запустились и работают.

Следующие посты:

7 комментариев:

  1. Посмотри в сторону OpenWrt. Уже есть все готовое, просто выкачиваешь git'а выбираешь галками процессор и те модули которые нужны, конфигуришь, ложишься спать пока все это дело компилится, а утром довольный ставишь.

    ОтветитьУдалить
  2. Аргх! Написано же, что ставлю все практически с нуля. Если бы я хотел все готовое, я бы просто залил готовые бинарники, поставляемые вместе с платой, или использовал бы готовую билд-машину, поставляемую в виде образа для VMWare...

    ОтветитьУдалить
  3. Не, я так понял, что охота посидеть пособирать =)
    А ты хочешь новую версию линукса собрать? Как назовешь?
    По крайней мере советую посмотреть на используемые решения в OpenWrt. Или посмотри на фреймворк openembedded, тоже облегчит жизнь.

    ОтветитьУдалить
  4. > Не, я так понял, что охота посидеть пособирать =)
    Ну да, чтобы разобраться, как вся эта штука работает...
    А по части упрощения сборки всего этого хозяйства я уже присмотрел себе buildroot. Делаешь make menuconfig, объясняешь, что хочешь видеть в своей системе, какие загрузчики будешь использовать, потом пишешь make и идешь спать. В общем, все то же самое =).

    ОтветитьУдалить
  5. Ну так никакого отличия от openwrt и openembedded!
    Но, как мне кажется, у openwrt самое большое коммъюнити и больше всего пакетов доступных, что называется, из коробки.

    ОтветитьУдалить
  6. Например в пэккаджах уже скомпилленное есть 
    http://downloads.openwrt.org/backfire/10.03/ar71xx/packages/  

    ОтветитьУдалить