NuttX Board Porting Guide
Last updated
Last updated
In order to port PX4 on NuttX to a new hardware target, that hardware target must be supported by NuttX. The NuttX project maintains an excellent for porting NuttX to a new computing platform.
The following guide assumes you are using an already supported hardware target or have ported NuttX (including the ) already.
The configuration files for all boards, including linker scripts and other required settings, are located under in a vendor- and board-specific directory (i.e. boards/VENDOR/MODEL/)).
The following example uses FMUv5 as it is a recent for NuttX based flight controllers:
Running make px4_fmu-v5_default
from the PX4-Autopilot directory will build the FMUv5 config
The base FMUv5 configuration files are located in: .
Board specific header (NuttX pins and clock configuration): .
Board specific header (PX4 configuration): .
NuttX OS config (created with NuttX menuconfig): .
Build configuration: .
To modify the NuttX OS configuration, you can use using the PX4 shortcuts:
For fresh installs of PX4 onto Ubuntu using you will also need to install kconfig tools from .
:::note The following steps are not required if using the docker container or have installed to macOS using our normal instructions (as these includekconfig-mconf
). :::
Run the following commands from any directory:
The --prefix=/usr
determines the specific installation location (which must be in the PATH
environment variable). The --enable-mconf
and --enable-qconf
options will enable the menuconfig
and qconfig
options respectively.
To run qconfig
you may need to install additional Qt dependencies.
First you will need a bootloader, which depends on the hardware target:
Download the source code and make sure you can build an existing target:
Find an existing target that uses the same (or a closely related) CPU type and copy it. For example for STM32F7:
Change manufacturer to the manufacturer name and my-target-v1 to your board name.
Next you need to go through all files under boards/manufacturer/my-target-v1 and update them according to your board.
firmware.prototype: update the board ID and name
default.px4board: update the VENDOR and MODEL to match the directory names (my-target-v1). Configure the serial ports.
Configure NuttX (defconfig) via make manufacturer_my-target-v1 menuconfig
: Adjust the CPU and chip, configure the peripherals (UART's, SPI, I2C, ADC).
src: go through all files under src and update them as needed, in particular board_config.h.
init/rc.board_sensors: start the sensors that are attached to the board.
STM32H7: the bootloader is based on NuttX, and is included in the PX4 Firmware. See for an example.
For all other targets, https://github.com/PX4/Bootloader is used. See for an example how to add a new target. Then checkout the .
Make sure you have a working and installed the NuttX menuconfig tool (see above).
nuttx-config/include/board.h: Configure the NuttX pins. For all peripherals with multiple pin options, NuttX needs to know the pin. They are defined in the chip-specific pinmap header file, for example .