우분투 리눅스 삼성 Q45/Q70 노트북 FN키로 밝기 조정 문제 해결 중

이전부터 쉘 스크립트 정도로 해결하는 노트북 패널 밝기 조정 문제에 종지부를 찍을 시점이 온 듯하다!

사용하고 있는 Q70 노트북은  콘솔로 나간 다음

$ sudo -s
# echo -n 밝기값 > /proc/acpi/video/NVID/LCD/brightness

라는 긴 명령어를 콘솔에서 써야 했다..

X윈도우에서 밝 조절을 하면 밝 조절이 엉뚱하게 되고, 이후 키 입력이 먹통이 되는 현상이 일어났다.

이런 버그의 원인을 찾아 샅샅이 뒤지던 중 고마운 문서들을 발견했다.

https://wiki.ubuntu.com/Hotkeys/Troubleshooting 의 문서

이 문서대로

먼저,

killall gnome-settings-daemon gnome-power-manager

명 령으로 위 데몬을 사살(!)한다. 저 데몬은 FN키를 눌렀을 경우 반응하기 때문에 테스트의 결과를 제대로 볼 수 없기 때문이다. 우리는 FN 키를 눌렀을 때의 결과를 콘솔 창에서 봐야 한다. 당연히 관리자 계정으로 해야 하며, 앞으로 모든 계정은 관리자 계정으로 하는 것이 편하다.

xev | sed -n 's/^.*state ([0-9].*), keycode *([0-9]+) *(.*), .*$/keycode 2 = 3, state = 1/p'


명령을 내리면, FN + 위/아래 키 입력 이벤트가 발생하지 않음을 확인할 수 있었다.
이는 X의 문제가 아닌 저수준 시스템의 문제임을 뜻했다.

hal-find-by-capability --capability input | xargs -n1 lshal -u


명령으로 hal의 입력 장치들을 나열해보았다...

이 중 의미가 있는 "AT Translated Set 2 keyboard" 의 결과이다

udi = '/org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input'
info.addons.singleton = {'hald-addon-input'} (string list)
info.callouts.add = {'hal-setup-keymap', 'debian-setup-keyboard'} (string list)
info.capabilities = {'input', 'input.keyboard', 'input.keypad', 'input.keys', 'input.keymap', 'button'} (string list)
info.category = 'input' (string)
info.parent = '/org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port' (string)
info.product = 'AT Translated Set 2 keyboard' (string)
info.subsystem = 'input' (string)
info.udi = '/org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input' (string)
input.device = '/dev/input/event0' (string)
input.keymap.data = {'e002:switchvideomode', 'e003:battery', 'e004:prog1', 'e006:wlan', 'e008:brightnessup', 'e009:brightnessdown', 'e031:prog2', 'e033:prog3', 'e034:wlan', '0074:prog1', '0075:www', 'e077:f22', '0078:mail', 'e079:f22'} (string list)
input.originating_device = '/org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port' (string)
input.product = 'AT Translated Set 2 keyboard' (string)
input.x11_driver = 'evdev' (string)
input.xkb.layout = 'kr' (string)
input.xkb.model = 'pc105' (string)
input.xkb.rules = 'evdev' (string)
input.xkb.variant = 'kr104' (string)
linux.device_file = '/dev/input/event0' (string)
linux.hotplug_type = 2 (0x2) (int)
linux.subsystem = 'input' (string)
linux.sysfs_path = '/sys/devices/platform/i8042/serio0/input/input0/event0' (string)



input-utils 패키지를 설치하여

input-events /dev/input/event0 (위의 inout.device 항목)

을 실행하여 한 번 더 FN+위/아래 키를 눌러보았다

실행 결과,

/dev/input/event0
bustype : BUS_I8042
vendor : 0x1
product : 0x1
version : 43841
name : "AT Translated Set 2 keyboard"
phys : "isa0060/serio0/input0"
bits ev : EV_SYN EV_KEY EV_MSC EV_LED EV_REP

waiting for events
02:05:01.475622: EV_MSC code=4 value=174
02:05:01.475639: EV_KEY KEY_VOLUMEDOWN (0x72) pressed
02:05:01.475644: EV_SYN code=0 value=0
02:05:01.567767: EV_MSC code=4 value=174
02:05:01.567784: EV_KEY KEY_VOLUMEDOWN (0x72) released
02:05:01.567788: EV_SYN code=0 value=0
02:05:02.069539: EV_MSC code=4 value=176
02:05:02.069556: EV_KEY KEY_VOLUMEUP (0x73) pressed
02:05:02.069560: EV_SYN code=0 value=0
02:05:02.161681: EV_MSC code=4 value=176
02:05:02.161699: EV_KEY KEY_VOLUMEUP (0x73) released
02:05:02.161703: EV_SYN code=0 value=0
02:05:03.144735: EV_MSC code=4 value=136
02:05:03.144751: EV_KEY KEY_BRIGHTNESSUP (0xe1) pressed
02:05:03.144756: EV_SYN code=0 value=0
02:05:03.677210: EV_MSC code=4 value=137
02:05:03.677227: EV_KEY KEY_BRIGHTNESSDOWN (0xe0) pressed
02:05:03.677232: EV_SYN code=0 value=0
02:05:04.516921: EV_MSC code=4 value=29


정상작동하는 FN+좌/우 키는 볼륨다운/업 이벤트와 연결이 되고 있고,
FN+아래/위 키 또한 밝조절 이벤트와 연결이 됨을 확인하였다.
하지만, 볼륨 다운 이벤트는 키를 놓았을 경우 "release" 이벤트가 호출되는 한편,
밝 조절 키는 release 이벤트가 호출되지 않는다.

그래서 X윈도우에서 FN + 아래 / 위 키를 눌렀을 경우, 밝가 최고치, 최저치를 극단적으로 향한 후, 키 입력이 되지 않았던 것으로 본다.
그러므로 키를 누르고 뗄 때에 올바르게 이벤트가 이뤄지지 않음으로 인해 문제가 발생한 것으로 판단하고 이것을 해결할 수 있는 패치를 찾아 보았다.

Samsung q45 does not produce key-release events for Fn-Keys (patch included)
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/347623

Samsung NC10 brightness keys block keyboard and produce all-or-nothing effect
https://bugs.launchpad.net/ubuntu/+source/hal-info/+bug/295251

검색을 하면서 삼성 Q45와 Q70은 스펙이 거의 같음을 알았고,
 Samsung q45 does not produce…. 이 문서에서 해결의 실마리를 드디어 찾았음을 느꼈다.

패치는 이렇다

--- linux-2.6.28/drivers/input/keyboard/atkbd.c 2009-03-23 23:50:32.000000000 +0100
+++ linux-2.6.28-patched/drivers/input/keyboard/atkbd.c 2009-03-23 23:51:23.803145169 +0100
@@ -901,7 +901,7 @@
}

/*
- * Samsung NC10 with Fn+F? key release not working
+ * Samsung NC10,Q45 with Fn+F? key release not working
*/
static void atkbd_samsung_keymap_fixup(struct atkbd *atkbd)
{
@@ -1570,6 +1570,15 @@
.driver_data = atkbd_samsung_keymap_fixup,
},
{
+ .ident = "Samsung Q45",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
+ DMI_MATCH(DMI_PRODUCT_NAME, "SQ45S70S"),
+ },
+ .callback = atkbd_setup_fixup,
+ .driver_data = atkbd_samsung_keymap_fixup,
+ },
+ {
.ident = "Znote 6615WD",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Zepto"),

현재 내가 사용하고 있는 2.6.28.9 커널 내 소스 파일과 일치하므로 패치하였다
그런데, 정말 Q45와 Q70이 동일할까? 란 생각이 들었다. DMI_MATCH 등등이 다르다면 패치해도 의미가 없을 뿐만 아니라 잘못하면 커널 패닉도 일어날 수 있지 않을까?

https://wiki.ubuntu.com/LaptopTestingTeam/HotkeyResearch

이 문서를 보던 중 의미 있는 내용을 발견하였다. 바로 저 DMI_ 로 시작하는 항목들을 알아내는 방법이다.

sudo dmidecode -s system-manufacturer
sudo dmidecode -s system-product-name
sudo dmidecode -s system-version

실행 결과는,

sudo dmidecode -s system-manufacturer
SAMSUNG ELECTRONICS CO., LTD.

sudo dmidecode -s system-product-name
SQ45S70S

sudo dmidecode -s system-version
10ST


정말 Q45와 Q70이 동일 취급 받음을 확신하였다.
커널 소스 파일이 패치되었으므로 이제 패치를 해야 한다.
패치하고 정말 동작하면?!
자.. 이제 컴파일을 시작하자! 모듈은 그대로이므로

make bzImage

로 커널을 변경한 후 컴파일된 커널로 재부팅하였다.

위 과정을 반복해보니, X윈도우 시스템에서도 올바르게 키 이벤트가 동작함을 확인하였다.
또한 밝 조절 게이지가 너무 줄지도 않고 너무 늘지도 않으면서 잘 동작하였다.

하지만!! 정작 밝 조절은 안된다....게이지만 바뀐다...
이건 NVIDIA 드라이버의 설정 문제이다. NVIDIA 드라이버를 사용하지 않으면 밝 조절이 가능해지리라 믿는다.

먼저

/etc/X11 디렉토리로 가서
xorg.conf.failsafe 파일이 있는지 확인한다...아마도 이 파일은 NVIDIA가 드라이버를 설치하면서
실패 대비용으로 만든 백업 파일일 것이다. 내용은 이렇다.

# xorg.conf (X.Org X Window System server configuration file)
#
# This file was generated by dexconf, the Debian X Configuration tool, using
# values from the debconf database.
#
# Edit this file with caution, and see the xorg.conf manual page.
# (Type "man xorg.conf" at the shell prompt.)
#
# This file is automatically updated on xserver-xorg package upgrades *only*
# if it has not been modified since the last upgrade of the xserver-xorg
# package.
#
# Note that some configuration settings that could be done previously
# in this file, now are automatically configured by the server and settings
# here are ignored.
#
# If you have edited this file but would like it to be automatically updated
# again, run the following command:
# sudo dpkg-reconfigure -phigh xserver-xorg

Section "Device"
Identifier "Configured Video Device"
EndSection

Section "Monitor"
Identifier "Configured Monitor"
EndSection

Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Configured Video Device"
EndSection

정말 아무것도 설정되지 않은 맨살 그대로의 설정이다. 아마 우분투 처음 깔면 이런 설정일걸?
이제 관리자 모드에서
nvidia-uninstall

을 쳐 준다.

그리고 로그아웃 후 다시 들어오면, NVIDIA 드라이버가 없는 상태의 X윈도우가 나온다.
여기서 FN+아래/위를 하면....

밝 조절이 된다! 기쁘다!!
시간이 해결해주는구나...작년에는 어떻게 할 지도 감잡지 못했는데..

하지만 불만족스러운 점이 있다.
MS 윈도우즈 만큼 밝 조절의 단계가 분명하지는 않다. 단계 값을 늘리는 방법은 없을까?
(6단계인데, 지금 보니 밝는 MS윈도우와 별반 차이가 없다.)
NVIDIA 드라이버를 없앤 상태에서 밝 조절이 된다.
드라이버를 동작시킨 상태에서는 밝 조절이 불가능할까?

... 앞으로의 연구 과제이다.



nvclock 이라는 프로그램이 있다. nvidia 그래픽카드 전용 프로그램인듯 싶은데,
이것으로 밝 조정을 매우 세밀하게 할 수 있다. 15% 부터 100%까지 1퍼센트 단위로도 조정 가능하다.
게다가 관리자 계정일 필요도 없다.

nvclock -S ( 숫자 절대치 | +증가치 | -감소치 )

이것을 이용해 시스템 - 기본 설정 - 키보드 바로 가기(gnome-keybinding-properties) 메뉴를 열어
적절한 FN키와 다른 키 하나를 묶어서 밝 조정을 할 수 있다.



현재 FN키와 < > 키를 엮어서 밝 조정을 하고 있다. 매우 잘 되긴 하다... 여기까지 한 것도 잘한 거다
하지만 FN키와 위 아래 키를 엮고 싶다. OSD랑 같이 돌아가게 하고 싶다.