From db4753e92445d1a6008e8bf6ab6afdfc12ff874a Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Thu, 6 Sep 2007 07:17:54 +0000 Subject: usb stack: add support for standard request get string git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14626 a1c6a512-1295-4272-9138-f99709370657 --- firmware/usbstack/core/utils.c | 51 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'firmware/usbstack/core/utils.c') diff --git a/firmware/usbstack/core/utils.c b/firmware/usbstack/core/utils.c index cd32fb3..d43bd92 100644 --- a/firmware/usbstack/core/utils.c +++ b/firmware/usbstack/core/utils.c @@ -9,6 +9,9 @@ * * Copyright (C) 2007 by Christian Gmeiner * + * Based on linux/drivers/usb/gadget/usbstring.c + * Copyright (C) 2003 David Brownell + * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. * @@ -123,3 +126,51 @@ void into_usb_ctrlrequest(struct usb_ctrlrequest* request) logf(" -> e: %s", extra); } } + +int usb_stack_get_string(struct usb_string* strings, int id, uint8_t* buf) +{ + struct usb_string* tmp; + char* sp, *dp; + int len; + + /* if id is 0, then we need to send back all supported + * languages. In our case we only support one + * language: en-us (0x0409) */ + if (id == 0) { + buf [0] = 4; + buf [1] = USB_DT_STRING; + buf [2] = (uint8_t) 0x0409; + buf [3] = (uint8_t) (0x0409 >> 8); + return 4; + } + + /* look for string */ + for (tmp = strings; tmp && tmp->s; tmp++) { + if (tmp->id == id) { + break; + } + } + + /* did we found it? */ + if (!tmp || !tmp->s) { + return -EINVAL; + } + + len = MIN ((size_t) 126, strlen (tmp->s)); + memset(buf + 2, 0, 2 * len); + + /* convert to utf-16le */ + sp = (char*)tmp->s; + dp = (char*)&buf[2]; + + while (*sp) { + *dp++ = *sp++; + *dp++ = 0; + } + + /* write len and tag */ + buf [0] = (len + 1) * 2; + buf [1] = USB_DT_STRING; + + return buf[0]; +} -- cgit v1.1