On Tue, Jan 21, 2014 at 06:55:47PM +0900, Ryo ONODERA wrote: > > Without my modification, my USB modem is recognized as single ugen(4). >
ok, clearly not correct :) > Here is output of usbdevs(8) without my modification. > > port 1 addr 11: full speed, power 100 mA, config 1, USB Modem(0x1329), > Conexant(0x0572), rev 1.00, serial 24680246 > ugen0 > > and output of dmesg. > > ugen0 at uhub4 port 1 > ugen0: Conexant USB Modem, rev 1.10/1.00, addr 11 > > > How to get class and subclass value for USB device? > build the attached code and run that with a /dev/ugen0.00 argument. It should print out a bunch of information about the device. Post the output here and we can work out what it claims to be. -- Brett Lymn Staple Guns: because duct tape doesn't make that KerCHUNK sound - xkcd.com
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <errno.h> #include <sys/ioctl.h> #include <dev/usb/usb.h> main(int argc, char **argv) { struct usb_config_desc desc; int fd, i, j; struct usb_interface_desc int_desc; struct usb_endpoint_desc end_desc; fd = open(argv[1], O_RDONLY, 0); if (fd < 0) { printf("open failed %d\n", errno); exit(0); } desc.ucd_config_index = USB_CURRENT_CONFIG_INDEX; if (ioctl(fd, USB_GET_CONFIG_DESC, &desc) < 0) { printf("ioctl failed, %d\n", errno); exit(0); } printf("length: %d\n", desc.ucd_desc.bLength); printf("descriptor type: %d\n", desc.ucd_desc.bDescriptorType); printf("total length: %d\n", desc.ucd_desc.wTotalLength); printf("num interface: %d\n", desc.ucd_desc.bNumInterface); printf("config value: %d\n", desc.ucd_desc.bConfigurationValue); printf("configuration: %d\n", desc.ucd_desc.iConfiguration); printf("Attributes: (0x%x) ", desc.ucd_desc.bmAttributes); /* if ((desc.ucd_desc.bmAttributes & UC_BUS_POWERED) == UC_BUS_POWERED) printf("Bus powered ");*/ if ((desc.ucd_desc.bmAttributes & UC_SELF_POWERED) == UC_SELF_POWERED) printf("Self powered "); if ((desc.ucd_desc.bmAttributes & UC_REMOTE_WAKEUP) == UC_REMOTE_WAKEUP) printf("Remote Wakeup "); printf("\n"); printf("max power: %d mA\n", desc.ucd_desc.bMaxPower * UC_POWER_FACTOR); int_desc.uid_config_index = USB_CURRENT_CONFIG_INDEX; int_desc.uid_alt_index = USB_CURRENT_ALT_INDEX; end_desc.ued_config_index = USB_CURRENT_CONFIG_INDEX; end_desc.ued_alt_index = USB_CURRENT_ALT_INDEX; for (i = 0; i <= desc.ucd_desc.bNumInterface - 1; i++) { printf("\nInterface %d:\n", i); int_desc.uid_interface_index = i; if (ioctl(fd, USB_GET_INTERFACE_DESC, &int_desc) < 0) { printf("ioctl failed, %d\n", errno); exit(0); } printf(" Length: %d\n", int_desc.uid_desc.bLength); printf(" Descriptor Type: %d\n", int_desc.uid_desc.bDescriptorType); printf(" Interface No: %d\n", int_desc.uid_desc.bInterfaceNumber); printf(" Alt Setting: %d\n", int_desc.uid_desc.bAlternateSetting); printf(" Num Endpoints: %d\n", int_desc.uid_desc.bNumEndpoints); printf(" Interface Class: %d\n", int_desc.uid_desc.bInterfaceClass); printf(" Interface SubClass: %d\n", int_desc.uid_desc.bInterfaceSubClass); printf(" Interface Protocol: %d\n", int_desc.uid_desc.bInterfaceProtocol); printf(" Interface: %d\n", int_desc.uid_desc.iInterface); end_desc.ued_interface_index = i; for (j = 0; j < int_desc.uid_desc.bNumEndpoints; j++) { printf(" Endpoint %d:\n", j); end_desc.ued_endpoint_index = j; if (ioctl(fd, USB_GET_ENDPOINT_DESC, &end_desc) < 0) { printf("ioctl failed, %d\n", errno); exit(0); } printf(" Length: %d\n", end_desc.ued_desc.bLength); printf(" Length: %d\n", end_desc.ued_desc.bDescriptorType); printf(" Length: (0x%x) %d ", end_desc.ued_desc.bEndpointAddress, UE_GET_ADDR(end_desc.ued_desc.bEndpointAddress)); if (UE_GET_DIR(end_desc.ued_desc.bEndpointAddress) == UE_DIR_OUT) printf("(out)\n"); else printf("(in)\n"); printf(" Attributes: (0x%x) ", end_desc.ued_desc.bmAttributes); switch (UE_GET_XFERTYPE(end_desc.ued_desc.bmAttributes)) { case UE_CONTROL: printf("control "); break; case UE_ISOCHRONOUS: printf("isochronous "); break; case UE_BULK: printf("bulk "); break; case UE_INTERRUPT: printf("interrupt "); break; } switch (UE_GET_ISO_TYPE(end_desc.ued_desc.bmAttributes)) { case UE_ISO_ASYNC: printf("async"); break; case UE_ISO_ADAPT: printf("adapt"); break; case UE_ISO_SYNC: printf("sync"); break; } printf("\n"); printf(" Max Packet Size: %d\n", end_desc.ued_desc.wMaxPacketSize); printf(" Interval: %d\n", end_desc.ued_desc.bInterval); } } }