linux 间 driver 交流

linux inter driver communication

在 raspberry pi 我希望能够使用旋转编码器作为音量控制。 我能看到的最好的方法是使用 rotary_encoder 模块读取编码器,将其设置为相对轴(这样会得到 +1 或 -1 事件)然后制作 driver 解释为创建提高音量或降低音量按键。

但是我正在努力解决中断和 drivers,所以我的 driver 必须将自己注册为能够提供 EV_KEY 事件,我认为我已经处理好了,但我不确定如何捕捉来自其他人的事件并对其采取行动 driver?

我想我必须轮询另一个 driver 创建的 /dev/input/event object,但我似乎找不到如何执行此操作的指南?

这是最好的方法吗?有没有一种方法可以让我真正捕捉到其他 driver 将事件馈送到输入系统所产生的中断?

您似乎想接收来自不相关模块的输入事件。但是你不能从内核 space 读取 /dev/input/event*,所以你必须选择:

  1. 编写一个读取 /dev/input/event* 并转发给您的驱动程序的用户模式守护程序,可能使用字符设备或 sysfs 参数。
  2. 挂接来自您的驱动程序的输入驱动程序事件。

选项 1 应该很简单。我将详细说明选项 2。

要从内核挂接输入设备,您可以使用模块初始化函数中的函数 input_register_handler()(当然,还有退出函数中的 input_unregister_handler())。

这个函数接受一个struct input_handler作为参数,它有很多成员,但你可能只需要填写nameid_tableconnectdisconnectevent.

然后,在您的 connect 回调中调用 input_register_handle()(注意 handlehandler 名称)和 input_open_device(),您将获得输入事件在你的 event 回调中。

当然,不要忘记在 disconnect 回调中撤消该工作。

在内核中有几个这种 API 用法的实例,但到目前为止更容易阅读的是 evbug 驱动程序:它只是将所有输入事件转储到内核日志中。