linux input子系统 -- 06 解析数据

其实在input_init中有这样的代码

static int __init input_proc_init(void)
{
	struct proc_dir_entry *entry;

	proc_bus_input_dir = proc_mkdir("bus/input", NULL);
	if (!proc_bus_input_dir)
		return -ENOMEM;

	entry = proc_create("devices", 0, proc_bus_input_dir,
			    &input_devices_fileops);
	if (!entry)
		goto fail1;

	entry = proc_create("handlers", 0, proc_bus_input_dir,
			    &input_handlers_fileops);
	if (!entry)
		goto fail2;

	return 0;
}

创建了2个proc文件

/proc/bus/input/devices

/proc/bus/input/handlers

对于具体的源码实现,这里不去研究

还是实例分析

[root@RV1126_RV1109:/]# cat /proc/bus/input/handlers 
N: Number=0 Name=leds
N: Number=1 Name=evdev Minor=64

查看当前系统中注册的handler有哪些,可以看到这个实例只有event和leds

[root@RV1126_RV1109:/]# cat /proc/bus/input/devices 
I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="adc-keys"
P: Phys=adc-keys/input0
S: Sysfs=/devices/platform/adc-keys/input/input1
U: Uniq=
H: Handlers=event1 
B: PROP=0
B: EV=3
B: KEY=800 600 0 0 2

分析几个关键的

H: 看匹配到的handler有哪些,这里只有event

B: PROP 这个是设备属性和怪癖的位图,没看到具体的使用

B: EV=3 对应2进制就是b00000011

      #define EV_SYN            0x00
      #define EV_KEY            0x01

      可以知道支持以上2个事件

B: KEY = 800 600 0 0 2

     每个跨度是BITS_TO_LONGS,这里是32

     挨个分析 首先是 2 二进制 b00000010  对应 #define KEY_SEC    1

     接着是0   这个时候键值要加32

     接着还是0  键值变成加64

     600 对应2进制b0110 0000 0000,这个时候键值要加96,看占位分别是bit9和bit10

            所以对应的按键键值是96+9=105 对应 #define KEY_LEFT   105

            另一个键值 96+10=106 对应 #define KEY_RIGHT  106

     800 对应2进制b1000 0000 0000,这个时候键值要加128,此时占位是bit11

            对应键值 128+11=139 对应 #define KEY_MENU   139

验证一下,dts配置如下

        adc-keys {
                compatible = "adc-keys";
                io-channels = <&saradc 0>;
                io-channel-names = "buttons";
                poll-interval = <100>;
                keyup-threshold-microvolt = <1800000>;

                esc-key {
                        label = "esc";
                        linux,code = <KEY_ESC>;
                        press-threshold-microvolt = <0>;
                };

                right-key {
                        label = "right";
                        linux,code = <KEY_RIGHT>;
                        press-threshold-microvolt = <400781>;
                };

                left-key {
                        label = "left";
                        linux,code = <KEY_LEFT>;
                        press-threshold-microvolt = <801562>;
                };

                menu-key {
                        label = "menu";
                        linux,code = <KEY_MENU>;
                        press-threshold-microvolt = <1198828>;
                };
        };

可以看到确实是我们分析的那样

下面分析一下按键上报,还是看这个event1

[root@RV1126_RV1109:/]# hexdump /dev/input/event1 
0000000 477f 5984 fc22 000c 0001 008b 0001 0000
0000010 477f 5984 fc22 000c 0000 0000 0000 0000

值解析如下

    

可以看到按键KEY_MENU被按下

按键释放上报的数据如下

[root@RV1126_RV1109:/]# hexdump /dev/input/event1 
0000020 4781 5984 f96b 0002 0001 008b 0000 0000
0000030 4781 5984 f96b 0002 0000 0000 0000 0000

  可以看到EV_KEY的value由1变成了0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dianlong_lee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值