#!/usr/bin/env bash
#
# 修复 Goodix GXTP7863 I2C-HID 触摸板「开机后不可用」的问题。
#
# 故障机理（由 journalctl 跨 25 次启动日志确认）:
#   i2c_designware i2c_designware.0: controller timed out
#   i2c_hid_acpi i2c-GXTP7863:00: can't add hid device: -110   (-110 = -ETIMEDOUT)
#   i2c_hid_acpi i2c-GXTP7863:00: probe with driver i2c_hid_acpi failed with error -110
#
# i2c_hid_acpi 探测失败后内核不重试，suspend/resume 也不会重新探测，
# 该 ACPI I2C 设备永久未绑定，整场会话都没有触摸板设备。
#
# 本脚本分两阶段恢复:
#   阶段1  重新绑定 i2c_hid_acpi（适用于设备只是"还没准备好"的情况）
#   阶段2  复位 I2C 控制器 i2c_designware.0，强制重新枚举并探测
#          （已确认 i2c-0 上只有触摸板，复位不影响其他设备）
#
set -u

I2C_NAME="i2c-GXTP7863:00"
I2C_HID_DRV="/sys/bus/i2c/drivers/i2c_hid_acpi"
I2C_HID_DEV="/sys/bus/i2c/devices/${I2C_NAME}"
DW_DRV="/sys/bus/platform/drivers/i2c_designware"
DW_DEV="i2c_designware.0"

log() { logger -t touchpad-rebind "$*"; echo "[touchpad-rebind] $*"; }

present() { grep -qs 'GXTP7863.*Touchpad' /proc/bus/input/devices; }

# ---------- 阶段 1：直接重新绑定驱动 ----------
for attempt in $(seq 1 10); do
    if present; then
        [ "$attempt" -gt 1 ] && log "触摸板已恢复（阶段1，第 ${attempt} 次）"
        exit 0
    fi

    if [ -e "${I2C_HID_DRV}/bind" ] && [ -d "${I2C_HID_DEV}" ]; then
        echo "${I2C_NAME}" > "${I2C_HID_DRV}/bind" 2>/dev/null
    fi
    sleep 1
done
present && exit 0

# ---------- 阶段 2：复位 I2C 控制器 ----------
if [ ! -e "${DW_DRV}/unbind" ]; then
    log "阶段1失败，且 ${DW_DRV}/unbind 不可用，无法复位控制器"
    exit 1
fi

for cycle in 1 2 3; do
    log "阶段1失败，复位 I2C 控制器 ${DW_DEV}（第 ${cycle} 次）"

    echo "${DW_DEV}" > "${DW_DRV}/unbind" 2>/dev/null
    sleep 2
    echo "${DW_DEV}" > "${DW_DRV}/bind" 2>/dev/null

    for _ in $(seq 1 8); do
        if present; then
            log "控制器复位后触摸板已恢复"
            exit 0
        fi
        sleep 1
    done
done

log "两种方式均未能启用触摸板，需要重启"
exit 1
