code wiki / (root) / nx_mcu_ready.nx

nx_mcu_ready.nx

buildroot/runtime/nx_mcu_ready.nx

6125 B92 linesdepth 3pulls 4 transitivereach 1 importersview sourcekind librarytopic mcu
docsdependenciesstructsconstsfunctions

about

nx_mcu_ready.nx -- THE HARDWARE-TEST CHOKEPOINT: composes the two independent questions a board must answer before anyone plugs one in. 1. DOES IT FIT? nx_mcu_fit -- core->SRAM, weights+table->flash, KV->PSRAM, refusing UNMEASURED. 2. IS IT SAFE? nx_mcu_brick -- eFuse burns refused as a class; flash permitted only while the mask-ROM UART recovery path is intact. ★SAFETY DOMINATES, ALWAYS. A config that fits perfectly is still REFUSED if the write is irreversible. The reverse is not symmetric: a safe write that does not fit is merely a sizing problem, recoverable by choosing a smaller model. An unsafe write that fits is a DEAD BOARD. So the composition is deliberately NOT a symmetric AND -- when both fail, the reported blocker is SAFETY, because that is the one the operator must never work around. WHY A SEPARATE ORGAN RATHER THAN A FLAG ON EITHER. Both inputs already exist and are gated (nx_mcu_fit 13/13, nx_neverbrick_gate 9/9). What did not exist was a SINGLE CALL a bring-up path can route through, and per the adoption law a capability proven only inside its own gate IS the baseline. This is the wire. FIRST- vs THIRD-PARTY: identical logic, different data. A first-party board is a row in mcu_targets.conf we have benched; a third-party board is a row we have NOT, so its fields are -1 and nx_mcu_fit REFUSES with UNMEASURED. That refusal is the correct answer for an unknown board -- it returns a work order ("bench these fields") rather than a guess, which is exactly what makes third-party testing safe. license_tier: ORIGINAL No hw writes (Rule 26).

dependencies 3 imports · 1 importers

nx_syscalls.nx nx_mcu_fit.nx nx_mcu_brick.nx nx_mcu_ready.nx nx_mcu_ready_gate.nx

imports: nx_syscalls.nxnx_mcu_fit.nxnx_mcu_brick.nx

imported by: nx_mcu_ready_gate.nx

structs

none

consts

32const RDY_READY: i64 = 100
33const RDY_BLOCKED_FIT: i64 = 101
34const RDY_BLOCKED_SAFETY: i64 = 102
35const RDY_BLOCKED_BOTH: i64 = 103

functions

37func rdy_reason(v: i64) -> *u8
called by 1: main
45func rdy_check(sram_kb: i64, psram_mb: i64, flash_mb: i64,
called by 1: main calls 2: mf_admitnb_verdict
78func rdy_probe(v: i64) -> *u8
called by 1: main
87func rdy_target_measured(sram_kb: i64, psram_mb: i64, flash_mb: i64) -> i64
called by 1: main