Настраиваем Clion для разработки под Flipper Zero

Flipper Zero — швейцарский нож для гиков и пентестеров с открытым исходным кодом.
Как только я получил это устройство — я сразу стал изучать как разрабатывать fap расширения, которые помогли бы мне в повседневной жизни и в работе.

В этой статье я расскажу как настроить Clion для сборки прошивки, приложений, и отладки через Wi-Fi Debugger Module.

Как оказалось, ребята из Flipper Inc разработали свой инструмент для стандартизации сборки и отладки на разных платформах, чтобы любой энтузиаст смог быстро установить необходимые инструменты и в пару кликов выполнять нужные для разработки операции.

Для VSCode даже существует готовое окружение с различными макросами в виде shell скриптов.


Сразу оговорюсь, что многое я подчеркнул из личного блога Савелия Красовского: https://krasovs.ky/2022/11/01/flipper-zero-clion.html, но дополнил инструкцию так, чтобы можно было отлаживать и fap приложения.

Приступаем к настройке

Для начала нужно клонировать git репозиторий с прошивкой флиппера, например, в папку с проектами Clion:

git clone --recursive https://github.com/flipperdevices/flipperzero-firmware.git

В репозитории находятся необходимые скрипты для установки инструментов сборки и отладки.

Далее установим необходимые утилиты, исполнив команду в папке проекта:

Для MacOS:

brew bundle --verbose

Или через pip (Для Windows или Unix)

pip3 install -r scripts/requirements.txt

После установки проверим, что Flipper Build Tool работает, для этого запускаем команду:

./fbt

Python скрипты должны скачать необходимые утилиты (GDB, GCC и так далее) и собрать прошивку.

Настройка основного функционала

Автодополнение кода и подсветка синтаксиса

После установки fbt можно открыть проект в Clion и приступить к базовой настройке.

Сперва сформируем CDB (Compilation Database) и импортируем в Clion.
Это нужно для автодополнения кода.

Исполним 3 команды:

./fbt
./fbt faps
./fbt firmware_cdb

После чего переходим в папку build -> lastes и копируем файл compile_commands.json в корень проекта. Затем нужно нажать по файлу правой кнопкой мыши и выбрать Load Compilation Database Project. Готово! Можно удалить файл из корня проекта.

Я пока не нашёл как автоматически подтягивать обновлённую базу из этого файла, если кто знает — добро пожаловать в комментарии :)

Осталось добавить Toolchain, для этого переходим в File -> Settings -> Build, Execution, Deployment -> Toolchains и создаём следующую конфигурацию:

  • C Compiler:  toolchain/{Ваша ОС}/bin/arm-none-eabi-gcc

  • С++ Compiler:  toolchain/{Ваша ОС}/bin/arm-none-eabi-g++

  • Debugger:  toolchain/{Ваша ОС}/bin/arm-none-eabi-gdb-py

На Mac с M1 у меня не проходит проверка Cmake, но это не важно, так как собирать прошивку и приложения мы будем через fbt.

Пример моей конфигурацииПример моей конфигурации

Добавляем удобные макросы как в VSCode

Как я и говорил ранее, для VSCode существует готовое, легко импортируемое окружение с множеством заданий, запускаемых в один клик из IDE. Мы попробуем сделать что-то подобное

Все задачи мы будем добавлять следующим образом:

  1. Кликнем вверху проекта Edit Configurations

  2. Нажмём + и выберем Shell Script

  3. Выберем Script Text и добавим Working Directory (Папка с проектом)

Для работы нам потребуются следующие задачи:

./fbt

Для сборки прошивки FpipperZeroДля сборки прошивки FpipperZero

./fbt FORCE=1 flash_blackmagic

Для загрузки прошивки через Wi-fi Dev BoardДля загрузки прошивки через Wi-fi Dev Board

./fbt fap_dist

Для сборки всех .fap расширенийДля сборки всех .fap расширений

./fbt launch_app APPSRC={Папка с вашим приложением}

Для сборки и загрузки вашего приложения на флиппер через USBДля сборки и загрузки вашего приложения на флиппер через USB

Вы можете расширить или изменить этот список, обратившись к документации. Для старта хватит пока и этого.

Настройка удалённого отладчика

Отладка будет осуществляться через удалённый GDB сервер.

Опять переходим в Edit Configurations вверху проекта и создаём конфигурацию Remote Debug:

57745bcad19810fa4ae1e29736cfff1e.png

  • Debugger — выбираем тот, который добавляли в Toolchain ранее.

  • 'target remote' args заполняем выводом команды ./fbt get_blackmagic (Wi-Fi дебагер должен быть подключён). Желательно настроить на Wi-Fi роутере статический ip для этого устройства, чтобы не менять конфигурацию.

  • Symbol file:  build/latest/firmware.elf — Путь к собранному elf файлу прошивки флиппера.

  • Sysroot: build/latest Путь к папке с собранной прошивкой

Перед запуском отладчика нужно выполнить некоторые команды на GDB сервере.
Для этого мы создадим Before launch блок External tool, нажав на +:

e8184c60b65fe7cfa486a397954c33fc.png

Блок будет выглядеть так:

dd252085e0efb7f48f03b82e5f9cec3f.png

Tool Settings

  • Program: Выбираем тотже отладчик, что и в Toolchain: toolchain/{Ваша ОС}/bin/arm-none-eabi-gdb-py

  • Arguments:
    -q -ex "target remote {заполняем выводом команды ./fbt get_blackmagic}" -ex "monitor swdp_scan" -ex "attach 1" -ex "set confirm off" -ex "set mem inaccessible-by-default off" -ex "source debug/flipperapps.py" -ex "fap-set-debug-elf-root {Тут нужен полный путь к папке .extraps в папке с собраной прошивкой, например /Users/user/CLionProjects/flipperzero-firmware/build/latest/.extapps}" -ex "quit" build/latest/firmware.elf

  • Working Detictory: Путь к папке с проектом

Теперь нужно создать файл .gdbinit в корневой папке проекта.
Файл заполнить следующим содержимым:

set confirm off
set trace-commands on

define target remote
target extended-remote $arg0
set mem inaccessible-by-default off
source debug/flipperapps.py
fap-set-debug-elf-root {Тут нужен полный путь к папке .extraps в папке с собраной прошивкой, например /Users/user/CLionProjects/flipperzero-firmware/build/latest/.extapps}
end

Готово! Сохраняем.

Теперь проверим отладку:

  1. Чтобы отладка заработала, нужно загрузить собранную прошивку в флиппер. Перед загрузкой прошивки рекомендую сделать бекап в приложении qFlipper, чтобы сохранить все настройки. Для загрузки прошивки используем задачи, созданные ранее: ./fbt и ./fbt FORCE=1 flash_blackmagic

  2. Нужно поставить точку остановки в файле firmware/targets/f7/furi_hal/furi_hal_os.c, на 154 строке:

8e9269754b3a047a3a6cbb21c7f2568a.png

  1. Запускаем отладку

В результате должна появиться отладочная информация:

763054056e5e4c284cd45a0fa785b239.png

Готово! Мы настроили удалённый отладчик!

Как отлаживать приложения

Приложения в Flipper Zero хранятся на SD карте и попадают в оперативную память только когда мы их запускаем. Поэтому, чтобы отладчик обнаружил нужный сектор, следует поставить точку остановки после загрузки приложения в память, чтобы отладчик успел вычитать ту область, в которую загрузилось приложение.

Для этого сначала поставим точку остановки в функции загрузчика fap расширений:
applications/main/fap_loader/fap_loader_app.c, на 107 строке.

6b5b3958d3bbc8b8b23ced6410bb592c.png

После этого можно поставить точки остановки в файлах вашего приложения, и начать отладку:

  1. Запустить отладку.

  2. На флиппере запустить ваше приложение.

  3. После того как вы запустили приложение — мы должны будем остановиться на точке, которую мы ранее поставили в fap_loader_app.c

  4. Нажимаем Resume Programm, после чего запустятся точки остановки, поставленные в коде приложения:

    e94328243c9ed03bbb87277322ee715a.png

1351667eeac18b6a1d82f548c5e4073d.png

Готово! Можно приступать разработке со всеми удобствами!

© Habrahabr.ru