Сборка Yocto для Beaglebone

С каждым днем одноплатные компьютеры (такие как 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Осталось добавить путь к BitBake в переменную окружения PATH. В консоли выполним:
cd bitbake
git checkout -b 1.28 --track origin/1.28
PATH=$PATH:/home/pavlya/Projects/bitbake/binБудьте внимательны с путями. У вас они будут другими.
И еще раз выполним:
bitbake core-image-satoВ процессе экспериментов Yocto запросил доставить утилиты (ну и повысить версию bitbake)

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

Ну вот, все собралось. На четырех ядрах Intel Core i3 сборка заняла более 3 часов. Так что запаситесь терпением
Результаты сборки находятся в папке build/tmp/deploy/images/beaglebone. Теперь нам нужно создать загрузочную SD карточку, с которой будет стартовать Yocto. У нас есть несколько вариантов:
- Воспользоваться инструкцией с сайта 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:Теперь запишем образ на SD карту c пощью утилиты dd. Для начала выясним, каке из устройств в /dev наша SD карта. Для этого выполним команду:
/var/tmp/wic/build/sdimage-bootpart-201605071524-mmcblk.direct
ls /dev | grep sdТеперь вставим SD карту в компьютер и еще раз выполним ls
Результат:
sda
sda1
sda2
sda5
sdb
ls /dev | grep sdНу вот и разобрались. Образ нужно писать в sdb. Утилиты dd запускается с двумя параметрами: if(указывает на источник, т.е. на то, откуда копируем. Указывается файл, который может быть как обычным файлом, так и файлом устройства) и of(указывает на файл назначения. То же самое, писать можем как в обычный файл, так и напрямую в устройство). Будьте внимательны. dd выполняет всего лишь побайтное копирование. Введя не то имя в параметр of вы рискуете
Результат:
sda
sda1
sda2
sda5
sdb
sdb1
sdb2
sdb
Запишем образ
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 комментариев
1 Включить поддержку Ethernet Gadget для USB устройств в ядре (перед сборкой ядра)
2 Если модуль g_ether (модуль Ethernet Gadget для USB устройств) собрался как отдельный модуль, то нужно явно прописать его загрузку при старте линукса. Если же его собрали как часть ядра — то прописывать не надо ))