head 1.5; access; symbols pkgsrc-2026Q1:1.5.0.118 pkgsrc-2026Q1-base:1.5 pkgsrc-2025Q4:1.5.0.116 pkgsrc-2025Q4-base:1.5 pkgsrc-2025Q3:1.5.0.114 pkgsrc-2025Q3-base:1.5 pkgsrc-2025Q2:1.5.0.112 pkgsrc-2025Q2-base:1.5 pkgsrc-2025Q1:1.5.0.110 pkgsrc-2025Q1-base:1.5 pkgsrc-2024Q4:1.5.0.108 pkgsrc-2024Q4-base:1.5 pkgsrc-2024Q3:1.5.0.106 pkgsrc-2024Q3-base:1.5 pkgsrc-2024Q2:1.5.0.104 pkgsrc-2024Q2-base:1.5 pkgsrc-2024Q1:1.5.0.102 pkgsrc-2024Q1-base:1.5 pkgsrc-2023Q4:1.5.0.100 pkgsrc-2023Q4-base:1.5 pkgsrc-2023Q3:1.5.0.98 pkgsrc-2023Q3-base:1.5 pkgsrc-2023Q2:1.5.0.96 pkgsrc-2023Q2-base:1.5 pkgsrc-2023Q1:1.5.0.94 pkgsrc-2023Q1-base:1.5 pkgsrc-2022Q4:1.5.0.92 pkgsrc-2022Q4-base:1.5 pkgsrc-2022Q3:1.5.0.90 pkgsrc-2022Q3-base:1.5 pkgsrc-2022Q2:1.5.0.88 pkgsrc-2022Q2-base:1.5 pkgsrc-2022Q1:1.5.0.86 pkgsrc-2022Q1-base:1.5 pkgsrc-2021Q4:1.5.0.84 pkgsrc-2021Q4-base:1.5 pkgsrc-2021Q3:1.5.0.82 pkgsrc-2021Q3-base:1.5 pkgsrc-2021Q2:1.5.0.80 pkgsrc-2021Q2-base:1.5 pkgsrc-2021Q1:1.5.0.78 pkgsrc-2021Q1-base:1.5 pkgsrc-2020Q4:1.5.0.76 pkgsrc-2020Q4-base:1.5 pkgsrc-2020Q3:1.5.0.74 pkgsrc-2020Q3-base:1.5 pkgsrc-2020Q2:1.5.0.70 pkgsrc-2020Q2-base:1.5 pkgsrc-2020Q1:1.5.0.50 pkgsrc-2020Q1-base:1.5 pkgsrc-2019Q4:1.5.0.72 pkgsrc-2019Q4-base:1.5 pkgsrc-2019Q3:1.5.0.68 pkgsrc-2019Q3-base:1.5 pkgsrc-2019Q2:1.5.0.66 pkgsrc-2019Q2-base:1.5 pkgsrc-2019Q1:1.5.0.64 pkgsrc-2019Q1-base:1.5 pkgsrc-2018Q4:1.5.0.62 pkgsrc-2018Q4-base:1.5 pkgsrc-2018Q3:1.5.0.60 pkgsrc-2018Q3-base:1.5 pkgsrc-2018Q2:1.5.0.58 pkgsrc-2018Q2-base:1.5 pkgsrc-2018Q1:1.5.0.56 pkgsrc-2018Q1-base:1.5 pkgsrc-2017Q4:1.5.0.54 pkgsrc-2017Q4-base:1.5 pkgsrc-2017Q3:1.5.0.52 pkgsrc-2017Q3-base:1.5 pkgsrc-2017Q2:1.5.0.48 pkgsrc-2017Q2-base:1.5 pkgsrc-2017Q1:1.5.0.46 pkgsrc-2017Q1-base:1.5 pkgsrc-2016Q4:1.5.0.44 pkgsrc-2016Q4-base:1.5 pkgsrc-2016Q3:1.5.0.42 pkgsrc-2016Q3-base:1.5 pkgsrc-2016Q2:1.5.0.40 pkgsrc-2016Q2-base:1.5 pkgsrc-2016Q1:1.5.0.38 pkgsrc-2016Q1-base:1.5 pkgsrc-2015Q4:1.5.0.36 pkgsrc-2015Q4-base:1.5 pkgsrc-2015Q3:1.5.0.34 pkgsrc-2015Q3-base:1.5 pkgsrc-2015Q2:1.5.0.32 pkgsrc-2015Q2-base:1.5 pkgsrc-2015Q1:1.5.0.30 pkgsrc-2015Q1-base:1.5 pkgsrc-2014Q4:1.5.0.28 pkgsrc-2014Q4-base:1.5 pkgsrc-2014Q3:1.5.0.26 pkgsrc-2014Q3-base:1.5 pkgsrc-2014Q2:1.5.0.24 pkgsrc-2014Q2-base:1.5 pkgsrc-2014Q1:1.5.0.22 pkgsrc-2014Q1-base:1.5 pkgsrc-2013Q4:1.5.0.20 pkgsrc-2013Q4-base:1.5 pkgsrc-2013Q3:1.5.0.18 pkgsrc-2013Q3-base:1.5 pkgsrc-2013Q2:1.5.0.16 pkgsrc-2013Q2-base:1.5 pkgsrc-2013Q1:1.5.0.14 pkgsrc-2013Q1-base:1.5 pkgsrc-2012Q4:1.5.0.12 pkgsrc-2012Q4-base:1.5 pkgsrc-2012Q3:1.5.0.10 pkgsrc-2012Q3-base:1.5 pkgsrc-2012Q2:1.5.0.8 pkgsrc-2012Q2-base:1.5 pkgsrc-2012Q1:1.5.0.6 pkgsrc-2012Q1-base:1.5 pkgsrc-2011Q4:1.5.0.4 pkgsrc-2011Q4-base:1.5 pkgsrc-2011Q3:1.5.0.2 pkgsrc-2011Q3-base:1.5 pkgsrc-2011Q2:1.4.0.6 pkgsrc-2011Q2-base:1.4 pkgsrc-2011Q1:1.4.0.4 pkgsrc-2011Q1-base:1.4 pkgsrc-2010Q4:1.4.0.2 pkgsrc-2010Q4-base:1.4 pkgsrc-2010Q3:1.3.0.34 pkgsrc-2010Q3-base:1.3 pkgsrc-2010Q2:1.3.0.32 pkgsrc-2010Q2-base:1.3 pkgsrc-2010Q1:1.3.0.30 pkgsrc-2010Q1-base:1.3 pkgsrc-2009Q4:1.3.0.28 pkgsrc-2009Q4-base:1.3 pkgsrc-2009Q3:1.3.0.26 pkgsrc-2009Q3-base:1.3 pkgsrc-2009Q2:1.3.0.24 pkgsrc-2009Q2-base:1.3 pkgsrc-2009Q1:1.3.0.22 pkgsrc-2009Q1-base:1.3 pkgsrc-2008Q4:1.3.0.20 pkgsrc-2008Q4-base:1.3 pkgsrc-2008Q3:1.3.0.18 pkgsrc-2008Q3-base:1.3 cube-native-xorg:1.3.0.16 cube-native-xorg-base:1.3 pkgsrc-2008Q2:1.3.0.14 pkgsrc-2008Q2-base:1.3 cwrapper:1.3.0.12 pkgsrc-2008Q1:1.3.0.10 pkgsrc-2008Q1-base:1.3 pkgsrc-2007Q4:1.3.0.8 pkgsrc-2007Q4-base:1.3 pkgsrc-2007Q3:1.3.0.6 pkgsrc-2007Q3-base:1.3 pkgsrc-2007Q2:1.3.0.4 pkgsrc-2007Q2-base:1.3 pkgsrc-2007Q1:1.3.0.2 pkgsrc-2007Q1-base:1.3 pkgsrc-2006Q4:1.1.0.10 pkgsrc-2006Q4-base:1.1 pkgsrc-2006Q3:1.1.0.8 pkgsrc-2006Q3-base:1.1 pkgsrc-2006Q2:1.1.0.6 pkgsrc-2006Q2-base:1.1 pkgsrc-2006Q1:1.1.0.4 pkgsrc-2006Q1-base:1.1 pkgsrc-2005Q4:1.1.0.2 pkgsrc-2005Q4-base:1.1; locks; strict; comment @# @; 1.5 date 2011.07.24.18.00.07; author jmcneill; state Exp; branches; next 1.4; 1.4 date 2010.12.25.14.03.57; author jmcneill; state Exp; branches; next 1.3; 1.3 date 2007.02.26.11.54.57; author drochner; state Exp; branches; next 1.2; 1.2 date 2007.01.23.17.02.07; author drochner; state Exp; branches; next 1.1; 1.1 date 2005.12.18.17.31.22; author joerg; state Exp; branches; next ; desc @@ 1.5 log @support HID descriptors larger than 256 bytes @ text @$NetBSD$ --- usbctl.c.orig 2002-02-24 19:50:55.000000000 -0500 +++ usbctl.c 2011-07-24 09:56:59.000000000 -0400 @@@@ -27,12 +27,18 @@@@ #include #include #include +#include #include #include #include #include +#ifdef __DragonFly__ +#include +#include +#else #include #include +#endif #ifndef USB_STACK_VERSION #define ucr_addr addr @@@@ -52,6 +58,21 @@@@ #define UICLASS_HUB UCLASS_HUB #endif +#ifndef UDESC_INTERFACE_ASSOC +#define UDESC_INTERFACE_ASSOC 0x0b +typedef struct { + uByte bLength; + uByte bDescriptorType; + uByte bFirstInterface; + uByte bInterfaceCount; + uByte bFunctionClass; + uByte bFunctionSubClass; + uByte bFunctionProtocol; + uByte iFunction +} UPACKED usb_interface_assoc_descriptor_t; +#define USB_INTERFACE_ASSOC_DESCRIPTOR_SIZE 8 +#endif + #define USBDEV "/dev/usb0" /* Backwards compatibility */ @@@@ -62,6 +83,7 @@@@ #endif #define NSTRINGS +#define STRINGLANG int num = 0; @@@@ -80,17 +102,43 @@@@ getstring(int si, char *s) int r, i, n; u_int16_t c; usb_string_descriptor_t us; + int lang = 0; if (si == 0 || num) { *s = 0; return; } + +#ifdef STRINGLANG req.ucr_addr = usbaddr; req.ucr_request.bmRequestType = UT_READ_DEVICE; req.ucr_request.bRequest = UR_GET_DESCRIPTOR; req.ucr_data = &us; - USETW2(req.ucr_request.wValue, UDESC_STRING, si); + USETW2(req.ucr_request.wValue, UDESC_STRING, 0); USETW(req.ucr_request.wIndex, 0); + USETW(req.ucr_request.wLength, sizeof(usb_string_descriptor_t)); + req.ucr_flags = USBD_SHORT_XFER_OK; + r = ioctl(usbf, USB_REQUEST, &req); + if (r < 0) { + fprintf(stderr, "get lang tbl failed (error=%d)\n", errno); + *s = 0; + return; + } + if (req.ucr_actlen > 0 && us.bLength >= 4) { + lang = UGETW(us.bString[0]); +#if 0 + printf("getstring: %d langs, using %d\n", + (us.bLength - 2) / 2, lang); +#endif + } +#endif + + req.ucr_addr = usbaddr; + req.ucr_request.bmRequestType = UT_READ_DEVICE; + req.ucr_request.bRequest = UR_GET_DESCRIPTOR; + req.ucr_data = &us; + USETW2(req.ucr_request.wValue, UDESC_STRING, si); + USETW(req.ucr_request.wIndex, lang); #ifdef NSTRINGS USETW(req.ucr_request.wLength, sizeof(usb_string_descriptor_t)); req.ucr_flags = USBD_SHORT_XFER_OK; @@@@ -154,6 +202,7 @@@@ descTypeName(int t) case UDESC_STRING: p = "string"; break; case UDESC_INTERFACE: p = "interface"; break; case UDESC_ENDPOINT: p = "endpoint"; break; + case UDESC_INTERFACE_ASSOC: p = "iad"; break; case 0x20: p = "cs_undefined"; break; case UDESC_CS_DEVICE: p = "cs_device"; break; case UDESC_CS_CONFIG: p = "cs_config"; break; @@@@ -278,6 +327,21 @@@@ bInterfaceProtocol=%d iInterface=%d(%s)\ d->iInterface, ifc); } +void +priad(usb_interface_assoc_descriptor_t *d) +{ + char func[MAXSTR]; + getstring(d->iFunction, func); + if (d->bDescriptorType != UDESC_INTERFACE_ASSOC) printf("weird descriptorType, should be %d\n", UDESC_INTERFACE_ASSOC); + printf("\ +bLength=%d bDescriptorType=%s bFirstInterface=%d bInterfaceCount=%d\n\ +bFunctionClass=%d bFunctionSubClass=%d bFunctionProtocol=%d\n\ +iFunction=%d(%s)\n", + d->bLength, descTypeName(d->bDescriptorType), d->bFirstInterface, + d->bInterfaceCount, d->bFunctionClass, d->bFunctionSubClass, + d->bFunctionProtocol, d->iFunction, func); +} + char *xfernames[] = { "control", "isochronous", "bulk", "interrupt" }; char *xfertypes[] = { "", "-async", "-adaptive", "-sync" }; @@@@ -384,7 +448,7 @@@@ struct usb_cdc_union_descriptor { }; void -prcdcd(usb_descriptor_t *ud) +prcdcd(struct usb_cdc_header_descriptor *ud) { if (ud->bDescriptorType != UDESC_CS_INTERFACE) printf("prcdcd: strange bDescriptorType=%d\n", @@@@ -630,7 +694,7 @@@@ gethubdesc(int f, usb_hub_descriptor_t * req.ucr_addr = addr; req.ucr_request.bmRequestType = UT_READ_CLASS_DEVICE; req.ucr_request.bRequest = UR_GET_DESCRIPTOR; - USETW(req.ucr_request.wValue, 0); + USETW2(req.ucr_request.wValue, UDESC_HUB, 0); USETW(req.ucr_request.wIndex, 0); USETW(req.ucr_request.wLength, USB_HUB_DESCRIPTOR_SIZE); req.ucr_data = d; @@@@ -1145,6 +1209,11 @@@@ prdesc(void *p, int *class, int *subclas prhubd(p); break; #endif + case UDESC_INTERFACE_ASSOC: + printf("INTERFACE ASSOCIATION descriptor:\n"); + priad(p); + break; + break; case UDESC_CS_DEVICE: if (*class == UICLASS_HID) { usb_hid_descriptor_t *hid = p; @@@@ -1155,10 +1224,14 @@@@ prdesc(void *p, int *class, int *subclas printf("\n"); for(k = 0; k < hid->bNumDescriptors; k++) { int type, len; - u_char buf[256]; + u_char *buf; type = hid->descrs[k].bDescriptorType; len = UGETW(hid->descrs[k].wDescriptorLength); + buf = malloc(len); + if (buf == NULL) { + errx(1, "malloc failed (size=%d)\n", len); + } if (type == UDESC_REPORT) { getreportdesc(globf, *iface, k, buf, len, globaddr); printf("Report descriptor\n"); @@@@ -1169,6 +1242,7 @@@@ prdesc(void *p, int *class, int *subclas printf("Unknown HID descriptor type %d\n", type); } printf("\n"); + free(buf); } } else goto def; @@@@ -1243,8 +1317,8 @@@@ prdesc(void *p, int *class, int *subclas default: def: printf("Unknown descriptor (class %d/%d):\n", *class, *subclass); - printf("bLength=%d bDescriptorType=%d bDescriptorSubtype=%d ...\n", d->bLength, - d->bDescriptorType, d->bDescriptorSubtype + printf("bLength=%d bDescriptorType=%d ...\n", d->bLength, + d->bDescriptorType ); break; } @@@@ -1321,6 +1395,7 @@@@ main(int argc, char **argv) if (!doaddr) prunits(f); +#ifndef __NetBSD__ if (!nodisc) { r = ioctl(f, USB_DISCOVER); if (r < 0) @@@@ -1329,6 +1404,7 @@@@ main(int argc, char **argv) if (disconly) exit(0); } +#endif for(addr = 0; addr < USB_MAX_DEVICES; addr++) { if (doaddr != -1 && addr != doaddr) @ 1.4 log @add support for parsing interface association descriptors (IAD): INTERFACE ASSOCIATION descriptor: bLength=8 bDescriptorType=iad(11) bFirstInterface=1 bInterfaceCount=6 bFunctionClass=255 bFunctionSubClass=255 bFunctionProtocol=255 iFunction=0() bump pkgrevision @ text @d3 2 a4 2 --- usbctl.c.orig 2002-02-25 00:50:55.000000000 +0000 +++ usbctl.c d159 25 a183 1 @@@@ -1243,8 +1312,8 @@@@ prdesc(void *p, int *class, int *subclas d194 1 a194 1 @@@@ -1321,6 +1390,7 @@@@ main(int argc, char **argv) d202 1 a202 1 @@@@ -1329,6 +1399,7 @@@@ main(int argc, char **argv) @ 1.3 log @-don't assume that usb_descriptor_t has a field bDescriptorSubtype - this field is class specific and shouldn't be there -before reading a string descriptor, read the language table and use a correct language code if possible -bump PKGREVISION @ text @d3 1 a3 1 --- usbctl.c.orig 2002-02-25 01:50:55.000000000 +0100 d24 23 a46 1 @@@@ -62,6 +68,7 @@@@ d54 1 a54 1 @@@@ -80,17 +87,43 @@@@ getstring(int si, char *s) d99 31 a129 1 @@@@ -384,7 +417,7 @@@@ struct usb_cdc_union_descriptor { d138 1 a138 1 @@@@ -630,7 +663,7 @@@@ gethubdesc(int f, usb_hub_descriptor_t * d147 13 a159 1 @@@@ -1243,8 +1276,8 @@@@ prdesc(void *p, int *class, int *subclas d170 1 a170 1 @@@@ -1321,6 +1354,7 @@@@ main(int argc, char **argv) d178 1 a178 1 @@@@ -1329,6 +1363,7 @@@@ main(int argc, char **argv) @ 1.2 log @-make fetch of hub descriptors in usbctl work (by setting the correct request value) -ifdef out the USB_DISCOVER ioctl on NetBSD, this doesn't exist -bump PKGREVISION @ text @d24 63 a86 1 @@@@ -630,7 +636,7 @@@@ gethubdesc(int f, usb_hub_descriptor_t * d95 12 a106 1 @@@@ -1321,6 +1327,7 @@@@ main(int argc, char **argv) d114 1 a114 1 @@@@ -1329,6 +1336,7 @@@@ main(int argc, char **argv) @ 1.1 log @Include correct headers on DragonFly. Don't depend on sys/ioctl.h being included by dev/usb/usb.h, which is not the case on DragonFly and FreeBSD. @ text @d3 1 a3 1 --- usbctl.c.orig 2002-02-25 00:50:55.000000000 +0000 d24 25 @