config: add dynamic init file

* config: add dynamic init file

* added review feedback

* added docs
This commit is contained in:
Alexander Lerach 2025-08-21 16:46:06 +02:00 committed by GitHub
parent 785ea1a137
commit 138427b3a8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 86 additions and 2 deletions

View File

@ -73,6 +73,11 @@ menu "Toolchain"
help help
relative path to the ROMFS root directory relative path to the ROMFS root directory
config BOARD_ADDITIONAL_INIT
string "Additional init file"
help
additional configurable init file to include in the ROMFS
config BOARD_IO config BOARD_IO
string "IO board name" string "IO board name"
default "px4_io-v2_default" default "px4_io-v2_default"

View File

@ -202,6 +202,31 @@ foreach(board_rc_file ${OPTIONAL_BOARD_RC})
endforeach() endforeach()
if(config_additional_init)
if(EXISTS "${PX4_BOARD_DIR}/init/${config_additional_init}")
file(RELATIVE_PATH rc_file_relative ${PX4_SOURCE_DIR} ${PX4_BOARD_DIR}/init/${config_additional_init})
message(STATUS "ROMFS: Adding ${rc_file_relative} -> /etc/init.d/rc.additional_init")
add_custom_command(
OUTPUT
${romfs_gen_root_dir}/init.d/rc.additional_init
${config_additional_init}.stamp
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PX4_BOARD_DIR}/init/${config_additional_init} ${romfs_gen_root_dir}/init.d/rc.additional_init
COMMAND ${CMAKE_COMMAND} -E touch ${config_additional_init}.stamp
DEPENDS
${PX4_BOARD_DIR}/init/${config_additional_init}
romfs_copy.stamp
COMMENT "ROMFS: copying ${config_additional_init}"
)
list(APPEND extras_dependencies
${config_additional_init}.stamp
)
else()
message(FATAL_ERROR "BOARD_ADDITIONAL_INIT file not found at: ${PX4_BOARD_DIR}/init/${config_additional_init}")
endif()
endif()
# board extras # board extras
set(OPTIONAL_BOARD_EXTRAS) set(OPTIONAL_BOARD_EXTRAS)

View File

@ -56,6 +56,17 @@ then
fi fi
unset BOARD_RC_DEFAULTS unset BOARD_RC_DEFAULTS
#
# Optional additional init file: rc.additional_init
#
set BOARD_RC_ADDITIONAL_INIT ${R}etc/init.d/rc.additional_init
if [ -f $BOARD_RC_ADDITIONAL_INIT ]
then
echo "Board additional init: ${BOARD_RC_ADDITIONAL_INIT}"
. $BOARD_RC_ADDITIONAL_INIT
fi
unset BOARD_RC_ADDITIONAL_INIT
# #
# Start system state indicator. # Start system state indicator.
# #

View File

@ -217,6 +217,17 @@ else
fi fi
unset BOARD_RC_DEFAULTS unset BOARD_RC_DEFAULTS
#
# Optional additional init file: rc.additional_init
#
set BOARD_RC_ADDITIONAL_INIT ${R}etc/init.d/rc.additional_init
if [ -f $BOARD_RC_ADDITIONAL_INIT ]
then
echo "Board additional init: ${BOARD_RC_ADDITIONAL_INIT}"
. $BOARD_RC_ADDITIONAL_INIT
fi
unset BOARD_RC_ADDITIONAL_INIT
# Load airframe configuration based on SYS_AUTOSTART parameter # Load airframe configuration based on SYS_AUTOSTART parameter
if ! param compare SYS_AUTOSTART 0 if ! param compare SYS_AUTOSTART 0
then then

View File

@ -339,6 +339,11 @@ if(EXISTS ${BOARD_DEFCONFIG})
endif() endif()
endif() endif()
# ADDITIONAL INIT
if(ADDITIONAL_INIT)
set(config_additional_init ${ADDITIONAL_INIT} CACHE INTERNAL "additional init" FORCE)
endif()
if(UAVCAN_INTERFACES) if(UAVCAN_INTERFACES)
set(config_uavcan_num_ifaces ${UAVCAN_INTERFACES} CACHE INTERNAL "UAVCAN interfaces" FORCE) set(config_uavcan_num_ifaces ${UAVCAN_INTERFACES} CACHE INTERNAL "UAVCAN interfaces" FORCE)
endif() endif()

View File

@ -90,6 +90,8 @@ This is documented below.
The best way to customize the system startup is to introduce a [new frame configuration](../dev_airframes/adding_a_new_frame.md). The best way to customize the system startup is to introduce a [new frame configuration](../dev_airframes/adding_a_new_frame.md).
The frame configuration file can be included in the firmware or on an SD Card. The frame configuration file can be included in the firmware or on an SD Card.
#### Dynamic customization
If you only need to "tweak" the existing configuration, such as starting one more application or setting the value of a few parameters, you can specify these by creating two files in the `/etc/` directory of the SD Card: If you only need to "tweak" the existing configuration, such as starting one more application or setting the value of a few parameters, you can specify these by creating two files in the `/etc/` directory of the SD Card:
- [/etc/config.txt](#customizing-the-configuration-config-txt): modify parameter values - [/etc/config.txt](#customizing-the-configuration-config-txt): modify parameter values
@ -106,7 +108,7 @@ If editing on Windows use a suitable editor.
These files are referenced in PX4 code as `/fs/microsd/etc/config.txt` and `/fs/microsd/etc/extras.txt`, where the root folder of the microsd card is identified by the path `/fs/microsd`. These files are referenced in PX4 code as `/fs/microsd/etc/config.txt` and `/fs/microsd/etc/extras.txt`, where the root folder of the microsd card is identified by the path `/fs/microsd`.
::: :::
#### Customizing the Configuration (config.txt) ##### Customizing the Configuration (config.txt)
The `config.txt` file can be used to modify parameters. The `config.txt` file can be used to modify parameters.
It is loaded after the main system has been configured and _before_ it is booted. It is loaded after the main system has been configured and _before_ it is booted.
@ -118,7 +120,7 @@ param set-default PWM_MAIN_DIS3 1000
param set-default PWM_MAIN_MIN3 1120 param set-default PWM_MAIN_MIN3 1120
``` ```
#### Starting Additional Applications (extras.txt) ##### Starting Additional Applications (extras.txt)
The `extras.txt` can be used to start additional applications after the main system boot. The `extras.txt` can be used to start additional applications after the main system boot.
Typically these would be payload controllers or similar optional custom components. Typically these would be payload controllers or similar optional custom components.
@ -145,3 +147,28 @@ The following example shows how to start custom applications:
mandatory_app start # Will abort boot if mandatory_app is unknown or fails mandatory_app start # Will abort boot if mandatory_app is unknown or fails
``` ```
#### Additional customization
In rare cases where the desired setup cannot be achieved through frame configuration or dynamic customization,
you can add a script that will be contained in the binary.
**Note**: In almost all cases, you should use a frame configuration. This method should only be used for
edge-cases such as customizing `cannode` based boards.
- Add a new init script in `boards/<vendor>/<board>/init` that will run during board startup. For example:
```sh
# File: boards/<vendor>/<board>/init/rc.additional
param set-default <param> <value>
```
- Add a new board variant in `boards/<vendor>/<board>/<variant>.px4board` that includes the additional script. For example:
```sh
# File: boards/<vendor>/<board>/var.px4board
CONFIG_BOARD_ADDITIONAL_INIT="rc.additional"
```
- Compile the firmware with your new variant by appending the variant name to the compile target. For example:
```sh
make <target>_var
```