Record SolarXiao auto detection and Base build validation [skip ci]

This commit is contained in:
mikecarper committed 2026-10-21 16:38:11 -07:00
1 parent 804219e9fe
commit 7182c01ff8
4 files changed
+275 -1

No files matched your search

+2 -1
View File
@@ -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.
+1
View File
@@ -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)
@@ -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.
@@ -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"
}
}
}
}