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
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:
-
Calls
PR00._ONto power the touchscreen -
Sends the GPIO reset sequence
-
Forces D0 power state via
_PS0 -
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!
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:
-
WiFi -
Audio (fixed via WeirdTreeThing script) -
Touchpad -
Camera (/dev/video*present) -
Keyboard shortcuts -
Touchscreen PROBE (via custom module)
What still needs work:
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?