其实在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