{"id":3332,"date":"2026-07-31T00:00:27","date_gmt":"2026-07-30T16:00:27","guid":{"rendered":"https:\/\/www.kadidisplay.com\/?post_type=blog-news&#038;p=3332"},"modified":"2026-07-29T18:19:51","modified_gmt":"2026-07-29T10:19:51","slug":"how-to-bring-up-a-custom-mipi-dsi-touch-display-on-raspberry-pi-cm4-panel-driver-device-tree-overlay-and-gt928-touch","status":"publish","type":"blog-news","link":"https:\/\/www.kadidisplay.com\/pt\/blog-news\/how-to-bring-up-a-custom-mipi-dsi-touch-display-on-raspberry-pi-cm4-panel-driver-device-tree-overlay-and-gt928-touch\/","title":{"rendered":"How to Bring Up a Custom MIPI DSI Touch Display on Raspberry Pi CM4: Panel Driver, Device Tree Overlay, and GT928 Touch"},"content":{"rendered":"<p>&nbsp;<\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" src=\"https:\/\/www.kadidisplay.com\/wp-content\/uploads\/2026\/07\/Raspberry-Pi-CM4-custom-MIPI-DSI-touchscreen-bring-up-with-panel-driver-Device-Tree-overlay-and-GT928-touch-configuration-3.webp\" alt=\"Raspberry Pi CM4 custom MIPI DSI touchscreen bring-up with panel driver, Device Tree overlay, and GT928 touch configuration\" \/><\/div>\n<p>Bringing up a custom MIPI DSI touchscreen on Raspberry Pi CM4 requires more than connecting a compatible-looking FPC. The system needs a correct physical interface, a Linux DRM panel driver containing the panel timing and initialization commands, a Device Tree overlay that links the panel to the CM4 DSI host, and a separate I\u00b2C configuration for the GT928 touch controller.<\/p>\n<p>This guide uses the <a style=\"text-decoration: underline;\" href=\"https:\/\/github.com\/Alan-wang9707\/KD101QWU88FP-CM4?tab=readme-ov-file\" rel=\"nofollow\"><strong>public KD101QWU88FP-CM4 reference implementation<\/strong><\/a> to explain how those layers work together. The repository includes an HX8279-based panel driver, a DSI overlay, GT928 touch files, and instructions for compiling and installing the resulting kernel module and overlays.<\/p>\n<h2 id=\"what-this-raspberry-pi-cm4-reference-implementation-includes\"><strong>What This Raspberry Pi CM4 Reference Implementation Includes<\/strong><\/h2>\n<p>The reference configuration is associated with a 10.1-inch, 1200 \u00d7 1920 MIPI DSI touchscreen. The matching Kadi product page identifies product number KD101QWU88FP-FC101, a 1200 \u00d7 1920 MIPI DSI display, I\u00b2C touch, and a converter board that changes the panel-side connection to a 22-pin MIPI DSI and I\u00b2C interface for the Compute Module platform.<\/p>\n<p>&nbsp;<\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" src=\"https:\/\/www.kadidisplay.com\/wp-content\/uploads\/2026\/07\/10.1-inch-1200x1920-MIPI-DSI-touchscreen-display-module-for-Raspberry-Pi-CM4-embedded-applications-2.webp\" alt=\"10.1-inch 1200x1920 MIPI DSI touchscreen display module for Raspberry Pi CM4 embedded applications\" \/><\/div>\n<p>O <a style=\"text-decoration: underline;\" href=\"https:\/\/www.kadidisplay.com\/pt\/products\/10-1-inch-12001920-dsi-mipi-display-for-raspberry-pi%EF%BC%88cm4-cm5%EF%BC%89\/\"><strong>10.1-inch 1200\u00d71920 MIPI DSI touchscreen for Raspberry Pi CM4<\/strong><\/a> is therefore more than a bare TFT panel. The complete integration path includes:<\/p>\n<ul>\n<li>\n<p>The LCD and capacitive touch panel<\/p>\n<\/li>\n<li>\n<p>An interface converter board<\/p>\n<\/li>\n<li>\n<p>MIPI DSI and I\u00b2C connections<\/p>\n<\/li>\n<li>\n<p>A Linux panel driver<\/p>\n<\/li>\n<li>\n<p>A display Device Tree overlay<\/p>\n<\/li>\n<li>\n<p>A separate touch overlay<\/p>\n<\/li>\n<li>\n<p>Kernel-module and overlay deployment<\/p>\n<\/li>\n<\/ul>\n<p>The repository should not be treated as a universal package for every display using an HX8279 controller. Another panel may require different display timing, initialization registers, power sequencing, lane settings, reset behavior, or FPC mapping. Matching the controller family or resolution alone does not establish compatibility.<\/p>\n<p>The display overlay also targets brcm,bcm2711, disables dsi0, and enables dsi1. This makes CM4 the clearly documented platform for the published overlay. The files should not be described as directly validated for CM5 without checking the current CM5 hardware, Linux kernel, and Device Tree structure.<\/p>\n<h2 id=\"verify-the-physical-display-and-touch-connections-first\"><strong>Verify the Physical Display and Touch Connections First<\/strong><\/h2>\n<p>Software changes cannot correct an incompatible pinout, missing power rail, or incorrectly routed DSI lane. Hardware verification should therefore come before kernel compilation.<\/p>\n<h3 id=\"check-the-mipi-dsi-display-path\"><strong>Check the MIPI DSI Display Path<\/strong><\/h3>\n<p>Confirm that the CM4 carrier or converter board provides the correct path between the DSI host and the display. Review:<\/p>\n<ul>\n<li>\n<p>Connector pin count and pitch<\/p>\n<\/li>\n<li>\n<p>Contact orientation<\/p>\n<\/li>\n<li>\n<p>Clock- and data-lane assignments<\/p>\n<\/li>\n<li>\n<p>Ground and power positions<\/p>\n<\/li>\n<li>\n<p>Panel reset signal<\/p>\n<\/li>\n<li>\n<p>Backlight power and control<\/p>\n<\/li>\n<li>\n<p>FPC length and exit direction<\/p>\n<\/li>\n<li>\n<p>Available bend and connector-clearance space<\/p>\n<\/li>\n<\/ul>\n<p>The published panel configuration uses four MIPI DSI data lanes, RGB888 pixel format, video mode with sync pulses, and low-power mode. Its default mode specifies a 160 MHz pixel clock, 1200 \u00d7 1920 active resolution, a horizontal total of 1360, and a vertical total of 1960.<\/p>\n<p>Those values must correspond to the selected panel and physical design. A cable may fit the connector while still using a different lane mapping, reset signal, voltage assignment, or touch pinout.<\/p>\n<h3 id=\"treat-gt928-touch-as-a-separate-interface\"><strong>Treat GT928 Touch as a Separate Interface<\/strong><\/h3>\n<p>The display image travels over MIPI DSI, while the GT928 touch controller communicates through I\u00b2C. Touch also requires its own reset, interrupt, power, and coordinate configuration.<\/p>\n<p>The public Goodix overlay places the touch controller at I\u00b2C address 0x14, uses GPIO 27 for the interrupt, and uses GPIO 17 for reset. It also includes optional settings for inverting the X or Y axis and swapping the coordinates.<\/p>\n<p>This separation explains why a system may show a correct image while touch remains unavailable. In that situation, the DSI panel path may be functional, while the I\u00b2C bus, touch-controller address, GPIO configuration, driver binding, or input mapping still needs attention.<\/p>\n<h2 id=\"understand-the-three-main-software-components\"><strong>Understand the Three Main Software Components<\/strong><\/h2>\n<p>A custom CM4 display bring-up becomes easier when the panel driver, display overlay, and touch overlay are diagnosed as separate components.<\/p>\n<h3 id=\"the-panel-driver-defines-how-the-display-operates\"><strong>The Panel Driver Defines How the Display Operates<\/strong><\/h3>\n<p>The Linux DRM panel driver describes the behavior of the specific display. In this reference implementation, it includes:<\/p>\n<ul>\n<li>\n<p>Panel initialization commands<\/p>\n<\/li>\n<li>\n<p>Horizontal and vertical timing<\/p>\n<\/li>\n<li>\n<p>Pixel clock<\/p>\n<\/li>\n<li>\n<p>Active resolution<\/p>\n<\/li>\n<li>\n<p>Four-lane DSI configuration<\/p>\n<\/li>\n<li>\n<p>RGB888 format<\/p>\n<\/li>\n<li>\n<p>DSI mode flags<\/p>\n<\/li>\n<li>\n<p>Reset and power handling<\/p>\n<\/li>\n<li>\n<p>Prepare, enable, disable, and unprepare operations<\/p>\n<\/li>\n<\/ul>\n<p>The driver binds to the compatible string kdxs,himax8279 and attaches the configured panel to the MIPI DSI subsystem.<\/p>\n<p>Changing only the visible resolution is not enough to adapt the file to another display. The initialization sequence, porch values, sync widths, clock, lane configuration, and power behavior may also need revision.<\/p>\n<h3 id=\"the-display-overlay-connects-the-panel-to-cm4-hardware\"><strong>The Display Overlay Connects the Panel to CM4 Hardware<\/strong><\/h3>\n<p>The Device Tree overlay tells Linux where the panel is connected and which driver should manage it. The published overlay:<\/p>\n<ul>\n<li>\n<p>Targets the BCM2711 platform<\/p>\n<\/li>\n<li>\n<p>Disables dsi0<\/p>\n<\/li>\n<li>\n<p>Enables dsi1<\/p>\n<\/li>\n<li>\n<p>Creates the DSI panel node<\/p>\n<\/li>\n<li>\n<p>Uses kdxs,himax8279 as the compatible string<\/p>\n<\/li>\n<li>\n<p>Assigns GPIO 4 as an active-low reset<\/p>\n<\/li>\n<li>\n<p>Connects the DSI host endpoint to the panel endpoint<\/p>\n<\/li>\n<\/ul>\n<p>If the compatible string in the Device Tree does not match the panel driver, the module may exist on the system without binding to the display.<\/p>\n<h3 id=\"the-touch-overlay-configures-the-gt928-path\"><strong>The Touch Overlay Configures the GT928 Path<\/strong><\/h3>\n<p>The GT928 overlay has a different responsibility. It describes the touch controller on the I\u00b2C bus, assigns its interrupt and reset GPIOs, defines its power supplies, and provides optional coordinate transformations.<\/p>\n<p>For practical debugging, first establish a stable image. Then enable and validate touch as a separate input subsystem.<\/p>\n<h2 id=\"prepare-a-kernel-build-environment-that-matches-the-target-cm4\"><strong>Prepare a Kernel Build Environment That Matches the Target CM4<\/strong><\/h2>\n<p>A custom panel module should be built against kernel sources and configuration that match the CM4 system where it will run.<\/p>\n<p>Record the following before building:<\/p>\n<ul>\n<li>\n<p>Raspberry Pi OS release<\/p>\n<\/li>\n<li>\n<p>Running kernel version<\/p>\n<\/li>\n<li>\n<p>32-bit or 64-bit architecture<\/p>\n<\/li>\n<li>\n<p>CM4 carrier-board model<\/p>\n<\/li>\n<li>\n<p>Kernel source branch or commit<\/p>\n<\/li>\n<li>\n<p>Existing display and boot configuration<\/p>\n<\/li>\n<\/ul>\n<p>The repository instructs users to obtain Raspberry Pi kernel sources, place the driver and Device Tree files into the appropriate directories, and compile the kernel and overlays to generate .ko and .dtbo files. It also points to the <a style=\"text-decoration: underline;\" href=\"https:\/\/www.raspberrypi.com\/documentation\/computers\/linux_kernel.html\" rel=\"nofollow\"><strong>official Raspberry Pi kernel build documentation<\/strong><\/a>, which covers native builds, cross-compilation, configuration, and installation.<\/p>\n<p>The panel source normally needs to be added to the relevant DRM panel directory and referenced by the applicable Makefile and Kconfig. Overlay files must also be included in the Device Tree overlay build. Exact paths and APIs can change between kernel versions, so the current source tree and official documentation should take priority over assumptions based on an older build.<\/p>\n<h2 id=\"build-and-deploy-the-panel-module-and-overlays\"><strong>Build and Deploy the Panel Module and Overlays<\/strong><\/h2>\n<p>The required output normally includes:<\/p>\n<ul>\n<li>\n<p>A panel-driver .ko module<\/p>\n<\/li>\n<li>\n<p>A display .dtbo overlay<\/p>\n<\/li>\n<li>\n<p>A GT928 touch .dtbo overlay<\/p>\n<\/li>\n<li>\n<p>A touch-driver module if the required driver is not already available<\/p>\n<\/li>\n<\/ul>\n<p>The repository\u2019s deployment instructions place .dtbo files in \/boot\/firmware\/overlays\/ and the .ko file in \/lib\/modules\/$(uname -r)\/extra\/. The next steps are to run sudo depmod -a, add the corresponding dtoverlay entries to config.txt, and reboot.<\/p>\n<p>Before rebooting:<\/p>\n<ul>\n<li>\n<p>Confirm that the module directory matches the running kernel.<\/p>\n<\/li>\n<li>\n<p>Verify that the overlay filenames match the boot entries.<\/p>\n<\/li>\n<li>\n<p>Back up the existing boot configuration.<\/p>\n<\/li>\n<li>\n<p>Keep a way to edit the SD card if the system fails to boot.<\/p>\n<\/li>\n<li>\n<p>Do not mix modules compiled against different kernel releases.<\/p>\n<\/li>\n<\/ul>\n<p>An out-of-tree module may require rebuilding after a Raspberry Pi OS kernel update, even if the panel hardware has not changed.<\/p>\n<h2 id=\"bring-up-the-display-before-debugging-touch\"><strong>Bring Up the Display Before Debugging Touch<\/strong><\/h2>\n<p>Use a layered validation sequence rather than changing several hardware and software variables at once.<\/p>\n<p>Start with the display path:<\/p>\n<ol type=\"1\">\n<li>\n<p>Confirm that the panel module loads.<\/p>\n<\/li>\n<li>\n<p>Check whether it binds to the Device Tree node.<\/p>\n<\/li>\n<li>\n<p>Confirm that the DSI host probes.<\/p>\n<\/li>\n<li>\n<p>Look for the expected DRM connector and display mode.<\/p>\n<\/li>\n<li>\n<p>Verify resolution and orientation.<\/p>\n<\/li>\n<li>\n<p>Check backlight control.<\/p>\n<\/li>\n<li>\n<p>Test cold boot and restart.<\/p>\n<\/li>\n<li>\n<p>Look for flickering, cropping, shifting, or unstable startup.<\/p>\n<\/li>\n<\/ol>\n<p>Useful tools may include dmesg, lsmod, \/sys\/class\/drm\/, and modetest when available. Their exact output depends on the kernel and configuration, so a single log line should not be treated as a universal compatibility test.<\/p>\n<p>Once the image path works, check touch:<\/p>\n<ol type=\"1\">\n<li>\n<p>Confirm that the GT928 appears on the expected I\u00b2C bus.<\/p>\n<\/li>\n<li>\n<p>Check whether the touch driver binds.<\/p>\n<\/li>\n<li>\n<p>Verify interrupt and reset operation.<\/p>\n<\/li>\n<li>\n<p>Confirm that events reach the Linux input subsystem.<\/p>\n<\/li>\n<li>\n<p>Test coordinate orientation.<\/p>\n<\/li>\n<li>\n<p>Recheck input mapping after display rotation.<\/p>\n<\/li>\n<\/ol>\n<p>If the panel remains black, the image is unstable, or the touch controller is not detected, the <a style=\"text-decoration: underline;\" href=\"https:\/\/www.kadidisplay.com\/pt\/blog-news\/raspberry-pi-mipi-dsi-touchscreen-not-working-complete-troubleshooting-guide\/\"><strong>Raspberry Pi MIPI DSI touchscreen troubleshooting guide<\/strong><\/a> provides a broader hardware-and-software diagnostic path covering power, backlight, FPC, timing, Device Tree, drivers, and I\u00b2C touch.<\/p>\n<h2 id=\"troubleshoot-by-hardware-and-software-layer\"><strong>Troubleshoot by Hardware and Software Layer<\/strong><\/h2>\n<table style=\"width: 100%;\">\n<colgroup>\n<col style=\"width: 26%;\" \/>\n<col style=\"width: 30%;\" \/>\n<col style=\"width: 42%;\" \/> <\/colgroup>\n<thead>\n<tr>\n<th style=\"text-align: left;\"><strong>Sintoma<\/strong><\/th>\n<th style=\"text-align: left;\"><strong>Likely layer<\/strong><\/th>\n<th style=\"text-align: left;\"><strong>What to check<\/strong><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">Panel driver does not bind<\/td>\n<td style=\"text-align: left;\">Kernel module or Device Tree<\/td>\n<td style=\"text-align: left;\">Module loading, compatible string, kernel version<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Backlight is on but no image appears<\/td>\n<td style=\"text-align: left;\">DSI timing, lane setup, reset, or initialization<\/td>\n<td style=\"text-align: left;\">Four-lane configuration, mode flags, reset GPIO, command sequence<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Image is shifted or unstable<\/td>\n<td style=\"text-align: left;\">Display timing<\/td>\n<td style=\"text-align: left;\">Pixel clock, porch values, sync widths, horizontal and vertical totals<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Display works but touch does not<\/td>\n<td style=\"text-align: left;\">I\u00b2C touch path<\/td>\n<td style=\"text-align: left;\">Address 0x14, GPIO 27 interrupt, GPIO 17 reset, driver binding<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Touch coordinates are rotated<\/td>\n<td style=\"text-align: left;\">Input mapping<\/td>\n<td style=\"text-align: left;\">Invert-X, invert-Y, and swap-X\/Y settings<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">Display stops working after an update<\/td>\n<td style=\"text-align: left;\">Kernel compatibility<\/td>\n<td style=\"text-align: left;\">Rebuilt module, overlay compatibility, kernel API changes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Change one layer at a time and record the result. Simultaneously changing the FPC, panel timing, overlay, and touch GPIO assignments makes it difficult to identify the actual cause.<\/p>\n<h2 id=\"choose-the-appropriate-integration-level\"><strong>Choose the Appropriate Integration Level<\/strong><\/h2>\n<p>A platform-ready module is suitable when the display, touch controller, converter board, cable, panel driver, and overlay already match the intended CM4 architecture. The <a style=\"text-decoration: underline;\" href=\"https:\/\/www.kadidisplay.com\/pt\/product_category\/displays-for-raspberry-pi\/\"><strong>MIPI DSI displays for Raspberry Pi<\/strong><\/a> category provides options across different sizes, resolutions, brightness levels, interfaces, and touch configurations.<\/p>\n<p>A custom display assembly may be more appropriate when the CM4 platform is fixed but the project requires:<\/p>\n<ul>\n<li>\n<p>A different size or resolution<\/p>\n<\/li>\n<li>\n<p>Higher brightness<\/p>\n<\/li>\n<li>\n<p>Custom FPC or pinout<\/p>\n<\/li>\n<li>\n<p>A project-specific converter board<\/p>\n<\/li>\n<li>\n<p>Cover glass or optical bonding<\/p>\n<\/li>\n<li>\n<p>Modified touch configuration<\/p>\n<\/li>\n<li>\n<p>Mechanical adaptation for the enclosure<\/p>\n<\/li>\n<li>\n<p>Panel-driver or Device Tree changes<\/p>\n<\/li>\n<\/ul>\n<p>When maintaining a custom kernel module is outside the project scope, a controller-based or modular display architecture may reduce low-level integration work. That approach can combine the display, touch, control board, cables, and mechanical elements into a higher-level subsystem.<\/p>\n<p><strong>Kadi Display<\/strong> presents Raspberry Pi displays, touch modules, embedded display products, accessories, and customized integration options rather than limiting the project to a bare TFT panel.<\/p>\n<h2 id=\"conclusion\"><strong>Conclus\u00e3o<\/strong><\/h2>\n<p>A custom MIPI DSI touchscreen on Raspberry Pi CM4 depends on coordinated hardware and software integration. The converter board and FPC establish the physical connection; the DRM panel driver defines timing, initialization, lane count, and pixel format; the display overlay links the panel to the CM4 DSI host; and the GT928 requires separate I\u00b2C, GPIO, power, and coordinate settings.<\/p>\n<p>The published repository provides a useful reference for its specific 1200 \u00d7 1920 CM4 configuration, but the same files should not be assumed to support another panel, kernel version, carrier board, or CM5 platform without review.<\/p>\n<p>For a non-standard CM4 design, submit the Compute Module and carrier-board details, Raspberry Pi OS and kernel versions, required display size and resolution, DSI connector information, touch requirements, brightness target, and mechanical drawing through <a style=\"text-decoration: underline;\" href=\"https:\/\/www.kadidisplay.com\/pt\/contact-us\/\"><strong>discuss a custom Raspberry Pi CM4 display project<\/strong><\/a>. Those details can help determine whether a platform-ready module, modified display assembly, custom converter board, or driver-supported solution is the practical starting point.<\/p>\n<h2 id=\"faqs\"><strong>FAQ<\/strong><\/h2>\n<h3 id=\"can-any-hx8279-mipi-dsi-panel-use-the-same-raspberry-pi-cm4-driver\"><strong>Can Any HX8279 MIPI DSI Panel Use the Same Raspberry Pi CM4 Driver?<\/strong><\/h3>\n<p>No. Panels using the same controller family may still require different timing, initialization commands, lane configuration, reset behavior, or power sequencing.<\/p>\n<h3 id=\"why-does-the-display-work-but-the-gt928-touchscreen-does-not\"><strong>Why Does the Display Work but the GT928 Touchscreen Does Not?<\/strong><\/h3>\n<p>The display and touch use separate interfaces. The image uses MIPI DSI, while GT928 touch depends on the correct I\u00b2C address, interrupt GPIO, reset GPIO, power settings, and Linux input driver.<\/p>\n<h3 id=\"does-the-kernel-module-need-to-be-rebuilt-after-a-raspberry-pi-os-update\"><strong>Does the Kernel Module Need to Be Rebuilt After a Raspberry Pi OS Update?<\/strong><\/h3>\n<p>It may need to be rebuilt. A module compiled outside the main kernel tree should be checked against the updated kernel version, configuration, module ABI, and source APIs.<\/p>\n<h3 id=\"can-the-same-device-tree-overlay-be-used-directly-on-raspberry-pi-cm5\"><strong>Can the Same Device Tree Overlay Be Used Directly on Raspberry Pi CM5?<\/strong><\/h3>\n<p>That should not be assumed. The published display overlay targets brcm,bcm2711, which is the CM4 platform. CM5 hardware and Device Tree configuration require separate review.<\/p>\n<h3 id=\"is-a-matching-connector-enough-to-confirm-cm4-display-compatibility\"><strong>Is a Matching Connector Enough to Confirm CM4 Display Compatibility?<\/strong><\/h3>\n<p>No. The design must also match the lane mapping, display timing, pixel format, voltage, reset, backlight, initialization commands, panel driver, Device Tree configuration, and touch interface.<\/p>","protected":false},"featured_media":0,"parent":0,"menu_order":14,"template":"","news":[],"_links":{"self":[{"href":"https:\/\/www.kadidisplay.com\/pt\/wp-json\/wp\/v2\/blog-news\/3332"}],"collection":[{"href":"https:\/\/www.kadidisplay.com\/pt\/wp-json\/wp\/v2\/blog-news"}],"about":[{"href":"https:\/\/www.kadidisplay.com\/pt\/wp-json\/wp\/v2\/types\/blog-news"}],"wp:attachment":[{"href":"https:\/\/www.kadidisplay.com\/pt\/wp-json\/wp\/v2\/media?parent=3332"}],"wp:term":[{"taxonomy":"news","embeddable":true,"href":"https:\/\/www.kadidisplay.com\/pt\/wp-json\/wp\/v2\/news?post=3332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}