固定 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
如果支持就把它當做一個鍵盤。
因爲我的設備中只有觸摸屏、鼠標、鍵盤,因此用它來處理就完全可以滿足了,判斷是否是鼠標的話可以判斷它是否支持左、右鍵,絕對位移或者相對位移事件。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章