Reverse-engineering a $35 backup camera display (AMT630A)
An Arduino Library for working with the AMT630A chip - mogrinz/AMT630A Arduino/ESP32 library for controlling the hardware on-screen display (OSD) engine in AMT630A-based composite-video LCD monitor boards. The library exposes the AMT630A's five hardware OSD windows as a practical Arduino API for text, custom glyphs, 16-color 4bpp bitmaps, palette animation, opacity/video blending, scaling, blink regions, and window movement. It also includes a Python image converter and optional automation for entering the hidden factory menu on one hardware-tested three-button monitor firmware. Hardware status: This project is based on hardware testing and reverse engineering of real AMT630A monitor boards. AMT630A products are not all guaranteed to use the same firmware, panel timing, keypad circuit, or exposed I2C connections. Features marked as hardware/firmware-specific should be treated accordingly. After this repository has been accepted into the Arduino Library Manager registry: Download the release ZIP, then in Arduino IDE choose Sketch > Include Library > Add .ZIP Library... and select it. Clone or copy the repository into the libraries directory of your Arduino sketchbook. Restart Arduino IDE if it was already open. The library communicates with the AMT630A over I2C. The default ESP32 pins used by begin() are: Always connect grounds between the ESP32 and monitor electronics. Do not assume every AMT630A monitor exposes the same test pads, voltage levels, supply input, or keypad arrangement; verify your own board before connecting it. display.begin( 21 , 22 , 100000 ); Minimal text example # include AMT630A_OSD display; void setup () { Serial. begin ( 115200 ); if (!display.
begin ()) return ; if (!display. set Font Mode ( AMT630A_OSD ::Large Font)) return ; if (!display. configure Window ( 0 , 160 , 44 )) return ; display. set Display Origin ( 0 , 40 , 40 ); display. write String ( 0 , 0 , 0 , " HELLO " , AMT630A_OSD ::White); display. set Visible ( 0 , true ); display. force Update (); } void loop () { display. service (); } Important stock-firmware / C6 ownership note The AMT630A uses SYS register C6 to select whether the internal 8051 MCU or external I2C controls internal registers. On the hardware-tested monitor, the stock firmware periodically accesses internal video/decoder registers and normally expects MCU ownership. Repeatedly taking external ownership during normal stock-firmware operation was found to eventually freeze the complete display pipeline, including both OSD and live composite video. The library still uses the external-I2C mechanism because it is how the OSD is controlled. On the tested three-button monitor, entering the hidden factory menu before sustained external OSD activity prevented the observed contention/freeze during long-duration testing. The Enter Factory Mode example automates that procedure using a 74HC4066 connected across the existing keypad switches. This factory-menu procedure is firmware-specific . It is not automatically invoked by begin() and is not inserted into the other examples.
If your monitor has different firmware, validate its behavior independently. The tested monitor has three physical buttons: Menu, + , and - , implemented as a passive resistor ladder. Three channels of a 74HC4066 can be placed across those button contacts so an ESP32 can electronically press them while leaving the physical buttons usable when the ESP32/4066 circuit is powered. On the tested firmware, the sequence must finish while Brightness is active and the final Menu press opens the Factory screen. Hardware testing found 100 ms press / 150 ms gap to be the shortest repeatable timing; the example uses 150 ms / 200 ms for margin. display.configure Factory Menu Control( 18 , 5 , 19 ); // Menu, Plus, Minus display.set Factory Menu Timing( 150 , 200 ); display.enter Factory Mode(); A custom sequence can be supplied with Factory Menu Step and set Factory Menu Sequence() . set FactoryOSDCoexistence(true) tells visibility management to preserve OSD-enable/blink bits already set by the stock firmware instead of replacing them. It does not itself enter factory mode. display.set Font Mode( AMT630A_OSD ::Large Font); display.set Font Mode( AMT630A_OSD ::Small Font); Verified cell geometry: write String() maps common ASCII characters into the AMT630A's built-in ROM. write Glyph() bypasses ASCII mapping and writes a raw 10-bit glyph ID. The bundled Large Font Character Set Browser and Small Font Character Set Browser examples let you explore the monitor's ROM from the Serial Monitor. The verified Small Font ROM mapping used by ordinary ASCII begins around 0x1C0 ; digits begin at 0x1C1 and letters at 0x1CB . There are five hardware OSD windows, but all five share 512 Index RAM cells . Windows may overlap visually; their backing Index RAM allocations must fit in the shared 512-cell pool.
⚡ Effects Interpreter
🌍World Economy
- ▶Growth projections drawn up in distant capitals might need a rethink.
- ▶Markets around the world may take their cue from how this story unfolds.
🏙️Local Economy
- ▶Corner shops and cafes rarely feel this straight away, but they do feel it.
- ▶Neighbourhood traders usually adjust gradually rather than all at once.
🏦Rates & Banks
- ▶Central banks watch moments like this closely, so keep an eye on savings rates.
- ▶Lenders usually reserve big rate moves for clearer economic signals.
❤️Health
- ▶Checking in on vulnerable neighbours matters when news feels heavy.
- ▶Unsettling news can weigh on sleep and mood, so peace of mind matters.
💷Wealth
- ▶Nest eggs can wobble briefly before finding their footing again.
- ▶A brief dip in value is not the same as a permanent loss.
🏠Housing
- ▶Asking prices in the area could firm up or soften only gradually.
- ▶First-time buyers watching the market closely may see little change in the short term.