

GPU12864
Simple Arduino-based GPU.
- Size
- 93 × 70 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 8
- Nets
- 45
- Pads
- 82
- Tracks, vias
- 176, 8
- Pours
- 1
- Routed
- Yes
- KiCad
- KiCad 10.0 (file 20260206)
- Created
- 20 Jul 2026
- Updated
- 24 Aug 2026
Overview
GPU12864 is an open-source printed circuit board by html-css-js-python, from the html-css-js-python/GPU12864 repository on GitHub, published under the Apache-2.0 licence. It is a 2-layer board of 93 × 70 mm with 8 parts on 45 nets, routed with 176 tracks and 8 vias.
It belongs with the AVR (ATmega, ATtiny) boards of this library.
README
README.mdVidiaG Force RT-X12864
VidiaG Force RT-X12864 is an open-source, microcontroller-based GPU designed for 128x64 GLCD displays. It acts as a dedicated graphics processing unit, handling framebuffer management, rendering, and communication with the display independently from the main CPU.
Unlike a typical GLCD library, the CPU does not directly control the display. Instead, it sends high-level drawing commands to the RT-X12864 GPU, which performs all rendering operations and updates the GLCD using its own framebuffer.
Features
- Dedicated GPU architecture for 128x64 GLCD displays
- Independent framebuffer management
- I²C communication between CPU and GPU
- Text rendering with 5x7 and 8x8 fonts
- Pixel, line, rectangle, and filled rectangle drawing
- Circle and filled circle rendering
- Bitmap rendering from PROGMEM
- Open-source hardware and software
- Expandable command-based communication protocol
Architecture
CPU (Master)
|
| I²C Commands (400 kHz)
v
VidiaG Force RT-X12864 GPU
|
| Framebuffer Rendering
v
CustomGLCD Driver
|
v
128x64 GLCD Display[!IMPORTANT] The CPU only sends high-level commands such as drawing pixels, lines, text, and bitmaps. The GPU handles all low-level rendering and display communication.
Hardware
| Component | Description |
|---|---|
| GPU | Arduino Uno R4 WiFi |
| CPU | Any compatible I2C master (tested with Arduino Nano Every) |
| Display | AG12864AHF / KS0108-compatible 128x64 GLCD |
| Interface | I²C Fast-Mode (400 kHz) |
| VRAM | 1 KB framebuffer |
| Power Consumption | Approximately 255 mA including the display (idle) |
Installation
- Upload
gpu_soft/ScreenI2C/ScreenI2C.inoto the Arduino Uno R4 WiFi. - Connect the GLCD display to the GPU according to the schematic.
- Connect the CPU board to the GPU via I²C using
GND,VCC,SCL, andSDA. - Include
GPU12864.hin your CPU project. - Call
gpuBegin()before using any GPU functions.
Basic Usage
#include "GPU12864.h"
void setup()
{
gpuBegin();
gpuClear();
gpuDrawText(1, 1, "Hello, World!", FONT_5X7);
gpuDrawLine(0, 0, 127, 63);
gpuUpdate();
}
void loop()
{
}Available Commands
The API is function-based rather than object-oriented.
Functions, yes, functions. Because yes.
It was simpler to implement this way. :P
| Command | Function |
|---|---|
gpuBegin() | Begins communication between CPU and GPU (takes about 1.2 s) |
gpuClear() | Clear the framebuffer |
gpuUpdate() | Send the framebuffer to the GLCD |
gpuDrawPixel(uint8_t x, uint8_t y, bool color = true) | Draw a single pixel |
gpuDrawLine(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, bool color = true) | Draw a line |
gpuDrawRect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, bool color = true) | Draw a rectangle |
gpuFillRect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, bool color = true) | Draw a filled rectangle |
gpuDrawCircle(uint8_t x, uint8_t y, uint8_t r, bool color = true) | Draw a circle |
gpuFillCircle(uint8_t x, uint8_t y, uint8_t r, bool color = true) | Draw a filled circle |
gpuDrawText(uint8_t x, uint8_t y, const char* text, uint8_t fontId, bool color = true) | Render text |
gpuDrawBitmap(uint8_t x, uint8_t y, const uint8_t *bitmap, uint8_t width, uint8_t height) | Render a bitmap stored in PROGMEM |
[!TIP] You can use
gpuFillRect()instead ofgpuClear()when you want to clear only part of the screen to avoid screen flashing on refresh.
Demos
The repository includes several demonstration programs:
- Hello World
- Font rendering demo
- Shapes and primitives demo
- Sine wave graph
- Live scrolling graph
- Bouncing ball animation
- Rotating 3D cube
- Benchmark demo
- Full demonstration sequence
Arduino IDE Package
For developers who want to use GPU12864 and additional drivers without copying files into every sketch.
Download the Arduino IDE package (ZIP)
After installing the ZIP through Sketch → Include Library → Add .ZIP Library…, use:
#include <GPU12864.h>
#include <adrv/AdditionalDriver.h>instead of:
#include "GPU12864.h"
#include "AdditionalDriver.h"Ready-to-use sketches are available in File → Examples → GPU12864 IDE Pack.
PCB
The repository includes the complete KiCad project and manufacturing files for the RT-X12864 adapter PCB, including:
.kicad_proproject file.kicad_schschematic.kicad_pcbPCB layout- Gerber files (
.gbr) - Drill files (
.drl) gerber.zipready for PCB fabrication
Documentation
- Technical Specification
- Bitmap Conversion and Rendering
- I²C Communication Protocol
- Additional Drivers
- Fun Specifications (Easter Egg)
Hardware Files
[!NOTE] This is not an RTX graphics card. It is a custom, microcontroller-based 2D GPU for GLCD displays.
This project is released as open-source hardware and software. You are free to study, modify, and distribute it under the terms of the license.
Parts
8| Qty | Value | Footprint | References |
|---|---|---|---|
| 1 | AG12864AHF | Connector_PinHeader_2.54mm:PinHeader_1x20_P2.54mm_Vertical | J1 |
| 1 | Arduino_Uno_R4_WiFi_Shield | PCM_arduino-library:Arduino_Uno_R4_WiFi_Shield | A1 |
| 1 | Contrast | Potentiometer_THT:Potentiometer_Runtron_RM-065_Vertical | RV1 |
| 1 | INPUT | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J2 |
The 4 most common of 8 parts.
Questions
How big is the GPU12864 PCB?
It measures 93 × 70 mm and has 2 copper layers, 1.6 mm thick.
What parts does the GPU12864 use?
8 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
Where can I download the GPU12864 KiCad files?
From the html-css-js-python/GPU12864 repository on GitHub, at the commit this page was made from: the board is hardware/GPU12864/GPU12864.kicad_pcb and its schematic hardware/GPU12864/GPU12864.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the GPU12864 design in my own project?
Its repository publishes it under the Apache-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).
Similar boards
- 2 layers20.5 × 24.8 mm

- 2 layers14.4 × 10.5 mm

OSO SWAB B1-00 Sensor Watch Accelerometer
joeycastillo/Sensor-Watch
A board replacement for the classic Casio F-91W wristwatch
8 parts2.1k - 2 layers7.9 × 39.1 mm

Brain board STM32F407 SD wing it
rusefi/rusefi
rusefi - GPL internal combustion engine control unit
8 parts1.2k - 2 layers59.9 × 25.7 mm

Buffer
hoglet67/RGBtoHDMI
Bare-metal Raspberry Pi project that provides pixel-perfect sampling of Retro Computer RGB/YUV video and conversion to HDMI
8 parts1kGPL-3.0 - 2 layers52 × 12.6 mm

USB
shanteacontrols/OpenDeck
A platform for building interactive control and sensing devices using MIDI and OSC built with Zephyr RTOS.
8 parts960Apache-2.0 - 2 layers87.5 × 48.5 mm

7 input macropad
hackclub/OnBoard
💡 Join 1,000 teenagers and make your first PCB with a $100 grant!
8 parts915 - 2 layers36.2 × 63.1 mm

PicoMemcard pico
dangiu/PicoMemcard
Emulating PSX Memory Card (or controller) using a Raspberry Pi Pico
8 parts694GPL-3.0 - 2 layers36 × 10 mm

PCB4-PWR BTN Rev.A
OLIMEX/DIY-LAPTOP
Do It Yourself Open Source Hardware and Software Modular Hacker's Friendly Laptop
8 parts578Apache-2.0