когда две фтыкаешь - два демона на разные девайсы.
и всё работает - две мыши сразу

Код: Выделить всё
http://ru.wikipedia.org/wiki/Extensible_Firmware_Interface
Код: Выделить всё
[report desc size=79]
USAGE PAGE Consumer(0xc)
USAGE Consumer Control(0x1)[Consumer(0xc)]
COLLECTION Application(1)
REPORT ID 1
USAGE MINIMUM Unassigned(0)
USAGE MAXIMUM AC Underline(576)
LOGICAL MINIMUM 0
LOGICAL MAXIMUM 576
REPORT SIZE 16
REPORT COUNT 1
INPUT ( Data Array Absolute ) (0)
END COLLECTION
USAGE PAGE Generic Desktop(0x1)
USAGE Mouse(0x2)[Generic Desktop(0x1)]
COLLECTION Application(1)
REPORT ID 2
USAGE Pointer(0x1)[Generic Desktop(0x1)]
COLLECTION Physical(0)
USAGE PAGE Button(0x9)
USAGE MINIMUM Button1(1)
USAGE MAXIMUM Button3(3)
LOGICAL MINIMUM 0
LOGICAL MAXIMUM 1
REPORT SIZE 1
REPORT COUNT 3
INPUT ( Data Variable Absolute ) (2)
REPORT SIZE 5
REPORT COUNT 1
INPUT ( Const Array Absolute ) (1)
USAGE PAGE Generic Desktop(0x1)
USAGE X(0x30)[Generic Desktop(0x1)]
USAGE Y(0x31)[Generic Desktop(0x1)]
USAGE Wheel(0x38)[Generic Desktop(0x1)]
LOGICAL MINIMUM -127
LOGICAL MAXIMUM 127
REPORT SIZE 8
REPORT COUNT 3
INPUT ( Data Variable Relative ) (6)
END COLLECTION
END COLLECTION
[hexdump]
0000 05 0C 09 01 A1 01 85 01 19 00 2A 40 02 15 00 26
0010 40 02 75 10 95 01 81 00 C0 05 01 09 02 A1 01 85
0020 02 09 01 A1 00 05 09 19 01 29 03 15 00 25 01 75
0030 01 95 03 81 02 75 05 95 01 81 01 05 01 09 30 09
0040 31 09 38 15 81 25 7F 75 08 95 03 81 06 C0 C0
Код: Выделить всё
USAGE PAGE Consumer(0xc)
USAGE Consumer Control(0x1)[Consumer(0xc)]
COLLECTION Application(1)
REPORT ID 1
USAGE PAGE Generic Desktop(0x1)
USAGE Mouse(0x2)[Generic Desktop(0x1)]
COLLECTION Application(1)
REPORT ID 2
Код: Выделить всё
device_get_nameunit(sc->sc_dev));
return ENXIO;
}
err = usbd_read_report_desc(uaa->iface, &desc, &size, M_TEMP);
if (err)
return ENXIO;
+ if (uaa->vendor == 0x046e &&
+ uaa->product == 0x52e6) {
+
+ desc += 25;
+ size -= 25;
+ }
if (!hid_locate(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_X),
Код: Выделить всё
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-11 19:54:27.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)
+ s->usage = c->_usage_page >> 16;
*h = *c;
hid_clear_local(c);
s->nu = 0;
@@ -364,7 +371,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 +379,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 +406,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;
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-11 20:00:13.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); /* NED 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/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;
Код: Выделить всё
# make
# cd krepdump
# kldload ./krepdump.ko
Код: Выделить всё
# dmesg
ums0: at uhub5 port 1 (addr 2) disconnected
ums0: detached
[report desc size=64]
USAGE PAGE Generic Desktop(0x1)
USAGE Mouse(0x2)[Generic Desktop(0x1)]
COLLECTION Application(1)
USAGE Pointer(0x1)[Generic Desktop(0x1)]
COLLECTION Physical(0)
USAGE PAGE Button(0x9)
USAGE MINIMUM Button1(1)
USAGE MAXIMUM Button8(8)
LOGICAL MINIMUM 0
LOGICAL MAXIMUM 1
REPORT COUNT 8
REPORT SIZE 1
INPUT ( Data Variable Absolute ) (2)
USAGE PAGE Generic Desktop(0x1)
USAGE X(0x30)[Generic Desktop(0x1)]
USAGE Y(0x31)[Generic Desktop(0x1)]
LOGICAL MINIMUM -2047
LOGICAL MAXIMUM 2047
REPORT SIZE 12
REPORT COUNT 2
INPUT ( Data Variable Relative ) (6)
USAGE Wheel(0x38)[Generic Desktop(0x1)]
LOGICAL MINIMUM -127
LOGICAL MAXIMUM 127
USAGE Unknown Usage(0xb8)[Generic Desktop(0x1)]
LOGICAL MINIMUM -128
LOGICAL MAXIMUM 127
REPORT SIZE 8
REPORT COUNT 2
INPUT ( Data Variable Relative ) (6)
END COLLECTION
END COLLECTION
[hexdump]
0000 05 01 09 02 A1 01 09 01 A1 00 05 09 19 01 29 08
0010 15 00 25 01 95 08 75 01 81 02 05 01 09 30 09 31
0020 16 01 F8 26 FF 07 75 0C 95 02 81 06 09 38 15 81
0030 25 7F 09 B8 15 80 25 7F 75 08 95 02 81 06 C0 C0
ums0: <A4Tech Wireless Battery Free Optical Mouse, class 0/0, rev 2.00/0.01, add
r 2> on uhub5
ums0: 8 buttons and Z dir.
Код: Выделить всё
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;
Код: Выделить всё
[report desc size=48]
USAGE PAGE Generic Desktop(0x1)
USAGE Mouse(0x2)[Generic Desktop(0x1)]
COLLECTION Application(1)
USAGE Pointer(0x1)[Generic Desktop(0x1)]
COLLECTION Physical(0)
USAGE PAGE Button(0x9)
USAGE MINIMUM Button1(1)
USAGE MAXIMUM Button8(8)
LOGICAL MINIMUM 0
LOGICAL MAXIMUM 1
REPORT SIZE 1
REPORT COUNT 8
INPUT ( Data Variable Absolute ) (2)
USAGE PAGE Generic Desktop(0x1)
USAGE X(0x30)[Generic Desktop(0x1)]
USAGE Y(0x31)[Generic Desktop(0x1)]
USAGE Wheel(0x38)[Generic Desktop(0x1)]
USAGE Unknown Usage(0xb8)[Generic Desktop(0x1)]
LOGICAL MINIMUM -127
LOGICAL MAXIMUM 127
REPORT SIZE 8
REPORT COUNT 4
INPUT ( Data Variable Relative ) (6)
END COLLECTION
END COLLECTION
[hexdump]
0000 05 01 09 02 A1 01 09 01 A1 00 05 09 19 01 29 08
0010 15 00 25 01 75 01 95 08 81 02 05 01 09 30 09 31
0020 09 38 09 B8 15 81 25 7F 75 08 95 04 81 06 C0 C0
ums1: <A4Tech PS/2+USB Mouse, class 0/0, rev 1.10/0.02, addr 2> on uhub4
ums1: 8 buttons and Z dir.