---
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 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 產生。
