Use UTF8 to encode strings read from the device (instead of using '?' for
characters >=0x100). Also add serial number string to the device information struct.
This commit is contained in:
parent
9ea9920e14
commit
c2c00331d7
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: if_cdce.c,v 1.4 2004/10/24 12:50:54 augustss Exp $ */
|
||||
/* $NetBSD: if_cdce.c,v 1.5 2005/05/02 15:32:18 augustss Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1997, 1998, 1999, 2000-2003 Bill Paul <wpaul@windriver.com>
|
||||
|
@ -41,7 +41,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: if_cdce.c,v 1.4 2004/10/24 12:50:54 augustss Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: if_cdce.c,v 1.5 2005/05/02 15:32:18 augustss Exp $");
|
||||
#include "bpfilter.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
|
@ -167,7 +167,7 @@ USB_ATTACH(cdce)
|
|||
int i;
|
||||
u_char eaddr[ETHER_ADDR_LEN];
|
||||
const usb_cdc_ethernet_descriptor_t *ue;
|
||||
char eaddr_str[USB_MAX_STRING_LEN];
|
||||
char eaddr_str[USB_MAX_ENCODED_STRING_LEN];
|
||||
|
||||
usbd_devinfo(dev, 0, devinfo, sizeof devinfo);
|
||||
USB_ATTACH_SETUP;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: usb.h,v 1.71 2004/06/23 06:27:54 mycroft Exp $ */
|
||||
/* $NetBSD: usb.h,v 1.72 2005/05/02 15:32:18 augustss Exp $ */
|
||||
/* $FreeBSD: src/sys/dev/usb/usb.h,v 1.14 1999/11/17 22:33:46 n_hibma Exp $ */
|
||||
|
||||
/*
|
||||
|
@ -270,6 +270,7 @@ typedef struct {
|
|||
} UPACKED usb_string_descriptor_t;
|
||||
#define USB_MAX_STRING_LEN 128
|
||||
#define USB_LANGUAGE_TABLE 0 /* # of the string language id table */
|
||||
#define USB_MAX_ENCODED_STRING_LEN (USB_MAX_STRING_LEN * 3) /* UTF8 */
|
||||
|
||||
/* Hub specific request */
|
||||
#define UR_GET_BUS_STATE 0x02
|
||||
|
@ -595,9 +596,10 @@ struct usb_device_info {
|
|||
u_int8_t udi_bus;
|
||||
u_int8_t udi_addr; /* device address */
|
||||
usb_event_cookie_t udi_cookie;
|
||||
char udi_product[USB_MAX_STRING_LEN];
|
||||
char udi_vendor[USB_MAX_STRING_LEN];
|
||||
char udi_product[USB_MAX_ENCODED_STRING_LEN];
|
||||
char udi_vendor[USB_MAX_ENCODED_STRING_LEN];
|
||||
char udi_release[8];
|
||||
char udi_serial[USB_MAX_ENCODED_STRING_LEN];
|
||||
u_int16_t udi_productNo;
|
||||
u_int16_t udi_vendorNo;
|
||||
u_int16_t udi_releaseNo;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: usb_subr.c,v 1.122 2005/03/04 05:03:19 mycroft Exp $ */
|
||||
/* $NetBSD: usb_subr.c,v 1.123 2005/05/02 15:32:18 augustss Exp $ */
|
||||
/* $FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $ */
|
||||
|
||||
/*
|
||||
|
@ -39,7 +39,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.122 2005/03/04 05:03:19 mycroft Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.123 2005/05/02 15:32:18 augustss Exp $");
|
||||
|
||||
#include "opt_usbverbose.h"
|
||||
|
||||
|
@ -81,8 +81,9 @@ extern int usbdebug;
|
|||
#endif
|
||||
|
||||
Static usbd_status usbd_set_config(usbd_device_handle, int);
|
||||
Static void usbd_devinfo_vp(usbd_device_handle, char *, size_t, char *,
|
||||
size_t, int);
|
||||
Static void usbd_devinfo_vp(usbd_device_handle dev,
|
||||
char v[USB_MAX_ENCODED_STRING_LEN],
|
||||
char p[USB_MAX_ENCODED_STRING_LEN], int usedev);
|
||||
Static int usbd_getnewaddr(usbd_bus_handle bus);
|
||||
#if defined(__NetBSD__)
|
||||
Static int usbd_print(void *, const char *);
|
||||
|
@ -207,9 +208,9 @@ usbd_trim_spaces(char *p)
|
|||
*e = 0; /* kill trailing spaces */
|
||||
}
|
||||
|
||||
void
|
||||
usbd_devinfo_vp(usbd_device_handle dev, char *v, size_t lv, char *p, size_t lp,
|
||||
int usedev)
|
||||
Static void
|
||||
usbd_devinfo_vp(usbd_device_handle dev, char v[USB_MAX_ENCODED_STRING_LEN],
|
||||
char p[USB_MAX_ENCODED_STRING_LEN], int usedev)
|
||||
{
|
||||
usb_device_descriptor_t *udd = &dev->ddesc;
|
||||
char *vendor = NULL, *product = NULL;
|
||||
|
@ -254,14 +255,15 @@ usbd_devinfo_vp(usbd_device_handle dev, char *v, size_t lv, char *p, size_t lp,
|
|||
product = usb_products[n].productname;
|
||||
}
|
||||
#endif
|
||||
/* There is no need for strlcpy & snprintf below. */
|
||||
if (vendor != NULL && *vendor)
|
||||
strlcpy(v, vendor, lv);
|
||||
strcpy(v, vendor);
|
||||
else
|
||||
snprintf(v, lv, "vendor 0x%04x", UGETW(udd->idVendor));
|
||||
sprintf(v, "vendor 0x%04x", UGETW(udd->idVendor));
|
||||
if (product != NULL && *product)
|
||||
strlcpy(p, product, lp);
|
||||
strcpy(p, product);
|
||||
else
|
||||
snprintf(p, lp, "product 0x%04x", UGETW(udd->idProduct));
|
||||
sprintf(p, "product 0x%04x", UGETW(udd->idProduct));
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -274,15 +276,14 @@ void
|
|||
usbd_devinfo(usbd_device_handle dev, int showclass, char *cp, size_t l)
|
||||
{
|
||||
usb_device_descriptor_t *udd = &dev->ddesc;
|
||||
char vendor[USB_MAX_STRING_LEN];
|
||||
char product[USB_MAX_STRING_LEN];
|
||||
char vendor[USB_MAX_ENCODED_STRING_LEN];
|
||||
char product[USB_MAX_ENCODED_STRING_LEN];
|
||||
int bcdDevice, bcdUSB;
|
||||
char *ep;
|
||||
|
||||
ep = cp + l;
|
||||
|
||||
usbd_devinfo_vp(dev, vendor, sizeof(vendor), product,
|
||||
sizeof(product), 1);
|
||||
usbd_devinfo_vp(dev, vendor, product, 1);
|
||||
cp += snprintf(cp, ep - cp, "%s %s", vendor, product);
|
||||
if (showclass)
|
||||
cp += snprintf(cp, ep - cp, ", class %d/%d",
|
||||
|
@ -1256,10 +1257,13 @@ usbd_fill_deviceinfo(usbd_device_handle dev, struct usb_device_info *di,
|
|||
di->udi_bus = USBDEVUNIT(dev->bus->bdev);
|
||||
di->udi_addr = dev->address;
|
||||
di->udi_cookie = dev->cookie;
|
||||
usbd_devinfo_vp(dev, di->udi_vendor, sizeof(di->udi_vendor),
|
||||
di->udi_product, sizeof(di->udi_product), usedev);
|
||||
usbd_devinfo_vp(dev, di->udi_vendor, di->udi_product, usedev);
|
||||
usbd_printBCD(di->udi_release, sizeof(di->udi_release),
|
||||
UGETW(dev->ddesc.bcdDevice));
|
||||
di->udi_serial[0] = 0;
|
||||
if (usedev)
|
||||
(void)usbd_get_string(dev, dev->ddesc.iSerialNumber,
|
||||
di->udi_serial);
|
||||
di->udi_vendorNo = UGETW(dev->ddesc.idVendor);
|
||||
di->udi_productNo = UGETW(dev->ddesc.idProduct);
|
||||
di->udi_releaseNo = UGETW(dev->ddesc.bcdDevice);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: usbdi.c,v 1.106 2004/10/24 12:52:40 augustss Exp $ */
|
||||
/* $NetBSD: usbdi.c,v 1.107 2005/05/02 15:32:18 augustss Exp $ */
|
||||
/* $FreeBSD: src/sys/dev/usb/usbdi.c,v 1.28 1999/11/17 22:33:49 n_hibma Exp $ */
|
||||
|
||||
/*
|
||||
|
@ -39,7 +39,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.106 2004/10/24 12:52:40 augustss Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.107 2005/05/02 15:32:18 augustss Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
|
@ -1210,13 +1210,19 @@ usbd_get_string(usbd_device_handle dev, int si, char *buf)
|
|||
n = size / 2 - 1;
|
||||
for (i = 0; i < n; i++) {
|
||||
c = UGETW(us.bString[i]);
|
||||
/* Convert from Unicode, handle buggy strings. */
|
||||
if ((c & 0xff00) == 0)
|
||||
if (swap)
|
||||
c = (c >> 8) | (c << 8);
|
||||
/* Encode (16-bit) Unicode as UTF8. */
|
||||
if (c < 0x0080) {
|
||||
*s++ = c;
|
||||
else if ((c & 0x00ff) == 0 && swap)
|
||||
*s++ = c >> 8;
|
||||
else
|
||||
*s++ = '?';
|
||||
} else if (c < 0x0800) {
|
||||
*s++ = 0xc0 | (c >> 6);
|
||||
*s++ = 0x80 | (c & 0x3f);
|
||||
} else {
|
||||
*s++ = 0xe0 | (c >> 12);
|
||||
*s++ = 0x80 | ((c >> 6) & 0x3f);
|
||||
*s++ = 0x80 | (c & 0x3f);
|
||||
}
|
||||
}
|
||||
*s++ = 0;
|
||||
return (USBD_NORMAL_COMPLETION);
|
||||
|
|
Loading…
Reference in New Issue