Apache NuttX is a mature, real-time embedded operating system (RTOS) https://nuttx.apache.org/
Find a file
Julian Oes 0c287d6f45 drivers/mtd/w25n: implement bad block management
Use the chip's built-in 20-entry non-volatile Bad Block Management
Look-Up Table (datasheet section 8.2.7) to transparently route around
bad blocks.

Init:
- Reserve the top 24 blocks of the array as a spare pool
- Clamp the MTD geometry to W25N_USER_BLOCKS = 1000 so upper layers
  never see the spare area (125 MB usable instead of 128 MB)
- Force BUF=1 alongside enabling ECC. The W25N01GVxxIT variant
  power-ups with BUF=0 (Continuous Read mode), in which Read Data
  ignores the column address and always starts at byte 0 - which
  silently broke any read targeting a non-zero column (OOB markers,
  sub-page reads in w25n_read).
- Scan all 1024 blocks for factory bad markers (non-FFh at byte 0 of
  the spare area of page 0) and remap any user-area bad blocks via the
  A1h BBM command. Idempotent across reboots: blocks already present
  in the LUT are skipped, so repeated scans don't consume LUT slots.

Runtime:
- On E-FAIL from w25n_block_erase or P-FAIL from w25n_program_execute,
  allocate a spare and issue A1h, then retry the operation once. The
  chip routes the retry to the spare PBA transparently. Data buffer is
  reloaded on program retry.
- Uncorrectable read ECC is left as -EIO (soft errors shouldn't trigger
  permanent remap, and remapping discards data we may still recover).

Safeguards against burning LUT slots on bogus bad blocks:
- w25n_pick_free_spare erases each candidate spare as an active proof
  of life before returning it - the factory OOB marker alone isn't
  trusted.
- w25n_bbm_swap rejects A1h with LBA outside the user area or PBA
  outside the spare pool.

Stack discipline for the logger-thread hot path:
- The 20-entry cached LUT lives in the device struct, not on the stack.
- w25n_read_bbm_lut decodes 4 bytes at a time instead of reading the
  full 80-byte LUT dump into a local buffer.

Boot diagnostics are emitted via syslog so they appear unconditionally:
- [w25n] BBM scan summary (new/remapped/unremapped/previously-remapped/
  LUT slots used)
- [w25n] W25N01GV ready line with user blocks, spare count, geometry,
  and actual SPI frequency
- [w25n] per-remap info and warnings on runtime E-FAIL/P-FAIL paths

Note: existing littlefs filesystems become unmountable because the
block count shrinks from 1024 to 1000; both PX4 board init.c paths
already mount with autoformat so they reformat on first boot after
this change.

Signed-off-by: Julian Oes <julian@oes.ch>
2026-04-23 16:26:44 +02:00
.github workflows/build.yml: job MSVC fix Filename too long 2026-04-13 23:55:10 +08:00
arch boards/stm32l4: migrate to new pinmap 2026-04-23 20:34:00 +08:00
audio include/debug.h: Move to include/nuttx/debug.h 2026-04-07 07:50:06 -03:00
binfmt include/debug.h: Move to include/nuttx/debug.h 2026-04-07 07:50:06 -03:00
boards boards/sim: Prefer tmpfs for /tmp in rc.sysinit. 2026-04-23 10:26:21 -03:00
cmake cmake: Moved the creation of the nxtmpdir folder to the root CMake file 2026-04-22 06:22:36 +08:00
crypto include/debug.h: Move to include/nuttx/debug.h 2026-04-07 07:50:06 -03:00
Documentation sched/docs: Align ETC ROMFS text with tmpfs-first /tmp mount. 2026-04-23 10:26:21 -03:00
drivers drivers/mtd/w25n: implement bad block management 2026-04-23 16:26:44 +02:00
dummy build: add initial cmake build system 2023-07-08 13:50:48 +08:00
fs fs/vfs/fs_fstat.c: fix write capability check in proxy_fstat() 2026-04-16 13:35:41 +02:00
graphics include/debug.h: Move to include/nuttx/debug.h 2026-04-07 07:50:06 -03:00
include nuttx/nx: compilation error occurs 2026-04-14 13:35:26 +08:00
libs include/debug.h: Move to include/nuttx/debug.h 2026-04-07 07:50:06 -03:00
mm include/debug.h: Move to include/nuttx/debug.h 2026-04-07 07:50:06 -03:00
net net/devif: Reorder ipv4_input packet classification. 2026-04-23 15:11:08 +08:00
openamp openamp: Fix Make style 2026-03-23 18:16:46 -04:00
pass1 Makefile: Remove make depend files by make distclean 2026-02-16 16:27:57 +01:00
sched sched/docs: Align ETC ROMFS text with tmpfs-first /tmp mount. 2026-04-23 10:26:21 -03:00
syscall Makefile: Remove make depend files by make distclean 2026-02-16 16:27:57 +01:00
tools ci/testlist/risc-v-02.dat: Added boards build with CMake 2026-04-22 06:22:36 +08:00
video include/debug.h: Move to include/nuttx/debug.h 2026-04-07 07:50:06 -03:00
wireless include/debug.h: Move to include/nuttx/debug.h 2026-04-07 07:50:06 -03:00
.asf.yaml github: master branch protection tune. 2025-05-07 18:37:13 -05:00
.codespell-ignore-lines net/icmpv6: replace net_lock with conn_lock and conn_lock_dev 2025-12-29 09:42:18 +08:00
.codespellrc codespellrc: add ist to ignorelist 2025-10-14 17:42:01 +08:00
.editorconfig .editorconfig: fix character encoding property specification 2025-11-28 19:12:13 +08:00
.gitignore tools/Unix.mk: fix Untracked files defconfig.tmp-e on macOS 2026-04-15 17:10:22 +08:00
.gitmessage docs/contributing: Add a commit message template 2025-06-03 17:33:24 +08:00
.pre-commit-config.yaml pre-commit: enable codespell checks 2025-05-05 12:34:39 +08:00
.yamllint
AUTHORS AUTHORS: add Donny Jiuzhu 2026-02-25 10:17:40 +01:00
CMakeLists.txt cmake: Moved the creation of the nxtmpdir folder to the root CMake file 2026-04-22 06:22:36 +08:00
CONTRIBUTING.md docs: Fix typos, formatting, and numbering in README.md and CONTRIBUTING.md. 2026-03-23 12:05:24 +01:00
INVIOLABLES.md
Kconfig tools/stackusage.py: use toolchain binaries instead of Python libraries 2026-03-17 11:26:44 -03:00
LICENSE style: fix spelling in code comments and strings 2025-05-23 10:48:41 +08:00
Makefile tools: migrate to SPDX identifier 2024-09-10 23:11:11 +08:00
NOTICE Remove the double blank line from source files 2022-02-20 20:10:14 +01:00
README.md docs: Fix typos, formatting, and numbering in README.md and CONTRIBUTING.md. 2026-03-23 12:05:24 +01:00
ReleaseNotes Documentation: move ReleaseNotes 2023-09-26 20:41:00 +08:00

POSIX Badge License Issues Tracking Badge Contributors GitHub Build Badge Documentation Badge

Apache NuttX is a real-time operating system (RTOS) with an emphasis on standards compliance and small footprint. Scalable from 8-bit to 64-bit microcontroller environments, the primary governing standards in NuttX are POSIX and ANSI standards. Additional standard APIs from Unix and other common RTOSs (such as VxWorks) are adopted for functionality not available under these standards, or for functionality that is not appropriate for deeply-embedded environments (such as fork()).

For brevity, many parts of the documentation will refer to Apache NuttX as simply NuttX.

Getting Started

First time on NuttX? Read the Getting Started guide! If you don't have a board available, NuttX has its own simulator that you can run on terminal.

Documentation

You can find the current NuttX documentation on the Documentation Page.

Alternatively, you can build the documentation yourself by following the Documentation Build Instructions.

The old NuttX documentation is still available in the Apache wiki.

Supported Boards

NuttX supports a wide variety of platforms. See the full list on the Supported Platforms page.

Contributing

If you wish to contribute to the NuttX project, read the Contributing guidelines for information on Git usage, coding standard, workflow and the NuttX principles.

License

The code in this repository is under either the Apache 2 license, or a license compatible with the Apache 2 license. See the License Page for more information.