正常
79 — GT911 触摸真路径战役(一):总线/gpio 影子成军,M0 卡在供电链(2026-08-30)
目标:宿主鼠标 → 影子 gt911(0x14@i2c2)→ 真 I2C → 真 goodix 驱动 → 输入子系统 → GNOME——sim 的输入归真,virtio 键鼠退役为 cmdline 休眠备胎。弹药来自家族 项目 imx-forge(GT911 寄存器级模型 0008-0016 九连补丁,上游 qemu v11.1 + 补丁链干净复现)。
0. 战役状态
| 项 | 结果 |
|---|---|
| gt911 设备移植 | ✅ hw/input/gt911.c(+h):imx-forge 终态全量搬入;INT 路由去 imx 板级硬编码(gpio0/IO9 partial-path)改为名义 GPIO out "gt911-int";v11.1 API 对齐(event 回调返回 int、class_init const、hw/core/irq.h) |
| rk3x i2c 控制器影子 | ✅ feaa0000(i2c2)sysbus 设备 rk3588-lite-i2c2:CON/CLKDIV/MRXADDR/MRXRADDR/MTXCNT/MRXCNT/IEN/IPD/FCNT + TX@0x100/RX@0x200 FIFO;时序关键:CON|START 只 pend INT_START,搬运由 MTXCNT/MRXCNT 写触发(驱动 handle_start 后才填 FIFO——fill_transmit_buf 首字节预填 i2c 地址);REGISTER_TX 地址+寄存器字节在 START 相发出,读走 repeated start(QEMU i2c 核心原生支持) |
| gpio3 影子 | ✅ fec40000 rockchip gpio v2 双字协议(+0=pin0-15 半字/+4=pin16-31 半字):dr/ddr/int_en/mask/type/polarity/bothedge/status/raw/eoi(w1c)/ext_port/ver_id;32 输入 qemu_irq + 边沿检测 → bank IRQ(SPI 280) |
| ver_id 坑 | 🔑 初版把 V2_2 写成字节序颠倒 0xC8190201 → 唯独 gpio3 不 probe(驱动 readl 单读校验版本)。正解 0x010219C8。其余 bank 落全零毯区按 V1 probe 反而都活着 |
| 总线枚举 | ✅ i2c 2-0014 client 成立(/sys/bus/i2c/devices/2-0014/name = gt911),DTB 节点直用 |
| M0(goodix probe) | ⛔ 卡在供电链:goodix → AVDD28 → vcc3v3_lcd0_n(已注册)→ vin → vcc_3v3_s3 = rk806 SPI PMIC dcdc-reg8(未建模,永不注册) → regulator 核心对 vin 未解析的 rdev 永远 -EPROBE_DEFER(devices_deferred 实证,手动 bind = EAGAIN)。这正是旧 overlay 用 /delete-property/ vin-supply 绕掉的挂账(现禁手术) |
| 次生坑 | goodix 还有 panel 供应者(vendor panel=<&panel> phandle,fw_devlink)——同样依赖显示链起活,与供电链同根 |
0.5 战役二补录(同日):rk806 SPI PMC 影子 + M0 全通
| 项 | 结果 |
|---|---|
| rk806 SPI 从设备 | ✅ hw/ssi/rk806.c:rk8xx-spi 协议(cmd[READ=0/WRITE=BIT7|len-1] + 2 字节地址 + 数据,CS 拉高帧复位);probe 不校验芯片名(variant 由 compatible 硬编码),寄存器堆应答即足 |
| spi2 控制器影子 | ✅ feb20000(DW 风格):TXDR 写即全双工打钟应答进 RX fifo;RO 模式(XFM=2)在 SSIENR 使能时按 CTRLR1 自动打钟(驱动 RX-only 不写 TXDR);VERSION 必答 0x00110002 |
| M0 铁证 | ✅ rk8xx-spi spi2.0 probe 通过(无超时)→ vcc_3v3_s3 注册 → 供电链解锁 → Goodix-TS 2-0014: ID 911, version: 0020(I2C rx trace: 39 31 31 00 20 00)→ input: Goodix Capacitive TouchScreen input0 注册 |
| M1 注点 | 🔧 HMP gt911_touch 700 400 → INT → gpio 边沿 → demux → goodix 线程经真 I2C 读回 81 00 bc02 9001(=1 触点@700,400)——报告已进驱动;evdev 落盘验证被 initramfs 工具链阻塞,最终验收挪到 M2 桌面 |
连环坑清单(全 trace 实证后修):
- SSI 基类
ssi_peripheral_realize无条件调 .realize——不给就空指针段错误(QEMU 秒死无输出) - SPI RF_FULL 判据差一:
rn > rxftlr(驱动按 len 设水位线) - i2c 寄存器枚举按 1 递增而偏移按 4——除 CON 外全部 case 未命中,写被静默丢弃
- 内核 CON 模式枚举:TX=0、REGISTER_TX=1、RX=2(我写反 1/2,地址相从未跑对 → ID 读全零)
- gpio v2 混合访问风格:配置寄存器走半字协议,但 demux 的 int_status 是裸 32 位 readl——按半字应答会把 BIT(16) 折半归零(风暴+无 EOI)
- goodix 在本 DTB 下把 pin16 配成上升沿(imx 板是下降沿)——assert 脉冲 0→1
0.7 M2 战报(同日):真路径验证通过,桌面分工定局
| 项 | 结果 |
|---|---|
| M2 纯触摸 | ✅ 链路全通——用户鼠标拖动/点击经 gt911→I2C→驱动→input0(实时 rx trace 可见坐标流),注入 (512,300) 精确回读 81 00 0002 2c01 |
| "纯炸"黑屏真凶 | 不是输入——rk806 救活供电链后 DSI 面板 probe 出第二张 DRM 卡(card1-DSI-1),mutter 双屏拓扑精神分裂。修:FAST 档 initcall_blacklist=rockchip_drm_init(宪法层 bootargs) |
| 拖不动窗口 | virtio 指针 grab 与 gt911 触摸手势两路按下抢方向盘——gt911 加 host-mouse 属性 + HMP gt911_mouse on|off 运行时避让 |
| 纯触摸"看着死了" | 事件在流但 GNOME 无指针模式藏掉 dock/光标/hover——无反馈目标,非链路问题 |
| 节流 | 拖动上报按 guest 虚拟时钟 33ms 合并(逐事件全价报告会饱和 mutter → 黑屏假死,CPU 215% 实证) |
| 意外大捷 | DSI 面板链路被 rk806 解锁(card1-DSI-1 能 probe)——"桌面走真面板"从不可想象变成就差最后一程(VOP 扫描输出 + mutter 选卡),值得单独立役 |
| 最终分工 | 日用驾驶 = virtio 键鼠 + gt911_mouse off;gt911 = 真触摸验证通道(gt911_mouse on / gt911_touch x y 随时唤醒)——用户验收通过 |
1. M1+ 待续
- M0 收官 = rk806 SPI PMIC 影子(spi@feb20000 控制器 + rk806 命令协议最小应答 → 注册 14 轨 regulators)——这一刀同时解锁显示供电链(panel/背光),是老挂账课题本体
- M0 后按序:M1 HMP
gt911_touch x y注点进 GNOME;M2 宿主鼠标真路径 (设备自带 ABS input handler——usb-tablet 机制,窗口内鼠标即触摸);M3 退役 virtio tablet - imx-forge 精化补丁的语义已并入终态(0x814e 读清 INT、release 即报告、 assert 先高后低保证下降沿)
2. 工具与流程沉淀
- imx-forge qemu 资产复现法:
.gitmodules指上游 qemu + 钉死 commit 84f0721 (v11.1.0)→ sparse fetch 该 commit → 16 连补丁顺序全绿 → 终态文件直接拷 - 内核侧规格书三件(建模即对照驱动源码):i2c-rk3x.c(含 FIFO 首字节=地址)、 gpio-rockchip.c(v2 双字半区 + ver_id 单读)、goodix.c + 咱们的 0005/0006
- sysfs 手动 bind 强探针:
echo 2-0014 > /sys/bus/i2c/drivers/Goodix-TS/bind(注意大小写);deferred 真因看/sys/kernel/debug/devices_deferred - initramfs busybox 无 head/tail——console 取证命令要裸 grep/cat
3. 现行文件清单
- third_party/qemu:hw/input/gt911.c、include/hw/input/gt911.h、 hw/arm/rk3588-lite.c(i2c2/gpio3 影子 + 布线 + HMP 钩子 rk3588_lite_gt911())、 Kconfig×2/meson×2/hmp-commands.hx/hmp.h/hmp-cmds.c
- HMP:
gt911_touch x y/gt911_release(M1 的注点工具,待 M0 后验收)
7. 收官杂项(同日晚)
- 内核树提交 a638d960f(0023 virtio_mmio cmdline SPI 映射);旧 overlay 死资产 (rk3588-topeet-board.dts/dtb)已删;snapshot.py 移植同 DTB 流(savevm 仍等 vmstate)
- VOP2 回归 PASS(board 模式非 FAST):rockchipdrm 绑定出 card0-DSI-1,
echo detect后 connected——rk806 供电链 + DSI 影子全链健康,面板检测通过 (战役一以来的第一次:以前 panel 因供电链 probe 不了)。enabled=disabled 属预期 (initramfs 无 KMS 客户端)