Change USB strings handling code

This commit add an extra field to the _usbd_device, that allows to
keep track of the number of USB strings  which allows simplify
boundaries checking code in usb_standard_get_descriptor.

This commit also changes the index base for strings in
usb_standard_get_descriptor which allows to get rid of necessity to
have a dummy one-character string in a strings array.
This commit is contained in:
Andrey Smirnov 2012-11-06 16:46:55 -08:00
parent 74405de4a5
commit 7a5da60e26
4 changed files with 16 additions and 13 deletions

View File

@ -38,7 +38,7 @@ extern u8 usbd_control_buffer[];
extern int usbd_init(const usbd_driver *driver,
const struct usb_device_descriptor *dev,
const struct usb_config_descriptor *conf,
const char **strings);
const char **strings, int num_strings);
extern void usbd_set_control_buffer_size(u16 size);
extern void usbd_register_reset_callback(void (*callback)(void));

View File

@ -45,12 +45,14 @@ u8 usbd_control_buffer[128] __attribute__((weak));
*/
int usbd_init(const usbd_driver *driver,
const struct usb_device_descriptor *dev,
const struct usb_config_descriptor *conf, const char **strings)
const struct usb_config_descriptor *conf,
const char **strings, int num_strings)
{
_usbd_device.driver = driver;
_usbd_device.desc = dev;
_usbd_device.config = conf;
_usbd_device.strings = strings;
_usbd_device.num_strings = num_strings;
_usbd_device.ctrl_buf = usbd_control_buffer;
_usbd_device.ctrl_buf_len = sizeof(usbd_control_buffer);

View File

@ -29,6 +29,7 @@ extern struct _usbd_device {
const struct usb_device_descriptor *desc;
const struct usb_config_descriptor *config;
const char **strings;
int num_strings;
u8 *ctrl_buf; /**< Internal buffer used for control transfers */
u16 ctrl_buf_len;

View File

@ -90,7 +90,7 @@ static u16 build_config_descriptor(u8 index, u8 *buf, u16 len)
static int usb_standard_get_descriptor(struct usb_setup_data *req,
u8 **buf, u16 *len)
{
int i;
int i, index;
struct usb_string_descriptor *sd;
switch (req->wValue >> 8) {
@ -105,16 +105,20 @@ static int usb_standard_get_descriptor(struct usb_setup_data *req,
case USB_DT_STRING:
sd = (struct usb_string_descriptor *)_usbd_device.ctrl_buf;
/* Send sane Language ID descriptor... */
if ((req->wValue & 0xff) == 0)
sd->wData[0] = 0x409;
index = (req->wValue & 0xff) - 1;
if (!_usbd_device.strings)
return 0; /* Device doesn't support strings. */
/* Check that string index is in range. */
for (i = 0; i <= (req->wValue & 0xff); i++)
if (_usbd_device.strings[i] == NULL)
return 0;
if (index >= _usbd_device.num_strings)
return 0;
sd->bLength = strlen(_usbd_device.strings[req->wValue & 0xff])
* 2 + 2;
sd->bLength = strlen(_usbd_device.strings[index]) * 2 + 2;
sd->bDescriptorType = USB_DT_STRING;
*buf = (u8 *)sd;
@ -122,11 +126,7 @@ static int usb_standard_get_descriptor(struct usb_setup_data *req,
for (i = 0; i < (*len / 2) - 1; i++)
sd->wData[i] =
_usbd_device.strings[req->wValue & 0xff][i];
/* Send sane Language ID descriptor... */
if ((req->wValue & 0xff) == 0)
sd->wData[0] = 0x409;
_usbd_device.strings[index][i];
return 1;
}