固定 event 节点

    相信与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
如果支持就把它当做一个键盘。
因为我的设备中只有触摸屏、鼠标、键盘,因此用它来处理就完全可以满足了,判断是否是鼠标的话可以判断它是否支持左、右键,绝对位移或者相对位移事件。


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值