Gt911 Register Map

Below is the definitive register map for the GT911. All addresses are 16-bit. Note: The GT911 uses Big-Endian (MSB first) for multi-byte values.

| Start Addr | End Addr | Size (bytes) | Name / Section | Type | Description | | :--- | :--- | :--- | :--- | :--- | :--- | | 0x8000 | 0x8000 | 1 | Product ID (MSB) | RO | First char of ID (e.g., '9') | | 0x8001 | 0x8001 | 1 | Product ID | RO | Second char (e.g., '1') | | 0x8002 | 0x8002 | 1 | Product ID | RO | Third char (e.g., '1') | | 0x8003 | 0x8003 | 1 | Product ID (LSB) | RO | Fourth char (e.g., 0x00 for string end) | | 0x8004 | 0x8004 | 1 | Firmware Version | RO | Major/minor version | | 0x8005 | 0x8005 | 1 | X Output Maximum (MSB) | RO | Reserved / default | | 0x8006 | 0x8006 | 1 | X Output Maximum (LSB) | RO | Reserved / default | | 0x8007 | 0x8007 | 1 | Y Output Maximum (MSB) | RO | Reserved / default | | 0x8008 | 0x8008 | 1 | Y Output Maximum (LSB) | RO | Reserved / default | | 0x8009 | 0x800F | 7 | Reserved / Status | RO | Touch count & flags | | 0x8010 | 0x8024 | 21 | Point 1 Data (TrackID, X, Y, Size) | RO | First touch report | | 0x8025 | 0x8039 | 21 | Point 2 Data | RO | Second touch report | | 0x803A | 0x804E | 21 | Point 3 Data | RO | Third touch report | | 0x804F | 0x8063 | 21 | Point 4 Data | RO | Fourth touch report | | 0x8064 | 0x8078 | 21 | Point 5 Data | RO | Fifth touch report | | 0x8079 | 0x807E | 6 | Reserved / Checksum | RO | Touch protocol integrity | | 0x8040 | 0x8040 | 1 | Gesture ID | RO | Up/Down/Left/Right/Double-Click | | 0x8041 | 0x80FF | 191 | Reserved | - | Not documented | | 0x8100 | 0x8100 | 1 | Config Version | RW | Configuration version number | | 0x8101 | 0x8101 | 1 | X Resolution (MSB) | RW | Screen width (max touch X) | | 0x8102 | 0x8102 | 1 | X Resolution (LSB) | RW | Screen width | | 0x8103 | 0x8103 | 1 | Y Resolution (MSB) | RW | Screen height (max touch Y) | | 0x8104 | 0x8104 | 1 | Y Resolution (LSB) | RW | Screen height | | 0x8105 | 0x8105 | 1 | Touch Threshold | RW | Finger detection sensitivity (default 80) | | 0x8106 | 0x8106 | 1 | Active (Screen-On) Gain | RW | Amplification factor for touch | | 0x8107 | 0x8107 | 1 | Standby (Screen-Off) Gain | RW | Low-power detection gain | | 0x8108 | 0x8108 | 1 | Debounce | RW | Number of consecutive samples (1-10) | | 0x8109 | 0x8109 | 1 | Noise Reduction | RW | Filter level (0-7) | | 0x810A | 0x810A | 1 | Screen Touch Level | RW | Reserved | | 0x810B | 0x810B | 1 | Proximity Enable | RW | Enable/Disable proximity sensing | | 0x810C | 0x810C | 1 | Handheld/Pen Enable | RW | Mode selection for stylus | | 0x810D | 0x811D | 17 | Key Area Array | RW | Physical button mapping | | 0x811E | 0x812F | 18 | Proximity & Noise Settings | RW | Advanced tuning | | 0x8130 | 0x813F | 16 | Gesture Parameters | RW | Swipe angles, double-tap timing |

GT911 (Goodix) touch controller register map shows registers for configuration, status, touch points, and commands. This guide gives key register addresses, sizes, and typical use.

Each touch point occupies 7 bytes:

| Offset | Register | Description | | :--- | :--- | :--- | | +0 | 0x8010 | Track ID – A rotating ID (0-31). Same ID across frames = same finger. | | +1 | 0x8011 | X Coordinate (Low Byte) – Bits 7-0 of X position | | +2 | 0x8012 | X Coordinate (High Byte) – Bits 11-8 of X position (not 15-12!). Only 12-bit resolution. | | +3 | 0x8013 | Y Coordinate (Low Byte) – Bits 7-0 of Y position | | +4 | 0x8014 | Y Coordinate (High Byte) – Bits 11-8 of Y position | | +5 | 0x8015 | Touch Size (Low Byte) – Area of contact (roughness) | | +6 | 0x8016 | Touch Size (High Byte) – Typically not used for basic apps | gt911 register map

Formula for coordinates: X = (read_u16(0x8012) << 8) | read_u8(0x8011) ... Wait, careful. Because the GT911 is big-endian:

int X = ( (regs[0x8012] & 0x0F) << 8 ) | regs[0x8011];
int Y = ( (regs[0x8014] & 0x0F) << 8 ) | regs[0x8013];

Only the lower 12 bits are valid. The upper 4 bits of the high byte are reserved or used for flags.

The first thing you notice is the Product ID Registers (0x8140–0x814E). You read 0x39, 0x33, 0x31, 0x31. Magic. It whispers "GT911" back at you. It’s alive.

The genius move? The Gesture ID at 0x814F. You swipe left? The register spits out 0x01. Swipe right? 0x02. This isn't just a touch controller; it’s a lazy programmer’s dream for UI navigation. No gesture math. No vector analysis. Just read one byte. Chef's kiss. Below is the definitive register map for the GT911

Then there's 0x814E (Buffer Status). Bit 7 is the "Large Detect" flag (fat-finger protection), and Bit 0 is the "Buffer Ready" flag. This is the heartbeat of the device. Poll it, read the 5 touch points (each taking 8 bytes at 0x8150), and clear it by writing 0x00 back. It’s a clean, simple dance.

The breakthrough came from the open-source community. As Android devices began shipping with Goodix controllers, Linux kernel developers needed drivers. Through leaks, NDA breaches, and sheer persistence, the register map began to surface in public source code.

The community discovered that the GT911 had a very specific "personality" defined by its register addresses:

A crucial plot point in the GT911 register map story is the I2C Address. The GT911 is unique because it can operate on two different addresses, and the register map is accessed differently depending on how the chip wakes up. Only the lower 12 bits are valid

The community reverse-engineered the "Handshake Protocol." They found that during power-up, the state of the Interrupt and Reset pins dictated the I2C address.

This discovery explained why some GT911 screens worked instantly with Arduino libraries and others failed silently—the developer was shouting at the wrong address.

Typical startup config area (example offsets):

| Offset | Field | Typical value | |--------|-------|----------------| | 0x8048-0x804D | X/Y resolution | Depends on display | | 0x8060 | Touch threshold | 0x46 (70 raw) | | 0x8061 | Filter coefficient | 0x05 | | 0x807C | I2C watchdog | 0x09 (9 sec) |

Important: After writing config, write 0x00 to 0x80FE (soft reset) and send 0x01 to 0x8040 (config update flag).

The GT911 (by Goodix) is a 5-point capacitive touch controller commonly found in displays (LCDs, LVDS, HDMI panels). Understanding its register map is key for debugging, calibration, or bare-metal drivers.