Сборка Yocto для Beaglebone

Embedded linux

С каждым днем одноплатные компьютеры (такие как Raspberry Pi, Beaglebone, Cubieboard...) становятся все популярнее, а их количество и сферы применения растут. Ну и маркетологи добаляют ажиотажа, утверждая что «наступила эра IoT».

Ну, раз она наступила, значит и нам нужно соотвествовать реальности. То есть уметь собрать образ Linux для своего одноплатника, написать пользовательское приложение для управления автопоилкой любимого хомяка автоматикой, разработать простейший драйвер, если не нашли готового.
Со сборки образа и начнем. Образ будем собирать для Beaglebone Black. В качестве дистрибутива Linux будем использовать Yocto. Что же это такое?
The Yocto Project is an open source collaboration project that provides templates, tools and methods to help you create custom Linux-based systems for embedded products regardless of the hardware architecture.
То есть это совместный Open Source-проект разработки шаблонов, инструментов и методов для создания специальных дистрибутивов Linux для встраиваемых систем на базе различных аппаратных архитектур.
Для начала склонируем последнюю версию yocto на компьютер (последнюю на момент написания статьи).
git clone -b jethro git://git.yoctoproject.org/poky.git poky-jethro
После этого перейдем в каталог poky-jethro и выполним команду
source oe-init-build-env

Теперь в директории build, которая появилась после выполнения команды, найдем файл local.conf и откроем его в текстовом редакторе. Расскоментируем строку:
MACHINE ?= «beaglebone»
В конце файла добавим:
#Add kernel source to SDK
TOOLCHAIN_TARGET_TASK_append = " kernel-devsrc"
Исходники ядра нам пригодятся в дальнейшем для разработки модулей ядра и драйверов.
Сохраним файл. В консоли (находясь в папке build) запустим команду:
bitbake core-image-sato
Упс…
bitbake: command not found
Что же такое этот BitBake? BitBake – это система сборки. Она считывает рецепты (определенные наборы инструкций) и следует им – скачивает необходимые пакеты, компилирует их и создает результирующие загрузочные образы. BitBake совместно поддерживается проектами Yocto Project и OpenEmbedded. Как выяснилось, BitBake у нас нет. Не беда. Склонируем его в папку Project (в моем случае). Для этого выполним:
git clone git://git.openembedded.org/bitbake.git
cd bitbake
git checkout -b 1.28 --track origin/1.28
Осталось добавить путь к BitBake в переменную окружения PATH. В консоли выполним:
PATH=$PATH:/home/pavlya/Projects/bitbake/bin
Будьте внимательны с путями. У вас они будут другими.
И еще раз выполним:
bitbake core-image-sato
В процессе экспериментов Yocto запросил доставить утилиты (ну и повысить версию bitbake)

Ставим утилиты:
sudo apt-get install diffstat
sudo apt-get install chrpath
sudo apt-get install texinfo (вместо makeinfo)
Также для работы системы сборки необходим python 2.x (python 3.x не поддерживается).
Ну что, еще раз запускаем…

Ну вот, все собралось. На четырех ядрах Intel Core i3 сборка заняла более 3 часов. Так что запаситесь терпением и пивом.
Результаты сборки находятся в папке build/tmp/deploy/images/beaglebone. Теперь нам нужно создать загрузочную SD карточку, с которой будет стартовать Yocto. У нас есть несколько вариантов:

    Воспользоваться wic для сборки.
    Написать свой собственный скрипт, который делает всю рутинную работу за нас.

Пойдем по пути «минимум работы, максимум результата» и воспользуемся wic. Что же это такое? wic — это утилита для создание образов для SD карточек, flash, HDD… Более детально с его возможностями вы можете ознакомиться в документации. Пока же нам достаточно того, что wic может создать файл образа. Для начала пропишем путь к wic. Она находится в директории yocto/poky-jethro/scripts
PATH=$PATH:/home/pavlya/Projects/yocto/poky-jethro/scripts
И выполним команду
wic create sdimage-bootpart -e core-image-sato
В процессе работы у меня возникла вот такая ошибка

Выполним команду
bitbake dosfstools-native mtools-native parted-native
и соберем образ с помощью команды wic create sdimage-bootpart -e core-image-sato

Готово. Месторасположение образа:
Info: The new image(s) can be found here:
/var/tmp/wic/build/sdimage-bootpart-201605071524-mmcblk.direct
Теперь запишем образ на SD карту c пощью утилиты dd. Для начала выясним, каке из устройств в /dev наша SD карта. Для этого выполним команду:
ls /dev | grep sd
Результат:
sda
sda1
sda2
sda5
sdb
Теперь вставим SD карту в компьютер и еще раз выполним ls
ls /dev | grep sd
Результат:
sda
sda1
sda2
sda5
sdb
sdb1
sdb2
sdb
Ну вот и разобрались. Образ нужно писать в sdb. Утилиты dd запускается с двумя параметрами: if(указывает на источник, т.е. на то, откуда копируем. Указывается файл, который может быть как обычным файлом, так и файлом устройства) и of(указывает на файл назначения. То же самое, писать можем как в обычный файл, так и напрямую в устройство). Будьте внимательны. dd выполняет всего лишь побайтное копирование. Введя не то имя в параметр of вы рискуете совершить ритуальный танец на граблях запортить данные на винчестере, если у вас их несколько.
Запишем образ
sudo dd if=/var/tmp/wic/build/sdimage-bootpart-201605071524-mmcblk.direct of=/dev/sdb
Готово. Теперь попробем запустить Linux. Для контроля процесса загрузки подключимся к терминалу, который в Beaglebone Black выведен на UART. Параметры порта: 115200 8N1

Вставим карточку в слот, зажмем кнопку расположенную над слотом с верхней стороны платы (если не зажать, Linux будет стартовать с eMMC расположенного на плате, а не SD) и подадим питание через USB.
Готово.

P.S.: Сейчас плата при подключении к компьютеру через USB никак не определяется. О том, почему это произошло и как это починить, читайте в следующей публикации.

6 комментариев

avatar
Теперь в директории build, которая появилась после выполнения команды, найдем файл local.conf и откроем его в текстовом редакторе. Расскоментируем строку:

MACHINE ?= «beaglebone»
А если у меня, например, своя плата, с другим процессором, или какая-нибудь редкая китайская? Там есть для таких случаев простое решение?
avatar
Если своя собственная на основе какой-то девборды, тогда проще. Просто берем рецепты девборды и меняем что необходимо. Если редкая китайская — простого решения может и не быть.
Комментарий отредактирован 2016-05-08 23:44:24 пользователем Pavlya
avatar
Собственно, я уже писал, когда учил йокто, никак не мог разобраться в его документации. Помогла книжка Embedded Linux Development with Yocto Project, после которой официальная документация становится понятной. Рекомендую.
avatar
Спасибо за пост! С нетерпением жду продолжения. (эх, больше бы матерьяла по подобной тематике)
avatar
а дальше что было?) на самом интересном месте! куда хоть копать дальше?
avatar
Часть второй статьи в черновике висит. Но сейчас, к сожалению, не до нее. (( Если коротко то нужно сделать следующее:
1 Включить поддержку Ethernet Gadget для USB устройств в ядре (перед сборкой ядра)
2 Если модуль g_ether (модуль Ethernet Gadget для USB устройств) собрался как отдельный модуль, то нужно явно прописать его загрузку при старте линукса. Если же его собрали как часть ядра — то прописывать не надо ))
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.