Open Stream Deck

Разработка прошивки

Модули, проверки, стиль кода, генерация букв заставки и правила при изменении аппаратного кода.

Модули

ФайлНазначение
src/main.cЗапуск, очередь HID-отчётов и обслуживание платы
src/platform.cТактирование, кэши, watchdog и вход в загрузчик
src/timebase.cВремя через DWT или SysTick
src/keys.cМатрица клавиш и подавление дребезга
src/display.cSPI, DMA, контроллер дисплея и рисование
src/usb_device.cUSB MUSB и транспорт HID
src/usb_descriptors.cUSB и HID-дескрипторы
src/osd_protocol.cПотоковый разбор команд OSD1
src/boot_anim.cЗаставка и переход к экрану приложения
src/idle_game.cИгра на время ожидания приложения
src/memory.cmemcpy и memset
startup/startup.SВекторы, начальная инициализация и обработчик отказа
linker/application.ldРазмещение секций в памяти

Проверки

bash test.sh
bash analyze.sh
bash build.sh

Тесты C работают на хосте с AddressSanitizer и UndefinedBehaviorSanitizer. Они проверяют команды OSD1, разбиение потока между отчётами, ошибки и SYNC, USB control transfers, Full Speed и High Speed, заполнение очереди, клавиши, таймер, транзакции дисплея, заставку и игру. Тесты Python проверяют скомпилированные HID-дескрипторы, ELF, контрольные суммы и версию.

Аппаратные обращения подменяются макросами USB_HOST_TEST, KEYS_HOST_TEST, TIMEBASE_HOST_TEST и DISPLAY_HOST_TEST. В целевой сборке эти определения отсутствуют.

Тесты на хосте не проверяют электрические задержки, DMA и физическую ориентацию кнопок. После изменения аппаратного кода проверьте на устройстве запуск, USB, все кнопки и их отпускание, одновременные нажатия, цвета, яркость, заставку, игру и переподключение USB.

GitHub Actions выполняет проверку синтаксиса скриптов, форматирование, статический анализ ARM GCC, тесты и сборку при push и pull request. Результаты и файлы сборки доступны в сводке запуска.

Стиль

Целевая платформа ARMv7-M, Thumb, soft-float, C11, freestanding. Основные модули собираются с -Os, дисплей и протокол с -O2. Предупреждения компилятора считаются ошибками. CC задаёт компилятор ARM, HOST_CC компилятор тестов.

Для форматирования нужен clang-format 18:

sudo apt install clang-format-18
CLANG_FORMAT=clang-format-18 bash format.sh
CLANG_FORMAT=clang-format-18 bash format.sh --check

Стиль задают .clang-format и .editorconfig: UTF-8, LF, отступ четыре пробела. Описание протокола и аппаратных ограничений находится в docs/, а не в комментариях исходников.

При рефакторинге сохраняйте порядок volatile-доступов, повторные записи в регистры, барьеры и выравнивание буферов DMA. Изменение задержек или оптимизаций требует проверки на плате.

Версия

Версия задаётся в FIRMWARE_VERSION файла tools/version.py в формате MAJOR.MINOR.PATCH, каждое число от 0 до 255. Она используется в ответе HID, именах BIN, ELF и MAP и в firmware.json.

Буквы заставки

Для обычной сборки достаточно include/boot_glyphs.h. Чтобы изменить буквы, нужны вариативный шрифт Inter (inter-latin-wght-normal.woff2 из пакета @fontsource-variable/inter), Pillow, fontTools и brotli:

python3 -m venv .venv
. .venv/bin/activate
python3 -m pip install Pillow fontTools brotli
python3 tools/glyphs.py inter-latin-wght-normal.woff2 --weight 600 --size 68
CLANG_FORMAT=clang-format-18 bash format.sh

Генератор сохраняет 4-битную альфу, по два пикселя на байт. Параметр --size задаёт размер шрифта в пикселях.