PERFORCE change 159053 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Wed Mar 11 01:25:09 PDT 2009
http://perforce.freebsd.org/chv.cgi?CH=159053
Change 159053 by hselasky at hselasky_laptop001 on 2009/03/11 08:24:55
USB CORE: More HID fixes:
- preserve item size and count accross items
- add some more debugging prints
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/usb_hid.c#22 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/usb_hid.c#22 (text+ko) ====
@@ -68,7 +68,9 @@
struct hid_item cur[MAXPUSH];
int32_t usages_min[MAXUSAGE];
int32_t usages_max[MAXUSAGE];
- int kindset;
+ uint32_t loc_size; /* last seen size */
+ uint32_t loc_count; /* last seen count */
+ uint8_t kindset; /* we have 5 kinds so 8 bits are enough */
uint8_t pushlevel; /* current pushlevel */
uint8_t ncount; /* end usage item count */
uint8_t icount; /* current usage item count */
@@ -268,6 +270,9 @@
c->kind = hid_input;
c->flags = dval;
ret:
+ c->loc.count = s->loc_count;
+ c->loc.size = s->loc_size;
+
if (c->flags & HIO_VARIABLE) {
/* range check usage count */
if (c->loc.count > 255) {
@@ -287,6 +292,7 @@
}
/* make sure we have a usage */
if (s->nusage == 0) {
+ DPRINTFN(1, "Using default usage\n");
/* use the undefined HID PAGE */
s->usages_min[s->nusage] = 0x0000;
s->usages_max[s->nusage] = 0xFFFF;
@@ -346,7 +352,8 @@
c->unit = dval;
break;
case 7:
- c->loc.size = dval;
+ /* mask because value is unsigned */
+ s->loc_size = dval & mask;
break;
case 8:
c->report_ID = dval;
@@ -354,12 +361,17 @@
c->loc.pos = 0;
break;
case 9:
- c->loc.count = dval;
+ /* mask because value is unsigned */
+ s->loc_count = dval & mask;
break;
case 10: /* Push */
s->pushlevel ++;
if (s->pushlevel < MAXPUSH) {
s->cur[s->pushlevel] = *c;
+ /* store size and count */
+ c->loc.size = s->loc_size;
+ c->loc.count = s->loc_count;
+ /* update current item pointer */
c = &s->cur[s->pushlevel];
} else {
DPRINTFN(0, "Cannot push "
@@ -372,7 +384,13 @@
/* preserve position */
oldpos = c->loc.pos;
c = &s->cur[s->pushlevel];
+ /* restore size and count */
+ s->loc_size = c->loc.size;
+ s->loc_count = c->loc.count;
+ /* set default item location */
c->loc.pos = oldpos;
+ c->loc.size = 0;
+ c->loc.count = 0;
} else {
DPRINTFN(0, "Cannot pop "
"item @ %d!\n", s->pushlevel);
More information about the p4-projects
mailing list