11 KiB
PT2 Lamp And Panel Output Selector Map
This note tracks bench-visible lamp/readout effects from CCU-to-RCP selector writes.
Current Model
The panel lamps and seven-segment displays are driven by selector-table state, not by one monolithic "connected" flag. Command 0 writes into the primary/current tables, and several selectors immediately affect visible panel outputs while CONNECT: OK is alive.
Known active-state foundation:
E000[0x0000] = 0x8080wakes/holdsCONNECT: OK.E000[0x008F]drives shutterEVS/OFFstyle display state and iris AUTO side effects.E000[0x0093]drives at least white-balance and black/flare lamp state.
Bench Observations 2026-05-26
lamp-0093-lowbyte-sweep
Result: no new visible behavior beyond the already-known 0x0093 family.
Interpretation:
- The earlier
0x0093mapping still stands. - Individual low-byte probes inside a streamed
0x90xxcontext did not reveal a new lamp in this run. - Keep
0x9020as a useful manual/baseline context and0x90FF/0xFFFFas black/flare AUTO positive controls.
lamp-known-button-selector-probe
Visible result:
- CAM button/lamp flashed on/off.
- CALL lamp flashed on/off.
- BARS and MASTER lamps flashed on/off.
- Camera tally changed red, then later green.
- Each visible output illuminated by itself, not as a broad all-lamps blast.
Serial result:
- The run stayed in normal
CONNECT: OKresponse cadence. - Each command-0 write produced an immediate
04 ...readback-style frame and repeated02 00 02 00 00 5Aactive responses.
Candidate mapping:
| Selector/value pair | Current meaning |
|---|---|
0x0007 = 0x8000/0x0000 |
CAM POWER lamp blink confirmed by isolated run |
0x0015 = 0x8000/0x0000 |
CALL lamp blink confirmed; red tally also blinked in the same phase |
0x0012, 0x0013, 0x0016, 0x0017, 0x0018, 0x001A |
ordered candidates for SLAVE, green tally, BARS, MASTER, and neighboring lamp states |
Follow-up lamp-isolate-cam-call result:
- First phase blinked CAM POWER.
- Second phase blinked CALL and red tally.
Follow-up lamp-isolate-known-neighbors result:
- Visible order was SLAVE, then green tally, then BARS.
- The pattern repeated, and at one point SLAVE and BARS were visible together.
- Treat the ordered mapping as likely but not final until a fresh-boot single-selector run separates latch/persistence effects from the selector under test.
Follow-up lamp-isolate-neighbor-single-boot result:
| Fresh-boot candidate | Visible result |
|---|---|
0x0012 = 0x8000/0x0000 |
no visible change reported |
0x0013 = 0x8000/0x0000 |
SLAVE lamp |
0x0016 = 0x8000/0x0000 |
camera tally green |
0x0017 = 0x8000/0x0000 |
BARS lamp |
0x0018 = 0x8000/0x0000 |
no visible result reported yet |
0x001A = 0x8000/0x0000 |
no visible result reported yet |
This confirms that the host/CCU can directly drive panel lamps through selector-table writes. It also validates using the ROM dispatch-neighbor list around 0x0007 and 0x0015 as a high-value lamp map.
lamp-broad-status-selector-sweep
Visible result:
- KNEE AUTO lamp flashed a few times.
- No other new visible result was reported.
- Follow-up isolation saw KNEE AUTO toward the end of the run, then blinking.
Candidate selectors in that run:
0x0003, 0x0040, 0x0081, 0x0092, 0x00A7, 0x00B7, 0x00B9, 0x0110
Interpretation:
- KNEE AUTO is likely in this broader status cluster.
- Because the visible change happened toward the end, strongest next candidates are
0x00A7,0x00B7,0x00B9, and0x0110, with0x0092kept as a guard candidate. - Exact selector/value still needs isolation because the broad sweep changed several selectors in sequence.
Follow-up lamp-isolate-knee-tail-single-boot result:
| Fresh-boot candidate | Visible result |
|---|---|
0x0092 |
iris AUTO/OFF behavior |
0x00A7 |
no visible result reported |
0x00B7 |
no visible result reported |
0x00B9 |
KNEE AUTO |
0x0110 |
KNEE AUTO |
Interpretation:
0x00B9and0x0110are real KNEE-related selectors, but a ROM trace now shows they are not a simple OR-held lamp pair.loc_1795is the local KNEE/panel-input handler. It is reached fromF104 -> F692 -> F6F0.1, then readsE000[0x00B9]andE000[0x0110].- The ROM gate for the live KNEE value/report branch is
0x00B9.13, not0x00B9.15. 0x0110.15forces a timed KNEE page/display override. That fits the observed "lights, then clears" behavior.0x00B9.15still matters on the timed KNEE LCD page: it selects thePRESETlabel when0x0110.15is clear. With both clear, the same page labels KNEE asAUTO.- When
0x00B9.13is set and0x0110.15is clear, the ROM computesF692 - F6B2and reports/updates selector0x00BC. That is now the strongest candidate for the KNEE control value lane.
Follow-up lamp-knee-or-precedence result:
- Case 1 (
0x00B9.15set, then0x0110.15set, then0x00B9cleared) kept KNEE AUTO on until near the end, when0x0110was cleared. - Case 2 (
0x0110.15set, then0x00B9.15set, then0x0110cleared) turned KNEE AUTO off well before the end, even though0x00B9had been set. - This argues against a simple OR model. Current best interpretation:
0x0110.15is the stronger live display/control source for KNEE AUTO;0x00B9.15is related, but may be a transient, secondary status source, or only meaningful with another gate active.
Follow-up lamp-knee-sustain-compare result:
- Repeated
0x00B9.15refresh never lit KNEE AUTO. - Repeated
0x0110.15refresh lit KNEE AUTO, but it turned off again around the middle of the repeated-refresh window. - This makes
0x00B9.15look like a context-sensitive or stale interpretation rather than a maintained lamp source. 0x0110.15remains the best KNEE AUTO source, but it is not sufficient by itself to hold the lamp. It likely needs a surrounding CCU status refresh, or another selector periodically clears/rebuilds the visible lamp bank.
Follow-up lamp-knee-context-hold result:
- Pairing
0x00B9.15with the known0x0093=0x9020active refresh did not light KNEE AUTO. - Pairing
0x0110.15with0x0093=0x9020did light KNEE AUTO, but it still turned off around the middle of the run. - The serial log stayed clean: repeated table readbacks and
02 00 02 00 00 5Aactive responses continued, with no resync or NOT ACT-style serial collapse. - Current best hypothesis:
0x0110.15behaves more like an edge/pulse or consumed display request than a pure level-held lamp bit. Repeating the same high value may not retrigger it after the display task has consumed the state.
ROM follow-up:
- Detailed notes:
docs/pt2-knee-rom-trace.md. - The timed path sets
F732=0x1C03,FB02=0x14, callsloc_48FA, and later restores the previous page throughloc_48EF. F732=0x1C03dispatches to a KNEE LCD page. Its second line isDLwhen0x0110.15is set,PRESETwhen0x0110.15is clear and0x00B9.15is set, otherwiseAUTO.knee-rom-gate-and-value-probeproduced a new bench LCD state withDTLon the left andKNEEon the right. This matches the ROM page-0x1C neighborhood: KNEE entry at0x95CE, DETAIL entry at0x97C8.- The panel physically has DETAIL and KNEE buttons near the LCD, so this is likely a local menu/button context. Pressing those buttons during the prepared gate window may supply the
F104transition that the ROM needs before it callsloc_1795. - Follow-up isolation lit KNEE AUTO in the later KNEE cases/windows but did not change the LCD. Treat the KNEE AUTO lamp and the DETAIL/KNEE LCD page as related but separate paths:
0x0110.15remains the strongest lamp/status source, while LCD movement likely needs an additional local menu/display gate. - Next bench retest should include
0x00B9.13(00 01 39 20 00 42) and the0x00BCreport/read lane, not only the older0x00B9.15/0x0110.15pair.
Follow-Up Isolation Scenarios
Run these with the console visible and record the exact label shown when each lamp changes:
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-cam-call.json --parity E --log captures\lamp-isolate-cam-call.txt --result-json captures\lamp-isolate-cam-call-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-known-neighbors.json --parity E --log captures\lamp-isolate-known-neighbors.txt --result-json captures\lamp-isolate-known-neighbors-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-knee-status-selectors.json --parity E --log captures\lamp-isolate-knee-status-selectors.txt --result-json captures\lamp-isolate-knee-status-selectors-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-neighbor-single-boot.json --parity E --log captures\lamp-isolate-neighbor-single-boot.txt --result-json captures\lamp-isolate-neighbor-single-boot-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-knee-tail-single-boot.json --parity E --log captures\lamp-isolate-knee-tail-single-boot.txt --result-json captures\lamp-isolate-knee-tail-single-boot-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-isolate-knee-bit-scan.json --parity E --log captures\lamp-isolate-knee-bit-scan.txt --result-json captures\lamp-isolate-knee-bit-scan-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-knee-or-precedence.json --parity E --log captures\lamp-knee-or-precedence.txt --result-json captures\lamp-knee-or-precedence-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-knee-sustain-compare.json --parity E --log captures\lamp-knee-sustain-compare.txt --result-json captures\lamp-knee-sustain-compare-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-knee-context-hold.json --parity E --log captures\lamp-knee-context-hold.txt --result-json captures\lamp-knee-context-hold-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\lamp-knee-edge-refresh.json --parity E --log captures\lamp-knee-edge-refresh.txt --result-json captures\lamp-knee-edge-refresh-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\knee-rom-gate-and-value-probe.json --parity E --log captures\knee-rom-gate-and-value-probe.txt --result-json captures\knee-rom-gate-and-value-probe-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\knee-rom-dtl-knee-isolation.json --parity E --log captures\knee-rom-dtl-knee-isolation.txt --result-json captures\knee-rom-dtl-knee-isolation-result.json
.\.venv\Scripts\python.exe scripts\serial_scenario.py scenarios\knee-detail-physical-button-watch.json --parity E --log captures\knee-detail-physical-button-watch.txt --result-json captures\knee-detail-physical-button-watch-result.json
Method notes:
- Record visible changes immediately during each labeled hold. Later
CONNECT: NOT ACTcleanup is not selector evidence. - If a selector causes a latch or unexpected mode, stop and keep the log instead of continuing the whole sweep.
- Prefer exact notes like
selector_0018_high -> tally red, because the logs already preserve send timestamps and readback frames. - For the single-boot follow-ups, each candidate gets a fresh power cycle. That is deliberate: it tests whether a lamp is truly driven by that selector rather than retained from a previous write.