flipperzero-firmware/documentation/HardwareTargets.md
hedger 224d0aefe4
[FL-2733] multitarget support for fbt (#2209)
* First part of multitarget porting
* Delete firmware/targets/f7/Inc directory
* Delete firmware/targets/f7/Src directory
* gpio: cli fixes; about: using version from HAL
* sdk: path fixes
* gui: include fixes
* applications: more include fixes
* gpio: ported to new apis
* hal: introduced furi_hal_target_hw.h; libs: added one_wire
* hal: f18 target
* github: also build f18 by default
* typo fix
* fbt: removed extra checks on app list
* api: explicitly bundling select mlib headers with sdk
* hal: f18: changed INPUT_DEBOUNCE_TICKS to match f7
* cleaned up commented out code
* docs: added info on hw targets
* docs: targets: formatting fixes
* f18: fixed link error
* f18: fixed API version to match f7
* docs: hardware: minor wording fixes
* faploader: added fw target check
* docs: typo fixes
* github: not building komi target by default
* fbt: support for `targets` field for built-in apps
* github: reworked build flow to exclude app_set; fbt: removed komi-specific appset; added additional target buildset check
* github: fixed build; nfc: fixed pvs warnings
* attempt to fix target id
* f7, f18: removed certain HAL function from public API
* apps: debug: enabled bt_debug_app for f18
* Targets: backport input pins configuration routine from F7 to F18

Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
2023-02-08 01:33:05 +09:00

3.2 KiB

What a Firmware Target is

Flipper's firmware is modular and supports different hardware configurations in a common code base. It encapsulates hardware-specific differences in furi_hal, board initialization code, linker files, SDK data and other information in a target definition.

Target-specific files are placed in a single sub-folder in firmware/targets. It must contain a target definition file, target.json, and may contain other files if they are referenced by current target's definition. By default, fbt gathers all source files in target folder, unless they are explicitly excluded.

Targets can inherit most code parts from other targets, to reduce common code duplication.

Target Definition File

A target definition file, target.json, is a JSON file that can contain the following fields:

  • include_paths: list of strings, folder paths relative to current target folder to add to global C/C++ header path lookup list.
  • sdk_header_paths: list of strings, folder paths relative to current target folder to gather headers from for including in SDK.
  • startup_script: filename of a startup script, performing initial hardware initialization.
  • linker_script_flash: filename of a linker script for creating the main firmware image.
  • linker_script_ram: filename of a linker script to use in "updater" build configuration.
  • linker_script_app: filename of a linker script to use for linking .fap files.
  • sdk_symbols: filename of a .csv file containing current SDK configuration for this target.
  • linker_dependencies: list of libraries to link the firmware with. Note that those not in the list won't be built by fbt. Also several link passes might be needed, in such case you may need to specify same library name twice.
  • inherit: string, specifies hardware target to borrow main configuration from. Current configuration may specify additional values for parameters that are lists of strings, or override values that are not lists.
  • excluded_sources: list of filenames from the inherited configuration(s) NOT to be built.
  • excluded_headers: list of headers from the inherited configuration(s) NOT to be included in generated SDK.
  • excluded_modules: list of strings specifying fbt library (module) names to exclude from being used to configure build environment.

Applications & Hardware

Not all applications are available on different hardware targets.

  • For applications built into the firmware, you have to specify a compatible application set using FIRMWARE_APP_SET=... fbt option. See fbt docs for details on build configurations.

  • For applications built as external .faps, you have to explicitly specify compatible targets in application's manifest, application.fam. For example, to limit application to a single target, add targets=["f7"], to the manifest. It won't be built for other targets.

For details on application manifests, check out their docs page.

Building Firmware for a Specific Target

You have to specify TARGET_HW (and, optionally, FIRMWARE_APP_SET) for fbt to build firmware for non-default target. For example, building and flashing debug firmware for f18 can be done with

./fbt TARGET_HW=18 flash_usb_full