Многим устройствам на базе встраиваемых систем необходим интернет. Проводное подключение к интернету для них не всегда возможно, и если устройства находятся в зоне действия сотовой связи, то к интернету можно подключиться с помощью GSM/3G/4G-модемов.  В этой заметке описан процесс создания дистрибутива ОС Linux для встраиваемой системы при помощи инструментария Yocto Project, позволяющий подключать устройство к интернету через GSM/3G/4G-модем и протокол PPP. Дистрибутив ОС Linux для встраиваемой системы будем собирать с помощью Yocto Project версии THUD 2.6.4 на ПК под управлением ОС Ubuntu 18.04. Роль встраиваемой системы будет играть устройство BeagleBone Black Rev. C с подключенным к нему LTE-модемом Quectel EC21-E. Для этого мы воспользуемся отладочным набором UMTS&LTE EVB для тестирования UMTS и LTE модулей Quectel. Структурная схема стенда, с которым мы будем экспериментировать, приведена на рис. 1.  Рисунок 1 — Структурная схема стенда Убедитесь, что на вашем ПК есть 50 ГБ свободного дискового пространства и на нем установлены: Установим необходимые пакеты: На этом подготовка ПК для сборки дистрибутива с использованием инструментария Yocto Project закончена. Любопытные читатели могут получить более подробную информацию ознакомившись с Yocto Project Quick Build. Создадим в домашней директории каталог, где у нас будет хранится репозитории Poky и мета-слои с рецептами. Назовем его habr-yocto-lte: Перейдем в директорию habr-yocto-lte и создадим пустой git репозиторий: Добавим в созданный git-репозиторий, в виде подмодулей, проект Poky и слой meta-ti: Poky это как раз тот самый инструмент, с помощью которого мы будем собирать наш дистрибутив, а meta-ti – это слой, который объединяет в себе наборы рецептов, классов и конфигурационных файлов для процессоров Texas Instruments. Подробнее о том, что такое Poky и мета-слои можно узнать из Yocto Project Overview and Concepts Manual. Создадим файл oe-init-build-env и сделаем его исполняемым: Добавим в него следующий код: Файл oe-init-build-env мы будем запускать всякий раз, при открытии нового окна терминала. Давайте запустим его командой: При первом выполнении скрипта в папке ~/habr-yocto-lte будет создана папка build, содержащая конфигурационные файлы и результаты сборки дистрибутива, а в окне терминала мы увидим нечто вроде этого: В принципе, теперь у нас все готово для сборки дистрибутива, но мы сделаем еще несколько «штрихов»: Запустим сборку дистрибутива: Пока собирается дистрибутив можете пойти вздремнуть, у вас есть на это часа 4 :). Потом будет собираться всё гораздо быстрее. Дистрибутив сохранится в каталоге ~/habr-yocto-lte/build/tmp/deploy/images/beaglebone Устройство, на котором будет установлен дистрибутив, созданный в предыдущем разделе, уже сможет распознать LTE-модуль Quectel EC21-E, т.к. его драйвера есть в ядре Linux. Однако для подключения устройства к интернету нам необходимо добавить поддержку протокола PPP в ядро Linux, а также добавить в наш дистрибутив пакет ppp и написать для него файл расширения рецепта, который «расскажет» bitbake как и куда установить в нашем дистрибутиве необходимые файлы для pppd и chat, являющиеся частью пакета ppp. Для конфигурирования ядра выполним команду: Откроется стандартное окно menuconfig в котором надо выбрать: Сохраняем конфигурацию и выходим из menuconfig. Учтите, что эта конфигурация будет применяться только на том ПК, на каком она была сохранена. Для того что бы она применялась на любом ПК при клонировании проекта из репозитория, необходимо сохранить конфигурацию в файле defconfig и написать рецепт расширения для recipes-kernel. Сохраним конфигурацию ядра в файле defconfig: Файл defconfig сохранится в каталоге ~/habr-yocto-lte/build/tmp/work/beaglebone-poky-linux-gnueabi/linux-ti-staging/4.19.94+gitAUTOINC+5a23bc00e0-r22a/build Все рецепты расширения и рецепты, написанные нами, будем хранить в отдельном мета-слое. Создадим и назовем его meta-habr: В каталоге ~/habr-yocto-lte появится директория meta-habr – это и есть наш мета-слой. В этой директории будет пример рецепта recipes-example, он нам не нужен, удалим его, а затем добавим наш мета-слой в файл bblayers.conf: Пришло время сделать рецепт расширения для ядра Linux. Создаем необходимые каталоги и файлы: Копируем ранее созданный файл defconfig в каталог ~/habr-yocto-lte/meta-habr/recipes-kernel/linux/linux-ti-staging/beaglebone и добавляем в файл linux-ti-staging_%.bbappend следующий код: Теперь конфигурация ядра, определенная в файле defconfig будет применяться всегда при сборке дистрибутива. Соберём его и убедимся, что требуемые модули PPP установлены: Пакеты программ добавляются в дистрибутив с помощью переменной IMAGE_INSTALL_append. Добавим её в конец файла local.conf и присвоим ей значение соответствующее имени пакета: Соберём дистрибутив и убедимся, что пакет ppp установлен: Теперь в нашем дистрибутиве есть все для того чтобы подключить устройство к интернету через LTE-модем. Однако мне лично не очень хочется настраивать pppd и chat, входящие в пакет ppp, непосредственно на устройстве. Поэтому давайте добавим необходимые скрипты для этих программ в наш дистрибутив с помощью расширения рецепта ppp. Создадим три файла скриптов habrppp, habr-chat-connect и habr-chat-disconnect со следующим содержимым: Несколько комментариев по представленным выше скриптам.
LTE-модуль Quectel EC21-E определятся в системе в виде четырёх последовательных портов: Если в вашей системе есть другие USB-устройства, то нумерация портов, возможно, будет отличаться от приведенной выше, но последовательность останется та же. Поскольку в нашей системе нумерация портов соответствует выше приведенной, то в скрипте habrppp мы указали в качестве порта для соединения по протоколу PPP порт /dev/ttyUSB3.  Обратите внимание на поля user и password в скрипте habrppp, а также на APN в команде AT+CGDCONT в скрипте habr-chat-connect, они должны быть установлены согласно рекомендациям сотового оператора. Осталось совсем чуть-чуть. Создадим каталоги и файл для рецепта расширения ppp: Скопируем скрипты, написанные в предыдущем разделе в папку ~/habr-yocto-lte/meta-habr/recipes-connectivity/ppp/ppp/beaglebone и добавим следующее содержимое в файл ppp_%.bbappend: Вы, наверное, заметили, что к тем трем файлам скрипта добавился файл 20-habr-modem.rules. Это правило для udev, согласно которому при возникновении в системе порта ttyUSB3 будет автоматически запущена служба pppd с нужными нам настройками. Таким образом наше устройство будет всегда подключаться к интернету при подключении модема к USB-порту. Содержимое файла 20-habr-modem.rules: Осталось собрать наш дистрибутив, с помощью программы balenaEtcher записать его образ на microSD карту памяти и запустить на устройстве. Теперь наше устройство подключено к интернету: Подключением к интернету через протокол PPP можно управлять вручную, с помощью команд pon и poff. Для установления соединения выполните команду: Для завершения соединения: Проект доступен по адресу https://gitlab.com/amamaev/habr-yocto-lte. Для клонирования репозитория выполните команду: