Код: Выделить всё
diff -urN usb.orig/hid.c usb.new/hid.c
--- usb.orig/hid.c 2008-03-03 03:14:47.000000000 +0200
+++ usb.new/hid.c 2008-07-12 03:35:34.000000000 +0300
@@ -72,6 +72,7 @@
int multi;
int multimax;
int kindset;
+ int usage;
};
static void
@@ -115,7 +116,7 @@
}
int
-hid_get_item(struct hid_data *s, struct hid_item *h)
+hid_get_item(struct hid_data *s, u_int32_t u, struct hid_item *h)
{
struct hid_item *c = &s->cur;
unsigned int bTag, bType, bSize;
@@ -193,6 +194,10 @@
case 0: /* Main */
switch (bTag) {
case 8: /* Input */
+
+ if (s->usage != u >>16)
+ break;
+
if (!(s->kindset & (1 << hid_input)))
continue;
c->kind = hid_input;
@@ -232,6 +237,8 @@
c->kind = hid_collection;
c->collection = dval;
c->collevel++;
+ if (c->collevel > 0 && u != 0)
+ s->usage = c->_usage_page >> 16;
*h = *c;
hid_clear_local(c);
s->nu = 0;
@@ -258,6 +265,8 @@
switch (bTag) {
case 0:
c->_usage_page = dval << 16;
+ if (u != 0 && u>>16 == dval)
+ s->usage = dval;
break;
case 1:
c->logical_minimum = dval;
@@ -364,7 +373,7 @@
}
int
-hid_report_size(void *buf, int len, enum hid_kind k, u_int8_t *idp)
+hid_report_size(void *buf, int len, u_int32_t u, enum hid_kind k, u_int8_t *idp)
{
struct hid_data *d;
struct hid_item h;
@@ -372,7 +381,7 @@
id = 0;
hi = lo = -1;
- for (d = hid_start_parse(buf, len, 1<<k); hid_get_item(d, &h); )
+ for (d = hid_start_parse(buf, len, 1<<k); hid_get_item(d, u, &h); )
if (h.kind == k) {
if (h.report_ID != 0 && !id)
id = h.report_ID;
@@ -399,7 +408,7 @@
struct hid_data *d;
struct hid_item h;
- for (d = hid_start_parse(desc, size, 1<<k); hid_get_item(d, &h); ) {
+ for (d = hid_start_parse(desc, size, 1<<k); hid_get_item(d, u, &h); ) {
if (h.kind == k && !(h.flags & HIO_CONST) && h.usage == u) {
if (loc != NULL)
*loc = h.loc;
@@ -452,7 +461,7 @@
if (hd == NULL)
return (0);
- err = hid_get_item(hd, &hi) &&
+ err = hid_get_item(hd, usage, &hi) &&
hi.kind == hid_collection &&
hi.usage == usage;
hid_end_parse(hd);
diff -urN usb.orig/hid.h usb.new/hid.h
--- usb.orig/hid.h 2005-01-19 17:51:03.000000000 +0200
+++ usb.new/hid.h 2008-07-11 19:35:09.000000000 +0300
@@ -82,8 +82,8 @@
struct hid_data *hid_start_parse(void *d, int len, int kindset);
void hid_end_parse(struct hid_data *s);
-int hid_get_item(struct hid_data *s, struct hid_item *h);
-int hid_report_size(void *buf, int len, enum hid_kind k, u_int8_t *id);
+int hid_get_item(struct hid_data *s, u_int32_t u, struct hid_item *h);
+int hid_report_size(void *buf, int len, u_int32_t u, enum hid_kind k, u_int8_t *id);
int hid_locate(void *desc, int size, u_int32_t usage,
enum hid_kind kind, struct hid_location *loc,
u_int32_t *flags);
diff -urN usb.orig/ucycom.c usb.new/ucycom.c
--- usb.orig/ucycom.c 2008-03-03 03:18:12.000000000 +0200
+++ usb.new/ucycom.c 2008-07-12 03:46:11.000000000 +0300
@@ -221,9 +221,9 @@
}
/* get report sizes */
- sc->sc_flen = hid_report_size(urd, urdlen, hid_feature, &sc->sc_fid);
- sc->sc_ilen = hid_report_size(urd, urdlen, hid_input, &sc->sc_iid);
- sc->sc_olen = hid_report_size(urd, urdlen, hid_output, &sc->sc_oid);
+ sc->sc_flen = hid_report_size(urd, urdlen, 0, hid_feature, &sc->sc_fid); /* NEED TO BE FIXX ????? */
+ sc->sc_ilen = hid_report_size(urd, urdlen, 0, hid_input, &sc->sc_iid); /* NEED TO BE FIXX ????? */
+ sc->sc_olen = hid_report_size(urd, urdlen, 0, hid_output, &sc->sc_oid); /* NEED TO BE FIXX ????? */
if (sc->sc_ilen > UCYCOM_MAX_IOLEN || sc->sc_olen > UCYCOM_MAX_IOLEN) {
device_printf(dev, "I/O report size too big (%zu, %zu, %u)\n",
diff -urN usb.orig/uhid.c usb.new/uhid.c
--- usb.orig/uhid.c 2007-06-21 17:42:33.000000000 +0300
+++ usb.new/uhid.c 2008-07-12 02:17:26.000000000 +0300
@@ -320,9 +320,9 @@
(void)usbd_set_idle(iface, 0, 0);
- sc->sc_isize = hid_report_size(desc, size, hid_input, &sc->sc_iid);
- sc->sc_osize = hid_report_size(desc, size, hid_output, &sc->sc_oid);
- sc->sc_fsize = hid_report_size(desc, size, hid_feature, &sc->sc_fid);
+ sc->sc_isize = hid_report_size(desc, size, 0, hid_input, &sc->sc_iid);
+ sc->sc_osize = hid_report_size(desc, size, 0, hid_output, &sc->sc_oid);
+ sc->sc_fsize = hid_report_size(desc, size, 0, hid_feature, &sc->sc_fid);
sc->sc_repdesc = desc;
sc->sc_repdesc_size = size;
diff -urN usb.orig/ums.c usb.new/ums.c
--- usb.orig/ums.c 2008-04-30 22:37:54.000000000 +0300
+++ usb.new/ums.c 2008-07-11 19:56:20.000000000 +0300
@@ -358,7 +358,8 @@
hid_locate(desc, size, HID_USAGE2(HUP_BUTTON, i),
hid_input, &sc->sc_loc_btn[i-1], 0);
- sc->sc_isize = hid_report_size(desc, size, hid_input, &sc->sc_iid);
+ sc->sc_isize = hid_report_size(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_MOUSE),
+ hid_input, &sc->sc_iid);
sc->sc_ibuf = malloc(sc->sc_isize, M_USB, M_NOWAIT);
if (!sc->sc_ibuf) {
printf("%s: no memory\n", device_get_nameunit(sc->sc_dev));
@@ -393,6 +394,7 @@
* descriptor), it seems that report id 17 contains the necessary
* mouse information(3-buttons,X,Y,wheel) so we specify it manually.
*/
+ /* IS IT NESSESARY ??? NEED TO BE RECHECK !!!!!!! AND EXCLUDE */
if (uaa->vendor == USB_VENDOR_MICROSOFT &&
uaa->product == USB_PRODUCT_MICROSOFT_WLNOTEBOOK3) {
sc->flags = UMS_Z;