Files
hugo_blog.awin.one/content/posts/2026/2026-05-03_ASUS UX310U 觸控板修復紀錄/index.md
T

150 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
slug: ASUS UX310U 觸控板修復紀錄
title: ASUS UX310U 觸控板修復紀錄
description:
toc: true
authors:
- awin
tags:
- linux
categories:
- System
series:
- Linux
date: 2026-05-03T00:00:00
lastmod: 2026-05-03T00:00:00
featuredVideo:
featuredImage:
draft: false
enableComment: true
---
## 問題描述
安裝 Fedora KDE 後,觸控板完全失效。Windows 10 下正常運作,代表硬體本身無問題。
<!--more-->
---
![](images/ASUS%20UX310U%20觸控板修復紀錄.png)
## 調查過程
### 1. 確認核心是否看到觸控板
```bash
cat /proc/bus/input/devices
```
結果:**觸控板完全不在清單中**。核心沒有產生任何 input 節點給觸控板。
### 2. 確認 I2C 裝置
```bash
ls /sys/bus/i2c/devices/
```
結果:清單中有 `i2c-ELAN1200:00`,確認觸控板是 **Elantech ELAN1200**,透過 I2C 介面連接。現代筆電觸控板多走 I2C,而非傳統的 PS/2。
### 3. 確認 ACPI 狀態
```bash
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. 確認驅動程式
```bash
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 對應正確
```bash
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 condition**`i2c_hid_acpi` 驅動程式嘗試 probe ELAN1200 時,底層的 I2C 控制器(`i2c_designware`)還沒完全初始化,導致 probe 失敗、驅動程式沒有綁定裝置。失敗後核心不會自動重試,觸控板就此失效。
---
## 修復步驟
### 立即啟用(當次開機有效)
```bash
sudo sh -c 'echo "i2c-ELAN1200:00" > /sys/bus/i2c/drivers/i2c_hid_acpi/bind'
```
**原理**:手動將裝置 `i2c-ELAN1200:00` 綁定到 `i2c_hid_acpi` 驅動程式。這等同於告訴核心「現在用這個驅動來管理這個裝置」,驅動會立刻進行 probe 並建立 input 節點。
### 永久修復(寫入 udev 規則)
```bash
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_acpi``i2c_hid``i2c_designware`
## 後記
本篇由 Claude 自行進行調查與修復。<br>
圖片由 ChatGPT 產生。