From: Vojtech P. <vo...@us...> - 2001-11-07 08:12:54
|
Update of /cvsroot/linuxconsole/ruby/linux/drivers/input In directory usw-pr-cvs1:/tmp/cvs-serv3514 Modified Files: hid-core.c hid-input.c hid.h Log Message: Fix unsigned logical maximums, shifted hats ... Index: hid-core.c =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/input/hid-core.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- hid-core.c 2001/09/25 10:12:07 1.31 +++ hid-core.c 2001/11/07 08:12:49 1.32 @@ -310,7 +310,10 @@ return 0; case HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM: - parser->global.logical_maximum = item_sdata(item); + if (parser->global.logical_minimum < 0) + parser->global.logical_maximum = item_sdata(item); + else + parser->global.logical_maximum = item_udata(item); return 0; case HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM: @@ -824,15 +827,18 @@ len--; } - if (!(report = report_enum->report_id_hash[n])) { - dbg("undefined report_id %d received", n); -#ifdef DEBUG - printk(KERN_DEBUG __FILE__ ": report (size %u) = ", len); - for (n = 0; n < len; n++) - printk(" %02x", data[n]); - printk("\n"); +#ifdef DEBUG_DATA + { + int i; + printk(KERN_DEBUG __FILE__ ": report %d (size %u) = ", n, len); + for (i = 0; i < n; i++) + printk(" %02x", data[i]); + printk("\n"); + } #endif + if (!(report = report_enum->report_id_hash[n])) { + dbg("undefined report_id %d received", n); return -1; } Index: hid-input.c =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/input/hid-input.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- hid-input.c 2001/09/25 10:12:07 1.16 +++ hid-input.c 2001/11/07 08:12:49 1.17 @@ -58,7 +58,7 @@ static struct { __s32 x; __s32 y; -} hid_hat_to_axis[] = {{0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}}; +} hid_hat_to_axis[] = {{ 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}}; static void hidinput_configure_usage(struct hid_device *device, struct hid_field *field, struct hid_usage *usage) { @@ -129,7 +129,8 @@ if (usage->hid == HID_GD_HATSWITCH) { usage->code = ABS_HAT0X; - usage->hat = 1 + (field->logical_maximum == 4); + usage->hat_min = field->logical_minimum; + usage->hat_max = field->logical_maximum; } break; @@ -318,7 +319,7 @@ input->absflat[usage->code] = (b - a) >> 4; } - if (usage->hat) { + if (usage->hat_min != usage->hat_max) { int i; for (i = usage->code; i < usage->code + 2 && i <= max; i++) { input->absmax[i] = 1; @@ -335,8 +336,8 @@ struct input_dev *input = &hid->input; int *quirks = &hid->quirks; - if (usage->hat) { - if (usage->hat == 2) value = value * 2; + if (usage->hat_min != usage->hat_max) { + value = (value - usage->hat_min) * 8 / (usage->hat_max - usage->hat_min + 1); if (value > 8) value = 8; input_event(input, usage->type, usage->code , hid_hat_to_axis[value].x); input_event(input, usage->type, usage->code + 1, hid_hat_to_axis[value].y); Index: hid.h =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/input/hid.h,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- hid.h 2001/09/25 09:37:57 1.22 +++ hid.h 2001/11/07 08:12:49 1.23 @@ -233,7 +233,8 @@ unsigned hid; /* hid usage code */ __u16 code; /* input driver code */ __u8 type; /* input driver type */ - __u8 hat; /* hat switch fun */ + __s8 hat_min; /* hat switch fun */ + __s8 hat_max; /* ditto */ }; struct hid_field { |