Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Вообще, оно 2 раза дескриптор строки должно запрашивать, 1)чтобы определить langid 2) вро- де бы саму строку.

Отправлено ++ 22 октября 2008 г. 13:34
В ответ на: Ест ьеще вопросец... по USB (+) отправлено <font color=gray>MARS</font> 22 октября 2008 г. 13:05


/*=====================================================================================================*/
static int usb_get_string(struct usb_device *dev, unsigned short langid, unsigned char index, void *buf, int size)
{int i;
int result;
unsigned int pipe;
pipe= usb_rcvctrlpipe(dev, 0);
for (i = 0; i < 3; ++i)
{/* retry on length 0 or stall; some devices are flakey */
result = usb_control_msg(dev, pipe, USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, (USB_DT_STRING << 8) + index, langid, buf, size);
if (!(result == 0 || result == -EPIPE))
break;
}
return result;
}
/*=====================================================================================================*/
static int usb_string_sub(struct usb_device *dev, unsigned int langid,unsigned int index, unsigned char *buf)
{int rc;
/* Try to read the string descriptor by asking for the maximum possible number of bytes */
rc = usb_get_string(dev, langid, index, buf, 255);
/* If that failed try to read the descriptor length, then ask for just that many bytes */
if (rc < 2)
{rc = usb_get_string(dev, langid, index, buf, 2);
if (rc == 2)
rc = usb_get_string(dev, langid, index, buf, buf[0]);
}
if (rc >= 2)
{if (buf[0] < rc)
rc = buf[0];
rc = rc - (rc & 1); /* force a multiple of two */
}
if (rc < 2)
rc = (rc < 0)? rc : -EINVAL;
return rc;
}
/*=====================================================================================================*/
/* returns string length (> 0) or error (< 0) */
static int usb_string(struct usb_device *dev, int index, char *buf, size_t size)
{int r;
unsigned int u, idx;
unsigned char *str;
str= (unsigned char *)usb_buf_1;
if (size <= 0 || !buf || !index)
return -EINVAL;
buf[0] = 0;
/* get langid for strings if it's not yet known */
if (!dev->have_langid)
{if( (r = usb_string_sub(dev, 0, 0, str)) < 0)
{diag_printf ("ошибка чтения дескриптора строки: %d.\n", r); return r;}
if(r < 4) /* if(r >=0) r == strlen(usb_sting) */
{diag_printf ("ошибка: неполный дескриптор строки.\n"); return -EINVAL;}
dev->have_langid = -1;
dev->string_langid = str[2] | (str[3]<< 8);
/* always use the first langid listed */
#ifdef USB_DEBUG
diag_printf ("default language= 0x%04x\n", dev->string_langid);
#endif
}
r = usb_string_sub(dev, dev->string_langid, index, str);
if(r < 0)
{return r;}
size--; /* leave room for trailing NULL char in output buffer */
for(idx = 0, u = 2; u < r; u += 2)
{if (idx >= size)
break;
if (str[u+1]) /* high byte */
buf[idx++] = '?'; /* non ISO-8859-1 character */
else
buf[idx++] = str[u];
}
buf[idx] = 0;
r = idx;
if(str[1] != USB_DT_STRING)
diag_printf("ошибочный тип дескриптора %02x для строки %d (\"%s\")\n", str[1], index, buf);
#ifdef USB_DEBUG
diag_printf("%s> [%s] r=%d \n", __FUNCTION__, buf, r);
#endif
return r;
}



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 123:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru