linux间驱动程序通信

时间:2018-03-29 10:21:52

标签: c linux driver linux-device-driver

在树莓派上我希望能够使用旋转编码器作为音量控制。 我能看到的最佳方法是使用rotary_encoder模块读取编码器,将其设置为相对轴(因此会得到+1或-1事件),然后让驱动程序解释它以创建音量或音量降低按键。

然而,我努力想要了解中断和司机,所以我的司机必须注册自己能够提供EV_KEY事件,我认为我已经处理了,但我'我不确定如何抓住并采取其他司机发生的事件?

我想我必须轮询其他驱动程序创建的/ dev / input / event对象,但我似乎找不到如何执行此操作的指南?

这是最好的方式吗?有没有办法可以实际捕获由其他驱动程序将事件输入输入系统所创建的中断?

1 个答案:

答案 0 :(得分:2)

您似乎希望从不相关的模块接收输入事件。但是你无法从内核空间读取/dev/input/event*,所以你必须选择:

  1. 编写一个用户模式守护程序,该守护程序读取/dev/input/event*并转发到您的驱动程序,可能使用char设备或sysfs参数。
  2. 挂钩驱动程序的输入驱动程序事件。
  3. 选项1应该是直截了当的。我将详细说明备选方案2。

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

    此函数以struct input_handler为参数,它有很多成员,但您可能只需要填充nameid_tableconnect,{{1 }和disconnect

    然后,在您的event回调中,您拨打connect(注意input_register_handle() vs handle名称)和handler,您将获得输入事件input_open_device()回调。

    当然,不要忘记撤消event回调中的这项工作。

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