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 {
|