Add ASUS UX310U 觸控板修復紀錄
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 2.0 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.8 MiB |
@@ -0,0 +1,149 @@
|
|||||||
|
---
|
||||||
|
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-->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 調查過程
|
||||||
|
|
||||||
|
### 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 ELAN1200(I2C HID,ACPI path: `\_SB_.PCI0.I2C1.ETPD`)
|
||||||
|
- 作業系統:Fedora(kernel 6.19.14-300.fc44.x86_64)
|
||||||
|
- 相關驅動:`i2c_hid_acpi`、`i2c_hid`、`i2c_designware`
|
||||||
|
|
||||||
|
## 後記
|
||||||
|
|
||||||
|
本篇由 Claude 自行進行調查與修復。<br>
|
||||||
|
圖片由 ChatGPT 產生。
|
||||||
Reference in New Issue
Block a user