우분투(Ubuntu) 18.04 노트북 Fn 키 이상동작 해결하기

문제

얼마 전 LG 노트북 14U380-E.AU1TK 모델을 구입한 후 우분투(Ubuntu) 18.04 LTS 를 설치했습니다. 설치 후 큰 문제없이 사용하고 있었는데, 이상한 점을 하나 발견했습니다.

바로 노트북에서 화면 밝기 조정, 볼륨 조정 같은 기능을 사용할 때 조합 키로 사용하는 Fn 키 (펑션 키)와 관련된 문제였는데요.

대부분의 기능은 제대로 동작했지만, 볼륨 음소거 On/Off 키와, 볼륨 줄이기, 볼륨 키우기 키가 제대로 동작하지 않았습니다. 정확히 표현하면 동작은 했지만, 한 번만 눌러도 마치 꾹 누르고 있는 것처럼 동작했습니다.

예를 들면 볼륨 음소거 On/Off 키를 한 번만 눌러도 On/Off 를 계속해서 반복하는 문제가 있었고, 볼륨 줄이기나 키우기도 마찬가지로 한 번만 눌러도 0%까지 줄여버리거나, 100%까지 키워버리는 문제가 발생했죠.

더군다나 키가 계속해서 눌리고 있는 것처럼 동작해서 다른 단축키가 제대로 동작하지 않는 등 사용하는데 불편함이 컸습니다.

원인: 우분투 키 인식

원인은 볼륨 관련 키를 누른 경우 한 번만 짧게 눌러도 키를 꾹 누르고 있는 것처럼 인식하기 때문이었습니다.

우분투 에서 키보드로 키를 입력하면 아래 3가지 상태로 구분됩니다.

  • 키 누름 – 1
  • 키 놓음 – 0
  • 키 누른 채 유지 – 2

따라서 일반적으로 키를 누르는 경우에는 (키 누름-키 놓음) 이벤트가 발생하게 되고, 오래 누르는 경우 (키 누름-키 누른 채 유지-키 놓음) 이벤트가 발생하게 됩니다.

실제로 발생하는 키 입력 이벤트를 확인하고 싶다면, evtest 라는 툴을 사용하면 됩니다. 없다면 아래 명령어로 설치해줍니다.

sudo apt-get install evtest

sudo evtest 명령어로 툴을 실행하면 아래와 같이 인풋 디바이스의 목록을 보여주고, 선택할 수 있습니다.

우분투 evtest

키보드로 보이는 event3 를 선택해주고, 엔터 키와 볼륨 줄이기 키를 순서대로 입력해 비교해보겠습니다.

우분투 evtest

두 키 모두 한 번만 짧게 입력했는데, KEY_ENTER 입력 이벤트는 (value 1 – value 0) 이 차례로 입력됐고, KEY_VOLUMEDOWN 입력 이벤트는 (value 2) 만 입력된 것을 확인할 수 있습니다. 즉, 키를 짧게 눌러도 키 누른 채 유지(2) 값이 입력된 것이죠.

해결

이 문제는 /lib/udev/hwdb.d/ 내부 파일을 업데이트 해주는 것으로 해결할 수 있었습니다.

/lib/udev/hwdb.d/60-keyboard.hwdb 파일을 열어보면, 해결의 실마리가 될 설명을 확인할 수 있습니다!

# ######################### KEY MAPPING ######################################
#
# Keyboard mapping of scan codes to key codes, and
# scan codes to add to the AT keyboard's 'force-release' list.
#
# Scan codes are specified as:
#   KEYBOARD_KEY_<hex scan code>=<key code identifier>
# The scan code should be expressed in hex lowercase. The key codes
# are retrieved and normalized from the kernel input API header.
# Keycodes are either KEY_* defines in lowercase with the key_ prefix
# optionally removed or BTN_ defines in lowercase with btn_ preserved.
#
# An '!' as the first character of the key identifier string
# will add the scan code to the AT keyboard's list of scan codes
# where the driver will synthesize a release event and not expect
# it to be generated by the hardware.
...

간단히 해석하면, 특정 스캔 코드를 ‘force-release’ 리스트에 추가할 수 있다는 이야기인데요. 스캔 코드와 키 코드를 매핑할 때, 키 구분 문자열(KEY_VOLUMEDOWN 같은 것) 앞에 느낌표를 붙여주면 하드웨어에서 키 놓음 이벤트를 발생시키든 말든 강제로 놓음 이벤트를 발생시켜주겠다. 하는 것이죠. 와!

문제가 되는 볼륨 관련 키들을 리스트에 추가하기 위해서, 우선 키보드 디바이스 정보를 확인하도록 합시다. 아까 evtest 툴을 사용할 때 디바이스 이름이 ‘AT Translated Set 2 keyboard’ 인 것은 확인할 수 있었죠.

그래서 저는 cat /proc/bus/input/devices | grep keyboard -n3 명령어로 정보를 확인했습니다.

31-I: Bus=0011 Vendor=0001 Product=0001 Version=ab83
32:N: Name="AT Translated Set 2 keyboard"
33-P: Phys=isa0060/serio0/input0
34-S: Sysfs=/devices/platform/i8042/serio0/input/input3

위에서 Bus=0011, Vendor=0001, Product=0001 세 정보만 기억하면 됩니다.

이제 원하는 키를 리스트에 추가할 차례인데요, 아까 봤던 60-keyboard.hwdb 파일에 리스트를 업데이트 하는 방법도 설명되어 있습니다.

# To update this file, create a new file
#   /etc/udev/hwdb.d/70-keyboard.hwdb
# and add your rules there. To load the new rules execute (as root):
#   systemd-hwdb update
#   udevadm trigger /dev/input/eventXX

시키는대로 해보겠습니다. 우선 파일을 작성하기 위해, sudo vi /etc/udev/hwdb.d/70-keyboard.hwdb 등의 명령으로 편집기를 열어줍니다.

그리고 저는 아래처럼 내용을 작성했습니다.

evdev:input:b0011v0001p0001*
 KEYBOARD_KEY_a0=!mute
 KEYBOARD_KEY_ae=!volumedown
 KEYBOARD_KEY_b0=!volumeup

첫 줄은 위에서 확인한 버스, 벤더, 프로덕트 번호를 통해 대상을 명시해 준 겁니다. 보이듯이 evdev:input:b[버스 번호]v[벤더 번호]p[프로덕트 번호]* 포맷에 맞춰 알맞게 적어줍니다.

나머지 세 줄은 매핑할 키 정보인데, KEYBOARD_KEY_[스캔 코드]=[키 코드] 포맷입니다. 주의할 점 한 가지는 각 정보 앞에 공백을 넣어 들여쓰기를 해주어야 한다는 겁니다.

코드들은 evtest 툴을 통해 확인할 수 있습니다. 출력되는 정보중 (MSC_SCAN), value ## 에 해당하는 값이 스캔 코드이고, 뒤이어 나오는 KEY_VOLUMEDOWN 문자열에서 VOLUMEDOWN 부분만 소문자로 하면 키 코드에 해당합니다.

강제로 놓음 이벤트를 발생시키기 위해 볼륨 음소거, 볼륨 줄이기, 볼륨 키우기 각 값들에 느낌표를 붙여주면 작성은 끝이 납니다.

파일을 작성했으니 나머지 명령어도 입력해줍니다.

sudo systemd-hwdb update
sudo udevadm trigger

명령이 잘 적용 되었는지 udevadm info /dev/input/event3 명령어로 확인해보겠습니다. 제대로 적용 되었다면 내용에서 아래 세 줄을 확인할 수 있습니다.

E: KEYBOARD_KEY_a0=!mute
E: KEYBOARD_KEY_ae=!volumedown
E: KEYBOARD_KEY_b0=!volumeup

노트북을 재부팅 한 뒤 확인해보니 볼륨 음소거 On/Off, 볼륨 줄이기, 볼륨 키우기 키 모두 정상 동작하는 것을 확인할 수 있었습니다.

문제 해결!!

0 0 vote
Article Rating
구독
Notify of
guest
0 Comments
Inline Feedbacks
View all comments