相信与Linux驱动打交道的人都会遇到这样一个问题,由于插入Input设备的时机不同,导致内核每次创建 event 节点未必一样,给应用程序的参数设置带来困难,比如qt设置环境变量。如何做到无论啥时候插拔设备 event 节点都固定下来?网上有改内核的做法,修改event节点创建部分的代码能够解决问题,但是换个设备就白瞎了,而且对内核开刀总是显得不太优雅。
解决思路:
通过 mdev + shell 脚本,判断 Input 设备支持的事件,来判断该设备是一个什么设备,然后创建固定名称的软连接。
起初也想过判断 usb class id 之类的信息,但是发现对于 usb 鼠标和 usb键盘这么简单的东西都无法分辨,想了想内核中 input_handler 的匹配条件,采用判断 input 设备的支持的事件才是正确做法。
这里是一个键盘的例子:
mdev.conf
input.* 0:0 666 @/etc/mdev/keyboard.sh
keyboard.sh
#!/bin/sh
if [ "$ACTION" == "add" ];then
if [ -e /sys/class/$MDEV/device/capabilities/key ];then
key=$(cat /sys/class/$MDEV/device/capabilities/key | awk '{print $(NF)}')
key="0x""$key"
echo $((num=$key)) > /dev/null
if [ $(($num & 0x00ff0000)) == $((0x00ff0000)) ];then
echo "found keyboard" > /dev/console
if [ -L /dev/input/keyboard ];then
rm /dev/input/keyboard
fi
ln -s /dev/$MDEV /dev/input/keyboard
fi
fi
fi
简单说一下原理,cat /sys/class/input*/event*/capabilities/key 得到的是该 input 设备支持的 key 类事件的 bitmap
取最低的4个字节,判断第3个字节的内容,第3个字节代表的是一下的键值
判断条件比较简单
判断改设备是否支持:
#define KEY_Q
16
#define KEY_W
17
#define KEY_E
18
#define KEY_R
19
#define KEY_T
20
#define KEY_Y
21
#define KEY_U
22
#define KEY_I
23
#define KEY_O
24
如果支持就把它当做一个键盘。
因为我的设备中只有触摸屏、鼠标、键盘,因此用它来处理就完全可以满足了,判断是否是鼠标的话可以判断它是否支持左、右键,绝对位移或者相对位移事件。