Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
022ae06
Add OpenPocket Rev-A engineering release gates
Twotoz Jul 31, 2026
55cb2fe
feat(display): add clean-room AMT630A firmware
Twotoz Jul 31, 2026
ba935a0
build(display): record reproducible AMT image manifest
Twotoz Jul 31, 2026
aa692b2
docs(hardware): specify Revision-A microSD subsystem
Twotoz Jul 31, 2026
16fa0ba
feat(hardware): add Revision-A KiCad engineering draft
Twotoz Aug 5, 2026
6c205ab
feat(hardware): harden Revision-A preproduction design
Twotoz Aug 5, 2026
6269fa8
feat(hardware): add deterministic ground fanout
Twotoz Aug 5, 2026
4c3f675
hardware: establish reviewed eight-layer Rev A basis
Aug 5, 2026
c75a68a
hardware: finalize bottom-side U.FL sourcing
Aug 5, 2026
93a9720
hardware: tolerate SES coordinate quantization
Aug 5, 2026
87b722d
hardware: place display FFC for bottom insertion
Aug 5, 2026
b4eeb9d
hardware: align RF clearance and fiducial placement
Aug 9, 2026
e62e27b
hardware: update RF netclass clearance
Aug 9, 2026
d2f7155
fix(hardware): sync J1 bottom placement release data
Aug 9, 2026
1298a68
feat(hardware): checkpoint connector placement and routing assets
Aug 9, 2026
c059e16
feat(hardware): optimize rev-a functional placement
Aug 10, 2026
328d707
feat(rev-a): add deterministic placement optimizer
Aug 10, 2026
f7e091b
docs(rev-a): record optimized placement routing benchmark
Aug 10, 2026
4ec44e3
fix(rev-a): remove dangling ELRS debug labels and refresh renders
Aug 10, 2026
9236c83
feat(rev-a): add edge ground pads for controls
Aug 10, 2026
7c5288c
fix(rev-a): place UFL beside RX5808 RF pad
Aug 10, 2026
7de1a74
feat(rev-a): split controls into edge solder groups
Aug 10, 2026
77ad2ea
fix(rev-a): unify user control solder pads
Aug 10, 2026
9c34d49
docs(rev-a): refresh current routing benchmark
Aug 10, 2026
72c1e86
feat(rev-a): apply legal power-video placement optimization
Aug 10, 2026
3baef9f
fix(rev-a): retain routing-superior baseline placement
Aug 10, 2026
81d03a5
fix(rev-a): clear TFT FFC breakout corridor
Aug 10, 2026
96a8bec
fix(rev-a): clear AMT fanout and refresh placement assets
Aug 10, 2026
725df27
fix(rev-a): seed legal AMT flash fanout
Aug 10, 2026
7a00297
fix(rev-a): center ESP fanout corridor
Aug 10, 2026
aaddc20
fix(rev-a): tighten ESP and expander routing corridor
Aug 10, 2026
df209e5
fix(rev-a): seed reviewed battery entry fanout
Aug 10, 2026
4bfe241
fix(rev-a): reserve ESP32 backside fanout corridor
Aug 10, 2026
97f205b
fix(rev-a): clear AMT mux from ESP32 underside
Aug 10, 2026
f3e77a0
fix(rev-a): improve edge pad silkscreen clearance
Aug 10, 2026
2cdd1cc
fix(rev-a): eliminate placement and silkscreen DRC violations
Aug 10, 2026
85fcd96
fix(rev-a): make routing benchmark compatible with seed fanouts
Aug 10, 2026
705a0c8
perf(rev-a): make placement search practical for multi-seed runs
Aug 10, 2026
49482c2
fix(rev-a): sync assembly placement exports
Aug 10, 2026
a5c1ea8
build(rev-a): verify firmware toolchain
Aug 10, 2026
0e0f9f4
route(rev-a): connect U5 output bulk capacitor
Aug 10, 2026
3580ab8
route(rev-a): extend reviewed 3V3 bulk fanout
Aug 10, 2026
f158b45
route(rev-a): add dedicated 3V3 distribution plane
Aug 10, 2026
0291e63
route(rev-a): add main 5V distribution plane
Aug 10, 2026
fb7ac91
place(rev-a): cluster master switch with power converters
Aug 10, 2026
18360f8
route(rev-a): add filtered video power island
Aug 10, 2026
cb07243
route(rev-a): add display and SD power islands
Aug 10, 2026
a52241d
route(rev-a): add display power distribution islands
Aug 10, 2026
a6aa90f
route(rev-a): add obstacle-aware system power trunks
Aug 10, 2026
4418c82
fix(rev-a): query via width on routed layer
Aug 10, 2026
416cc26
route(rev-a): refine constrained routing search
Aug 10, 2026
ac69d5a
fix(rev-a): join charger to battery positive rail
Aug 10, 2026
43582e9
fix(rev-a): regenerate schematic for battery rail
Aug 10, 2026
1609f48
docs(rev-a): describe grouped control ground pads
Aug 10, 2026
b6c1d26
fix(rev-a): legalize optimized control placement seed
Aug 11, 2026
a5dac5b
feat(rev-a): generate placement-safe shared power pours
Aug 11, 2026
b3f76b0
fix(rev-a): fan out edge control grounds locally
Aug 11, 2026
24d1137
fix(rev-a): localize factory test points by function
Aug 11, 2026
abde8fc
fix(rev-a): localize and route interface support nets
Aug 11, 2026
8fc9660
fix(rev-a): protect reviewed routing during benchmarks
Aug 11, 2026
3967983
fix(rev-a): route USB-C power entry as reviewed tree
Aug 11, 2026
85099e9
feat(rev-a): add bounded always-on power island
Aug 11, 2026
74d10ee
docs(rev-a): add current PCB top render
Aug 11, 2026
aaa19d0
docs(rev-a): preserve 60-pass routing milestone
Aug 11, 2026
87b8d8c
fix(rev-a): enforce safe autorouter import
Aug 11, 2026
96e4b11
fix(rev-a): prevent unsafe routing neckdowns
Aug 11, 2026
ebdf588
docs(rev-a): preserve safe routing benchmark
Aug 11, 2026
592d0e4
feat(rev-a): filter unsafe routed nets
Aug 11, 2026
8b18c10
fix(rev-a): salvage routing with ground obstacles
Aug 12, 2026
51ff270
fix(rev-a): widen reviewed USB power trunk
Aug 13, 2026
c38441c
fix(rev-a): add local switched-power island
Aug 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*.step binary
*.wrl binary
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@

# Local build and editor files
build/
__pycache__/
*.pyc
.DS_Store
.easyeda_cache/
/manufacturing/
hardware/rev-a/easyeda/**/CONN-SMD_DF40C-100DS-0.4V-51.*
*.swp
*~
81 changes: 43 additions & 38 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,16 @@
</p>

<p align="center">
<strong>An open ESP32-S3 handheld that combines RivetTX, ExpressLRS, an RX5808 receiver, an AT7456E OSD, and an AMT630A snow-screen display.</strong>
<strong>A compact all-in-one ESP32-S3 handheld PCB combining RivetTX, ExpressLRS, RX5808 video, AT7456E OSD, and an AMT630A-driven 5-inch TFT.</strong>
</p>

<p align="center">
<img src="docs/assets/openpocket-pcb-placement-top.png" alt="OpenPocket Revision-A top-side component placement without board text or signal traces" width="90%">
<img src="docs/assets/openpocket-pcb-placement-bottom.png" alt="OpenPocket Revision-A bottom-side component placement without board text or signal traces" width="90%">
</p>

<p align="center"><em>Revision-A top and bottom placement previews — production-board text and signal routing intentionally omitted.</em></p>

<p align="center">
<a href="#why-openpocket">Why OpenPocket</a> ·
<a href="#architecture">Architecture</a> ·
Expand Down Expand Up @@ -42,7 +49,7 @@ backend. The ESP32 never has to capture or process video pixels.
| **One handheld** | Gimbals, switches, ExpressLRS control, telemetry, video, and menus in a single enclosure. |
| **Purpose-built MCU** | ESP32-S3 provides the GPIO, native USB, and task separation needed by the complete controller. |
| **Low-latency video** | RX5808 composite video passes through the AT7456E into an AMT630A TFT controller without digital capture. |
| **Snow-screen display** | The selected AMT630A board keeps weak or lost analog video visible as noise instead of hiding it behind a blue screen. |
| **Integrated snow-screen display** | The PCB-installed AMT630A keeps weak or lost analog video visible as noise instead of hiding it behind a blue screen. |
| **Native analog OSD** | PAL/NTSC autodetection, a 30×16 character grid, custom glyphs, delta updates, and video-loss recovery. |
| **Bounded background work** | OSD and receiver services cannot delay control, CRSF, or telemetry processing. |
| **Open development path** | Wiring, BOM decisions, bring-up evidence, and future KiCad sources live in this repository. |
Expand All @@ -60,8 +67,8 @@ flowchart LR

E[5.8 GHz antenna] --> F[RX5808]
F -->|composite video| G[AT7456E]
G -->|video + overlay| H[AMT630A<br/>snow-screen board]
H --> I[Matched TFT panel]
G -->|internal PCB trace| H[AMT630A<br/>on the same PCB]
H -->|24-bit RGB + sync| I[AT050TN33 V.1<br/>40-pin TFT]

B -->|tune + RSSI| F
B -->|bounded SPI| G
Expand All @@ -82,12 +89,12 @@ path.

| Component | Role |
|---|---|
| ESP32-S3 development board or module | RivetTX, inputs, UI, storage, USB, and hardware services |
| ExpressLRS TX hardware | full-duplex 3.3 V CRSF control and telemetry link |
| RX5808 module | tunable 5.8 GHz analog receiver, composite video, and RSSI |
| AT7456E OSD module | PAL/NTSC character overlay between the receiver and display |
| AMT630A snow-screen controller board | PAL/NTSC composite decoding without blue-screen signal masking |
| matched parallel-RGB TFT panel | live FPV image and the complete OpenPocket interface |
| ESP32-S3-MINI-1U-N8 | PCB-installed RivetTX MCU, native USB, 8 MiB flash, no PSRAM |
| user-installed ExpressLRS nano receiver | four-wire full-duplex CRSF control and telemetry link |
| PCBWay-installed RX5808 module | tunable 5.8 GHz analog receiver, internal composite video, and RSSI |
| PCB-installed AT7456E | PAL/NTSC character overlay in the internal video path |
| PCB-installed AMT630A and flash | PAL/NTSC composite decoding and direct 24-bit RGB panel drive |
| AT050TN33 V.1-compatible TFT | user-plugged 40-pin panel; arbitrary 40-pin TFTs are unsupported |
| two dual-axis gimbals | four primary analog control axes |
| switches, menu buttons, and optional encoder | arming, AUX controls, navigation, and editing |
| validated regulators and protection | clean supplies sized for RF, display, video, and logic peaks |
Expand All @@ -108,29 +115,28 @@ The existing RivetTX compositor produces a hardware-independent 30-column by
- bounded asynchronous transfers instead of full-screen blocking redraws
- communication retry/backoff and redraw after video loss or recovery

The RX5808 feeds baseband video to the AT7456E; the AT7456E overlays text and
passes the result to the AMT630A board, which drives its matched TFT panel. The
The RX5808 feeds baseband video to the AT7456E over an internal PCB trace; the
AT7456E overlays text and passes it internally to the AMT630A, which drives the
edge-connected TFT directly. The user never wires composite video. The
AMT630A's internal OSD is not used for OpenPocket menus. See the
[complete wiring guide](docs/wiring.md).

## Build path

Bring up one subsystem at a time:

1. Read the [bill of materials](docs/bom.md) and record the exact revisions of
every module.
2. Build and measure the protected 5 V and 3.3 V rails on a current-limited
supply.
3. Add the ESP32-S3, controls, and ExpressLRS link with RF output constrained.
4. Prove the direct RX5808-to-AMT630A composite path in PAL and NTSC, including
snow-screen behavior with no received signal.
5. Insert the AT7456E, level shifting, and SPI control lines.
6. Configure RivetTX, then complete every item in the
[bring-up checklist](docs/bring-up.md).
1. Review the [Revision-A engineering package](hardware/rev-a/README.md) and
resolve every machine-readable release blocker.
2. Complete independent schematic, layout, sourcing, and Gerber reviews.
3. Assemble first articles through PCBWay with the RX5808 consigned/manual
operation and no unapproved substitutions.
4. Power the board from a current-limited source and validate rails before
inserting the TFT, battery, or ExpressLRS receiver.
5. Complete the factory and HIL gates before any propeller-on use.

The [bench build guide](docs/build-guide.md) contains the full sequence and
stop conditions. Do not design a battery pack or order a PCB production run
from the provisional module-level BOM.
stop conditions. Do not order from provisional files or bypass the release
gate in `hardware/rev-a`.

## Firmware

Expand All @@ -146,11 +152,9 @@ idf.py build
idf.py flash monitor
```

Enable `Use OpenPocket AT7456E analog OSD instead of SSD1306` under
`Component config -> RivetTX hardware`, then assign pins for the OSD, CRSF,
controls, and other peripherals. There is deliberately no universal GPIO map
until a specific ESP32-S3 module and reviewed schematic are selected. See the
[firmware guide](docs/firmware.md) for the complete configuration.
Use RivetTX's checked-in `sdkconfig.openpocket-rev-a.defaults`; it contains the
authoritative no-PSRAM, 8 MiB flash configuration and GPIO map matching this
board. See the [firmware guide](docs/firmware.md) for the complete configuration.

## Documentation

Expand All @@ -165,19 +169,20 @@ until a specific ESP32-S3 module and reviewed schematic are selected. See the
| [ESP32-S3 decision](docs/decisions/0001-esp32-s3.md) | why OpenPocket standardizes on the S3 |
| [AMT630A display decision](docs/decisions/0002-amt630a-snow-screen.md) | why the display stage uses a snow-screen AMT630A board |
| [Hardware sources](hardware/README.md) | scope and release policy for future KiCad and production files |
| [Revision-A package](hardware/rev-a/README.md) | integrated board constraints, GPIO, power, BOM, factory test, and release gates |
| [AMT630A firmware](display/amt630a/README.md) | target behavior, provenance requirements, and deterministic build gate |

## Project status

RivetTX already contains the 30×16 OpenPocket menus and the physical AT7456E
backend, including host-side PAL, NTSC, navigation, warning, delta-update,
glyph-upload, video-loss, standard-change, and SPI-failure tests. RX5808 target
hardware, the exact AMT630A PCB/panel revision, the final GPIO assignment, the
reference schematic, PCB, power system, and complete composite-video HIL
evidence remain open engineering work.
RivetTX contains the character OSD and physical RX5808/AT7456E services, with
host coverage for PAL, NTSC, UI, tuning, scanning, RSSI, delta updates, glyphs,
loss/recovery, and failure isolation. Revision-A startup ordering, board power
policy, and the no-PSRAM pin/partition profile are under review.

No schematic, PCB, enclosure, or battery design is currently released as
production-ready. The hardware directory will become the authoritative source
for those files after design review and measurement.
No PCB order package is released yet. The exact panel datasheet, AMT630A
firmware rights/provenance, selected RX5808 consigned module, sourcing review,
KiCad ERC/DRC, Gerber inspection, and physical HIL evidence remain open. This
is intentionally an engineering prototype, not a production-ready product.

## Contributing

Expand Down
21 changes: 21 additions & 0 deletions display/amt630a-openpocket/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 OpenPocket contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
38 changes: 38 additions & 0 deletions display/amt630a-openpocket/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
SDCC ?= sdcc
MAKEBIN ?= makebin
PYTHON ?= python3
BUILD := build
TARGET := $(BUILD)/amt630a-openpocket-er-tft050a3-2
SOURCES := src/main.c src/registers.c src/status_i2c.c
OBJECTS := $(patsubst src/%.c,$(BUILD)/%.rel,$(SOURCES))

.PHONY: all clean test manifest

all: $(TARGET).bin $(TARGET).bin.sha256 build-manifest.json

$(BUILD):
mkdir -p $@

$(BUILD)/%.rel: src/%.c include/amt630a.h | $(BUILD)
$(SDCC) -mmcs51 --model-small --iram-size 256 --xram-size 2048 \
--code-size 65536 -Iinclude -c $< -o $@

$(TARGET).ihx: $(OBJECTS)
$(SDCC) -mmcs51 --model-small --iram-size 256 --xram-size 2048 \
--code-size 65536 --out-fmt-ihx $(OBJECTS) -o $@

$(TARGET).bin: $(TARGET).ihx
$(MAKEBIN) -s 65536 $< $@

$(TARGET).bin.sha256: $(TARGET).bin
sha256sum $< | awk '{print $$1}' > $@

build-manifest.json: $(TARGET).bin $(TARGET).bin.sha256 tools/manifest.py panel-timing.json
$(PYTHON) tools/manifest.py

test: all
$(PYTHON) -m unittest discover -s tests -v

clean:
find $(BUILD) -type f -delete 2>/dev/null || true
rmdir $(BUILD) 2>/dev/null || true
18 changes: 18 additions & 0 deletions display/amt630a-openpocket/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# OpenPocket AMT630A firmware

This directory contains an original MIT-licensed SDCC/mcs51 firmware for the
AMT630A used by OpenPocket Revision A. It is built from register documentation,
the AMT630A product specification, and public reference-circuit observations;
it is not a monitor-board dump and contains no vendor firmware.

`make test` builds a deterministic 64 KiB W25X05 image and verifies panel
timing, PAL/NTSC state handling, sync-loss recovery, CVBS1 selection, RGB pin
muxing, and that documented snow/blue-substitution controls are disabled. The
controller keeps TFT timing active during video loss and pulses decoder resync
until video returns. Whether a particular weak RF signal visibly produces the
desired snow texture remains a first-article acceptance measurement.

The RivetTX factory service holds AMT RESET low, selects the ESP32 side of U19
(SN74CB3Q3257PWR), checks JEDEC ID `EF 30 10`, erases/programs/reads every byte,
compares SHA-256, restores AMT ownership, releases reset, then waits for I2C
status before enabling the backlight.
60 changes: 60 additions & 0 deletions display/amt630a-openpocket/build-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{
"compiler": "SDCC : mcs51/z80/z180/r2k/r2ka/r3ka/sm83/tlcs90/ez80_z80/z80n/ds390/TININative/ds400/hc08/s08/stm8/pdk13/pdk14/pdk15/mos6502 4.2.0 #13081 (Linux)",
"compiler_sha256": "b34caf6863460b150f2164d4842b2df6a71d27d1a66fe0a3b4a5f84d28315414",
"cvbs_input": "CVBS1 after AT7456E",
"license": "MIT",
"no_signal_policy": "TCON free-runs; blue substitution disabled; decoder resync pulse",
"output_binary": "build/amt630a-openpocket-er-tft050a3-2.bin",
"output_sha256": "9bd55356861bfe61b36313e531aaae6bde8b2071384f008d3534367b3695aff9",
"output_size": 65536,
"panel": "EastRising ER-TFT050A3-2 no-touch",
"panel_timing": {
"active_height": 272,
"active_width": 480,
"backlight_current_ma": 40,
"backlight_max_voltage_v": 19.2,
"backlight_topology": "2P6S",
"backlight_typical_voltage_v": 18.0,
"controller": "ILI6480",
"dclk_sample_edge": "rising",
"de_polarity": "active-high",
"disp_active": "high",
"horizontal_back_porch": 39,
"horizontal_front_porch": 5,
"horizontal_sync_width": 1,
"horizontal_total": 525,
"hsync_polarity": "active-low",
"interface": "RGB888",
"logic_voltage_v": 3.3,
"panel": "EastRising ER-TFT050A3-2 no-touch",
"pixel_clock_hz": 9000000,
"power_down_sequence": [
"disable backlight",
"deassert DISP",
"wait 2 frames",
"stop RGB clocks",
"remove PANEL_3V3"
],
"power_up_sequence": [
"assert DISP low and keep backlight off",
"apply PANEL_3V3",
"wait 20 ms",
"start DCLK/RGB/DE/HSYNC/VSYNC",
"wait 10 valid frames",
"assert DISP high",
"enable backlight after controller-ready"
],
"refresh_hz": 59.5238095238,
"rgb_order": "RGB",
"vertical_back_porch": 7,
"vertical_front_porch": 8,
"vertical_sync_width": 1,
"vertical_total": 288,
"vsync_polarity": "active-low"
},
"source_commit": "49482c2d7e58c815fd9cf4c3b48affb78f0ddbf6",
"standards": [
"PAL",
"NTSC"
]
}
23 changes: 23 additions & 0 deletions display/amt630a-openpocket/include/amt630a.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#ifndef OPENPOCKET_AMT630A_H
#define OPENPOCKET_AMT630A_H

#include <stdint.h>

#define OPENPOCKET_FW_MAJOR 1u
#define OPENPOCKET_FW_MINOR 0u

typedef struct {
uint16_t address;
uint8_t value;
} register_write_t;

extern const __code register_write_t openpocket_registers[];
extern const __code uint16_t openpocket_register_count;

void register_write(uint16_t address, uint8_t value);
uint8_t register_read(uint16_t address);
void delay_cycles(uint16_t cycles);
void status_i2c_initialize(void);
void status_update(uint8_t video_flags, uint8_t standard);

#endif
44 changes: 44 additions & 0 deletions display/amt630a-openpocket/panel-timing.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"panel": "EastRising ER-TFT050A3-2 no-touch",
"controller": "ILI6480",
"interface": "RGB888",
"pixel_clock_hz": 9000000,
"active_width": 480,
"horizontal_front_porch": 5,
"horizontal_sync_width": 1,
"horizontal_back_porch": 39,
"horizontal_total": 525,
"active_height": 272,
"vertical_front_porch": 8,
"vertical_sync_width": 1,
"vertical_back_porch": 7,
"vertical_total": 288,
"refresh_hz": 59.5238095238,
"de_polarity": "active-high",
"hsync_polarity": "active-low",
"vsync_polarity": "active-low",
"dclk_sample_edge": "rising",
"rgb_order": "RGB",
"disp_active": "high",
"logic_voltage_v": 3.3,
"backlight_topology": "2P6S",
"backlight_typical_voltage_v": 18.0,
"backlight_max_voltage_v": 19.2,
"backlight_current_ma": 40,
"power_up_sequence": [
"assert DISP low and keep backlight off",
"apply PANEL_3V3",
"wait 20 ms",
"start DCLK/RGB/DE/HSYNC/VSYNC",
"wait 10 valid frames",
"assert DISP high",
"enable backlight after controller-ready"
],
"power_down_sequence": [
"disable backlight",
"deassert DISP",
"wait 2 frames",
"stop RGB clocks",
"remove PANEL_3V3"
]
}
13 changes: 13 additions & 0 deletions display/amt630a-openpocket/registers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Register derivation

The immutable table in `src/registers.c` selects the 480×272 24-bit RGB+DE
output (`FC00=00`, `FD34..FD43=22`, `FD50=0F`), the documented 480×272 PLL
tuple (`FD0A=A8`, `FD0F=09`, `FD16=0A`), CVBS1, and separate PAL/NTSC scaler
timings. `FED7[7,6,1,0]` and `FEDC[7,6,4]` remain clear: those documented bits
disable snow or request a blue/background substitute.

The selected input sequence is the older-reference CVBS1 mapping:
`FED7[4:3]=0`, `FED8[7:6]=2`, `FEDC[5:4]=0`, then `FED7[4:3]=3`. A fixture
test must confirm that CVBS1 corresponds to physical pin 1 on the assembled
AMT630A; this is an execution check against an already frozen circuit, not an
unresolved architecture choice.
Loading