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*
,所以你必须选择:
- 编写一个读取
/dev/input/event*
并转发给您的驱动程序的用户模式守护程序,可能使用字符设备或 sysfs 参数。
- 挂接来自您的驱动程序的输入驱动程序事件。
选项 1 应该很简单。我将详细说明选项 2。
要从内核挂接输入设备,您可以使用模块初始化函数中的函数 input_register_handler()
(当然,还有退出函数中的 input_unregister_handler()
)。
这个函数接受一个struct input_handler
作为参数,它有很多成员,但你可能只需要填写name
、id_table
、connect
、disconnect
和 event
.
然后,在您的 connect
回调中调用 input_register_handle()
(注意 handle
与 handler
名称)和 input_open_device()
,您将获得输入事件在你的 event
回调中。
当然,不要忘记在 disconnect
回调中撤消该工作。
在内核中有几个这种 API 用法的实例,但到目前为止更容易阅读的是 evbug
驱动程序:它只是将所有输入事件转储到内核日志中。
在 raspberry pi 我希望能够使用旋转编码器作为音量控制。 我能看到的最好的方法是使用 rotary_encoder 模块读取编码器,将其设置为相对轴(这样会得到 +1 或 -1 事件)然后制作 driver 解释为创建提高音量或降低音量按键。
但是我正在努力解决中断和 drivers,所以我的 driver 必须将自己注册为能够提供 EV_KEY 事件,我认为我已经处理好了,但我不确定如何捕捉来自其他人的事件并对其采取行动 driver?
我想我必须轮询另一个 driver 创建的 /dev/input/event object,但我似乎找不到如何执行此操作的指南?
这是最好的方法吗?有没有一种方法可以让我真正捕捉到其他 driver 将事件馈送到输入系统所产生的中断?
您似乎想接收来自不相关模块的输入事件。但是你不能从内核 space 读取 /dev/input/event*
,所以你必须选择:
- 编写一个读取
/dev/input/event*
并转发给您的驱动程序的用户模式守护程序,可能使用字符设备或 sysfs 参数。 - 挂接来自您的驱动程序的输入驱动程序事件。
选项 1 应该很简单。我将详细说明选项 2。
要从内核挂接输入设备,您可以使用模块初始化函数中的函数 input_register_handler()
(当然,还有退出函数中的 input_unregister_handler()
)。
这个函数接受一个struct input_handler
作为参数,它有很多成员,但你可能只需要填写name
、id_table
、connect
、disconnect
和 event
.
然后,在您的 connect
回调中调用 input_register_handle()
(注意 handle
与 handler
名称)和 input_open_device()
,您将获得输入事件在你的 event
回调中。
当然,不要忘记在 disconnect
回调中撤消该工作。
在内核中有几个这种 API 用法的实例,但到目前为止更容易阅读的是 evbug
驱动程序:它只是将所有输入事件转储到内核日志中。