diff --git a/docs/solarxiao_power.md b/docs/solarxiao_power.md index 67aacb80c..99e7f5b93 100644 --- a/docs/solarxiao_power.md +++ b/docs/solarxiao_power.md @@ -112,7 +112,8 @@ A remotely deployed node must first receive compatible firmware before these commands can be used. Deployment still requires its installed target and bootloader compatibility to be checked when it is reachable. -See the [earlier manual Advanced profile validation](test-results/solarxiao_advanced_2026-10-21.md). +See the [automatic detection/Base build and host validation](test-results/solarxiao_auto_2026-10-21.md) +and [earlier manual Advanced profile validation](test-results/solarxiao_advanced_2026-10-21.md). This adds no measurements beyond existing self voltage/MCU temperature and has not been installed on the remote Advanced board. diff --git a/docs/test-results/index.md b/docs/test-results/index.md index c307a7bab..7915a46d6 100644 --- a/docs/test-results/index.md +++ b/docs/test-results/index.md @@ -11,6 +11,7 @@ Completed validation reports, experiments, and test guides are collected here. O ## Radio and RF +- [SolarXiao automatic detection and Base support build/host validation, 2026-10-21](solarxiao_auto_2026-10-21.md) - [SolarXiao Advanced carrier profile build/host validation, 2026-10-21](solarxiao_advanced_2026-10-21.md) - [SolarXiao native MPPT and battery controls, 2026-10-21](solarxiao_power_2026-10-21.md) diff --git a/docs/test-results/solarxiao_auto_2026-10-21.md b/docs/test-results/solarxiao_auto_2026-10-21.md new file mode 100644 index 000000000..8a965af99 --- /dev/null +++ b/docs/test-results/solarxiao_auto_2026-10-21.md @@ -0,0 +1,109 @@ +# SolarXiao automatic carrier detection and Base support, 2026-10-21 + +SolarXiao repeater firmware now defaults to automatic carrier detection when +there is no saved selection. A verified INA260 identity enables MPPT support; +until then, the firmware reports self-only telemetry without guessing Base +versus Advanced. Existing saved manual selections retain their meanings. +Manual `auto`, `base`, `advanced` and `mppt` settings remain available. + +Base needs no additional telemetry driver. The published +[Base Standard schematic](https://github.com/wehooper4/Meshtastic-Hardware/blob/main/XaioSeries/SolarXaio/Base/Standard/Schematic_SolarXaio_Base_2025-10-23.pdf) +uses a CN3791 analog charger with no digital interface or INA monitor. Its +battery connects to the XIAO BAT input; charge status drives an LED. Like the +older BQ24650 Advanced design, it provides existing XIAO battery voltage and +MCU temperature only. There are no new physical measurements for either board. +Base Lite publishes a README but no schematic; its exact wiring is not +independently qualified here. + +Radio target selection stays separate. The published Base schematic specifies +E22-900M30S; the pictured 2W Advanced has M33S. The existing 30S/33S target must +match the fitted module. Charger detection does not change RF settings, +PA limits, hardware/OTA identity, bootloader, flash layout or battery protection. + +## Qualified source and packages + +| Item | Result | +| --- | --- | +| Application source | [`5c44324330a4b3a2e79059dbfa5e086d4cfc1e08`](https://github.com/mikecarper/MeshCore/commit/5c44324330a4b3a2e79059dbfa5e086d4cfc1e08) | +| Version | `v1.18.0.1-halo-keymind-cascade-dev-5c443243` | +| 33S OTA target / hardware | `0x3caf966e` / `solarxiao_33S`, unchanged | +| 30S OTA target / hardware | `0xb38ebf22` / `solarxiao_30S`, unchanged | +| Native host checks | 22 PASS: 19 carrier methods and 3 existing power methods; native harnesses use ASan/UBSan | +| XIAO startup/battery safety checks | 6 PASS | +| Full/Reduced DFU, UF2, linked capabilities, memory | PASS for both targets | + +| Target | Profile | Application bytes | EndF body hash | Internal bytes available | +| --- | --- | --- | --- | --- | +| `solarxiao_33S_repeater` | Full | 599,132 | `7AB98467B6E3A468` | 150,576 | +| `solarxiao_33S_repeater` | Reduced | 569,136 | `217075127849EE7C` | 152,224 | +| `solarxiao_30S_repeater` | Full | 599,132 | `0C386CB1FC49608C` | 150,576 | +| `solarxiao_30S_repeater` | Reduced | 569,136 | `ACBB1554247BB0B5` | 152,224 | + +Every memory check requires 76,960 heap/transient bytes. Both profiles in both +targets retain compiled LoRa/Bluetooth update support and telemetry history. +Independent package checks verified the application version, EndF body length, +body hash and target/hardware IDs. Package, UF2 and manifest file hashes matched. +All four applications contain the native power marker, verified/pending Auto +responses, Base/CN3791 and Advanced/BQ24650 descriptions, live self-reading +response and history guidance. + +The first 30S dependency installation failed before compilation because of a +local disk quota. Reusing the identical inherited 33S dependency cache resolved +the build setup; the final 30S Full/Reduced pair passed. PlatformIO processes +ran sequentially throughout. Logs and packages are retained under +`/home/mesh/hwtest/solarxiao-auto-20261021/`. + +See the [machine-readable validation record](solarxiao_auto_2026-10-21.safe.json) +for exact package/application/UF2 hashes and detection parameters, and the +[controls guide](../solarxiao_power.md) for commands and hardware limits. + +## Detection and host acceptance + +Auto reads only INA260 identity registers at carrier address `0x40`: +manufacturer `0xfe = 0x5449` and device `0xff & 0xfff0 = 0x2270`. Address ACK, +wrong identity, missing response and an incomplete second read do not enable +MPPT. No INA or charger configuration is written by detection. + +The first probe occurs after startup initialization. Unverified detection +retries every five seconds, including across the millisecond timer wrap. +A positive identity is retained until reboot or a successful mode change; +temporary communication loss does not demote it. Before verification, the +adapter does not read the LTC4162, replay saved overrides or emit native carrier +telemetry/history. Self battery/MCU readings remain available. + +The actual adapter harness verifies delayed discovery and reloads retained +charger overrides only on the transition that enables native access. A dedicated +long-uptime test first services manual MPPT at a low timestamp, disables it, +then detects Auto at `UINT32_MAX - 1000`: replay occurs immediately once, the +next check waits exactly five seconds across wrap, and a simulated charger +reset reapplies the override without redundant writes afterward. + +Manual Base/Advanced and unconfirmed/corrupt selections make zero native bus +calls. Saved Auto restarts as unverified; original eight-byte manual MPPT and +Advanced records keep their exact meanings without being rewritten. Fault +tests cover metadata/read errors, wrong-size/corrupt records, partial writes, +failed rename, corrupt publication and ambiguous public readback. Explicit +successful selection recovers. Existing parser bounds, reply canaries, missing +readings, history feature propagation, core charger checks and telemetry +permissions/channel-order tests also pass. + +## Deployment limits and commands + +No firmware was flashed to any device in this run. No physical Auto detection, +Base/Advanced electrical measurement, boot/soak, radio forwarding or LoRa OTA +transfer was tested for this image. SEA Sherwood remains unreachable and +unchanged; its installed target and bootloader have not been verified. Earlier +Mercerwood hardware results belong to their named firmware revisions. + +With no saved selection, Auto requires no setup. To replace a saved manual +selection after installing compatible firmware: + +```text +set solar.board auto +get solar.board +get solar capabilities +``` + +Manual overrides use `set solar.board base|advanced|mppt`. When native access +becomes enabled, retained `/solar_power` overrides are reloaded. Fresh LTC4162 +chemistry/cell-count checks still independently guard all charger writes. diff --git a/docs/test-results/solarxiao_auto_2026-10-21.safe.json b/docs/test-results/solarxiao_auto_2026-10-21.safe.json new file mode 100644 index 000000000..75d1b37c8 --- /dev/null +++ b/docs/test-results/solarxiao_auto_2026-10-21.safe.json @@ -0,0 +1,163 @@ +{ + "passed": true, + "scope": "build and host validation only; no hardware flashing, OTA transfer, electrical or radio tests", + "source_commit": "5c44324330a4b3a2e79059dbfa5e086d4cfc1e08", + "version": "v1.18.0.1-halo-keymind-cascade-dev-5c443243", + "default_selection": "auto when no saved selection exists", + "detection": { + "address": "0x40", + "manufacturer_register": "0xfe", + "manufacturer_id": "0x5449", + "device_register": "0xff", + "device_mask": "0xfff0", + "device_id": "0x2270", + "retry_ms": 5000, + "positive_identity_latched_until": "reboot or selection change", + "unverified_result": "self-only; Base vs Advanced unknown", + "detection_configuration_writes": 0 + }, + "manual_overrides": [ + "auto", + "base", + "advanced", + "mppt" + ], + "legacy_manual_records_preserved": true, + "base_and_advanced_new_measurements": [], + "installed_on_any_device": false, + "tests": { + "carrier": 19, + "existing_native_power": 3, + "xiao_battery_safety": 6, + "total": 28, + "native_sanitizers": [ + "ASan", + "UBSan" + ], + "native-tests.log_sha256": "5cea7fe67245b4c13cf9d14d0d603c9209217d0fb8f0392c94d7727a3978bd71", + "xiao-startup-tests.log_sha256": "aeb690eba78ed4f1376ccdbbfb9ecc7e531f3ae1488e5793e87d300f6a11f2f0" + }, + "build_environment": { + "initial_30s_dependency_install": "failed with local disk quota exceeded before compilation; retained log", + "retry": "reused the identical inherited 33S dependency cache; Full and Reduced passed", + "platformio_concurrency": 1 + }, + "builds": { + "solarxiao_33S_repeater": { + "full": { + "package": "solarxiao_33S_repeater-full-ota-v1.18.0.1-halo-keymind-cascade-dev-5c443243.zip", + "package_sha256": "ac8908c732c0e19571ff482842095e99405cd0c0bf6c235c1b269c7a0b13013b", + "application_bytes": 599132, + "application_sha256": "ff075c9f3cca5e98becdc27fe5a15d2fbe8a1458b70c72c7cbf9b0f9d1814325", + "body_bytes": 599076, + "body_hash": "7AB98467B6E3A468", + "ota_target": "0x3caf966e", + "hardware_id": "solarxiao_33S", + "firmware_markers": { + "native_power": true, + "auto_identity_verified": true, + "auto_unverified_self_only": true, + "base_analog_charger": true, + "advanced_analog_charger": true, + "live_self_readings": true, + "history_guidance": true + }, + "memory_passed": true, + "available_internal_bytes": 150576, + "required_heap_bytes": 76960, + "capabilities_verified": true, + "update_methods": [ + "bluetooth", + "lora" + ], + "uf2_sha256": "8ba8286eb2be7f2538802ddacc99e1eefd898721938dff0becbbc85ce3796ea5" + }, + "reduced": { + "package": "solarxiao_33S_repeater-reduced-ota-v1.18.0.1-halo-keymind-cascade-dev-5c443243.zip", + "package_sha256": "60bebaaa24a5abab94bfa26f3d826ba2a7e619b552dcdd060db247b692370abf", + "application_bytes": 569136, + "application_sha256": "03281ca3816d68ed45474a6dc7fa15db9eac764e7c036109019c0c81e687a494", + "body_bytes": 569080, + "body_hash": "217075127849EE7C", + "ota_target": "0x3caf966e", + "hardware_id": "solarxiao_33S", + "firmware_markers": { + "native_power": true, + "auto_identity_verified": true, + "auto_unverified_self_only": true, + "base_analog_charger": true, + "advanced_analog_charger": true, + "live_self_readings": true, + "history_guidance": true + }, + "memory_passed": true, + "available_internal_bytes": 152224, + "required_heap_bytes": 76960, + "capabilities_verified": true, + "update_methods": [ + "bluetooth", + "lora" + ], + "uf2_sha256": "d2cbb00a0dac8bf846f80af4f27e13100c86b23e35a64ac88a82d8f55f90f642" + } + }, + "solarxiao_30S_repeater": { + "full": { + "package": "solarxiao_30S_repeater-full-ota-v1.18.0.1-halo-keymind-cascade-dev-5c443243.zip", + "package_sha256": "cad2a95577d4e594340587ceed621994457e6de1325f1c29efc780ea0e86bb1d", + "application_bytes": 599132, + "application_sha256": "d24f914c0a211d616b7419e2b8f03c6ec65158f26719ddff70cae544904521d1", + "body_bytes": 599076, + "body_hash": "0C386CB1FC49608C", + "ota_target": "0xb38ebf22", + "hardware_id": "solarxiao_30S", + "firmware_markers": { + "native_power": true, + "auto_identity_verified": true, + "auto_unverified_self_only": true, + "base_analog_charger": true, + "advanced_analog_charger": true, + "live_self_readings": true, + "history_guidance": true + }, + "memory_passed": true, + "available_internal_bytes": 150576, + "required_heap_bytes": 76960, + "capabilities_verified": true, + "update_methods": [ + "bluetooth", + "lora" + ], + "uf2_sha256": "69ef67c581b1c913d5506d6a9a6ae4d6a97a37335a00cc0cf5ad46333981aaa1" + }, + "reduced": { + "package": "solarxiao_30S_repeater-reduced-ota-v1.18.0.1-halo-keymind-cascade-dev-5c443243.zip", + "package_sha256": "240bbe83fffb0a1f3480a361b8533ccc1cfc31f768a318791ac3d81e33f7f4cc", + "application_bytes": 569136, + "application_sha256": "3ba61daf9e536e636a4aed9afff3566e99852d9ce57c7f963666824cef0d3ea8", + "body_bytes": 569080, + "body_hash": "ACBB1554247BB0B5", + "ota_target": "0xb38ebf22", + "hardware_id": "solarxiao_30S", + "firmware_markers": { + "native_power": true, + "auto_identity_verified": true, + "auto_unverified_self_only": true, + "base_analog_charger": true, + "advanced_analog_charger": true, + "live_self_readings": true, + "history_guidance": true + }, + "memory_passed": true, + "available_internal_bytes": 152224, + "required_heap_bytes": 76960, + "capabilities_verified": true, + "update_methods": [ + "bluetooth", + "lora" + ], + "uf2_sha256": "3fb621c06960203ca1227a05f128e483033e79a52b144db0374c5c63a1d8c22c" + } + } + } +}