return correct length of LangID string to host

This commit is contained in:
heyuanjie87 2013-05-30 18:26:52 +08:00
parent 3f74a95663
commit 376a08d89a
1 changed files with 6 additions and 6 deletions

View File

@ -100,13 +100,13 @@ static rt_err_t _get_string_descriptor(struct udevice* device, ureq_t setup)
str_desc.type = USB_DESC_TYPE_STRING; str_desc.type = USB_DESC_TYPE_STRING;
index = setup->value & 0xFF; index = setup->value & 0xFF;
if(index > USB_STRING_INTERFACE_INDEX) if (index > USB_STRING_INTERFACE_INDEX)
{ {
rt_kprintf("unknown string index\n"); rt_kprintf("unknown string index\n");
dcd_ep_stall(device->dcd, 0); dcd_ep_stall(device->dcd, 0);
return -RT_ERROR; return -RT_ERROR;
} }
if(index == 0) if (index == 0)
{ {
str_desc.bLength = 4; str_desc.bLength = 4;
str_desc.String[0] = 0x09; str_desc.String[0] = 0x09;
@ -117,14 +117,14 @@ static rt_err_t _get_string_descriptor(struct udevice* device, ureq_t setup)
len = rt_strlen(device->str[index]); len = rt_strlen(device->str[index]);
str_desc.bLength = len*2 + 2; str_desc.bLength = len*2 + 2;
for(i=0; i<len; i++) for (i=0; i<len; i++)
{ {
str_desc.String[i*2] = device->str[index][i]; str_desc.String[i*2] = device->str[index][i];
str_desc.String[i*2 + 1] = 0; str_desc.String[i*2 + 1] = 0;
} }
} }
if(setup->length > len) if (setup->length > str_desc.bLength)
len = str_desc.bLength; len = str_desc.bLength;
else else
len = setup->length; len = setup->length;
@ -149,7 +149,7 @@ static rt_err_t _get_descriptor(struct udevice* device, ureq_t setup)
RT_ASSERT(device != RT_NULL); RT_ASSERT(device != RT_NULL);
RT_ASSERT(setup != RT_NULL); RT_ASSERT(setup != RT_NULL);
if(setup->request_type == USB_REQ_TYPE_DIR_IN) if (setup->request_type == USB_REQ_TYPE_DIR_IN)
{ {
switch(setup->value >> 8) switch(setup->value >> 8)
{ {
@ -250,7 +250,7 @@ static rt_err_t _set_interface(struct udevice* device, ureq_t setup)
setting = intf->curr_setting; setting = intf->curr_setting;
/* start all endpoints of the interface alternate setting */ /* start all endpoints of the interface alternate setting */
for(i=setting->ep_list.next; i != &setting->ep_list; i=i->next) for (i=setting->ep_list.next; i != &setting->ep_list; i=i->next)
{ {
ep = (uep_t)rt_list_entry(i, struct uendpoint, list); ep = (uep_t)rt_list_entry(i, struct uendpoint, list);
dcd_ep_stop(device->dcd, ep); dcd_ep_stop(device->dcd, ep);