[ubuntu] 노트북 마우스 왼쪽 버튼이 안 눌릴 때

[ubuntu] 노트북 마우스 왼쪽 버튼이 안 눌릴 때

enter image description here

[ubuntu] 노트북 마우스 왼쪽 버튼이 안 눌릴 때 (Elantech PS/2 오인식 해결)

Ubuntu 노트북을 사용하다가 가끔 마우스 왼쪽 버튼이 전혀 안 눌리는 문제가 발생했다.

화면과 마우스 포인터는 정상적으로 움직이는데 좌클릭만 안 되는 상황.
외장 G502의 버튼 상태도 정상이어서 처음에는 데스크톱 화면이 멈춘 것으로 생각했다.

확인한 환경은 다음과 같다.

  • Dell Inspiron 7559
  • Ubuntu 24.04.4 LTS
  • Kernel 7.0.0-28-generic
  • GNOME X11
  • ELAN1010 I2C 터치패드
  • Logitech G502 USB 마우스

문제 상황

증상은 다음과 같았다.

  • 마우스 포인터 이동은 정상
  • 키보드 입력도 정상
  • 마우스 왼쪽 버튼만 동작하지 않음
  • 외장 마우스와 터치패드 모두 좌클릭이 이상함
  • 같은 증상이 가끔 다시 발생함

하나의 마우스가 고장 난 것이라면 다른 마우스는 정상이어야 한다.
하지만 모든 포인터 장치의 좌클릭이 동시에 안 되는 것을 보면 X11 입력 상태부터 확인할 필요가 있다.

입력 장치 확인

먼저 현재 입력 장치를 확인한다.

xinput list --short

문제가 발생했을 때 다음 장치들이 잡혀 있었다.

ELAN1010:00 04F3:3012 Touchpad      id=10
PS/2 Logitech Wheel Mouse           id=7
Logitech Gaming Mouse G502          id=18

노트북에 PS/2 Logitech 마우스를 연결한 적이 없는데
PS/2 Logitech Wheel Mouse라는 장치가 생겨 있었다.

장치 번호는 부팅이나 재연결 때 바뀔 수 있다.
위의 id=7, id=18은 당시 확인한 번호다.

각 장치의 버튼 상태를 확인했다.

xinput query-state 7

문제의 PS/2 장치는 왼쪽 버튼을 계속 누른 상태로 보고하고 있었다.

button[1]=down
button[2]=up
button[3]=up

반면 실제 G502는 정상이었다.

xinput query-state 18
button[1]=up
button[2]=up
button[3]=up

즉, G502의 왼쪽 버튼이 고장 난 것이 아니었다.
가짜 PS/2 장치가 button[1]=down 상태를 계속 유지하면서 다른 마우스의 좌클릭까지 막고 있었다.

시스템 로그 확인

관련 로그를 확인한다.

journalctl -b --no-pager | \
  grep -E 'psmouse serio1|ETPS/2 Elantech Touchpad: device removed|PS/2 Logitech Wheel Mouse'

문제가 발생한 시점에 다음 로그가 기록됐다.

psmouse serio1: elantech: synaptics_send_cmd query 0x01 failed.
event7 - ETPS/2 Elantech Touchpad: device removed
psmouse serio1: elantech: synaptics_send_cmd query 0x01 failed.
input: PS/2 Logitech Wheel Mouse as /devices/platform/i8042/serio1/input/input25

serio1ETPS/2 Elantech Touchpad가 제거되고 Elantech 쿼리가 실패한 직후,
동일한 i8042/serio1 경로에 PS/2 Logitech Wheel Mouse가 새로 등록됐다.

실제 장착된 장치와 앞에서 확인한 버튼 상태를 같이 보면
PS/2 호환 장치가 fallback 방식으로 다시 잡히면서 오인식된 것으로 보인다.

이때 새로 생성된 장치가 왼쪽 버튼을 누른 상태로 남아 좌클릭 전체를 막은 것이다.

원인

이번 문제는 화면 멈춤이나 USB 마우스 고장이 아니었다.

핵심은 노트북 터치패드의 구형 PS/2 인터페이스다.

  • 별도의 ELAN1010:00 I2C 터치패드는 계속 동작 중
  • i8042/serio1에는 Elantech PS/2 호환 장치도 존재
  • Elantech PS/2 통신 쿼리가 실패
  • PS/2 장치가 Logitech Wheel Mouse로 잘못 재인식
  • 잘못 인식된 장치가 button[1]=down을 계속 출력
  • X11 전체에서 새로운 좌클릭이 정상 처리되지 않음

로그만 보면 터치패드가 물리적으로 완전히 고장 났다고 보기는 어렵다.
I2C 터치패드는 계속 정상적으로 잡혀 있었고 PS/2 호환 경로에서만 오류가 발생했다.

임시 해결

문제가 발생한 세션에서 잘못 인식된 장치만 비활성화한다.

xinput disable "PS/2 Logitech Wheel Mouse"

명령 실행 직후 왼쪽 클릭이 다시 정상적으로 동작했다.

필요하면 다음 명령으로 다시 활성화할 수 있다.

xinput enable "PS/2 Logitech Wheel Mouse"

xinput disable은 현재 X11 세션에만 적용된다.
재부팅하면 설정이 풀릴 수 있기 때문에 반복되는 경우 영구 설정이 필요하다.

영구 재발 방지 (libinput에서 제외)

이 노트북은 정상 I2C 터치패드가 따로 있으므로
문제가 발생하는 구형 PS/2 터치패드 경로 serio1만 libinput에서 제외했다.

주의: 터치패드가 PS/2 방식 하나만 있는 노트북에서는 아래 설정을 그대로 사용하면 안 된다.
먼저 xinput list --short에서 I2C 방식 터치패드가 별도로 존재하는지 확인해야 한다.

udev 규칙 파일을 만든다.

sudo vi /etc/udev/rules.d/99-ignore-broken-ps2-touchpad.rules

다음 내용을 추가한다.

# Ignore only the built-in touchpad's unstable legacy PS/2 interface.
# The ELAN I2C touchpad, USB mice, and the PS/2 keyboard are unaffected.
ACTION!="remove", SUBSYSTEM=="input", KERNEL=="event[0-9]*", KERNELS=="serio1", ENV{LIBINPUT_IGNORE_DEVICE}="1"

장치명이나 xinput id가 아니라 물리 경로인 serio1을 기준으로 잡은 것이 핵심이다.

오류가 없을 때는 ETPS/2 Elantech Touchpad,
오류가 발생하면 PS/2 Logitech Wheel Mouse로 이름이 바뀌기 때문에 장치명만으로는 영구 설정이 불안정하다.

규칙 적용 및 확인

먼저 규칙 문법을 검사한다.

sudo udevadm verify /etc/udev/rules.d/99-ignore-broken-ps2-touchpad.rules

정상이면 다음과 같이 나온다.

1 udev rules files have been checked.
  Success: 1
  Fail:    0

udev 규칙을 다시 불러온다.

sudo udevadm control --reload-rules

현재 시스템에서 문제 장치가 event7이었기 때문에 다음과 같이 모의 적용도 확인했다.

sudo udevadm test --action=add /sys/class/input/event7 2>&1 | grep LIBINPUT_IGNORE_DEVICE

결과:

LIBINPUT_IGNORE_DEVICE=1

이 글을 작성한 시점에는 규칙 파일 설치, 문법 검사,
LIBINPUT_IGNORE_DEVICE=1 모의 적용까지 실제로 확인했다.

event7 번호도 시스템마다 다를 수 있다.
/proc/bus/input/devices에서 문제 장치의 현재 event 번호를 확인하면 된다.

grep -A 6 -B 2 'PS/2 Logitech Wheel Mouse' /proc/bus/input/devices

현재 세션에서는 앞의 xinput disable 명령으로 이미 비활성화돼 있다.
설치한 udev 규칙은 다음 부팅이나 장치 재인식 때부터 자동 적용된다.

sudo reboot

현재 작업 중인 세션을 유지하기 위해 바로 재부팅하지는 않았다.
다음 재부팅 후 xinput list --short에서 PS/2 장치가 활성 장치로 추가되지 않는지 최종 확인하면 된다.

이 설정의 적용 범위

커널에서 PS/2 장치 자체를 끄거나 psmouse의 장치 탐색을 중지하는 설정은 아니다.
PS/2 event 장치와 관련 커널 로그는 계속 생길 수 있지만,
문제의 serio1 입력만 libinput과 X11에서 무시하게 만든다.

  • 무시: 내장 PS/2 호환 장치 경로 i8042/serio1
  • 유지: PS/2 키보드 경로 i8042/serio0
  • 유지: ELAN1010:00 I2C 터치패드
  • 유지: Logitech G502 같은 USB 마우스

때문에 정상 터치패드와 외장 마우스는 그대로 사용할 수 있다.

되돌리는 방법

설정을 되돌릴 때는 규칙 파일의 확장자를 바꿔 보관한다.

sudo mv \
  /etc/udev/rules.d/99-ignore-broken-ps2-touchpad.rules \
  /etc/udev/rules.d/99-ignore-broken-ps2-touchpad.rules.disabled

규칙을 다시 불러오고 재부팅한다.

sudo udevadm control --reload-rules
sudo reboot

다시 사용할 계획이 없다면 .disabled 파일은 나중에 삭제하면 된다.

정리

  • 화면이 멈춘 것이 아니라 가짜 PS/2 장치가 좌클릭을 계속 누르고 있었음
  • xinput query-state에서 문제 장치만 button[1]=down으로 확인
  • Elantech PS/2 통신 오류 직후 같은 경로에 Logitech 마우스 장치가 등록됨
  • xinput disable로 현재 세션을 바로 복구
  • udev에서 i8042/serio1만 제외하는 영구 규칙을 설치하고 모의 적용까지 확인
  • I2C 터치패드, PS/2 키보드, USB 마우스는 그대로 유지

마우스 포인터는 움직이는데 왼쪽 클릭만 전부 안 된다면
마우스 고장으로 판단하기 전에 다른 입력 장치가 버튼을 계속 누르고 있는지 확인해보면 된다.

끝 :)

댓글 쓰기

0 댓글