Onion Omega2 — это одноплатный компьютер на базе MIPS-процессора, имеющего следующую периферию: Wi-Fi, Ethernet 10\100 Мбит, UART, PWM, I2C, SPI, USB, SDIO и GPIO. В качестве ОС используется Linux LEDE (Linux Embedded Development Environment), базирующийся на OpenWRT.
Статья-мануал о том, как начать писать и отлаживать программы на С\С++ для Omega2 в Visual Studio 2017. Если интересно, прошу под кат:
Выбор версии LEDE и её обновление
В качестве отладочной платы у меня плата собственной разработки с модулем Omega2S+ (максимальная комплектация с 32 Мбайт памяти, 128 Мбайт ОЗУ и SDIO для подключения MicroSD карт). При первом включении на ней будет старый билд LEDE, и его требуется обновить, вот тут есть разные пути. Рассмотрим как различие версий ОС (стабильные и девелоперские), так и пути обновления.
Итак, вначале необходимо определиться с установленной версией дистрибутива LEDE в модуле, тут я пришёл к следующим вариантам:
- Выбираем версию v0.2.0 b177, основная причина — на ней нормально работает вывод звука по I2S, и если у вас внешний ЦАП именно I2S, то более новые версии дистрибутива имеют поломанный I2S драйвер (и его не чинят, более того, советуют подключать USB ЦАП и не париться, что я считаю «индусским бредом»), более того, как я ни пытался, я так и не смог заставить корректно Visual Studio работать с этой версией по ssh (как встроенному, так и дополнительно установленному open-ssh) — то не подключалось, то sftp не работало…
- Обновляем до последней стабильной версии — v0.2.2 b200, тут уже поломан I2S, но проблем с подключением нет, и остальное вполне корректно работает;
- Выбираем последнюю девелоперскую версию — на ваш страх и риск, к ней вроде бы подключалось всё нормально, но гарантий никаких.
Я же начал с 1-го варианта, просто скачал с официального сайта omega2/images/ следующий билд — omega2p-v0.2.0-b177.bin (именно «p» в конце имени для моей версии модуля Omega2s+, для обычных Omega2s необходимо скачивать omega2-v0.2.0-b177.bin), скидываем его на флешку с файловой системой FAT32, подключаем флешку к плате.
Запускаем putty и выбираем COM порт платы (скорость 115200):
Пустота в терминале:
Нажимаем Enter и терминал приветствует нас, теперь мы можем вводить команды (не обращайте внимания на версию):
Заходим на флешку:
cd /tmp/mounts/USB-A1
И запускаем процедуру ручного обновления до указанного образа:
sysupgrade omega2p-v0.2.0-b177.bin
Да, можно проверить, насколько актуален текущий (работающий) в модуле LEDE, следующей командой:
oupgrade -c
И на этом первый вариант для меня закончился, т. к. я несколько вечеров просидел, пытаясь понять и решить, почему Visual Studio вообще никак не подключается к встроенному ssh (как будто доступа нет, хотя putty подключается без проблем), а также к дополнительно установленному open-ssh на другом порту (с различными конфигурациями последнего) не подключается или не может скачать\залить исходники.
Поэтому, вдоволь намучившись, я уже пошел по второму варианту, просто обновив LEDE до последнего стабильного билда следующей командой:
oupgrade
Примечание: Все дальнейшие действия в статье будут описаны для v0.2.2 b200 как последнего официального стабильного билда LEDE.
И если вы любите риск, то 3-й вариант для вас — команда для обновления на самую последнюю (нестабильную) версию:
oupgrade -l
И да, посмотреть текущую версию в модуле можно командой:
oupgrade -v
Подготовка LEDE
Определившись и обновив LEDE, нам необходимо расширить память, чтобы установить компилятор, отладчик и т. д., а также иметь место для экспериментов.
Вводим команду:
df -h
И видим, что в /overlay у нас свободно места чуть более 21 Мбайт, чего не хватает даже на установку GCC, печально. Место же можно расширить 2-мя способами для Omega2S+ — microSD-флешкой или USB-флешкой (для обычной версии Omega2S — только USB), я на плате развёл всё для MicroSD флешек и USB терять не хочу, поэтому буду показывать на примере MicroSD (всё можно также посмотреть в официальном гайде с небольшими неточностями тут — Booting from External Storage).
Вначале обновляем репозитории:
opkg update
Устанавливаем набор утилит для работы с различными файловыми системами:
opkg install e2fsprogs
Демонтируем подключенную флешку:
umount /tmp/mounts/SD-P1
Форматируем её на файловую систему EX4:
mkfs.ext4 /dev/mmcblk0p1
Создаём ссылку и монтируем флешку:
mkdir /mnt/mmcblk0p1
mount /dev/mmcblk0p1 /mnt/
Перемещаем /overlay в смонтированную флешку:
tar -C /overlay -cvf — . | tar -C /mnt/ -xf —
umount /mnt/
Ставим утилиту для автоматического подключения флешки при запуске:
opkg install block-mount
Генерируем fstab для подключенной флешки:
block detect > /etc/config/fstab
Открываем конфигурацию fstab в редакторе vi (да, мануал по работе с редактором vi):
vi /etc/config/fstab
Нажимаем «i» для перехода в текстовый режим. Теперь находим следующую строку:
option target ‘/mnt/mmcblk0p1’
И переписываем на:
option target ‘/overlay’
А также в строке:
option enabled ‘0’
Меняем 0 на 1:
option enabled ‘1’
Нажимаем «ESC» для перехода в режим команд. Набираем:
:wq
И жмём «Enter«. Всё готово. Перезагружаем модуль командой:
reboot
После загрузки можно проверить память:
df -h
Теперь в /overlay должны появиться гигабайты пустого места, можно переходить к следующим шагам.
Установка компилятора, отладчика
Для установки утилит компилятора, отладчика и прочего необходимо сначала зайти в конфигурацию источников пакетов командой:
vi /etc/opkg/distfeeds.conf
Далее необходимо раскоментировать следующие строки:
src/gz reboot_base http://downloads.lede-project.org/snapshots/packages/mipsel_24kc/base
src/gz reboot_packages http://downloads.lede-project.org/snapshots/packages/mipsel_24kc/packages
Примечание: ссылки могут отличаться в других версиях, ключевые слова здесь — reboot_base и reboot_packages.
Теперь обновляем доступные пакеты к установке командой:
opkg update
Ставим компилятор GCC:
opkg install gcc
Ставим утилиты Make:
opkg install make
Ставим GDB-отладчик:
opkg install gdb
Если необходимо, то можно поставить GDB-сервер для отладки, но в моём случае это не требуется:
opkg install gdbserver
Также ставим упаковщик ZIP-архивов (понадобится для скачивания заголовков исходников):
opkg install zip
А также утилиту TTY для работы с одним терминалом из нескольких процессов (необходимо для отладки через Visual Studio):
opkg install coreutils-tty
Вот вроде и всё, Omega2 готова к подключению, компиляции и запуску отладки первого проекта!
Первый проект
Создаём Console Application из раздела Cross Platform (необходимо для этого установить утилиты для разработки под Linux, подробнее можно прочитать в Установка WSL и тестовый проект в Visual Studio 2017):
Заходим в свойства проекта и проверяем параметры отладки (отладка посредством GDB):
Да, тут же создаём новую архитектуру платформы — MIPS, под которую будет проект (нажимаем New… и можно скопировать настройки из ARM64):
Да, ещё можно изменить удалённую директорию (в данном случае в папке пользователя на Omega2 будет создана папка projects, и в ней уже папка проекта), куда будут скопированы исходники и произведена компиляция:
Остальные настройки проекта можно пока не трогать, для старта значения по умолчанию подходят. Далее добавляем исходники к проекту (в моём случае это работа с GPIO и I2C):
И в main.c (или main.cpp, я просто решил создать чисто С проект) добавляем код, который будем отлаживать (хотя для начала вполне хватит вывода строки посредством printf):
Здесь я вывожу строку приветствия в консоль, настраиваю GPIO на выход (для светодиода RGB) и на вход (для одной кнопки), инициализирую OLED по I2C, в бесконечном цикле меняю по коду Джонсона значение светодиодов и вывожу его на дисплей.
Номера GPIO я беру из схемы на отладку для Onion Omega2S (собственной разработки, но RGB-светодиод и I2C OLED подключёны аналогично официальным платам):
Не забываем, что светодиоды подключены катодами к GPIO (зажигаем 0):
И для OLED есть возможность изменить его I2C адрес (по умолчанию аналогичен официальным платам — 0x3C):
Когда проект создан и добавлены исходники для первой пробы, требуется теперь в Connection Manager создать подключение к нашей плате. Заходим в опции:
Далее заходим в Cross Platform -> Connection Manager :
Указываем IP, порт и имя пользователя с паролем (по умолчанию это root \ onioneer, да, будем под рутом… но можно создать отдельного пользователя для этих целей):
После успешного подключения будет попытка скачать заголовки:
Но если зайти в папку кеша (%userprofile%\AppData\Local\Microsoft\Linux\HeaderCache\1.0\*random*\) на ПК, с которого мы подключались, то можно увидеть следующую картину:
Заголовки не скачаны и, соответственно, в проекте никакие дефайны и заголовочные файлы автоматом не будут доступны через IntelliSence. Надо исправлять!
Самый простой путь — это задать вариант скачивания исходников в виде архива (для чего ранее и устанавливали zip). Для этого в папке заголовков, в её корне находим файл settings.xml.unused и переименовываем его в settings.xml, тем самым разрешая применение настроек из него для Connection Manager:
Теперь открываем его и меняем в параметр syncMethod на sftp_ssh:
Открываем опять Connection Manager и жмём обновить:
Вуаля:
Всё на месте!
Вот и всё, теперь можете нажимать на запуск отладки на выбранном IP:
Visual Studio подключится, скопирует исходники, откомпилирует и запустит отладку. Всё аналогично WSL. На гифке выше пример запуска приложения и остановка по breakpoint, выполнение на реальном железе приостанавливается, а также в окне Autos отображаются значения локальных переменных, и можно отлаживаться как с обычным приложением.
Спасибо, что прочитали! Удачного кодинга. ;)
Ссылки
- Omega2S — характеристики модуля, документация на официальном сайте;
- Установка WSL и тестовый проект в Visual Studio 2017 — ознакомительная статья по этому направлению;
- omega2/images/ — все билды LEDE в бинарном виде;
- Manual Firmware Installation — ручная установка билда;
- Updating the Omega — автоматическое обновление билда;
- Booting from External Storage — расширение памяти за счет внешней флешки и загрузка с неё;
- Работа с редактором vi — описание команд текстового редактора vi;
- Compiling C on the Omega — описание базовых основ для компиляции C\C++ исходника на Omega2.