]>
git.ipfire.org Git - people/trikolon/ipfire-2.x.git/blob - src/hwinfo/src/hd/input.c
8 #include <linux/input.h>
15 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
18 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
21 static void get_input_devices(hd_data_t
*hd_data
);
22 static char *all_bits(char *str
);
23 static int test_bit(char *str
, unsigned bit
);
25 void hd_scan_input(hd_data_t
*hd_data
)
27 if(!hd_probe_feature(hd_data
, pr_input
)) return;
29 hd_data
->module
= mod_input
;
32 remove_hd_entries(hd_data
);
34 PROGRESS(1, 0, "joydev mod");
35 load_module(hd_data
, "joydev");
37 PROGRESS(1, 1, "evdev mod");
38 load_module(hd_data
, "evdev");
40 PROGRESS(2, 0, "input");
42 get_input_devices(hd_data
);
46 #define INP_NAME "N: Name="
47 #define INP_HANDLERS "H: Handlers="
48 #define INP_KEY "B: KEY="
49 #define INP_REL "B: REL="
51 void get_input_devices(hd_data_t
*hd_data
)
54 str_list_t
*input
, *sl
, *sl1
;
57 unsigned bus
, vendor
, product
, version
;
58 unsigned mouse_buttons
, mouse_wheels
;
59 char *name
= NULL
, *handlers
= NULL
, *key
= NULL
, *rel
= NULL
;
61 str_list_t
*handler_list
;
62 hd_dev_num_t dev_num
= { type
: 'c', range
: 1 };
64 input
= read_file("/proc/bus/input/devices", 0, 0);
66 ADD2LOG("----- /proc/bus/input/devices -----\n");
67 for(sl
= input
; sl
; sl
= sl
->next
) {
68 ADD2LOG(" %s", sl
->str
);
70 ADD2LOG("----- /proc/bus/input/devices end -----\n");
72 for(ok
= 0, sl
= input
; sl
; sl
= sl
->next
) {
73 if(*sl
->str
== '\n') {
74 ADD2LOG("bus = %u, name = %s\n", bus
, name
);
75 if(handlers
) ADD2LOG(" handlers = %s\n", handlers
);
76 if(key
) ADD2LOG(" key = %s\n", key
);
77 if(rel
) ADD2LOG(" rel = %s\n", rel
);
81 for(u
= BTN_MOUSE
; u
< BTN_MOUSE
+ 8; u
++) {
82 if(test_bit(key
, u
)) mouse_buttons
++;
85 ADD2LOG(" mouse buttons = %u\n", mouse_buttons
);
89 for(u
= REL_HWHEEL
; u
<= REL_MAX
; u
++) {
90 if(test_bit(rel
, u
)) mouse_wheels
++;
93 ADD2LOG(" mouse wheels = %u\n", mouse_wheels
);
96 handler_list
= hd_split(' ', handlers
);
100 for(sl1
= handler_list
; sl1
; sl1
= sl1
->next
) {
101 if(sscanf(sl1
->str
, "mouse%u", &u
) == 1) {
102 str_printf(&s
, 0, "/dev/input/mouse%u", u
);
108 for(hd
= hd_data
->hd
; hd
; hd
= hd
->next
) {
109 if(hd
->unix_dev_name2
&& !strcmp(hd
->unix_dev_name2
, s
)) {
110 hd
->compat_vendor
.id
= MAKE_ID(TAG_SPECIAL
, 0x0210);
111 hd
->compat_device
.id
= MAKE_ID(TAG_SPECIAL
, (mouse_wheels
<< 4) + mouse_buttons
);
119 if(search_str_list(handler_list
, "kbd") && test_bit(key
, KEY_1
)) {
120 hd
= add_hd_entry(hd_data
, __LINE__
, 0);
121 hd
->base_class
.id
= bc_keyboard
;
122 hd
->sub_class
.id
= sc_keyboard_kbd
;
123 hd
->bus
.id
= bus_ps2
;
125 hd
->vendor
.id
= MAKE_ID(TAG_SPECIAL
, 0x0211);
126 hd
->device
.id
= MAKE_ID(TAG_SPECIAL
, 0x0001);
127 hd
->device
.name
= new_str(name
);
129 for(sl1
= handler_list
; sl1
; sl1
= sl1
->next
) {
130 if(sscanf(sl1
->str
, "event%u", &u
) == 1) {
131 str_printf(&hd
->unix_dev_name
, 0, "/dev/input/event%u", u
);
133 dev_num
.minor
= 64 + u
;
134 hd
->unix_dev_num
= dev_num
;
139 else if(strstr(handlers
, "mouse")) {
140 hd
= add_hd_entry(hd_data
, __LINE__
, 0);
141 hd
->base_class
.id
= bc_mouse
;
142 hd
->sub_class
.id
= sc_mou_ps2
;
143 hd
->bus
.id
= bus_ps2
;
145 hd
->vendor
.id
= MAKE_ID(TAG_SPECIAL
, 0x0210);
146 hd
->device
.id
= MAKE_ID(TAG_SPECIAL
, (mouse_wheels
<< 4) + mouse_buttons
);
147 hd
->device
.name
= new_str(name
);
149 /* Synaptics/Alps TouchPad */
150 if(vendor
== 2 && (product
== 7 || product
== 8)) {
151 hd
->compat_vendor
.id
= hd
->vendor
.id
;
152 hd
->compat_device
.id
= hd
->device
.id
;
153 hd
->vendor
.id
= MAKE_ID(TAG_SPECIAL
, 0x0212);
154 hd
->device
.id
= MAKE_ID(TAG_SPECIAL
, product
- 6);
157 hd
->unix_dev_name
= new_str(DEV_MICE
);
160 hd
->unix_dev_num
= dev_num
;
162 for(sl1
= handler_list
; sl1
; sl1
= sl1
->next
) {
163 if(sscanf(sl1
->str
, "mouse%u", &u
) == 1) {
164 str_printf(&hd
->unix_dev_name2
, 0, "/dev/input/mouse%u", u
);
166 dev_num
.minor
= 32 + u
;
167 hd
->unix_dev_num2
= dev_num
;
175 handler_list
= free_str_list(handler_list
);
180 name
= free_mem(name
);
181 handlers
= free_mem(handlers
);
186 if(sscanf(sl
->str
, "I: Bus=%04x Vendor=%04x Product=%04x Version=%04x", &bus
, &vendor
, &product
, &version
) == 4) {
191 if(!strncmp(sl
->str
, INP_NAME
, sizeof INP_NAME
- 1)) {
192 s
= sl
->str
+ sizeof INP_NAME
;
195 name
= canon_str(s
, len
- 2);
200 if(!strncmp(sl
->str
, INP_HANDLERS
, sizeof INP_HANDLERS
- 1)) {
201 s
= sl
->str
+ sizeof INP_HANDLERS
- 1;
202 handlers
= canon_str(s
, strlen(s
));
206 if(!strncmp(sl
->str
, INP_KEY
, sizeof INP_KEY
- 1)) {
207 s
= sl
->str
+ sizeof INP_KEY
- 1;
208 key
= canon_str(s
, strlen(s
));
213 if(!strncmp(sl
->str
, INP_REL
, sizeof INP_REL
- 1)) {
214 s
= sl
->str
+ sizeof INP_REL
- 1;
215 rel
= canon_str(s
, strlen(s
));
221 free_str_list(input
);
226 char *all_bits(char *str
)
228 str_list_t
*sl
, *sl0
;
232 if(!str
) return NULL
;
234 sl
= sl0
= hd_split(' ', str
);
235 for(; sl
; sl
= sl
->next
) {
236 u
= strtoul(sl
->str
, NULL
, 16);
237 str_printf(&s
, -1, "%08x", u
);
246 int test_bit(char *str
, unsigned bit
)
256 mask
= 1 << (bit
& 3);
258 if(ofs
>= len
) return 0;
262 u
= str
[ofs
] >= 'a' ? str
[ofs
] - 'a' + 10 : str
[ofs
] - '0';
264 return (u
& mask
) ? 1 : 0;