熱鍵缺少了key release event就是很常見的情形。像是在Fujitsu Amilo和Samsung NC系列,很多型號都有這樣的問題。
因為沒有release event,所以會發生「只有第一次按有用」「只按一下降低音量的鍵,卻變成靜音」等奇怪的情況。
2.6.31之前的kernel會在AT keyboard驅動程式(atkbd.c)中加了許多DMI quirk和熱鍵的scan code,只要型號和scan code符合,atkbd會自動加入release event。
不過,在這麼一般的驅動程式中加入一堆DMI quirk,並不是一個好主意。所以在2.6.32 kernel,便在/sys下加入了一個可以由userspace控制的介面:
/sys/devices/platform/i8042/serio0/force_release
要讓某些scan code自動的產生出release event,只要把hotkey的scan code用逗號隔開,再寫入(echo + pipeline)這個檔案,之後kernel便會自動的幫這些scan code產生出release event。
對於一個distro來說,最好能夠收集這些有問題的型號和熱鍵的scan code,並且自動的偵測和設定。以Ubuntu而言,從Ubuntu Karmic之後,熱鍵便從HAL改為由udev來管理。所以在Ubuntu Lucid中,udev也加入了這個新功能:
將DMI quirk紀錄在此:
/lib/udev/rules.d/95-keyboard-force-release.rules
將熱鍵的scan code紀錄在此:
/lib/udev/keymaps/force-release/
在Ubuntu Lucid中,處理這類問題,就不須再更動、重編kernel,只要簡單的修改一些udev script即可。