1 | #!/bin/sh
|
---|
2 | ########################################################################
|
---|
3 | #
|
---|
4 | # Description : Input devices
|
---|
5 | #
|
---|
6 | # Authors : Based on Open Suse Udev Rules
|
---|
7 | # kay.sievers@suse.de
|
---|
8 | #
|
---|
9 | # Adapted to : Jim Gifford
|
---|
10 | # LFS
|
---|
11 | #
|
---|
12 | # Version : 00.00
|
---|
13 | #
|
---|
14 | # Notes :
|
---|
15 | #
|
---|
16 | ########################################################################
|
---|
17 |
|
---|
18 | input_join_words() {
|
---|
19 | local array="$1" tmp
|
---|
20 | [ "$array" ] || return 0
|
---|
21 |
|
---|
22 | set $array
|
---|
23 | tmp="$1"
|
---|
24 | shift
|
---|
25 | while [ "$#" -gt 0 ]; do
|
---|
26 | tmp="$tmp:$1"
|
---|
27 | shift
|
---|
28 | done
|
---|
29 |
|
---|
30 | echo "$tmp"
|
---|
31 | }
|
---|
32 |
|
---|
33 | input_convert_vars() {
|
---|
34 | i_bustype=0; i_vendor=0; i_product=0; i_version=0; i_evBits=0
|
---|
35 |
|
---|
36 | if [ "$PRODUCT" ]; then
|
---|
37 | set -- $(IFS='/'; echo $PRODUCT '')
|
---|
38 | i_bustype=$((0x$1))
|
---|
39 | i_vendor=$((0x$2))
|
---|
40 | i_product=$((0x$3))
|
---|
41 | [ "$4" ] && i_version=$((0x$4)) # XXX
|
---|
42 | fi
|
---|
43 |
|
---|
44 | [ "$EV" ] && i_evBits=$((0x$EV))
|
---|
45 |
|
---|
46 | i_keyBits=$(input_join_words "$KEY")
|
---|
47 | i_relBits=$(input_join_words "$REL")
|
---|
48 | i_absBits=$(input_join_words "$ABS")
|
---|
49 | i_mscBits=$(input_join_words "$MSC")
|
---|
50 | i_ledBits=$(input_join_words "$LED")
|
---|
51 | i_sndBits=$(input_join_words "$SND")
|
---|
52 | i_ffBits=$( input_join_words "$FF")
|
---|
53 | }
|
---|
54 |
|
---|
55 | input_match_bits() {
|
---|
56 | local mod_bits="$1" dev_bits="$2"
|
---|
57 | [ "$dev_bits" ] || return 0
|
---|
58 |
|
---|
59 | local mword dword
|
---|
60 | mword=$((0x${mod_bits##*:}))
|
---|
61 | dword=$((0x${dev_bits##*:}))
|
---|
62 |
|
---|
63 | while true; do
|
---|
64 | if [ $(( $mword & $dword != $mword )) -eq 1 ]; then
|
---|
65 | return 1
|
---|
66 | fi
|
---|
67 |
|
---|
68 | mod_bits=${mod_bits%:*}
|
---|
69 | dev_bits=${dev_bits%:*}
|
---|
70 |
|
---|
71 | case "$mod_bits-$dev_bits" in
|
---|
72 | *:*-*:*) continue ;;
|
---|
73 | *:*-*|*-*:*) return 0 ;;
|
---|
74 | *) return 1 ;;
|
---|
75 | esac
|
---|
76 | done
|
---|
77 | }
|
---|
78 |
|
---|
79 | load_drivers() {
|
---|
80 | local TYPE="$1" FILENAME="$2"
|
---|
81 |
|
---|
82 | ${TYPE}_map_modules < $FILENAME
|
---|
83 |
|
---|
84 | for MODULE in $DRIVERS; do
|
---|
85 | /sbin/modprobe $MODULE || true
|
---|
86 | done
|
---|
87 | }
|
---|
88 |
|
---|
89 | input_map_modules() {
|
---|
90 | local line module
|
---|
91 | local relBits mscBits ledBits sndBits keyBits absBits ffBits
|
---|
92 |
|
---|
93 | while read line; do
|
---|
94 | # comments are lines that start with "#" ...
|
---|
95 | # be careful, they still get parsed by bash!
|
---|
96 | case "$line" in
|
---|
97 | \#*) continue ;;
|
---|
98 | esac
|
---|
99 |
|
---|
100 | set $line
|
---|
101 |
|
---|
102 | module="$1"
|
---|
103 | matchBits=$(($2))
|
---|
104 |
|
---|
105 | bustype=$(($3))
|
---|
106 | vendor=$(($4))
|
---|
107 | product=$(($5))
|
---|
108 | version=$(($6))
|
---|
109 |
|
---|
110 | evBits="$7"
|
---|
111 | keyBits="$8"
|
---|
112 | relBits="$9"
|
---|
113 |
|
---|
114 | shift 9
|
---|
115 | absBits="$1"
|
---|
116 | cbsBits="$2"
|
---|
117 | ledBits="$3"
|
---|
118 | sndBits="$4"
|
---|
119 | ffBits="$5"
|
---|
120 | driverInfo=$(($6))
|
---|
121 |
|
---|
122 | if [ $INPUT_DEVICE_ID_MATCH_BUS -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_BUS )) ] &&
|
---|
123 | [ $bustype -ne $i_bustype ]; then
|
---|
124 | continue
|
---|
125 | fi
|
---|
126 |
|
---|
127 | if [ $INPUT_DEVICE_ID_MATCH_VENDOR -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_VENDOR )) ] &&
|
---|
128 | [ $vendor -ne $i_vendor ]; then
|
---|
129 | continue
|
---|
130 | fi
|
---|
131 |
|
---|
132 | if [ $INPUT_DEVICE_ID_MATCH_PRODUCT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_PRODUCT )) ] &&
|
---|
133 | [ $product -ne $i_product ]; then
|
---|
134 | continue
|
---|
135 | fi
|
---|
136 |
|
---|
137 | # version i_version $i_version < version $version
|
---|
138 | if [ $INPUT_DEVICE_ID_MATCH_VERSION -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_VERSION )) ] &&
|
---|
139 | [ $version -ge $i_version ]; then
|
---|
140 | continue
|
---|
141 | fi
|
---|
142 |
|
---|
143 | if [ $INPUT_DEVICE_ID_MATCH_EVBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_EVBIT )) ] &&
|
---|
144 | input_match_bits "$evBits" "$i_evBits"; then
|
---|
145 | continue
|
---|
146 | fi
|
---|
147 | if [ $INPUT_DEVICE_ID_MATCH_KEYBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_KEYBIT )) ] &&
|
---|
148 | input_match_bits "$keyBits" "$i_keyBits"; then
|
---|
149 | continue
|
---|
150 | fi
|
---|
151 | if [ $INPUT_DEVICE_ID_MATCH_RELBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_RELBIT )) ] &&
|
---|
152 | input_match_bits "$relBits" "$i_relBits"; then
|
---|
153 | continue
|
---|
154 | fi
|
---|
155 |
|
---|
156 | if [ $INPUT_DEVICE_ID_MATCH_ABSBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_ABSBIT )) ] &&
|
---|
157 | input_match_bits "$absBits" "$i_absBits"; then
|
---|
158 | continue
|
---|
159 | fi
|
---|
160 |
|
---|
161 | if [ $INPUT_DEVICE_ID_MATCH_MSCBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_MSCBIT )) ] &&
|
---|
162 | input_match_bits "$mscBits" "$i_mscBits"; then
|
---|
163 | continue
|
---|
164 | fi
|
---|
165 |
|
---|
166 | if [ $INPUT_DEVICE_ID_MATCH_LEDBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_LEDBIT )) ] &&
|
---|
167 | input_match_bits "$ledBits" "$i_ledBits"; then
|
---|
168 | continue
|
---|
169 | fi
|
---|
170 |
|
---|
171 | if [ $INPUT_DEVICE_ID_MATCH_SNDBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_SNDBIT )) ] &&
|
---|
172 | input_match_bits "$sndBits" "$i_sndBits"; then
|
---|
173 | continue
|
---|
174 | fi
|
---|
175 |
|
---|
176 | if [ $INPUT_DEVICE_ID_MATCH_FFBIT -eq $(( $matchBits & $INPUT_DEVICE_ID_MATCH_FFBIT )) ] &&
|
---|
177 | input_match_bits "$ffBits" "$i_ffBits"; then
|
---|
178 | continue
|
---|
179 | fi
|
---|
180 |
|
---|
181 | if [ $matchBits -eq 0 -a $driverInfo -eq 0 ]; then
|
---|
182 | continue
|
---|
183 | fi
|
---|
184 |
|
---|
185 | # It was a match!
|
---|
186 | case " $DRIVERS " in
|
---|
187 | *" $module "*)
|
---|
188 | : already found
|
---|
189 | ;;
|
---|
190 | *)
|
---|
191 | DRIVERS="$module $DRIVERS"
|
---|
192 | ;;
|
---|
193 | esac
|
---|
194 |
|
---|
195 | done
|
---|
196 | }
|
---|
197 |
|
---|
198 | INPUT_DEVICE_ID_MATCH_BUS=1
|
---|
199 | INPUT_DEVICE_ID_MATCH_VENDOR=2
|
---|
200 | INPUT_DEVICE_ID_MATCH_PRODUCT=4
|
---|
201 | INPUT_DEVICE_ID_MATCH_VERSION=8
|
---|
202 | INPUT_DEVICE_ID_MATCH_EVBIT=$((0x010))
|
---|
203 | INPUT_DEVICE_ID_MATCH_KEYBIT=$((0x020))
|
---|
204 | INPUT_DEVICE_ID_MATCH_RELBIT=$((0x040))
|
---|
205 | INPUT_DEVICE_ID_MATCH_ABSBIT=$((0x080))
|
---|
206 | INPUT_DEVICE_ID_MATCH_MSCBIT=$((0x100))
|
---|
207 | INPUT_DEVICE_ID_MATCH_LEDBIT=$((0x200))
|
---|
208 | INPUT_DEVICE_ID_MATCH_SNDBIT=$((0x400))
|
---|
209 | INPUT_DEVICE_ID_MATCH_FFBIT=$((0x800))
|
---|
210 |
|
---|
211 | MAP_CURRENT="/lib/modules/$(uname -r)/modules.inputmap"
|
---|
212 | [ -r $MAP_CURRENT ] || exit 0
|
---|
213 |
|
---|
214 | input_convert_vars
|
---|
215 | load_drivers input $MAP_CURRENT
|
---|
216 |
|
---|
217 | exit 0
|
---|