Phase 3: touchpad, touchscreen and the Ti50 TPM (2026-11-03)
Attempts 2026-11-03-15 (image b5f533fb178c67a2, kernel #13, commit 7bffb22) and 2026-11-03-16 (image
bf2dd269aa121412, same kernel, /init from commit a9d7aeb). Owner pick after the retro (2026-11-03): touchpad,
touchscreen and TPM. Sources: the netlog dumps/firstboot/2026-11-03-netlog.txt and the AP and EC console logs
dumps/firstboot/2026-11-03-{ap,ec}.log (all gitignored), and the pinned tree a804c57.
Why
The retro’s gap check (scripts/dt-kconfig-map.py --gaps, commit 4e1f825) listed
hid-over-i2c I2C_HID_OF=m touchscreen@10,touchpad@2c and google,cr50 TCG_TIS_I2C_CR50=m tpm@50. Both drivers
are =m in arm64 defconfig and the initramfs loads no modules, so none of the three nodes had ever bound.
Changes (commit 7bffb22)
kernel/mica-touch.config:I2C_HID_OF,I2C_HID_CORE,HID_MULTITOUCHbuilt in.kernel/mica-tpm.config:TCG_TIS_I2C_CR50built in;TCG_TPM2_HMACforbidden at=y(it creates a primary key in the null hierarchy at every boot,tpm2-sessions.c:1408-1412). TPM traffic is probe-time startup, self-test and capability reads, andTPM2_Shutdown(CLEAR)at reboot (tpm-chip.c:272).- Both compatibles left
kernel/dt-gaps.txt. /init:touch-*captures with a touch window,tpmandhwrngcaptures; fromb6b6662anda9d7aebthehid-over-i2cIRQ counts around the window and a 30 s window behind a banner.
TPM: pass (attempt -15)
cr50_i2c 1-0050: ti50 OT TPM 2.0 (i2c 0x50 irq 177 id 0x5066)at 2.80 s (the driver’s Ti50 name,tpm_tis_i2c_cr50.c:693-702).tpm=tpm0 tpmrm0 major=2 driver=cr50_i2c;hwrngliststpm-rng-0besidesmccc_trng(current).
Touchpad: pass (attempt -16)
hid-multitouch 0018:27C6:0D4F:Mouse(event0) andTouchpad(event1) on2-002c, both boots.- -15: 0 events, but the owner missed the 20 s prompt. -16:
touch-events=event1 bytes=373296 events=15554in the 30 s window; IRQmsmgpio 3 Level hid-over-i2cwent 646 to 2888.
Touchscreen: probes on one boot of two, reports never arrive whole
- -15:
hid-multitouch 0018:1FD2:5010bound (event2, andevent3namedUNKNOWN, likely a vendor collection; inference); no touch in the missed window. - -16: the descriptor read at probe came back garbled:
hid-generic 0018:FFA5:FFFF.0001: unexpected long global item,probe with driver hid-generic failed with error -22. In the window the IRQ (msmgpio 51) still went 305 to 921, and each report failedi2c_hid_of 0-0010: i2c_hid_get_input: incomplete report (64/106)(i2c-hid-core.c:570-573: 64 is the buffer size from the bad descriptor, 106 the size the panel sent). - So the panel answers and reports touches; the descriptor read at probe is unreliable (inference: power-on timing).
The node matches stock (descriptor address 0, TLMM 51 level-low, L15B and the TLMM 88 3.3 V switch with
startup-delay-us = <150000>andregulator-boot-on, overlayentry01fragments 69 and 75). The 9345’s panel is a different one (descriptor address 1), so it gives no precedent. - Candidate fix (not tried):
post-power-on-delay-msontouchscreen@10(i2c-hid-of.c:58-59,:105). Not in the stock tree, so it would be marked unverified (ADR 0004). Judge it over several boots: one good probe in two is the baseline.
Other results on these boots
compareprintedstart: coldfor both (the retro’sboot_start.pyfix works) and noWRONG IMAGE.unbound=lists1dfa000.crypto, the four CPU bandwidth-monitor PMUs,3d6a000.gmu,aaf0000andade0000clock controllers: the gap list’s leads, as expected.- SCMI failed on both cold starts (
Firmware version 0x0,cpufreq=none): four of the last five cold starts (scmi-2026-11-03.md).
Update: touchscreen attempts -17 to -19 (2026-11-03, 7:32 PM ET)
| Attempt | Change | Touchscreen at probe | In the window |
|---|---|---|---|
-17 | post-power-on-delay-ms = <150> (commit 42047ed) | ID right (1FD2:5010), report descriptor usage index exceeded, -22 | IRQ 1 to 730, every report incomplete (64/106) |
-18 | same, plus dyndbg for i2c-hid-core.c:944 and :804 (GBOOK_CMDLINE_EXTRA, commit bc705a1) | see the dump below | no input device |
-19 | i2c8 at 100 kHz (commit 2d4c257) | no message at all: no dump, not deferred, not unbound | no IRQ line registered |
The -18 dump (i2c_hid_of 0-0010: HID Descriptor:):
1e 00 00 01 a7 03 21 00 24 00 6a 00 25 00 6c 00 22 00 23 00 a5 ff ff ff ff ff ff ff ff ff.
- The first 20 bytes are a valid HID-over-I2C descriptor: length 30, version 1.00, report descriptor
0x3a7(935) bytes at register0x21, input register0x24,wMaxInputLength0x6a= 106, output0x25/108, command0x22, data0x23. - From byte 20 the read returns
0xff: vendora5 ffinstead ofd2 1f, thenffto the end. The report descriptor read gives05 0d 09 04 43and then0xff(a valid one starts05 0d 09 04 a1 01). - The touchpad’s dump on
2-002c(another bus) is clean:... 2f 00 ... c6 27 4f 0d ...(27C6:0D4F,wMaxInputLength47). - So the panel’s descriptor is right and the read loses data partway: the line reads high (
0xff) once the device stops driving it (inference). The “64” on -16/-17 was a corruptedwMaxInputLength. The 30-byte read uses the GENI FIFO path (DMA starts at 32 bytes,i2c-qcom-geni.c:528), so SE DMA is not the cause.
-19 at 100 kHz is inconclusive: the probe ran earlier than on any other boot (touchpad at 1.5 s against 3.2 to
5.4 s), and the one silent failure path in i2c-hid is nothing at this address (i2c-hid-core.c:1055, dev_dbg,
not enabled). Speed and timing are mixed.
Reverted (commits 9126648, 6d66b05): the 100 kHz bus and the power-on delay, neither shown to help; the DTS
traces to stock again. Three boots did not converge, so the touchscreen is parked.
Leads for a later session (inference, untested):
- Stock reaches the panel through Qualcomm’s vendor GENI I2C driver at 400 kHz; mainline’s GENI clock table and
transfer handling differ. Compare the SCL timing values (
i2c-qcom-geni.cclock table) with a stock-side read. - Enable
i2c-hid-core.c:1055and the GENI I2C error lines in the next touch boot, so a silent probe failure shows. - The panel’s own reset or report-enable line (TLMM 89,
dts/README.md) and its timing against the first read.
Update: the touchscreen on the wire, attempt -21 (2026-11-03, about 8 PM ET)
Attempt 2026-11-03-21 (kernel #16, commit 778abbf) traced the i2c and qcom_geni_i2c events
(kernel/mica-debug.config, debug-tools.md); the probe-time trace is in the netlog.
- Descriptor read clean this time (30 bytes, FIFO path):
… 22-00-23-00-d2-1f-10-50-30-50-00-00-00-00(1FD2:5010, version0x5030). - Report descriptor (935 bytes, DMA path):
05-0d-09-04thenffto the end; hid-generic failed-22. - Input reports (64-byte reads, the fallback buffer): every one starts
6a-00-10-03-01-48-36-1d-33(length 106, report ID0x10), and about half turn toffafter 9 to 12 bytes. - No controller error:
geni-erris empty; the GENI status shows ordinary done interrupts (m_stat=0x08000081). - Bus setup identical on both touch buses:
clk_freq=400000 clk_div=2 t_high=5 t_low=11 t_cycle=22(i2c-qcom-geni.c:188, the 19.2 MHz table). By the driver’s formula (:180-182) that is about 1.15 µs low and 0.52 µs high, under the I2C Fast-mode minimums (1.3 µs, 0.6 µs); the comment says the firmware adds cycles the formula leaves out (:176-178), so the real timing is unknown (inference). The touchpad tolerates it. - Reading: the panel answers and starts each reply correctly, then lets the data line float (
0xff) at a varying byte, with no error the controller sees. Bus timing that this touch controller does not tolerate fits (inference); -19’s 100 kHz boot was inconclusive and is worth repeating with the trace on.
Update: 100 kHz with the trace, attempt -22 (2026-11-03, 8:14 PM ET)
i2c8 at 100 kHz again (commit 20a1f8a), with tracing and dyndbg on i2c-hid-core.c:1055 and
i2c-qcom-geni.c:235-306. The bus came up at 100 kHz (clk_div=7 t_high=10 t_low=12 t_cycle=26), and the
touchscreen did not acknowledge its address: geni_i2c a80000.i2c: NACK: target device unresponsive, check its power/reset-ln twice, then i2c_hid_of 0-0010: nothing at this address: -6. That is -19’s silent failure.
So the panel answers at 400 kHz (and drops out mid-read) and not at all at 100 kHz: the slower bus made it worse, so
“too fast for the panel” does not fit (inference). Reverted (commit 6671f61); the DTS traces to stock again.
Parked. Untested leads: the panel’s own enable and reset sequencing before the first read (TLMM 89, the 3.3 V
switch on TLMM 88, vreg_l15b), compared with what stock does at boot; and the stock driver’s I2C settings.
Update: panel follower and a full stock comparison, attempt 2026-11-04-1 (2026-11-04, 12:15 AM ET)
Offline first: the touchscreen’s DT matches stock line for line. ts0_default (int-n gpio51; reset-n gpio48
output low; report-enable gpio89 output low), the 3.3 V switch on gpio88 with a 150 ms startup delay, vdd L15B,
IRQ_TYPE_LEVEL_LOW, hid-descr-addr 0 (stock entry01-overlay.dts fragment@68 and fragment@75). The bus pins
match as well: stock sets bias-pull-up plus qcom,i2c_pull, and mainline’s bias-pull-up = <2200> selects the same
TLMM I2C strong pull (pinctrl-msm.c:467, i2c_pull_bit = 13 in pinctrl-x1e80100.c at a804c57).
Attempt 2026-11-04-1 (kernel #18, dts/diag/touch-panel-follower.dtsi, commit 5b9ee4e): panel on the
touchscreen node points at the eDP panel, so i2c-hid powers and probes it only after the panel is prepared, as the
ChromeOS in-cell boards do (sc7180-trogdor-homestar.dtsi:119). The owner touched the screen during the prompt.
- The link works and changes nothing. The panel came up at 3.95 s and the touchscreen probed after it, at 4.30 s.
The 30-byte HID descriptor read cleanly. The 935-byte report descriptor read
05-0d-09-04-43and then0xffto the end (unknown main item tag 0x4,-22). - The interrupt fires and the controller reports. There were 1936
msmgpio 51interrupts on CPU 0 and 1940 input reads (64 bytes each; the device announces 106). 1549 of them turn to0xfffrom byte 5 to 8, while the rest read cleanly (6a-00-10-03-01-b6-47-cc-3a-c6-07-cc-04-00 …). There was no controller error. - Reading (inference): the controller starts every reply right and then stops driving SDA at a random byte. With the
DT, pins and pull-ups as stock and the panel timing ruled out, what is left is the controller side: the GENI SCL
timing (19.2 MHz table: t_low ≈ 1.15 µs, t_high ≈ 0.52 µs by the formula, under the Fast-mode minimums,
i2c-qcom-geni.c:174-188) or clock stretching that the controller does not honour. Stock runs a vendor GENI driver whose timing cannot be read from the image. -22’s 100 kHz NACK does not fit timing alone. - The fragment stays until the owner decides (status: failed for the probe; the link itself is harmless).
Update: in-spec GENI timing, attempt 2026-11-04-2 (2026-11-04, 12:26 AM ET)
kernel/patches/0008 (kernel #19) set the GENI 400 kHz entry to 2/6/13/24, and the trace confirms it on both
touch buses (geni_i2c_bus_setup: a80000.i2c: … t_high=6 t_low=13 t_cycle=24, the same on b80000.i2c). No panel
follower. No change: the touchscreen’s HID descriptor read FFFF:FFFF this time (-22), 608 of 773 reads ended
in 0xff, and there was one NACK: target device unresponsive. The touchpad (27C6:0D4F) and the TPM worked at the
new timing. SCL timing is ruled out (within the formula’s view of it). The touchscreen is parked again. Every
setting readable from the stock tree matches; what is left is the vendor GENI driver’s behaviour, or the panel
controller’s own state. The patch goes (a failed diagnostic, ADR 0007), as does dts/diag/touch-panel-follower.dtsi.