# IMX Shared SDRAM Buffer Qualification — 2026-07-27

Status: passed on Controller B then Controller A; both left Graph-ready

## Exact candidate

- Debug S-record SHA-256:
  `30C98F00E8712BB1C9CF4C9FC144F20A84692C1C416CE09BEF5AF20E2AADF649`
- Debug ELF SHA-256:
  `F53A6E1C15142936F90A6BF99D55A9B5D31009C465705B0431D7693C23952821`
- Installed four-MiB internal-flash SHA-256 on both controls:
  `6C0DBDB31E30AAD13993CA3D49BA0141BEDCC8FF2E4C38BC33743D9FA7389D4B`
- Clean isolated e2 production build/package: pass
- Shared `.smi_usb` allocation: 131,072 bytes at `0x91AAA080`
- Retained `.noinit` total: 232 bytes; IMX telemetry: 128 bytes
- Owner-authorized USB buffer ceiling: unchanged at 1,024 KiB

The implementation reuses one 128 KiB, 64-byte-aligned SDRAM window for
serialized CSV, image-save, image-preflight, and image-staging work. The
selected IMX request ceiling is 32 KiB. Save changed from 8,193 FileX calls to
257; each complete update read pass changed from 8,192 calls to 256.

## Selection evidence

B was tested first without formatting or normalizing its SD card. Exact FileX
contiguous preallocation returned success but destabilized the following USB
transaction. Both 128 KiB and 64 KiB preallocation trials ended in USBX
`UX_TRANSFER_TIMEOUT (0x5C)` without publishing the temporary file. A 128 KiB
non-preallocated payload write also returned `0x5C` on its first request.

Every rejected trial retained the prior `.imx`; close/flush/rename rollback
ordering prevented incomplete publication. The 32 KiB non-preallocated path
then passed on B and A with zero FileX/USBX errors. This is the fastest request
size proven safe in this campaign; sizes between 32 KiB and 128 KiB are not
claimed qualified.

## Performance results

Firmware ticks are 100 Hz and span the complete phases shown.

| Measurement | Controller A | Controller B |
| --- | ---: | ---: |
| IMX save total | 24.29 s | 32.27 s |
| Source CRC | 0.60 s | 0.61 s |
| Source-to-SDRAM copy | 2.41 s | 2.50 s |
| FileX payload/header writes | 19.05 s | 24.11 s |
| Close / flush / rename | 0.00 / 0.04 / 0.02 s | 0.01 / 0.98 / 0.03 s |
| Writes / bytes / maximum request | 257 / 8,388,864 / 32,768 | 257 / 8,388,864 / 32,768 |
| Prior conservative save bound | 231.9 s | 477.2 s |
| Improvement versus prior bound | 9.55x | 14.79x |
| Update preflight USB reads | 2.09 s / 256 calls | 2.77 s / 256 calls |
| Update staging USB reads | 0.75 s / 256 calls | 2.58 s / 256 calls |
| Update QSPI page program | 10.45 s | 9.57 s |
| Update path before flash handoff/reset | 28.89 s | 30.76 s |

The original 4x save stretch goal is exceeded on both devices. Save device
spread fell from approximately 2.06x to 1.33x. Update USB reads consume 2.84
seconds on A and 5.35 seconds on B for two complete 8 MiB passes. The retained
update total stops immediately before the RAM-resident internal-flash handoff;
it is not presented as a full update-and-reboot wall-clock measurement.

## Identity, media, and integrity

| Result | Controller A | Controller B |
| --- | --- | --- |
| Assembly / J-Link | 1751136 / 69664082 | 1751219 / 69660123 |
| Raw CID | `035344535330384780976F0084018559` | `035344535330384780976F0085018507` |
| Protocol / CID valid / representative read | 6 / 1 / 0 | 6 / 1 / 0 |
| Final system errors | 0 | 0 |
| Config operational / findings / inhibited | 1 / 0 / 0 | 1 / 0 / 0 |
| Config RAM generation / committed / blocks identical | 231 / 231 / yes | 173 / 173 / yes |
| Final oldest lane starts | 1 / 1 / 1 | 86 / 86 / 1 |
| Final active lane starts | 2047 / 2047 / 2047 | 1109 / 1109 / 1024 |
| Final retired segments | 0 / 0 / 0 | 2 / 1 / 0 |
| Dropped / lost log records | 0 / 0 | 0 / 0 |
| Graph-cache load | 3.27 s | 3.18 s |

B's abnormal mirror topology was preserved. Both self-generated images passed
header/payload CRC preflight, QSPI staging and CRC verification, internal-flash
installation, reboot, and byte-for-byte four-MiB S-record comparison. Both WAV
tables remained valid and sound 1 playback returned to idle without an error.

## Operator-ready handoff

| Graph state | Controller A | Controller B |
| --- | ---: | ---: |
| Screen active / attached | yes | yes |
| Follow newest | yes | yes |
| Render sequence current | 18 / 18 | 40 / 40 |
| Zoom | 12 h | 12 h |
| RTC-to-newest age at capture | 43 s | 8 s |

Raw evidence is below:

- A:
  `work/evidence/hpt-log-store-circular-mirror/controller-a/imx-buffer-qualification-20260727/`
- B:
  `work/evidence/hpt-log-store-circular-mirror/controller-b/imx-buffer-qualification-20260727/`

No SD card was formatted, removed, inserted, or replaced.
