STM32 з нуля без HAL: Buildroot, Luckfox і перший крок у embedded Linux Частина 5

STM32 вивчено, що далі?

Місяць перший закрито. GPIO, UART, I2C, SPI, Timer все є, все працює, свій HAL написаний. Але якщо подивитись на вакансії embedded розробника там завжди є рядок: «досвід з Linux, Buildroot, Device Tree». І ось тут наш крутезний bare-metal HAL нікому не цікавий.

Починаю другий місяць своєї епопеї і цей місяць це перехід в інший світ. STM32 більше не головний герой. Тепер він просто периферія. Мозком стає Luckfox Pico Pro — маленька плата з ARM Cortex-A7, 128MB RAM і повноцінним Linux всередині. Коштує ~$15.

Що будемо робити: зберемо власний Linux образ з нуля через Buildroot, навчимось додавати власні пакети (BR2_PACKAGE), розберемось з автозапуском через init.d. А в наступних частинах — U-Boot і перший міст STM32 ↔ Linux через UART.

ЧАСТИНА 1: Середовище і збірка образу

Чиста машина — чистий старт

Всі дії виконуються на Ubuntu 22.04. Спеціально беремо чисту машину — щоб читач міг повторити з нуля без «а у мене вже щось стояло».

Встановлення STM32 toolchain

 

Перевірка:

Проблема яку не очікував: BRLTTY

Підключив CH340 адаптер — і /dev/ttyUSB0 не з’являється. lsusb плату бачить, але файлу немає.

 

В логах знаходимо винуватця:

BRLTTY — програма для шрифту Брайля. Вона перехоплює CH340 і відключає його одразу після підключення.

brltty є в базовій установці Ubuntu 22.04. Для розробки він абсолютно непотрібний.

Після видалення перепідключи CH340 — /dev/ttyUSB0 з’явиться одразу.

І традиційно — права доступу:

Встановлення залежностей для Buildroot

golang-go потрібен на хості для збірки Go пакетів в Buildroot. Без нього збірка впаде з ‘go: command not found’.

Клонування Luckfox SDK

SDK важить ~1GB. Встановлюємо cross-compilation toolchain:

Скрипт може видати ‘sed: cannot read ~/.bash_profile’. Не помилка — toolchain налаштовується.

Встановлюй змінну BUILDROOT на початку кожної сесії — вона не зберігається між терміналами. Додай в ~/.bashrc: export BUILDROOT=~/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6

Вибір конфігурації і збірка

 

З меню вибираємо для Luckfox Pico Pro (Flash, SPI NAND):

 

Перша збірка — 20-40 хвилин. Образ буде тут: output/image/update.img

Прошивка через upgrade_tool

 

Maskrom режим: затисни BOOT → підключи USB → відпусти BOOT.

Завжди вказуй повний шлях до образу — щоб не переплутати з офіційним образом з сайту.

Перевірка: це наш образ?

Дата збірки сьогоднішня. Значить це мій образ.

 

Пакети, BR2_PACKAGE і автозапуск

Developer Image: toolbox для embedded розробки

Базовий образ мінімальний. Для розробки потрібно більше. Buildroot дозволяє додати будь-який пакет через menuconfig.

menuconfig — вибір пакетів

 

В меню Target packages додаємо:

  • Networking: nmap, tcpdump, iperf3
  • Debugging: strace, lsof, gdbserver
  • System tools: htop
  • Interpreter languages: python3
  • Text editors: nano

 

Фейл з mc: uclibc vs glibc

Спробував додати Midnight Commander (mc). Збірка впала:

Luckfox використовує uclibc — легша бібліотека без повної підтримки wide characters. mc потребує саме їх. В embedded Linux не все з Ubuntu можна просто скомпілювати.

uclibc vs glibc — перший урок реального embedded. Buildroot SDK визначає що можна використовувати.

BR2_PACKAGE: власний Go сервер

Стандартні пакети — це галочки в menuconfig. Для власного коду є BR2_PACKAGE — механізм інтеграції в систему збірки Buildroot.

Структура пакету:

Config.in — важливо: таби не пробіли

Buildroot Config.in вимагає таби. Пробіли — пакет невидимий в menuconfig пошуку. Перевір: cat -A Config.in → має бути ^I на початку рядків.

go-dashboard.mk

$(TOPDIR) — правильний шлях для цього SDK. $(BR2_EXTERNAL_LUCKFOX_PATH) не працює.

Підключення до Buildroot

Якщо зламав Config.in: wget -O $BUILDROOT/package/Config.in \ https://github.com/buildroot/buildroot/raw/2023.02.6/package/Config.in

Автозапуск: init.d і підводні камені

init.d скрипти в Buildroot виконуються при старті системи. Число в назві визначає порядок — S98 запускається перед S99.

S98go-dashboard — запуск Go сервера:

start-stop-daemon — не використовуй для Go процесів на Buildroot Luckfox. Вішає систему при boot. Тільки nohup … & працює надійно.

S99staticip — статичний IP після DHCP:

 

sleep 5 — чекаємо поки udhcpc завершить роботу. /etc/network/interfaces не допомагає — udhcpc стартує незалежно і перебиває статичний IP. S99staticip з sleep 5 — єдиний надійний спосіб на Buildroot Luckfox.

ubifs: чому старі файли залишаються після прошивки

Виявили цікаву особливість: після прошивки нового образу старі файли в /etc/init.d/ залишались навіть якщо їх не було в новому образі.

Причина: ubifs (UBI File System) на SPI NAND не перезаписує файли які не змінились. upgrade_tool оновлює партиції інкрементально. Файл вже є у флеші — і залишається там навіть якщо в новому образі його немає.

Рішення: upgrade_tool ef (erase and flash) стирає флеш повністю перед прошивкою. Або просто видалити файл вручну на платі перед тестуванням нової версії.

Результат: перевірка після прошивки

 

Час правильний — NTP синхронізувався через Ethernet. Через USB RNDIS NTP не працює стабільно.

RNDIS vs Ethernet: важливий висновок

USB RNDIS з’єднання (172.32.x.x) — нестабільне для SSH сесій. Термінал підвисає через ~20 секунд без активності. Ctrl+C/Z не допомагають.

Ethernet через роутер (192.168.1.x) — стабільне. Підключай плату кабелем до роутера для нормальної роботи.

RNDIS підходить тільки для першого підключення і прошивки. Для розробки завжди використовуй Ethernet.

Підсумок

За два тижні пройшли шлях від чистої Ubuntu до власного Linux образу з Go HTTP сервером і автозапуском:

 

  • Встановили STM32 і Buildroot оточення на чистій машині
  • Вирішили проблему BRLTTY — типову для Ubuntu 22.04
  • Зібрали образ для Luckfox Pico Pro з нуля через build.sh all
  • Прошили через upgrade_tool в Maskrom режимі
  • Зібрали Developer Image: htop, nmap, python3, strace, tcpdump, iperf3
  • Познайомились з uclibc — не все з Ubuntu компілюється в embedded
  • Написали BR2_PACKAGE і зібрали Go сервер як частину образу
  • Налаштували автозапуск через init.d і статичний IP
  • Розібрались з ubifs — чому старі файли залишаються після прошивки

Наступні частини: U-Boot і boot sequence — розберемось як система завантажується від першої інструкції до нашого шела. І головне — з’єднаємо STM32 і Luckfox через UART.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *