!boards: Simplify NuttX initialization#18408
Conversation
|
Notes for reviewers on the initial draft:
|
|
@linguini1 this is a great initiative. |
Hi @fdcavalcanti, if you're talking about making the changes, I think all ESP boards should be included in this patch already (xtensa/risc-v). They were actually quite easy since the board_late_init and board_app_init logic were pretty much identical. If you're talking about how to test, the process would be to configure the build system for one of the modified ESP32 configurations (i.e. nsh) and just boot into NuttX, check that things look okay and run Hope I understood correctly, thanks for your help! |
f30db82 to
31a4ad2
Compare
|
Okay, it should all be good now! Thanks so much for the testing @fdcavalcanti ! I really appreciate your help! |
cederom
left a comment
There was a problem hiding this comment.
Very cool, thank you @linguini1 for this cleanup, lots of work and time, kudos!
In the next step we should create a good documentation of the whole boot process :D
I agree. That will be on the roster soon while I work on getting my altimeter running. I have to first get the nuttx-apps twin PR merged, then do the last step which removes the |
lupyuen
left a comment
There was a problem hiding this comment.
Tested OK on Arm64 + RISC-V 64-bit SBCs: Avaota-A1, StarPro64, Oz64. Thanks :-)
$ git clone https://github.com/linguini1/nuttx nuttx --branch byebye-archinit
$ git clone https://github.com/linguini1/nuttx-apps apps --branch byebye-archinit
...
nsh> uname -a
NuttX 0.0.0 a5b265711e Apr 29 2026 13:56:15 ...
nsh> ostest
ostest_main: Exiting with status 0|
FYI I'm trying to understand the Init Sequence before and after the PR. Here's what the LLM drew, not sure if it's correct 🤔 https://docs.google.com/document/d/1o8z4JIUp88NhCPftAZ28GOHpy9ERGaxfLRgEXHd5mUo/edit?tab=t.0 sequenceDiagram
participant Hardware as MCU/Hardware
participant Kernel as nx_start (Kernel)
participant Board as Board Logic (*_boot.c)
participant AppInit as Board App Init (*_appinit.c)
participant NSH as Application (NSH)
Note over Hardware, NSH: BEFORE PR #18408 (Legacy Flow)
Hardware->>Kernel: Reset / Entry Point
Kernel->>Board: board_initialize() (Early)
Kernel->>NSH: task_create("nsh_main")
activate NSH
NSH->>Kernel: boardctl(BOARDIOC_INIT)
Kernel->>AppInit: board_app_initialize()
AppInit->>Kernel: Register Drivers (/dev/sensor0, etc.)
deactivate NSH
Note over NSH: Shell becomes ready with drivers
sequenceDiagram
participant Hardware as MCU/Hardware
participant Kernel as nx_start (Kernel)
participant Board as Board Logic (*_boot.c)
participant AppInit as Board App Init (*_appinit.c)
participant NSH as Application (NSH)
Note over Hardware, NSH: AFTER PR #18408 (Simplified Flow)
Hardware->>Kernel: Reset / Entry Point
Kernel->>Board: board_initialize() (Early)
Kernel->>Board: board_late_initialize() (New Unified Hook)
Board->>Kernel: Register Drivers (/dev/sensor0, etc.)
Kernel->>NSH: task_create("nsh_main")
activate NSH
Note over NSH: Shell starts. Drivers already registered
deactivate NSH
|
|
@michallenc and @acassis, please take look; the change requests are now resolved. |
BREAKING: In an effort to simplify NuttX initialization, NSH_ARCHINIT is removed. board_app_initialize is also removed. BOARD_LATE_INITIALIZE now performs all board initialization logic, and is by default enabled. All references to these symbols are removed. BOARDIOC_INIT remains, but will result in -ENOTTY when called. It is to be removed in a later commit. Quick fix: Boards relying on NSH_ARCHINIT should now enable CONFIG_BOARD_LATE_INITIALIZE instead. If the application needs fine-grained control over board initialization from userspace, the logic performed by BOARDIOC_INIT may be copied to the board_finalinitialize function and used instead via BOARDIOC_FINALINIT. All board_app_initialize logic provided by NuttX is now moved to board_late_initialize, and the same should be done for out-of-tree boards. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Logic provided by board_app_initialize is replaced by board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Logic provided by board_app_initialize is removed due to the removal of BOARDIOC_INIT boardctl command. Logic inside board_late_initialize is to be used and is identical. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
Replaced board_app_initialize logic with board_late_initialize. Signed-off-by: Matteo Golin <matteo.golin@gmail.com>
|
Rebased onto master again due to changes with QEMU VGA support. |
lupyuen
left a comment
There was a problem hiding this comment.
Tested OK on Arm64 + RISC-V 64-bit SBCs: Avaota-A1, StarPro64, Oz64. Thanks :-)
$ git clone https://github.com/linguini1/nuttx nuttx --branch byebye-archinit
$ git clone https://github.com/linguini1/nuttx-apps apps --branch byebye-archinit
...
nsh> uname -a
NuttX 0.0.0 7f2d327695 May 2 2026 16:13:54 ...
nsh> ostest
ostest_main: Exiting with status 0
Summary
BREAKING CHANGE
This change simplifies the NuttX initialization logic by:
board_app_initialize did so any defconfigs relying on NSH_ARCHINIT will not
break.
This is related to #11321.
Twin PR in NuttX apps should be merged at the same time: apache/nuttx-apps#3405
Impact
Almost every single board/configuration in the NuttX source tree, since many
relied on NSH for initialization.
This is a breaking change that removes the user's ability to use BOARDIOC_INIT
as well. Users are provided with quick-fixes in the commit messages for how to
fix any breakages. BOARDIOC_FINALINIT should be used instead for applications
that truly require full control over the initialization process. For every other
application, BOARD_LATE_INITIALIZE should be enabled to have the NuttX kernel
perform initialization before launching into the app.
Testing
I will be testing on the platforms available to me (simulators and whatever
hardware I own). Testing from community members with hardware across the
architectures affected would be greatly appreciated. If you do want to help with
testing, please provide logs in the PR comments for the affected defconfigs you
tested.
Testing of applications can be seen in the twin PR: apache/nuttx-apps#3405
OS Test logs
sim:nsh: sim-nsh.txtqemu-armv8a:nsh: qemu-armv8a-nsh.txtqemu-armv7a:nsh: qemu-armv7a-nsh.txtrv-virt:nsh: rv-virt-nsh.txtraspberrypi-4b:sd: rpi4b-sd.txt (verify SD filesystem is mounted + ostest)samv71-xult:nsh,samv71-xult:netnsh: See commentesp32c3-xiao:ble: esp32c3-xiao.txtAvaota A1: Avaota A1StarPro64: StarPro64Oz64: Oz64Espressif CI: Espressif CI