关于input设备的多次打开

这两天在研究linux中的input-polldev.c ,这是kernel提供的一个新的架构,该架构基于linux原有的input子系统,在input设备外增加了一层轮询设备的封装。这个架构允许我们注册一个poll-dev。我们只要提供给这个poll-dev一个轮询时间间隔,一个轮询的回调函数即可,而后该系统会为我们注册一个input设备并在我们打开该input设备时启动轮询(当轮询时间大于0时),轮询启动后会按照设置好的时间间隔调用我们前面提到的那个回调函数。当我们关闭该input设备时轮询会自动终止。另外该架构还创建了一些sys-fs节点,一个比较有用的就是poll节点,我们可以cat该节点得到当前的轮询频率,也可以echo一个值进去从而更新轮询频率。总之这比我们自己制造一个轮询系统来的更方便更直接。


在研究代码时还发现当打开这个基于poll-dev的input设备时还会调用该轮询设备的open函数(代码见 input_open_polled_device函数。当然前提是你在注册poll-dev时提供了自己的open函数),因为目前在做mma8452q的驱动,所以我想,为了省电起见,我希望在这个基于poll-dev的input设备在打开时再给8452供电,在关闭input设备时自动给8452断电。所以可以自己实现一个open和close函数,在注册poll-dev之前赋值给input_polled_dev对象的open和close指针。


这个想法很不错,可是奇怪的是我发现我的这个open函数只在android启动后被调用了一次,而且没有看到close被调用的迹象。为了确认这个问题。我自己写了一个测试的应用程序,在这个测试中我会连续两次open     /dev/input/event2.。但是依然看到的是我的那个挂在poll-dev中的open只在第一次open   /dev/input/event2时 被调用了一次,同样我在两次调用close   /dev/input/event2时也只是在最后一次调用中看到我的对应的close被调用了一次。


如此看来,对于input设备来说可能它的open函数只有第一次open 设备是才会调用,打开input.c查看了一把,在函数input_open_device()中果然看到了就是这样的。只有第一次open input设备时对应的input设备的open函数才会被调用,以后如果对一个input设备进行多次打开的话只能让input设备的users成员自增,而不会调用open函数。

你可能感兴趣的:(linux,android,制造,测试,input)