HP Chromebook 14 G7 (DRAWMAN): Touchscreen investigation — PROBE succeeded, need HID help

HP Chromebook 14 G7 (DRAWMAN) — Touchscreen on Linux: A Full Investigation

Author: Riyad
Email: [email protected]
Date: April 25, 2026
Device: HP Chromebook 14 G7
Board: DRAWMAN | Platform: Intel JasperLake
OS: Kubuntu 26.04 LTS | Kernel: 7.0.0-14-generic
Firmware: MrChromebox-2603.1 (04/09/2026) — Full ROM UEFI


The Problem

After installing Kubuntu 26.04 on my HP Chromebook 14 G7, everything worked except the touchscreen. dmesg showed this repeatedly:

elants_i2c i2c-ELAN0001:00: supply vcc33 not found, using dummy regulator
elants_i2c i2c-ELAN0001:00: supply vccio not found, using dummy regulator
elants_i2c i2c-ELAN0001:00: nothing at this address

What follows is everything I discovered after a full day of deep investigation.


Step 1 — libinput Shows Only Touchpad, Not Touchscreen

sudo libinput list-devices | grep -iE "touch|elan"
# Result: Only "Elan Touchpad" — no Touchscreen

The touchpad (ELAN0000) worked fine. The touchscreen (ELAN0001) was invisible.


Step 2 — i2cdetect Shows Empty Buses

sudo i2cdetect -y 0   # empty
sudo i2cdetect -y 1   # empty
sudo i2cdetect -y 2   # empty

No device visible on any I2C bus. This suggested a power problem, not a driver problem.


Step 3 — Finding the SSDT

The DSDT had no mention of ELAN0001. But the SSDT did:

sudo acpidump > /tmp/all_acpi.dat
sudo acpixtract -a /tmp/all_acpi.dat
sudo iasl -d /tmp/ssdt.dat
grep -i "ELAN0001" /tmp/ssdt.dsl -A 40

Key discovery — the SSDT defines the touchscreen and its power sequence:

Scope (\_SB.PCI0.I2C2)
{
    Device (D010)
    {
        Name (_HID, "ELAN0001")
        Name (_DDN, "ELAN Touchscreen")

        PowerResource (PR00, 0x00, 0x0000)
        {
            Method (_ON, 0, Serialized)
            {
                \_SB.PCI0.STXS (0x79)   // GPIO 121 HIGH
                \_SB.PCI0.STXS (0x7A)   // GPIO 122 HIGH
                Sleep (One)              // 1ms
                \_SB.PCI0.CTXS (0x79)   // GPIO 121 LOW (Reset)
                Sleep (0x14)             // 20ms
            }
        }
    }
}

The touchscreen lives on I2C bus 2, address 0x10, and needs GPIO 121 and 122 to wake up.


Step 4 — The Driver Problem

sudo dmesg | grep -i "elan"
# elants_i2c i2c-ELAN0001:00: nothing at this address

The driver elants_i2c is built-in to Ubuntu kernel 7.0 — it cannot be blacklisted with /etc/modprobe.d/. It tries to talk to the touchscreen before the GPIO power sequence runs, fails, and gives up.

Attempting blacklist via GRUB:

initcall_blacklist=elants_i2c_driver_init

:white_check_mark: This works! The driver is now skipped at boot.


Step 5 — Power State Investigation

sudo cat /sys/bus/i2c/devices/i2c-ELAN0001:00/firmware_node/real_power_state
# D3cold  ← completely powered off

sudo cat /sys/bus/i2c/devices/i2c-ELAN0001:00/firmware_node/power_resources_D0/LNXPOWER:00/resource_in_use
# 0  ← power resource is OFF

The touchscreen is in D3cold (deepest sleep) because nothing ever calls PR00._ON.


Step 6 — Manual ACPI Call Succeeds

Using acpi_call module:

sudo modprobe acpi_call
echo '\_SB.PCI0.STXS 0x79' | sudo tee /proc/acpi/call && sudo cat /proc/acpi/call
# 0x1  ← SUCCESS
echo '\_SB.PCI0.STXS 0x7A' | sudo tee /proc/acpi/call && sudo cat /proc/acpi/call
# 0x1  ← SUCCESS
echo '\_SB.PCI0.CTXS 0x79' | sudo tee /proc/acpi/call && sudo cat /proc/acpi/call
# 0x0  ← SUCCESS

All GPIO signals sent successfully. But the device still showed D3cold.


Step 7 — i2cdetect After PR00._ON

echo '\_SB.PCI0.I2C2.D010.PR00._ON' | sudo tee /proc/acpi/call
sudo i2cdetect -r -y 2

Result:

40: 40

A device appeared at address 0x40! Then disappeared after a few seconds.

However, i2cget confirmed the device responds:

sudo i2cget -y 2 0x40 0x00   # 0x00
sudo i2cget -y 2 0x40 0x01   # 0x1e


Step 8 — Writing a Custom Kernel Module

Since elants_i2c is built-in and cannot be displaced, I wrote a custom kernel module that:

  1. Calls PR00._ON to power the touchscreen

  2. Sends the GPIO reset sequence

  3. Forces D0 power state via _PS0

  4. Registers as an ACPI-matched I2C driver for ELAN0001

static const struct acpi_device_id elan_acpi_match[] = {
    { "ELAN0001", 0 },
    { }
};

static struct i2c_driver elan_driver = {
    .driver = {
        .name = "elan_touch",
        .acpi_match_table = elan_acpi_match,
    },
    .probe = elan_probe,
};

Result:

elan_touch: PR00 ON
elan_touch: GPIO sequence done
elan_touch: D0 forced
elan_touch: PROBE called for ELAN0001:00 at 0x10!
elan_touch: Driver registered!

:white_check_mark: PROBE succeeded! The touchscreen accepted the driver at address 0x10.


Current Status

The touchscreen is detected and probed successfully. The remaining challenge is reading HID data from it — attempts return -121 (EREMOTEIO), suggesting the device needs additional initialization before accepting I2C reads.

What works:

  • :white_check_mark: WiFi

  • :white_check_mark: Audio (fixed via WeirdTreeThing script)

  • :white_check_mark: Touchpad

  • :white_check_mark: Camera (/dev/video* present)

  • :white_check_mark: Keyboard shortcuts

  • :white_check_mark: Touchscreen PROBE (via custom module)

What still needs work:

  • :cross_mark: Touchscreen HID data reading (EREMOTEIO after probe)

Key Technical Facts for Developers

Property Value
Board DRAWMAN
Platform Intel JasperLake
Touchscreen HID ELAN0001
I2C Bus i2c-2 (0000:00:15.2)
I2C Address 0x10
ACPI Path \_SB.PCI0.I2C2.D010
Power Resource \_SB.PCI0.I2C2.D010.PR00
GPIO Reset (HIGH) 0x79 (121), 0x7A (122) via STXS
GPIO Reset (LOW) 0x79 (121) via CTXS
Power State D3cold (needs PR00._ON)
GRUB fix needed initcall_blacklist=elants_i2c_driver_init

How to Reproduce (For Developers)

# 1. Boot with this kernel parameter:
# initcall_blacklist=elants_i2c_driver_init

# 2. Load acpi_call
sudo modprobe acpi_call

# 3. Send power sequence
echo '\_SB.PCI0.I2C2.D010.PR00._ON' | sudo tee /proc/acpi/call
echo '\_SB.PCI0.STXS 0x79' | sudo tee /proc/acpi/call
echo '\_SB.PCI0.STXS 0x7A' | sudo tee /proc/acpi/call
sleep 0.001
echo '\_SB.PCI0.CTXS 0x79' | sudo tee /proc/acpi/call
sleep 0.1

# 4. Device should appear on i2c-2 at 0x10
# The custom module (elan_touch.ko) successfully probes it
# Next step: implement HID descriptor reading


Community

If you have a DRAWMAN board or know how to implement HID over I2C for ELAN0001 after a successful probe, please contribute at:

This investigation was done entirely on Kubuntu 26.04 with kernel 7.0.0-14-generic.

UPDATE — Major discoveries after posting:

After further investigation, I found that the real touchscreen address is 0x40, not 0x10. The device is actually a Goodix GTCH7503 (Vendor: 0x2A94, Product: 0xA804), not ELAN.

HID Descriptor (read from register 0x01):

0x1e 0x00 0x00 0x01 0xfd 0x01 0x21 0x00
0x24 0x00 0x3f 0x00 0xe7 0x00 0x3f 0x00
0x22 0x00 0x23 0x00 0x94 0x2a 0x04 0xa8

Decoded:

  • Report Descriptor Register: 0x0021

  • Input Register: 0x0024

  • Command Register: 0x0022

  • Vendor ID: 0x2A94 (Goodix)

  • Product ID: 0xA804

Registering i2c_hid at 0x40 succeeds:

bash

echo "i2c_hid 0x40" | sudo tee /sys/bus/i2c/devices/i2c-2/new_device
# i2c i2c-2: new_device: Instantiated device i2c_hid at 0x40

But no input device is created yet. The i2c_hid driver needs the HID descriptor register address (0x0001) passed explicitly.

@WeirdTreeThing — This matches the GTCH7503 you identified on Beetley! Do you know how to pass the descriptor register to i2c_hid?

@WeirdTreeThing Hi! I wanted to bring your attention to my investigation above.
I’ve been working on getting the touchscreen working on my HP Chromebook 14 G7 (DRAWMAN, JasperLake) running Kubuntu 26.04. After a full day of research, I managed to:

Identify the power sequence from SSDT (GPIO 121/122 via STXS/CTXS)
Successfully call PR00._ON and _PS0 via a custom kernel module
Achieve a successful PROBE on ELAN0001 at i2c-2, address 0x10

The remaining blocker is that I2C reads return -121 (EREMOTEIO) after probe, suggesting the device needs additional HID initialization.
Given that you already solved audio for JasperLake boards, I thought you might have insight into what’s missing for the HID layer. The full technical details are in the post above.
Any guidance would be greatly appreciated! :folded_hands:

UPDATE — Major discoveries after posting:

After further investigation, I found that the real touchscreen address is 0x40, not 0x10. The device is actually a Goodix GTCH7503 (Vendor: 0x2A94, Product: 0xA804), not ELAN.

HID Descriptor (read from register 0x01):

0x1e 0x00 0x00 0x01 0xfd 0x01 0x21 0x00
0x24 0x00 0x3f 0x00 0xe7 0x00 0x3f 0x00
0x22 0x00 0x23 0x00 0x94 0x2a 0x04 0xa8

Decoded:

  • Report Descriptor Register: 0x0021

  • Input Register: 0x0024

  • Command Register: 0x0022

  • Vendor ID: 0x2A94 (Goodix)

  • Product ID: 0xA804

Registering i2c_hid at 0x40 succeeds:

bash

echo "i2c_hid 0x40" | sudo tee /sys/bus/i2c/devices/i2c-2/new_device
# i2c i2c-2: new_device: Instantiated device i2c_hid at 0x40

But no input device is created yet. The i2c_hid driver needs the HID descriptor register address (0x0001) passed explicitly.

@WeirdTreeThing — This matches the GTCH7503 you identified on Beetley! Do you know how to pass the descriptor register to i2c_hid?

JFC. We’re going to have to start filtering/rejecting LLM-based debugging vomit. This is not helpful at all.

on DRAWMAN/DRAWCIA devices with the UEFI Full ROM firmware, you need to select the correct touchscreen type using the UEFI setup options. That’s it.