Saturday, May 19, 2007

Kubuntu Feisty vs Logitech

หายหน้าหายตาไม่ได้ up blog เป็นเวลานานแสนนาน แถมจั่วหัวเรื่องซะน่ากลัว แต่ไม่ใช่เรื่อง Logitech ไปหาเรื่องฟ้อง Kubuntu แต่อย่างใด เป็นเรื่องที่ผมไปซื้อเมาส์มาใหม่ เป็นเมาส์ Laser รุ่น V450 จาก Logitech ในราคาลดสะบั้นแค่ AU$58 เท่านั้น (แพงฉิบ) ซึ่งเมาส์ตัวนี้ก็ใช้ได้ดีเกือบทุกพื้นผิว ละเอียดดี (ไม่รู้เท่าไหร่ เพราะมันไม่ยอมบอกว่ากี่ dpi แต่รู้สึกว่ามันเคลื่อนที่เรียบขึ้น อาจจะเป็น Placebo Effect) แถมยังใช้ได้ไกลพอตัว (ประมาณเกือบๆ 5 เมตร) และที่สำคัญคือประหยัดถ่าน (มันเคลมว่าใช้ได้นานสุด 1ปี)



ตัวนี้แหละ


การใช้งานทั่วไปบนวินโดวส์ก็ไม่มีปัญหา แต่ต้องลง software ของ Logitech จึงจะทำให้ใช้ได้ครบทุกปุ่ม ซึ่งมันมี 3 ปุ่ม และ sidescroll (ขนาดบนวินโดวส์นะ) ทีนี้มาว่ากันบน Linux มั่ง ซึ่งเครื่องผมลง Kubuntu Feisty เอาไว้ (ก่อนหน้านั้นก็ Edgy แหละ แต่ตัดสินใจลง Feisty ดีกว่าเพื่อความสดของ packages) เมื่อลองเสียบครั้งแรก ก็ใช้ได้ทันที แต่ ปุ่ม sidescroll มันใช้ไม่ได้ สรุปว่า หายไป 2 ปุ่มซะงั้น -_-' แรกๆ ก็ไม่คิดอะไรหรอก ไม่ใช้ก็ได้ แต่ไปๆ มาๆ ก็ซื้อมาตั้งแพง ทำไมใช้ไม่ได้ฟะ แถมเมาส์ก็เคลื่อนที่แบบที่เรียกว่า out of control เอามากๆ คือ ขนาดปิด acceleration ใน KDE ไปแล้ว (ตั้ง factor x1) มันยังปรู๊ดปร๊าด แบบควบคุมลำบาก ยิ่งแย่เข้าไปใหญ่ (คิดว่าน่าจะเป็นผลจากความละเอียดที่มากขึ้นจริงๆ) เลยคิดว่า... สงสัยต้องหาวิธีเอาซะแล้ว

ที่ entry นี้ไม่เขียนเป็นภาษาอังกฤษเพราะว่า เอกสารภาษาอังกฤษมีเยอะแล้ว (เหอๆ) และคนไทยมักไม่ค่อยอยากอ่านภาษาอังกฤษ ดังนั้นก็เขียนเป็นภาษาไทยละกัน (เผื่อจะมีคนมาเม้นต์มากขึ้น เหอๆ)

วิธีการนั้น ผมได้มาจาก Google -> Gentoo Wiki (เข้าใจแล้วว่า ทำไมเค้าถึงบอกว่าเอกสารของ Gentoo ดีที่สุดในโลก) และรายละเอียดปลีกย่อยนิดหน่อยจากหน้า manpage

เอาล่ะ มาเข้าเรื่องกัน

ขั้นแรก: สำรวจไดรเวอร์
การตั้งค่าเมาส์โดยปริยายใน xrog.conf ที่ติดมากับ *buntu นั้น จะใช้ไดรเวอร์ที่เรียกว่า mouse เพราะมันเป็นไดรเวอร์ที่ใช้ได้กับเมาส์ทั่วไปไม่ว่าจะเป็นเมาส์ ps/2, usb หรือ serial (ยังมีใครใช้มั้ยเนี่ย) แต่สำหรับเมาส์ใหม่ๆ ที่ปุ่มมันเยอะๆ และเป็น usb ซึ่งไดรเวอร์และ Protocol ตัวเก่านั้น มันอาจทำให้การ map ปุ่มเมาส์เละไปหมด เค้าก็เลยเปลี่ยนมาใช้ไดรเวอร์ที่ชื่อว่า evdev แทน ซึ่งไดรเวอร์ตัวนี้จะทำการ จับ event ของอุปกรณ์นำเข้าข้อมูลต่างๆ เข้ามาผ่านทำการประมวลผลใน kernel และตามเอกสารของ Gentoo ก็บอกไว้ว่า 9 ใน 10 ครั้งนั้น คุณจะไม่ต้องไปนั่ง map ปุ่มใหม่เอง (เยี่ยม)

สำหรับ evdev นั้น *buntu ได้ build มาเป็น kernel module แล้วพร้อมกับโหลดให้ตอนบูตเรียบร้อย


ขั้นที่ 2: สำรวจอุปกรณ์
รายละเอียดของอุปกรณ์นั้นจะถูกเก็บไว้ในระบบไฟล์ชั่วคราว (/proc) ที่แฟ้ม /proc/bus/input/device ลองดูเนื้อหาภายในนั้นได้จากการใช้คำสั่ง cat หรือ less แบบนี้
cat /proc/bus/input/device
หรือ
less /proc/bus/input/device


แต่แนะนำให้ใช้ less ดีกว่า เพราะเลื่อนขึ้นลงไล่ดูได้ ลองไล่ๆ ไปก็จะเห็นข้อความประมาณนี้


I: Bus=0003 Vendor=046d Product=c518 Version=0111
N: Name="Logitech USB Receiver"
P: Phys=usb-0000:00:1d.2-2/input0
S: Sysfs=/class/input/input4
H: Handlers=mouse1 ts1 event4
B: EV=7
B: KEY=ffff0000 0 0 0 0 0 0 0 0
B: REL=143

I: Bus=0003 Vendor=046d Product=c518 Version=0111
N: Name="Logitech USB Receiver"
P: Phys=usb-0000:00:1d.2-2/input1
S: Sysfs=/class/input/input5
H: Handlers=kbd event5
B: EV=f
B: KEY=7fff 2c3027 bf004440 0 0 1 f80 8807c000 667bfa d9415fed 8e0000 0 0 0
B: REL=40
B: ABS=1 0


โปรดสังเกตชื่อ Logitech USB Receiver และคุณจะเห็นว่ามันมีอยู่ 2 entries เนื่องจากว่า kernel มองมันเป็น Receiver ของทั้งเมาส์และคีย์บอร์ดไร้สายของ Logitech มันก็เลยขึ้น 2 อัน โดยส่วนสำคัญที่เราสามารถเอาไปใช้ใน xorg.conf ได้มีอยู่หลายส่วน เช่น Name, Phys, bit (B: น่ะ) ให้จดๆ เอาไว้ก่อน แล้วเราไปแก้ /etc/X11/xorg.conf กัน

ขั้นที่ 3: แก้ xorg.conf
คำเตือน: ก่อนกระทำการใดๆ ในขั้นนี้ โปรด backup ไฟล์ xorg.conf เอาไว้ก่อน เพราะเกิดเข้า X ไม่ได้ขึ้นมาจะได้ก็อปกลับไปทับได้

ทีนี้ ตามคู่มือของ Gentoo ที่อ่านมา เค้าบอกว่า ให้แก้ไฟล์ xorg.conf โดยทำการเพิ่มส่วน InputDevice section เพิ่มเข้าไป โดยต้องไปตามดูวิธีการเขียน Config ตามรุ่นและชนิดของเมาส์อีกที (ดูอ้างอิงข้างล่าง) แล้วก็เพิ่มค่าของเมาส์ใหม่เข้าไปในส่วนของ ServerLayout ด้วย

ตามตัวอย่างของ Gentoo Wiki นั้น เค้าบอกให้เพิ่ม InputDevice เข้าไปแบบนี้


Section "InputDevice"
Identifier "V450"
Driver "evdev"
Option "Name" "Logitech USB Receiver"
Option "HWHEELRelativeAxisButtons" "7 6"
EndSection

และ

Section "ServerLayout"
Identifier "Default Layout"
Screen "Default Screen"
InputDevice "Generic Keyboard"
InputDevice "V450" "CorePointer" <- เพิ่มตรงนี้เข้าไป
InputDevice "Synaptics Touchpad"
EndSection


จะเห็นว่า ตัวไดรเวอร์เปลี่ยนไปโดยหันไปใช้ evdev แทน แล้วก็กำหนดอุปกรณ์ด้วยชื่อ ซึ่งก็ควรจะใช้ได้ ถ้าเกิดว่าอุปกรณ์ของผมมันไม่มีชื่อซ้ำกัน แต่จากตัวอย่างข้างบนในขั้นที่ 2 คุณเห็นแล้วว่าชื่อ Logitech USB Receiver มันซ้ำกัน ผลก็คือ เมื่อ restart X ใหม่แล้ว มันมืดไปเลย - -'

ก็เลยเปลี่ยนวิธีเรียกอุปกรณ์ใหม่ เป็นการเรียกใช้จาก event แทน จากตัวอย่างในขั้นที่ 2 จะเห็นว่า ตัว event ที่เป็นเมาส์ของ Logitech นั้น ตรงกับ event4 เราก็เปลี่ยนตรง Option name ให้เป็น Device แบบนี้


Section "InputDevice"
Identifier "V450"
Driver "evdev"
Option "Device" "/dev/input/event4"
Option "HWHEELRelativeAxisButtons" "7 6"
EndSection


หลังจาก restart X แล้วก็ปรากฏว่า สามารถใช้งานเมาส์ได้ และใช้ได้หมดทุกปุ่ม ทั้งปุ่ม ซ้าย ขวา scroll ขึ้น-ลง และ scroll ซ้าย-ขวา ฮ่า... สำเร็จ

แต่...

การใส่ option แบบนี้มีข้อเสียคือ ในการบูตแต่ละครั้งนั้น HAL มันอาจจะเอาเมาส์ของคุณไป register ไว้ที่ event ต่างๆ กันก็ได้ (โดยส่วนใหญ่ก็จะเป็น event เดิมแหละ แต่ตั้งแต่เปลี่ยนมาใช้ Feisty มันเปลี่ยนทุกครั้งที่บูตเลยอ่ะ - -') ซึ่งถ้าเป็นแบบนั้น คุณก็จะไม่สามารถใช้เมาส์ได้ครบปุ่มอยู่ดี ดังนั้นมีวิธีที่ดีกว่าก็คือ การกำหนด Physical address ไปซะเลย โดยทำการเปลี่ยน Device ไปเป็น Phys แบบนี้


Section "InputDevice"
Identifier "V450"
Driver "evdev"
Option "Phys" "usb-0000:00:1d.2-2/input0"
Option "HWHEELRelativeAxisButtons" "7 6"
EndSection


ทีนี้คุณก็จะได้เมาส์พร้อมใช้งาน ทุกครั้งที่บูต (แต่แบบนี้ก็มีข้อเสียอีกแหละ ถ้าคุณเปลี่ยนพอร์ตที่ใช้เสียบตัว Receiver แล้ว address ตรงนี้ก็เปลี่ยนเหมือนกัน แต่ถ้าไม่เปลี่ยนพอร์ตก็ไม่มีปัญหา)

ขั้นสุดท้าย: ทำการปรับแต่งอีกเล็กน้อย
เนื่องจากว่า ผมรู้สึกว่าเมาส์มันกระตุกๆ แปลกๆ ซึ่งอาจเป็นเพราะว่า การ poll ข้อมูลของเมาส์มันต่ำเกินไปสำหรับเมาส์แบบ Laser ซึ่งมีความละเอียดสูง ดังนั้นก็เลยเปลี่ยนความถี่ในการ poll ข้อมูลซะ (ค่าปกติคือ 100 Hz) โดยจากคู่มือของ Gentoo ที่อ่านมา บอกว่า เมาส์ส่วนใหญ่ของ Logitech สามารถรับความถี่ 500Hz ได้สบายๆ โดยใช้ usbhid module และให้ โหลดโมดูลนี้ตอนบูต โดยทำการสร้างไฟล์ usbhid เอาไว้ใน /etc/modprobe.d


sudo vi /etc/modprobe.d/usbhid

options usbhid mousepoll=2


ซึ่งตรงนี้เป็นการเปลี่ยนให้มีการรับข้อมูลจากเมาส์ทุกๆ 2 ms (ก็คือ 500 ครั้ง/วินาที หรือ 500 Hz นั่นเอง)

แล้วก็บอกให้ทำการโหลดโมดูลพร้อม option นี้ทุกครั้งเวลาบูตด้วยการใส่ usbhid ต่อท้ายเข้าไปในไฟล์ /etc/modules

ต่อมาผมรู้สึกว่า เมาส์มันเคลื่อนที่เร็วเกินไป ถึงแม้จะได้ทำการปรับความเร็วของเมาส์ใน KDE ไปแล้วก็ยังเร็วอยู่ดี หลังจากที่หาไปหามาแล้ว ก็พบวิธีที่จะปรับเมาส์ให้มีความเร็วลดลง และเพิ่ม sensitivity (threshold) โดยการใช้คำสั่ง


xset m 1/2 1


ซึ่งแปลว่า ทำการตั้งความเร็วเมาส์ให้เหลือ 0.5 เท่า และให้เคลื่อน cursor เมื่อเคลื่อนเมาส์ไป 1 pixel ซึ่งการตั้งแบบนี้ ทำให้ผมควบคุมเมาส์ได้ดีขึ้นมากๆ แต่ทนี้จะทำไงให้มันเป็นแบบนี้ตั้งแต่บูตเข้ามาดีล่ะ ... อันนี้หาไม่เจอแฮะ ... แต่ก็มีวิธีพอกล้อมแกล้มไปได้ด้วยการสั่งแบบนี้ในตอน login เข้า kde โดยทำการสร้างไฟล์ .desktop สำหรับเรียกโปรแกรม ใส่เข้าไปใน ~/.kde/Autostart โดยตั้งชื่อว่า reduce_mouse_speed.desktop และมีเนื้อหาแบบนี้ครับ


[Desktop Entry]
Name=Reduce Mouse Speed
Exec=xset m 1/2 1
StartupNotify=false
Terminal=false


ที่ไม่ยัดคำสั่งนี้เข้าไปใน .bashrc เพราะว่า มันจะแสดง error ถ้าเกิดไม่ได้ login ด้วย X ครับ ก็เลยยัดเอาไว้ใน Autostart ดีกว่า

หลังจากนี้ทีนี้ก็ได้เมาส์พร้อมใช้งานได้แบบเต็มประสิทธิภาพแล้วครับ

Resources:
Gentoo's HOWTO Advanced Mouse
Gentoo's HOWTO Advanced Mouse / Individual Configurations
Gentoo's HOWTO Setting mouse speed through command line
Gentoo's HOWTO Change mouse Hz