Skip to content

feat(platforms): upgrade NuttX to 12.12.0 - #26215

Merged
mrpollo merged 24 commits into
mainfrom
pr-nuttx-12-12-0
Sep 3, 2026
Merged

feat(platforms): upgrade NuttX to 12.12.0#26215
mrpollo merged 24 commits into
mainfrom
pr-nuttx-12-12-0

Conversation

@PetervdPerk-NXP

@PetervdPerk-NXP PetervdPerk-NXP commented Jan 5, 2026

Copy link
Copy Markdown
Member

Continuation of #26198 but now the NuttX repo's are on the PX4 repositories.
Some reasons why to upgrade NuttX

  • Last upgrade was more then 3 years ago Aug 10, 2022
  • I3C Support has been added
  • RPmsg support for heterogenous MCU's
  • GDBStub support (for debugging over Serial/Ethernet)
  • C/C++ atomic support has been improved
  • Network stack got improved
  • Optional run-time stackchecking on IRQ/Context switch (useful for debugging)
  • CMake support (not the focus on this PR, but allows us to cleanup the build system).
  • Better RISC-V/Xtensa support.

PX4 Test Plan

Category Boot & Flash SD Card CAN/UAVCAN Radio Modes Parameters Ethernet XRCE-DDS USB/QGC Hardfault Logging CPU Load Publication Rates Mavlink
Description Flash PX4 firmware and verify boot Run sd_bench and measure write speed Check UAVCAN node and CAN1 status Bind and verify RC input Arm in Stabilized mode, verify leveling Change parameters and reset to defaults Verify Ethernet connectivity Receive visual odometry messages via XRCE-DDS Verify USB connection and QGC link Trigger and verify hardfault logging Run top when the system is armed Run uorb top when the system is armed Run mavlink status
Expectation PX4 boots without errors Check Avg ≥ 400 KB/s, max write ≤ 50 ms No HW/IO errors, RX/TX frames increment RC channels update in QGC Craft attempts to level (bench OK) Changes persist, reset works PX4 responds to pings, MAVLink over Ethernet VO messages visible in PX4 logs QGC connects and parameters sync correctly Hardfault log saved and retrievable CPU load is similar Publication rates TX/RX rate and latency for all MAVLink instances
CUAV V6X Okay Okay Okay Okay Okay Okay Okay Okay
Pixhawk 6X
Pixhawk 6X-RT

@github-actions

github-actions Bot commented Jan 5, 2026

Copy link
Copy Markdown
Contributor

🔎 FLASH Analysis

px4_fmu-v5x [Total VM Diff: 5336 byte (0.25 %)]
    FILE SIZE        VM SIZE    
--------------  -------------- 
+0.2% +3.10Ki  +0.2% +3.10Ki    .text
 -94.5% +8.00Ki -94.5% +8.00Ki    [1609 Others]
  [NEW] +2.03Ki  [NEW] +2.03Ki    vscanf_internal
  [NEW]    +936  [NEW]    +936    strtox.isra.0
  [NEW]    +912  [NEW]    +912    uart_readv
 +57e2%    +684 +57e2%    +684    _assert
  [NEW]    +628  [NEW]    +628    nsh_argument.isra.0
  +135%    +628  +135%    +628    strftime
  [NEW]    +614  [NEW]    +614    mmcsd_sdinitialize
  [NEW]    +484  [NEW]    +484    uart_writev
  [NEW]    +390  [NEW]    +390    fat_get_sectors
 -43.8%    -352 -43.8%    -352    mmcsd_probe
 -98.9%    -364 -98.9%    -364    strtod
  [DEL]    -390  [DEL]    -390    nx_poll
  [DEL]    -492  [DEL]    -492    uart_read
  [DEL]    -532  [DEL]    -532    up_assert
  [DEL]    -588  [DEL]    -588    cmd_ifconfig
  [DEL]    -940  [DEL]    -940    ps_callback
  [DEL] -1.24Ki  [DEL] -1.24Ki    nsh_argument
  [DEL] -1.71Ki  [DEL] -1.71Ki    proc_read
 -98.9% -1.79Ki -98.9% -1.79Ki    lib_vscanf
  -2.3% -3.77Ki  -2.3% -3.77Ki    [section .text]
 +43% +1.70Ki   +43% +1.70Ki    .data
 -59.3%    +468 -59.3%    +468    [45 Others]
   +50%    +192   +50%    +192    g_dma
  +460%     +92  +460%     +92    g_hpwork
  +460%     +92  +460%     +92    g_lpwork
  [NEW]     +88  [NEW]     +88    g_wrbuffer
   +26%     +60   +26%     +60    g_uart4priv
   +26%     +60   +26%     +60    g_uart5priv
   +26%     +60   +26%     +60    g_uart7priv
   +26%     +60   +26%     +60    g_uart8priv
   +26%     +60   +26%     +60    g_usart1priv
   +26%     +60   +26%     +60    g_usart2priv
   +26%     +60   +26%     +60    g_usart3priv
   +26%     +60   +26%     +60    g_usart6priv
  [NEW]     +44  [NEW]     +44    g_cbprealloc
  [NEW]     +44  [NEW]     +44    g_icmp_connections
  [NEW]     +44  [NEW]     +44    g_tcp_connections
  [NEW]     +44  [NEW]     +44    g_udp_connections
  [NEW]     +40  [NEW]     +40    g_devno_lock
  [NEW]     +40  [NEW]     +40    g_free_lock
  +250%     +40  +250%     +40    g_inode_lock
   +43%     +36   +43%     +36    g_spi1dev
[ = ]       0  +1.3% +1.16Ki    .bss
  [ = ]       0  [NEW] +4.88Ki    g_iob_buffer
  [ = ]       0  [NEW] +1.91Ki    g_tcp_connections_buffer
  [ = ]       0  [NEW] +1.25Ki    g_wrbuffer_buffer
  [ = ]       0  [NEW]    +704    g_udp_connections_buffer
  [ = ]       0  [NEW]    +480    g_kthread_group
  [ = ]       0  [NEW]    +448    g_sigpool
  [ = ]       0  [NEW]    +288    g_icmp_connections_buffer
  [ = ]       0  [NEW]    +216    g_last_regs
  [ = ]       0  [NEW]    +112    g_sigactions
  [ = ]       0 -98.5%     +96    [52 Others]
  [ = ]       0  [NEW]     +96    g_cbprealloc_buffer
  [ = ]       0  [NEW]     +64    g_tasklisttable
  [ = ]       0   +75%     +60    g_bbsram
  [ = ]       0  [DEL]     -64    g_iobuserstats
  [ = ]       0  [DEL]    -224    g_icmp_connections
  [ = ]       0  [DEL]    -384    g_cbprealloc
  [ = ]       0  [DEL]    -448    g_dns_cache
  [ = ]       0  [DEL]    -704    g_udp_connections
  [ = ]       0  [DEL] -1.22Ki    g_wrbuffer
  [ = ]       0  [DEL] -1.50Ki    g_tcp_connections
  [ = ]       0  [DEL] -4.88Ki    g_iob_pool
+3.7% +73.1Ki  [ = ]       0    .debug_abbrev
+0.9% +1.52Ki  [ = ]       0    .debug_aranges
+1.0% +4.77Ki  [ = ]       0    .debug_frame
+4.0% +1.10Mi  [ = ]       0    .debug_info
+3.4%  +178Ki  [ = ]       0    .debug_line
  [DEL]      -6  [ = ]       0    [Unmapped]
  +3.4%  +178Ki  [ = ]       0    [section .debug_line]
+2.5%     +10  [ = ]       0    .debug_line_str
+1.1% +39.0Ki  [ = ]       0    .debug_loclists
  [NEW]      +3  [ = ]       0    [Unmapped]
  +1.1% +39.0Ki  [ = ]       0    [section .debug_loclists]
+0.8% +4.98Ki  [ = ]       0    .debug_rnglists
  [DEL]      -1  [ = ]       0    [Unmapped]
  +0.8% +4.98Ki  [ = ]       0    [section .debug_rnglists]
+0.1% +4.95Ki  [ = ]       0    .debug_str
  [NEW]      +1  [ = ]       0    [Unmapped]
  +0.1% +4.95Ki  [ = ]       0    [section .debug_str]
+0.8%      +2  [ = ]       0    .shstrtab
-0.0%    -290  [ = ]       0    .strtab
  [DEL]     -10  [ = ]       0    CSWTCH.45
  [DEL]      -9  [ = ]       0    CSWTCH.5
 -100.2%     -15  [ = ]       0    [870 Others]
  -0.3%     -81  [ = ]       0    [section .strtab]
  [DEL]     -15  [ = ]       0    __FUNCTION__.0
  [DEL]     -15  [ = ]       0    __FUNCTION__.1
  [DEL]     -15  [ = ]       0    __FUNCTION__.2
  [DEL]     -15  [ = ]       0    __FUNCTION__.3
  [DEL]     -15  [ = ]       0    __FUNCTION__.4
  [DEL]     -15  [ = ]       0    __FUNCTION__.5
 -26.7%     -16  [ = ]       0    ___ZL19param_get_cplusplustPf.isra.0_veneer
  [DEL]     -26  [ = ]       0    ____aeabi_uldivmod_veneer
  [NEW]     +18  [ = ]       0    ____assert_veneer
  [NEW]     +21  [ = ]       0    __arm_ack_irq_veneer
  [DEL]     -27  [ = ]       0    __arm_switchcontext_veneer
  [DEL]     -19  [ = ]       0    __arp_arpin_veneer
  [NEW]     +19  [ = ]       0    __arp_input_veneer
  [DEL]     -18  [ = ]       0    __arp_ipin_veneer
  [DEL]     -17  [ = ]       0    __arp_out_veneer
  [NEW]      +9  [ = ]       0    __assert
  [DEL]     -29  [ = ]       0    __clock_abstime2ticks_veneer
-0.1%    -832  [ = ]       0    .symtab
 -25.0%     -16  [ = ]       0    AM32Settings::decodeInfoResponse()
   +33%     +16  [ = ]       0    AuterionAutostarter::is_eeprom_header_valid()
 -50.0%     -16  [ = ]       0    AuterionAutostarter::start()
  +100%     +32  [ = ]       0    CSWTCH.42
  [DEL]     -32  [ = ]       0    CSWTCH.45
  [DEL]     -32  [ = ]       0    CSWTCH.5
  +100%     +16  [ = ]       0    CdcAcmAutostart::execute_process()
 -25.0%     -16  [ = ]       0    CdcAcmAutostart::scan_buffer_for_carriage_returns()
  +100%     +16  [ = ]       0    MavlinkStream::update()
  +100%     +16  [ = ]       0    MavlinkStreamAutopilotStateForGimbalDevice::send()
 -25.0%     -16  [ = ]       0    MavlinkStreamBatteryInfo::send()
 -14.3%     -16  [ = ]       0    MavlinkStreamServoOutputRaw<>::new_instance()
 -33.3%     -16  [ = ]       0    PX4IO::updateDisarmed()
  +100%     +16  [ = ]       0    PX4IO::updateFailsafe()
   +50%     +16  [ = ]       0    SensorGpsSim::generate_wgn()
 -33.3%     -16  [ = ]       0    SensorGpsSim::generate_wgn()::S
 -102.6% -1.11Ki  [ = ]       0    [1216 Others]
  +4.5%    +512  [ = ]       0    [section .symtab]
  [DEL]     -80  [ = ]       0    __FUNCTION__.0
  [DEL]     -48  [ = ]       0    __FUNCTION__.1
  [DEL]     -32  [ = ]       0    __FUNCTION__.2
 +17% +1.66Ki  [ = ]       0    [Unmapped]
-5.3%    -776  -5.3%    -776    .ramfunc
  +139%    +100  +139%    +100    nxsched_add_readytorun
   +13%     +76   +13%     +76    stm32_interrupt_work
  +120%     +72  +120%     +72    wd_timer
  +133%     +64  +133%     +64    arm_doirq
  +214%     +60  +214%     +60    nxsched_remove_blocked
   +93%     +56   +93%     +56    ioctl
  +120%     +48  +120%     +48    nxsched_remove_readytorun
   +11%     +44   +11%     +44    stm32_i2c_isr
 -100.6%     -32 -100.6%     -32    [73 Others]
  [DEL]     -40  [DEL]     -40    nxsched_add_blocked
 -97.8%     -44 -97.8%     -44    [section .ramfunc]
 -91.7%     -44 -91.7%     -44    arm_svcall
  [DEL]     -44  [DEL]     -44    sq_rem
  [DEL]     -64  [DEL]     -64    nxsched_add_prioritized
 -51.3%     -80 -51.3%     -80    nxsem_post
  [DEL]     -84  [DEL]     -84    up_unblock_task
  [DEL]    -112  [DEL]    -112    up_block_task
 -88.9%    -128 -88.9%    -128    memset
  [DEL]    -184  [DEL]    -184    wd_start
 -35.6%    -188 -35.6%    -188    memcpy
  [DEL]    -252  [DEL]    -252    nxsig_timedwait
+3.1% +1.40Mi  +0.3% +5.21Ki    TOTAL

px4_fmu-v6x [Total VM Diff: 7400 byte (0.36 %)]
    FILE SIZE        VM SIZE    
--------------  -------------- 
+0.2% +3.63Ki  +0.2% +3.63Ki    .text
 -94.3% +8.58Ki -94.3% +8.58Ki    [1646 Others]
  [NEW] +2.03Ki  [NEW] +2.03Ki    vscanf_internal
  [NEW]    +936  [NEW]    +936    strtox.isra.0
  [NEW]    +912  [NEW]    +912    uart_readv
 +57e2%    +684 +57e2%    +684    _assert
  [NEW]    +628  [NEW]    +628    nsh_argument.isra.0
  +135%    +628  +135%    +628    strftime
  [NEW]    +614  [NEW]    +614    mmcsd_sdinitialize
  [NEW]    +484  [NEW]    +484    uart_writev
  [NEW]    +390  [NEW]    +390    fat_get_sectors
 -43.8%    -352 -43.8%    -352    mmcsd_probe
 -98.9%    -364 -98.9%    -364    strtod
  [DEL]    -390  [DEL]    -390    nx_poll
  [DEL]    -492  [DEL]    -492    uart_read
  [DEL]    -532  [DEL]    -532    up_assert
  [DEL]    -588  [DEL]    -588    cmd_ifconfig
  [DEL]    -940  [DEL]    -940    ps_callback
  [DEL] -1.24Ki  [DEL] -1.24Ki    nsh_argument
  [DEL] -1.71Ki  [DEL] -1.71Ki    proc_read
 -98.9% -1.79Ki -98.9% -1.79Ki    lib_vscanf
  -2.4% -3.82Ki  -2.4% -3.82Ki    [section .text]
 +45% +2.05Ki   +45% +2.05Ki    .data
  +170%    +544  +170%    +544    g_sdmmcdev2
 -57.7%    +464 -57.7%    +464    [44 Others]
  +460%     +92  +460%     +92    g_hpwork
  +460%     +92  +460%     +92    g_lpwork
  [NEW]     +88  [NEW]     +88    g_wrbuffer
   +26%     +60   +26%     +60    g_uart4priv
   +26%     +60   +26%     +60    g_uart5priv
   +26%     +60   +26%     +60    g_uart7priv
   +26%     +60   +26%     +60    g_uart8priv
   +26%     +60   +26%     +60    g_usart1priv
   +26%     +60   +26%     +60    g_usart2priv
   +26%     +60   +26%     +60    g_usart3priv
   +26%     +60   +26%     +60    g_usart6priv
  [NEW]     +44  [NEW]     +44    g_cbprealloc
  [NEW]     +44  [NEW]     +44    g_icmp_connections
  [NEW]     +44  [NEW]     +44    g_tcp_connections
  [NEW]     +44  [NEW]     +44    g_udp_connections
  [NEW]     +40  [NEW]     +40    g_devno_lock
  [NEW]     +40  [NEW]     +40    g_free_lock
  +250%     +40  +250%     +40    g_inode_lock
  [NEW]     +40  [NEW]     +40    g_nshprompt
[ = ]       0  +1.6% +1.55Ki    .bss
  [ = ]       0  [NEW] +4.88Ki    g_iob_buffer
  [ = ]       0  [NEW] +1.91Ki    g_tcp_connections_buffer
  [ = ]       0  [NEW] +1.28Ki    g_kthread_group
  [ = ]       0  [NEW] +1.25Ki    g_wrbuffer_buffer
  [ = ]       0  [NEW]    +704    g_udp_connections_buffer
  [ = ]       0  [NEW]    +448    g_sigpool
  [ = ]       0  [NEW]    +288    g_icmp_connections_buffer
  [ = ]       0 -95.9%    +228    [53 Others]
  [ = ]       0  [NEW]    +216    g_last_regs
  [ = ]       0  [NEW]    +112    g_sigactions
  [ = ]       0  [NEW]     +96    g_cbprealloc_buffer
  [ = ]       0   +76%     +64    g_bbsram
  [ = ]       0  [DEL]     -64    g_iobuserstats
  [ = ]       0  [DEL]    -224    g_icmp_connections
  [ = ]       0  [DEL]    -384    g_cbprealloc
  [ = ]       0  [DEL]    -448    g_dns_cache
  [ = ]       0  [DEL]    -512    sdmmc_rxbuffer
  [ = ]       0  [DEL]    -704    g_udp_connections
  [ = ]       0  [DEL] -1.22Ki    g_wrbuffer
  [ = ]       0  [DEL] -1.50Ki    g_tcp_connections
  [ = ]       0  [DEL] -4.88Ki    g_iob_pool
+4.9% +92.2Ki  [ = ]       0    .debug_abbrev
+1.1% +1.76Ki  [ = ]       0    .debug_aranges
+1.1% +5.19Ki  [ = ]       0    .debug_frame
+4.7% +1.24Mi  [ = ]       0    .debug_info
+3.7%  +189Ki  [ = ]       0    .debug_line
  [NEW]      +1  [ = ]       0    [Unmapped]
  +3.7%  +189Ki  [ = ]       0    [section .debug_line]
+2.5%     +10  [ = ]       0    .debug_line_str
+1.2% +41.5Ki  [ = ]       0    .debug_loclists
  [NEW]      +2  [ = ]       0    [Unmapped]
  +1.2% +41.5Ki  [ = ]       0    [section .debug_loclists]
+0.9% +5.24Ki  [ = ]       0    .debug_rnglists
+0.2% +5.30Ki  [ = ]       0    .debug_str
  [NEW]      +3  [ = ]       0    [Unmapped]
  +0.2% +5.30Ki  [ = ]       0    [section .debug_str]
+0.4%      +1  [ = ]       0    .shstrtab
+0.0%    +227  [ = ]       0    .strtab
  [DEL]     -10  [ = ]       0    CSWTCH.45
  [DEL]      -9  [ = ]       0    CSWTCH.5
 -96.1%    +275  [ = ]       0    [828 Others]
  +0.4%     +94  [ = ]       0    [section .strtab]
  [DEL]     -15  [ = ]       0    __FUNCTION__.0
  [DEL]     -15  [ = ]       0    __FUNCTION__.1
  [DEL]     -15  [ = ]       0    __FUNCTION__.2
  [DEL]     -15  [ = ]       0    __FUNCTION__.3
  [DEL]     -15  [ = ]       0    __FUNCTION__.4
  [DEL]     -15  [ = ]       0    __FUNCTION__.5
  [NEW]      +9  [ = ]       0    __assert
   +28%      +9  [ = ]       0    __orb_position_controller_landing_status
 -81.8%      -9  [ = ]       0    __start
  [DEL]     -15  [ = ]       0    _net_timedwait
 -45.7%     -16  [ = ]       0    _vectors
  [NEW]      +7  [ = ]       0    adjust
  [NEW]     +15  [ = ]       0    arc4random_buf
  [NEW]     +19  [ = ]       0    arm_color_intstack
  [DEL]     -15  [ = ]       0    arm_dump_stack
  [DEL]     -14  [ = ]       0    arm_dump_task
  [DEL]     -23  [ = ]       0    arm_fullcontextrestore
+0.0%     +16  [ = ]       0    .symtab
 -25.0%     -16  [ = ]       0    AM32Settings::decodeInfoResponse()
  +100%     +32  [ = ]       0    CSWTCH.42
  [DEL]     -32  [ = ]       0    CSWTCH.45
  [DEL]     -32  [ = ]       0    CSWTCH.5
  +100%     +16  [ = ]       0    CdcAcmAutostart::execute_process()
 -25.0%     -16  [ = ]       0    CdcAcmAutostart::scan_buffer_for_carriage_returns()
  +100%     +16  [ = ]       0    MavlinkStream::update()
 -14.3%     -16  [ = ]       0    MavlinkStreamServoOutputRaw<>::new_instance()
 -33.3%     -16  [ = ]       0    PX4IO::updateDisarmed()
  +100%     +16  [ = ]       0    PX4IO::updateFailsafe()
 -99.9%     +48  [ = ]       0    [1152 Others]
  +2.4%    +272  [ = ]       0    [section .symtab]
  [DEL]    -128  [ = ]       0    __FUNCTION__.0
  [DEL]     -48  [ = ]       0    __FUNCTION__.1
  [DEL]     -32  [ = ]       0    __FUNCTION__.2
  [DEL]     -32  [ = ]       0    __FUNCTION__.3
  [DEL]     -32  [ = ]       0    __FUNCTION__.4
  [DEL]     -32  [ = ]       0    __FUNCTION__.5
  [NEW]     +48  [ = ]       0    __assert
   +25%     +16  [ = ]       0    __dtoa_engine
 -25.0%     -16  [ = ]       0    __errno
+8.7%    +376  [ = ]       0    [Unmapped]
+3.6% +1.58Mi  +0.4% +7.23Ki    TOTAL

Updated: 2026-04-01T12:19:51

@alexcekay

Copy link
Copy Markdown
Member

Hi @PetervdPerk-NXP, @AlexKlimaj,

This is a very large change (around 5,000 commits in NuttX and many changes in the common code), and to be honest I’m not particularly excited about the approach:

Asked github copilot with Claude Sonnet 4.5 to replace the PX4 Nuttx submodule with upstream NuttX.

Especially when this then requires patching and reviewing fixes like the following just to get things running:

# Add delay after format for SD card to be ready (NuttX 12)
usleep 100000
[...]
# Try one more time with additional delay
usleep 200000

This kind of patching being needed already shows that interfaces don't behave the same anymore and we need to understand this and not start patching until it somehow works. This one was detected, but I am very sure there are a lot more of those "quirks" that will occur less often and only in specific situations.

Don’t get me wrong, I like the idea of us staying up to date with NuttX. However, with a migration that appears to be largely AI-driven, it effectively shifts a significant amount of risk and workload onto the reviewers and flight testers. They now need to ensure that no low-level or timing-related issues are introduced that might only show up sporadically in real operation.

With that in mind, I’d like to ask a few questions:

  • What do we gain by updating to NuttX 12.12.0 at this point? Is there a specific feature, fix, or requirement that makes this update necessary right now?
    • Given the chosen approach, I see a real risk of subtle interface or behavior changes in NuttX that could lead to time-consuming bugs later, and that may not have been considered during the AI-assisted migration
  • This will require serious testing. Can you coordinate with PX4 flight testers and your in-house testing resources to get a substantial number of testing hours before we move forward?

@PetervdPerk-NXP

PetervdPerk-NXP commented Jan 5, 2026

Copy link
Copy Markdown
Member Author

Hi @alexcekay,
I used #26198 as the baseline since it showed we could get to NuttX 12.12.0 with ~400 lines of changes. I reviewed and applied the updates manually and refactored out most of the "weird" changes from #26198 as well.

I kept the timeout change you're referring to in since @AlexKlimaj observed issues on his hardware that I can’t reproduce on our V6X-RT FMU but overall that's the reason this PR is a draft. Most likely it has to do with the rejected fat dma allocation patches which weren't in the #26198 attempt. Edit: Timeout change not needed anymore, also working on ARK hardware.

Beyond Kconfig symbol churn, the PR is quite modest. My reason to upgrade is primarily to enable i.MX93/i.MX95 hardware, which depends on a more mature RPMsg that we can’t realistically backport from our 2-3 year old NuttX. But they're are various other improvements NuttX brings which makes it worthwhile to upgrade.

I sense some hesitation about upgrading. If we intend to stay on the current kernel long‑term, the migration cost will only grow. I’m happy to help push this over the line, as I did myself with the previous kernel bump 2 years ago aswell, but I’d appreciate alignment and some shared ownership. If you’d prefer I step back and focus elsewhere, let me know.

@alexcekay

alexcekay commented Jan 5, 2026

Copy link
Copy Markdown
Member

Hi @PetervdPerk-NXP,

Thanks for explaining your rationale and pushing this topic.

I sense some hesitation about upgrading

No, as stated: Don’t get me wrong, I like the idea of us staying up to date with NuttX and appreciate

I’m happy to help push this over the line, as I did myself with the previous kernel bump 2 years ago as well

I am hesitant about the risk associated with any larger OS change (and the hours needed to debug the issues afterwards) and thus want to de-risk this and emphasize:

This will require serious testing. Can you coordinate with PX4 flight testers and your in-house testing resources to get a substantial number of testing hours before we move forward?

When this has a sort of mature state where strange quirks are not needed anymore or are at least clearly understood I would be happy to assist in reviewing it and do testing with our HW.

@PetervdPerk-NXP
PetervdPerk-NXP force-pushed the pr-nuttx-12-12-0 branch 5 times, most recently from 845fc70 to f6d73d0 Compare January 5, 2026 19:09
@AlexKlimaj

Copy link
Copy Markdown
Member

ARKV6X is booting and sd card works. Doesn't look like free or ps commands work.

[boot] Rev 0x1 : Ver 0x1 ARKV6X001
reset done, 10 ms
[boot]
Fault Log info File No 4 Length 3177 flags:0x01 state:1
[boot]
Fault Log is Armed
HW arch: ARK_FMU_V6X
HW type: ARKV6X
HW FMUM ID: 0x001
HW BASE ID: 0x001
PX4 git-hash: f6d73d0bacd239501747f5987f09b1ba9b86f152
PX4 version: 1.17.0 40 (17891392)
PX4 git-branch: pr-nuttx-12-12-0
OS: NuttX
OS version: Release 12.12.0 (202113279)
OS git-hash: 62ff1b8c59f2ebf1a570126bed0caa326a780701
Build datetime: Jan  5 2026 13:49:00
Build uri: localhost
Build variant: default
Toolchain: GNU GCC, 10.2.1 20201103 (release)
PX4GUID: 000600000000363334373333510f0024003c
MCU: STM32H7[4|5]xxx, rev. V
ERROR [bsondump] open '/fs/mtd_caldata' failed (2)
New /fs/mtd_caldata size is:
ERROR [bsondump] open '/fs/mtd_caldata' failed (2)
INFO  [param] selected parameter default file /fs/mtd_params
INFO  [param] importing from '/fs/mtd_params'
INFO  [parameters] BSON document size 621 bytes, decoded 621 bytes (INT32:14, FLOAT:15)
INFO  [param] selected parameter backup file /fs/microsd/parameters_backup.bson
Board architecture defaults: /etc/init.d/rc.board_arch_defaults
Board defaults: /etc/init.d/rc.board_defaults
Loading airframe: /etc/init.d/airframes/4001_quad_x
INFO  [dataman] data manager file '/fs/microsd/dataman' size is 128528 bytes
Board sensors: /etc/init.d/rc.board_sensors
INFO  [ina226] Failed to init INA226 on bus 1, but will try again periodically.
ina226 #0 on I2C bus 1 (external) address 0x41
INFO  [ina226] Failed to init INA226 on bus 2, but will try again periodically.
ina226 #1 on I2C bus 2 (external) address 0x41
INFO  [ina226] Failed to init INA226 on bus 3, but will try again periodically.
ina226 #2 on I2C bus 3 (external) address 0x41
iim42653 #0 on SPI bus 1 rotation 3
iim42653 #1 on SPI bus 2 rotation 9
iim42653 #2 on SPI bus 3 rotation 6
bmm150 #0 on I2C bus 4 (external) address 0x10
bmp390 #0 on I2C bus 4 (external) address 0x76
ekf2 [596:237]
INFO  [px4io] PX4IO Not Supported
Starting Main GPS on /dev/ttyS0
Starting MAVLink on /dev/ttyS6
INFO  [mavlink] mode: Normal, data rate: 1200 B/s on /dev/ttyS6 @ 57600B
Starting MAVLink on ethernet
INFO  [mavlink] mode: Normal, data rate: 100000 B/s on udp port 14550 remote port 14550
INFO  [cdcacm_autostart] Starting CDC/ACM autostart
INFO  [logger] logger started (mode=all)
INFO  [uavcan] Node ID 1, bitrate 1000000
sercon: Registering CDC/ACM serial driver
sercon: Successfully registered the CDC/ACM serial driver

NuttShell (NSH) NuttX-12.12.0
nsh> WARN  [health_and_arming_checks] Preflight Fail: ekf2 missing data
INFO  [cdcacm_autostart] Starting mavlink on /dev/ttyACM0 (SYS_USB_AUTO=2)
INFO  [mavlink] mode: Onboard, data rate: 100000 B/s on /dev/ttyACM0 @ 2000000B
INFO  [uavcan] advertising node_id 120 on index 0
INFO  [gyro_calibration] gyro 1 (3014674) updating offsets [-0.013, -0.012, 0.028]->[-0.005, -0.012, 0.021] 25.2 degC
uavcan_gnss adding channel for topic sensor_gps node 120...
uavcan_gnss node 120 instance 0 ok
uavcan_gnss node 120 topic sensor_gps instance 0 ok
uavcan_mag adding channel for topic sensor_mag node 120...
uavcan_mag channel 120 instance 1 ok
WARN  [uavcan] GNSS Fix2 msg detected for ch 0; disabling Fix msg for this node
WARN  [health_and_arming_checks] Preflight: GPS fix too low
INFO  [vehicle_magnetometer] MAG switch from #0 -> #1
WARN  [health_and_arming_checks] Preflight Fail: Strong magnetic interference
WARN  [health_and_arming_checks] Preflight: GPS fix too low
WARN  [health_and_arming_checks] Preflight Fail: Compass 1 uncalibrated

nsh>
nsh>
nsh>
nsh> sd_bench
INFO  [sd_bench] Using block size = 4096 bytes, sync=0
INFO  [sd_bench]
INFO  [sd_bench] Testing Sequential Write Speed...
INFO  [sd_bench]   Run  0:   363.19 KB/s, max write time: 104 ms (=  38.46 KB/s), fsync: 48 ms
INFO  [sd_bench]   Run  1:   398.10 KB/s, max write time: 37 ms (= 108.11 KB/s), fsync: 56 ms
INFO  [sd_bench]   Run  2:   399.99 KB/s, max write time: 19 ms (= 210.53 KB/s), fsync: 48 ms
INFO  [sd_bench]   Run  3:   394.94 KB/s, max write time: 38 ms (= 105.26 KB/s), fsync: 46 ms
INFO  [sd_bench]   Run  4:   399.31 KB/s, max write time: 19 ms (= 210.53 KB/s), fsync: 47 ms
INFO  [sd_bench]   Avg   :   391.12 KB/s
INFO  [sd_bench]   Overall max write time: 104 ms
nsh>
 PID COMMAND                   CPU(ms) CPU(%)  USED/STACK PRIO(BASE) STATE FD
   0 Idle_Task                   27595 53.213   272/  768   0 (  0)  READY  8
   1 hpwork                          0  0.000   336/ 1216 249 (249)  w:sem  8
   2 lpwork                          0  0.000   336/ 1568  50 ( 50)  w:sem  8
   3 nsh_main                        0  0.000  2024/ 3152 100 (100)  w:sem  8
   4 wq:manager                      0  0.000   368/ 1240 255 (255)  w:sem  8
   5 wq:lp_default                   7  0.264  1552/ 3480 205 (205)  w:sem  8
   6 netinit                         5  0.000   664/ 2032  49 ( 49)  w:sem  8
1235 mavlink_rcv_if1                 4  0.175  2272/ 6200 175 (175)  w:sem  8
 264 wq:hp_default                  99  3.622  1312/ 2784 237 (237)  w:sem  8
 365 dataman                         0  0.001  1072/ 1384  90 ( 90)  w:sem  8
 427 wq:I2C1                         4  0.145  1024/ 2320 246 (246)  w:sem  8
 430 wq:I2C2                         4  0.143   856/ 2320 245 (245)  w:sem  8
 439 wq:I2C3                         4  0.143   880/ 2320 244 (244)  w:sem  8
 458 wq:SPI1                       151  5.570  1832/ 2376 253 (253)  PEND   8
 463 wq:SPI2                       163  6.007  1832/ 2376 252 (252)  PEND   8
 476 wq:SPI3                        79  2.909  1832/ 2376 251 (251)  PEND   8
 492 wq:I2C4                         5  0.192   904/ 2320 243 (243)  w:sem  8
 592 wq:nav_and_controllers        113  4.123  1280/ 2224 242 (242)  w:sem  8
 593 wq:rate_ctrl                  108  3.962  2328/ 3128 255 (255)  w:sem  8
 594 wq:INS0                       181  6.647  3824/ 5984 241 (241)  w:sem  8
 629 commander                      14  0.526  1624/ 3200 140 (140)  w:sig  8
 794 gps                             1  0.105  1040/ 1944 205 (205)  w:sem  8
 926 mavlink_if0                    31  1.156  1784/ 3056 100 (100)  w:sig  8
 927 mavlink_rcv_if0                 4  0.155  2552/ 6200 175 (175)  w:sem  8
1017 mavlink_if1                    96  3.473  1808/ 3056 100 (100)  READY  8
1076 navigator                       2  0.092  1616/ 2176 105 (105)  w:sem 16
1159 logger                          4  0.156  3056/ 3616 230 (230)  w:sem  8
1174 log_writer_file                 0  0.000   384/ 1152  60 ( 60)  w:sem  8
1179 wq:uavcan                      38  1.389  3168/ 3608 236 (236)  w:sem  8
1208 mavlink_if2                   118  4.319  1784/ 3144 100 (100)  w:sig  8
1213 mavlink_rcv_if2                 3  0.144  2216/ 6200 175 (175)  w:sem  8
1257 top                             4  0.187  2336/ 4064 237 (237)  RUN    8

Processes: 32 total, 6 running, 26 sleeping
CPU usage: 45.61% tasks, 1.18% sched, 53.21% idle
DMA Memory: 5120 total, 1024 used 1536 peak
Uptime: 102.365s total, 27.595s idle

nsh> free
nsh> ps a
nsh> ps

@AlexKlimaj

Copy link
Copy Markdown
Member

Confirmed ethernet is working on the ARKV6X.

@PetervdPerk-NXP

Copy link
Copy Markdown
Member Author

ARKV6X is booting and sd card works.

Good to hear SD card works, I've already removed the delay fuctions from the previous PR in rcs, good to know that's not needed anymore.

Doesn't look like free or ps commands work.

This is a bit weird, maybe procfs doesn't properly mount, does help show the commands?

Confirmed ethernet is working on the ARKV6X.

Awesome thanks for testing.

@henrykotze

Copy link
Copy Markdown
Collaborator

Im also interested in upgrading Nuttx. Happy to assist in bench testing and flight testing to get this over the line confidently.

What I will test on my bench so long. I hope to report back in the next week.
ESP32
Holybro v6x
CUAV v6x
Cube Orange Plus

@PetervdPerk-NXP
PetervdPerk-NXP force-pushed the pr-nuttx-12-12-0 branch 8 times, most recently from 91f6a29 to 99280e0 Compare January 7, 2026 14:53
@mrpollo

mrpollo commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Here's a hardfault log fault_1970_01_01_02_37_59.log

@dakejahl

dakejahl commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Here's a hardfault log fault_1970_01_01_02_37_59.log

Do you have the elf? I'll leave an RT running overnight tonight and see if it faults

@mrpollo

mrpollo commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

I haven't been able to replicate this, I left Claude hacking at it all night and nothing has come up yet, I'm going to call this a documented fluke and move on.

@dakejahl here's the ELF if you want to look at this in depth px4_fmu-v6xrt_default.elf.xz.zip

I will move on to testing on the Pixhawk 4 and report back.

mrpollo
mrpollo previously approved these changes Sep 3, 2026
PetervdPerk-NXP and others added 24 commits September 3, 2026 12:03
Update git sha's for NuttX
bootloader: update main prototype for NuttX 12.12.0

platforms/nuttx: Add wrapper for queue.h

For some reason the queue.h header was moved, add this wrapper so
posix and nuttx builds can both still use #include <queue.h>

Fix print_load to be compatible with upstream NuttX

Also Change tg_filelist -> tg_fdlist as per new NuttX

Co-authored-by: Ville Juven <ville.juven@unikie.com>
Signed-off-by: Jukka Laitinen <jukkax@ssrc.tii.ae>
sitl: fix NuttX 11.12.0 upgrade regressions

drivers: uavcan: fix TFLM c library conflict

With NuttX 12.12.0 the TFLM c library causes a conflict
boards: Disable MMC_IOC_CMD ioctl

NuttX default is Y, but it's not used

boards: Fix meminfo/free

boards: fix libc float setting

boards: Reduce flash usage

Using strerr short mode
Don't cache DNS entries (also saves some ram)

fix(boards): kakutef7 disable optical flow ekf2 to save flash

kakutef7 overflows with nuttx 12.12.0 also it doesn't have optical
flow drivers anyhow. Thus disable ekf2 optical flow
NuttX 12.12 changed symbols for certain calls or inlined them.
Fix a protected kernel link failure caused by static initialization
of a shared uORB::Publication in AM32Settings. Which is problematic
for NuttX 12.12.0.

The NuttX 12.12 PX4 protected kernel does not provide __dso_handle.
Upgrading the NuttX apps submodule (kernel bump or switching branches then
`git submodule update`) updates tracked files only. When the new revision
removes an application directory, the autogenerated Kconfig a previous build
left inside it is untracked, so it survives `git clean -dX`. mkkconfig.sh keeps
globbing that orphaned `*/Kconfig`, whose stale `source` points at a file that
no longer exists, breaking `make olddefconfig`:

  olddefconfig: apps/gpsutils/Kconfig:9: 'apps/gpsutils/minmea/Kconfig' not found

Add a `cmake -P` helper, invoked at the end of the `clean` target, that walks
the apps Kconfig graph and removes only untracked Kconfig files that source a
missing path. Tracked files and the nuttx tree (whose stale artifacts are all
gitignored and already dropped by `git clean -dX`) are never touched, so a
`make clean` before rebuilding now migrates cleanly across the upgrade.

Assisted-by: Claude:claude-opus-4.8
Signed-off-by: Peter van der Perk <peter.vanderperk@nxp.com>
The mcp_gpio_dev_s / gpio_pin_dev_s struct layout changed in NuttX
12.12, so use designated initializers (.gp_pintype/.gp_ops) instead of
positional initialization.

Co-authored-by: marinauterion <224611774+marinauterion@users.noreply.github.com>
Signed-off-by: Peter van der Perk <peter.vanderperk@nxp.com>
Stack usage of the mcp23009/mcp23017 GPIO drivers increased with NuttX
12.12, bump STACK_MAIN to 2560.

Co-authored-by: marinauterion <224611774+marinauterion@users.noreply.github.com>
Signed-off-by: Peter van der Perk <peter.vanderperk@nxp.com>
Enable ICANON and ECHO, and map CR to NL (ICRNL) so the nshterm console
echoes typed characters and processes the enter key.

Co-authored-by: marinauterion <224611774+marinauterion@users.noreply.github.com>
Signed-off-by: Peter van der Perk <peter.vanderperk@nxp.com>
fix(mavlink_shell): no echo of commands
The nsh output path changed architecture in NuttX 12: nuttx-apps
95f32fd018 decoupled nshlib from FILE streams, so every output call
now runs vdprintf() with the stream engine and full VFS write chain
on the nsh task stack. On CONFIG_DEFAULT_SMALL boards the
lib_get_tempbuffer() fallback additionally compiles to alloca() on
the parse path. The hardcoded 2048 byte stack overflows, and because
NuttX 12 keeps the TLS block at the stack base the failure is a
silent mute shell rather than a hardfault.

Verified on fmu-v5x hardware: shell dead at 2048, working at 4096.
Mirrors the nshterm stack fix already on this branch (8a8f326).

Assisted-by: Claude:claude-fable-5
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
The upgrade defconfig sweep (04c0026) replaced
CONFIG_STDIO_BUFFER_SIZE=256 with CONFIG_STDIO_DISABLE_BUFFERING=y on
these two boards. On NuttX 12.12 that config hits an upstream
regression (62c2b1abba): task_init_stream() only assigns
fs_cookie/fs_oflags inside the buffered branch, so with unbuffered
stdio every spawned task's stdout FILE is left zeroed and bound to
fd 0. All printf output on the board is silently discarded, including
the boot log and every shell command that prints via stdio; raw fd
writes (top, dmesg) still work, which made this hard to spot.

Verified on fmu-v5x hardware (fileno(stdout)==0 in spawned tasks,
EACCES on flush over the MAVLink shell). Restoring buffered stdio
returns these boards to their pre-upgrade configuration. The upstream
fix apache/nuttx 2b1cf4238756 (post-12.12.0) should additionally be
backported to px4_firmware_nuttx-12.12.0+ to cure the class for any
unbuffered config.

Assisted-by: Claude:claude-fable-5
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
Main removed this file in f057390 (#28185) when USB autostart moved
into the cdcacm_autostart driver. The NuttX upgrade rebase brought back
a NuttX 12 adaptation of it, but nothing references it in any build
file, so it is 370 lines of dead code.

Assisted-by: Claude:claude-fable-5
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
The UAVCAN_BITRATE code merged via #28457 prints the driver's
arbi_bitrate (uint32_t) with %u. On the NuttX 12.12 toolchain
uint32_t is unsigned long, so -Werror=format fails every SocketCAN
board (imxrt, s32k). Use PRIu32 for the uint32_t; kbps stays %u as it
is a uint16_t promoted to int.

Assisted-by: Claude:claude-fable-5
Signed-off-by: Ramon Roche <mrpollo@gmail.com>
NuttX 12.12.0 shares one statically allocated g_kthread_group between all
kernel threads, but group_leave() guards the group_release() call behind
HAVE_GROUP_MEMBERS, which is only defined when pthreads are enabled. Every
bootloader config sets CONFIG_DEFAULT_SMALL=y, so DISABLE_PTHREAD defaults
to y, and the first kernel thread to exit tears down the shared group and
calls kmm_free() on a .bss static. The bootloader died before USB
enumeration. Around 64 configs in the tree share that combination.

The submodule now carries the upstream fix, apache/nuttx f20f9ff19e.

The bump also picks up the backport that recombines the per-command CAN
ioctl Kconfig options back into NETDEV_CAN_IOCTL. Defconfigs on this branch
already reference CONFIG_NETDEV_CAN_IOCTL, which does not exist at the
previously pinned commit, so SocketCAN bitrate, filter and state ioctls
were silently disabled on ark/fmu-v6xrt, px4/fmu-v6xrt, nxp/mr-canhubk3,
nxp/tropic-community and nxp/mr-tropic.

Assisted-by: Claude:claude-opus-5
Signed-off-by: Julian Oes <julian@oes.ch>
NuttX 12.12.0 added arm_initialize_stack(), which moves thread mode onto
the process stack pointer whenever CONFIG_ARCH_INTERRUPTSTACK > 7. Every
bootloader config qualifies, so the bootloader now reaches arch_do_jump()
with CONTROL.SPSEL set, where previously it ran on the main stack.

arch_do_jump() writes the MSP and branches, but never selects it. The
application therefore starts on the bootloader's PSP while its own startup
code initialises a stack pointer the CPU is not using. Boards booted far
enough to reach NSH and start MAVLink, then hard faulted once the stale
bootloader stack was overwritten, surfacing as an assertion in Idle_Task
with no useful backtrace.

Clear CONTROL.SPSEL so control passes on the stack the application expects.
The i.MX RT bootloader performs the same jump and its configs also exceed
the interrupt stack threshold, so fix both.

Verified on CubePilot CubeOrange and Pixhawk 6C; the prebuilt bootloaders
for both are regenerated, as the shipped binaries have the defect.

Assisted-by: Claude:claude-opus-5
Signed-off-by: Julian Oes <julian@oes.ch>
The SIOCSCANBITRATE path in CanIface::setBitRate() was gated on
SIOCGCANERRORS, which the NuttX submodule bump now defines. That turned on
a retune sequence that had never been compiled or run in this tree: it takes
the interface down, sets the bitrate and brings it back up.

Two problems surfaced on a Pixhawk v6XRT. The path did not build, because it
still used IFF_DOWN, which NuttX removed; SIOCSIFFLAGS now acts on the
IFF_UP request bit, so clearing it is what takes an interface down. Once it
built, the board booted and then crashed a few seconds later, when uavcan
started and retuned the interfaces. The driver ioctl itself is harmless and
only stores the timings, so the fault is in bringing a FlexCAN interface
down and back up at runtime, where ECC RAM initialisation runs again on a
controller that has already been started.

SIOCGCANERRORS reports whether a driver can read error counters, which says
nothing about whether it can be retuned; the two capabilities only happened
to arrive in the same commit. Gate on the capability that is actually meant,
and keep the configured rate on the FlexCAN chips. Every board in the tree
that enables SocketCAN today is FlexCAN, so this restores the behaviour
those boards already had before the bump.

Verified on px4_fmu-v6xrt: crashes with the retune path active, stable with
the configured rate kept.

Assisted-by: Claude:claude-opus-5
Signed-off-by: Julian Oes <julian@oes.ch>
The fix is upstream as f20cf4aac3 but landed after the 12.12.0 tag, so
moving the submodule onto 12.12.0 dropped a fix the previous branch
already carried. Backport it.

Without it the group address in the IGMP header, a uint16_t[2] that decays
to a pointer, is compared against INADDR_ANY, which is always false. A
General Query then falls through to the group-specific branch, a group is
allocated for 0.0.0.0, and joined groups never have their report timers
restarted, so the querier ages out the membership and multicast delivery
to the device stops.

CONFIG_NET_IGMP is enabled on ark/fmu-v6xrt, px4/fmu-v6xrt,
nxp/mr-canhubk3, nxp/mr-tropic and nxp/tropic-community.

Assisted-by: Claude:claude-opus-5
Signed-off-by: Julian Oes <julian@oes.ch>
Kernel update changed can_ioctl_data_s bitrate unit from kbit/s to bit/s
Update uavcan ioctl logic accordingly
Fixes the redefinition warnings in apps/system/dd/dd_main.c.
…ork queues for NuttX 12 (#28509)

* fix(uavcan): apply UAVCAN_BITRATE on FlexCAN again

58dfff0 turned the SIOCSCANBITRATE path off for i.MX RT, S32K and Kinetis,
which is every board in the tree that builds SocketCAN, so UAVCAN_BITRATE
stopped doing anything at all. It was written before db6f7ec, and the crash
it works around is that commit's bug: the driver reports bit/s on NuttX 12 and
the caller still divided by 1000, so a 1 Mbit/s board asked its controller for
1000 bit/s on every boot.

Benched on an ARK FMU-v6XRT with the gate removed: 1 Mbit/s -> 500 kbit/s ->
1 Mbit/s round-trips with both DroneCAN nodes coming back OPERAT, buses
error-active, no fault. Requesting a rate the controller cannot reach is also
survivable now -- it is reported and the configured rate is kept, where before
a negative return from here made CanDriver::init() give up and DroneCAN never
started.

The %u for a uint32_t is fixed as well; nothing compiled this branch while the
gate was in place.

* fix(work_queue): size the uavcan and TTY work queues for NuttX 12

NuttX 12.12 costs a few hundred bytes of stack on the paths that go through
the file layer, and that is more than these two defaults left spare. Measured
against the same PX4 tree on 10.3.0:

  wq:uavcan  2860/3728 -> 3184/3736  (ARK FMU-v6X, two DroneCAN GNSS nodes)
  wq:ttyS4   1088/1704 -> 1432/1712  (ARK FMU-v6XRT, crsf_rc)

load_mon reports wq:ttyS4 low on stack with 280 bytes left, and wq:uavcan sits
at 85 % of its own. 4096 and 2048 restore the margin the 10.3.0 figures had.
Advance the NuttX submodule from 1db7c59 to the fork branch tip
f07832f0 (px4_firmware_nuttx-12.12.0+), pulling in three backports:

  - FlexCAN: store the TX deadline only once the frame is sent
  - FlexCAN: assign MAXMB rather than OR-ing it in
  - STM32F412: set SRAM1_END to 256KiB (#407)

The two FlexCAN backports are the apache/nuttx#19970 follow-ups the
branch was missing; they land the corrected i.MX RT TX-abort behavior.

Signed-off-by: Ramon Roche <mrpollo@gmail.com>
Assisted-by: Claude:claude-fable-5-1
@mrpollo

mrpollo commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Thanks @PetervdPerk-NXP and everyone else that helped push this forward 🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

kind:feature Request or change that adds new functionality. risk:safety-critical May affect arming, failsafe, control, navigation, or flight safety. scope:boards Board-specific changes or hardware definitions. scope:build-system CMake, Kconfig, board config, or build tooling. scope:control Rate, attitude, position, allocation, or actuator control. scope:dependencies Dependency or submodule updates. scope:drivers Device drivers and hardware interfaces. scope:mavlink MAVLink module, streams, commands, or protocol handling. scope:middleware DDS, ROS 2, Cyphal/UAVCAN, zenoh, or bridge layers. scope:navigation Missions, RTL, geofence, takeoff, landing, or navigator behavior. scope:offboard Offboard mode, external setpoints, companion-computer control, or offboard failsafe behavior. scope:parameters Parameter definitions, metadata, migration, or defaults.

Projects

None yet

Development

Successfully merging this pull request may close these issues.