我正在尝试编写一个内核驱动程序来支持我的笔记本电脑上的硬件开关。该开关用于控制是否禁用或启用触摸板,它内置于笔记本电脑的 360° 铰链中。根据几乎相同硬件的其他驱动程序的提示,我从开关捕获硬件事件,并根据开关的位置,在输入设备上发送相应的键码。键码留在用户空间中处理。这与我观察到的 Windows 10 驱动程序中用于此开关的机制相同。
我发现我可以发送键码 191 ( KEY_F21
),Gnome 3.18 成功地将其作为请求发送给切换触摸板状态。这几乎完美地工作,除了如果在笔记本电脑关闭或睡眠时翻转开关,则切换状态与开关位置不同步,并且开关现在具有与预期效果相反的效果。 KEY_F21
似乎是为无状态开关设计的,例如键盘上的热键,而我的笔记本电脑的开关具有不同的打开和关闭位置。
是否存在一对不同的键码,我可以将其用作“请求用户空间以禁用触摸板”和“请求用户空间以启用触摸板”,而不是单个“请求用户空间以切换触摸板”? 如果做不到这一点,哪一对键码对我来说在驱动程序中使用是安全的,在 X 或桌面环境中没有任何预定义的行为,以便我可以在我的 DE(Gnome 3.18)中为它们设置自定义快捷方式?
有些我已经尝试过但不起作用的事情:
- 使用
KEY_F22
和KEY_F23
.乍一看,这些似乎是触摸板打开和关闭代码。不幸的是,事实证明,它们并不是请求用户空间更改触摸板状态,而是通知用户空间,“驱动程序或硬件已更改触摸板状态,我只是让用户空间知道为了显示警报的新状态”。 - 看过了input-event-codes.h 的最新内核版本对于任何其他明显有前途的代码。我发现的唯一的就是
KEY_TOUCHPAD_TOGGLE
、KEY_TOUCHPAD_ON
和KEY_TOUCHPAD_OFF
(0x212-0x214)。我尝试了这些,但没有任何效果,因为 X 服务器无法接收任何高于 247 (0xF7) 的键码。我需要 X 或 DE 来处理用户空间中的触摸板启用/禁用事件,因此无法使用那么高的键码。