Files

4.0 KiB
Raw Permalink Blame History

slug, title, description, toc, authors, tags, categories, series, date, lastmod, featuredVideo, featuredImage, draft, enableComment
slug title description toc authors tags categories series date lastmod featuredVideo featuredImage draft enableComment
ASUS UX310U 觸控板修復紀錄 ASUS UX310U 觸控板修復紀錄 true
awin
linux
System
Linux
2026-05-03T00:00:00 2026-05-03T00:00:00 false true

問題描述

安裝 Fedora KDE 後,觸控板完全失效。Windows 10 下正常運作,代表硬體本身無問題。


調查過程

1. 確認核心是否看到觸控板

cat /proc/bus/input/devices

結果:觸控板完全不在清單中。核心沒有產生任何 input 節點給觸控板。

2. 確認 I2C 裝置

ls /sys/bus/i2c/devices/

結果:清單中有 i2c-ELAN1200:00,確認觸控板是 Elantech ELAN1200,透過 I2C 介面連接。現代筆電觸控板多走 I2C,而非傳統的 PS/2。

3. 確認 ACPI 狀態

cat /sys/bus/acpi/devices/ELAN1200:00/status   # 輸出:15(裝置正常啟用)
cat /sys/bus/acpi/devices/ELAN1200:00/path     # 輸出:\_SB_.PCI0.I2C1.ETPD

ACPI 狀態 15(二進位 1111)代表裝置:存在、啟用、功能正常、有電源。硬體層面完全正常。

4. 確認驅動程式

lsmod | grep i2c_hid
# 輸出:i2c_hid_acpi   i2c_hid(已載入)

ls /sys/bus/i2c/drivers/i2c_hid_acpi/
# 輸出:bind  module  uevent  unbind(驅動存在,但沒有綁定任何裝置)

驅動程式 i2c_hid_acpi 已載入,但沒有自動綁定到 ELAN1200 裝置。

5. 確認 modules.alias 對應正確

grep "PNP0C50" /lib/modules/$(uname -r)/modules.alias
# 輸出:alias acpi*:PNP0C50:* i2c_hid_acpi

ELAN1200 的 ACPI modalias 是 acpi:ELAN1200:PNP0C50:,理應自動觸發 i2c_hid_acpi 載入並綁定。對應關係正確,但實際上沒有發生 — 這代表是 udev 在開機時的時序問題:驅動程式載入時,I2C 控制器尚未完全就緒,probe 失敗後沒有重試。


根本原因

開機時序問題(race conditioni2c_hid_acpi 驅動程式嘗試 probe ELAN1200 時,底層的 I2C 控制器(i2c_designware)還沒完全初始化,導致 probe 失敗、驅動程式沒有綁定裝置。失敗後核心不會自動重試,觸控板就此失效。


修復步驟

立即啟用(當次開機有效)

sudo sh -c 'echo "i2c-ELAN1200:00" > /sys/bus/i2c/drivers/i2c_hid_acpi/bind'

原理:手動將裝置 i2c-ELAN1200:00 綁定到 i2c_hid_acpi 驅動程式。這等同於告訴核心「現在用這個驅動來管理這個裝置」,驅動會立刻進行 probe 並建立 input 節點。

永久修復(寫入 udev 規則)

sudo tee /etc/udev/rules.d/99-elan1200-touchpad.rules << 'EOF'
ACTION=="add", SUBSYSTEM=="i2c", ENV{MODALIAS}=="acpi:ELAN1200:PNP0C50:", RUN{builtin}="kmod load i2c_hid_acpi", RUN+="/bin/sh -c 'echo %k > /sys/bus/i2c/drivers/i2c_hid_acpi/bind'"
EOF

sudo udevadm control --reload-rules

udev 規則詳細說明

ACTION=="add"

只在裝置被新增(偵測到)時觸發,不在 remove 或其他事件觸發。

SUBSYSTEM=="i2c"

只匹配 I2C 子系統的裝置。

ENV{MODALIAS}=="acpi:ELAN1200:PNP0C50:"

精確匹配這顆觸控板的 ACPI 識別碼,避免規則影響其他 I2C 裝置。

RUN{builtin}="kmod load i2c_hid_acpi"

確保驅動模組已載入(若尚未載入則載入之)。

RUN+="/bin/sh -c 'echo %k > /sys/bus/i2c/drivers/i2c_hid_acpi/bind'"

%k 是 udev 變數,代表裝置的 kernel name(即 i2c-ELAN1200:00)。這行把裝置名稱寫入驅動的 bind 介面,強制完成綁定。


系統環境

  • 機型:ASUS ZenBook UX310U
  • 觸控板:Elantech ELAN1200I2C HIDACPI path: \_SB_.PCI0.I2C1.ETPD
  • 作業系統:Fedorakernel 6.19.14-300.fc44.x86_64
  • 相關驅動:i2c_hid_acpii2c_hidi2c_designware

後記

本篇由 Claude 自行進行調查與修復。
圖片由 ChatGPT 產生。