linux input子系统

驱动

设备结构体中要包含input_dev timer_list paltform_device
挂在platform总线上,依靠定时器中断上报event

struct timer_list包含的主要成员:
a. data:传递到超时处理函数的参数,主要在多个定时器同时使用时,区别是哪个timer超时。
b. expires:定时器超时的时间,以linux的jiffies来衡量。
c. void (*function)(unsigned long):定时器超时处理函数。

主要的API函数:
a. init_timer(struct timer_list):定时器初始化函数;
b. add_timer(struct timer_list
):往系统添加定时器;
c. mod_timer(struct timer_list *, unsigned long jiffier_timerout):修改定时器的超时时间为jiffies_timerout;
d. timer_pending(struct timer_list ):定时器状态查询,如果在系统的定时器列表中则返回1,否则返回0;
e. del_timer(struct timer_list
):删除定时器

时间与jiffies的转换函数:
Linux系统中的jiffies类似于Windows里面的TickCount,它是定义在内核里面的一个全局变量,只是它的单位并不是秒或是毫秒。通常是250个jiffies为一秒,在内核里面可以直接使用宏定义:HZ。这里有几个时间和jiffies的相互转换函数:

  1. unsigned int jiffies_to_msecs(unsigned long);
  2. unsigned int jiffies_to_usecs(unsigned long);
  3. unsigned long msecs_to_jiffies(unsigned int);
  4. unsigned long usecs_to_jiffies(unsigned int);

测试

dev/input/ 里面有N个event,可以用getevent -i -c N 查看N个event的详细信息
测试需要用到以下两个命令

getevent

当完成input子系统的驱动编写之后还需要验证我们是否成功,这时候可以选择编写一个测试程序,也可以选择通过adb shell中命令模拟用户查看event消息,那么就用到了这个指令:
getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]
查看事件,不加device就是所有event (16进制)
-t:显示时间戳
-l:以文本形式输出事件类型和名称,比 -t 更清楚直观
-n:不换行打印
-s:显示指定位的开关状态
-S:显示所有位的开关状态
-d:显示设备隐藏的描述信息
-p:显示设备支持的事件类型和编码方式
-i:显示设备的所有信息和支持的事件,比 -p 显示更多信息
-h help
-c:打印固定数量的事件并退出
-r:显示事件上报速率
-v:根据 mask 值显示相关信息,执行后会一直显示上报数据
errs=1, dev=2, name=4, info=8, vers=16, pos.events=32, props=64
默认显示 dev| name| info| vers = 30;
-q: quiet (clear verbosity mask)

sendevent

对应的还有sendevent命令。不过要注意,send命令和get命令都是在上层,不能开两个窗口一个send一个get,因为这样是不会调用底层驱动的,即使驱动没注册也是有效果。
sendevent [device] [type] [code] [value] (后三个都是对应事件的10进制值)

posted @ 2021-12-23 15:26  月的光景  阅读(98)  评论(0编辑  收藏  举报