* Lib: move cube to libs. Firmware: prepare for code base refactoring, detach from cube, port to cmsis_os2. * Firmware, target f2: regenerate project with latest cube package, tim17 for os ticks. * Firmware: unified codebase. * Core: do not include semaphore on old targets. Firmware: dfu uplaod target. * CI: submodules, add firmware build. * CI: proper submodule config. * refactor build system * CI: update chain to use new targets. Documentation: update to match current structure. * CI: clean before rebuild. * Add local test docker-compose exec dev make -C firmware TARGET=local TEST=1 run * Makefile: target specific build directory. CI: updated artifacts path. * Makefile: init git submodules if they don't exists. * Makefile: debug rule now doesn't reset MCU, prevent SIGINT propagation to st-util. * Makefile: proper rebuild sequence in zz and zzz * Makefile: timestamp tracking for flash and upload commands. * Apps: modular build. Input: fix flipper hal inline. * Wiki: proper bootloader link. * Applications: fix broken build for local targets. * add st-flash to docker * fix build * force rebuild app * move app force to firmware part * fix build deps * qrcode build ok * fix example display * add testing routine * update build instruction Co-authored-by: Aleksandr Kutuzov <aku@plooks.com> Co-authored-by: aanper <mail@s3f.ru>
4.1 KiB
Overview of Flipper firmware architecture:
Project structure
.
├── applications # Flipper applications
├── bootloader # Bootloader make project
├── core # Main feature like OS, HAL (target-independed)
├── core-rs # Rust code
├── docker # Docker toolchain container
├── firmware # Firmware make project
├── lib # Libs and 3rd parties
├── make # Makefile scripts
├── wiki # Documentation (wiki) generates from this files
└── wiki_static # Static files for wiki
HAL
We use STM32 HAL/LL. Description available here: dm00105879.pdf
Flipper HAL
Some flipper-specific implementation of gpio/HAL:
- Init gpio pin:
app_gpio_init
- Fast write gpio (inline):
app_gpio_write
- Fast read gpio (inline):
app_gpio_read
- Microsecond delay
delay_us
- Set PWM on timer's pin:
pwm_set
Files location: /app/app_hal.[ch]
Bootloader
For production targets('f2' and newer) bootloader must be flashed first.
Detailed instruction on how to compile and flash it you can find in bootloader
folder.
Production version is going to have following features:
- Hardware initialization
- Firmware CRC check
- Firmware update
- Interactive UI
- Boot process LED indicators
- FS check
- Recovery mode
OS
CMSIS-RTOS2 over FreeRTOS
Platform code
CMSIS, Freertos and HAL files are generated by CubeMX.
You can find platform code for L476 version in f2
folder:
Inc
Src
— CubeMX generated headers & codeMiddlewares/Third_Party/FreeRTOS/Source
— freeRTOSdeploy.sh
— flash firmware to deviceSTM32L476RGTx_FLASH.ld
— linker scriptstartup_stm32l476xx.s
— board startup/initialization assembler codecube.ioc
— CubeMX project file
You can regenerate platform code:
- Download CubeMX from st.com
- Open
*.ioc
file - Click
generate code
- After regenerating, look at git status, regenerating may broke some files.
Flipper Universal Registry Implementation (FURI)
FURI is used to:
- application control (start, exit, switch between active)
- data exchange between application (create/open channel, subscribe and push messages or read/write values)
- non-volatile data storage for application (create/open value and read/write)
Read more at FURI page
FS (not implemented)
File system is used to volaile storage some files (config, application data, etc.). There are some folders mounted to different volumes:
/usr
for store static data like assets, menu items. Build system add files to usr while building. It can be useful for exchange some static data between application. For example, your app can add link to itself to Plugins menu items file, user will see your app and can call it from this menu.- Specially
/usr/etc-default
folder contains default configs for apps. Bootloader hasfactory default
options to reset applications config. Also when new app is bootstapping, system copy files from default config folder to/etc
. /etc
for store configs of application. This volume not overwrite during flashing./var
for store some application data (saved keys, application database, logs). This volume also not overwrite during flashing./media/*
mounted if SD card is inserted.
Flipper applications
Each flipper functionality except OS/HAL/FURI doing by Flipper application. Some application are called at startup, the rest are called by the user (for example, from menu).
(you can see some examples)
For exchange data between application each app expose own record in FURI. You can subscribe on/read record to get data from application and write to record to send data to application.