|
|
  |
ПРОВЕДЕНИЕ СТАНДАРТНЫХ ЗАПРОСОВ USB, ПОМОГИТЕ КТО МОЖЕТ!!!!!!!!!! |
|
|
|
Jul 5 2006, 17:16
|
Участник

Группа: Новичок
Сообщений: 19
Регистрация: 30-06-06
Из: Донецк
Пользователь №: 18 488

|
> после того как хост отсылает token IN пакет, после которого устройство должно бы прислать свой дескриптор в качестве пакета данных
Дело в том, что Device требуется время, чтобы сформировать ответный пакет данных на Ваш запрос GetDescriptor, впрочем как и на большинство других запросов. Поскольку на момент получения token IN ответ еще не был заложен в девайсовский буфер передачи, его аппаратура автоматом отфутболивает Host-у NAK. Ваша задача осознать, что это всего-лишь НЕГОТОВНОСТЬ и послать повторный IN-token, а точнее долбить Device IN-ами до тех пор, пока не получите ACK, или какую-либо ошибку, или не вымотаете тайм-аут.
Удачи!
|
|
|
|
|
Jul 6 2006, 10:31
|
Частый гость
 
Группа: Свой
Сообщений: 86
Регистрация: 3-05-06
Пользователь №: 16 717

|
Цитата(AlexBoss @ Jul 5 2006, 21:16)  > после того как хост отсылает token IN пакет, после которого устройство должно бы прислать свой дескриптор в качестве пакета данных
Дело в том, что Device требуется время, чтобы сформировать ответный пакет данных на Ваш запрос GetDescriptor, впрочем как и на большинство других запросов. Поскольку на момент получения token IN ответ еще не был заложен в девайсовский буфер передачи, его аппаратура автоматом отфутболивает Host-у NAK. Ваша задача осознать, что это всего-лишь НЕГОТОВНОСТЬ и послать повторный IN-token, а точнее долбить Device IN-ами до тех пор, пока не получите ACK, или какую-либо ошибку, или не вымотаете тайм-аут.
Удачи! Дело в том, что я именно так и делаю: долблю девайс IN-пакетами, но на них на все приходит NACK, и в конце концов закканчивается время, отведённое драйвером на этот запрос (timeout). Хост так и не получает дескриптор устройства, и как следствие не проходит нормальная конфигурация устройства. Соответственно не получается работать с устройством (записывать на него или читать с него).
|
|
|
|
|
Jul 6 2006, 17:40
|
Участник

Группа: Новичок
Сообщений: 19
Регистрация: 30-06-06
Из: Донецк
Пользователь №: 18 488

|
Ага!!! Ну в таком случае мы с Вами где-то собратья по несчастью. Правда у меня все SetUp транзакции проходят без проблем. Зато похожая проблема возникает при попытке работать с флэшкой в Bulk-Only протоколе. Первая команда (любая) завершается успешно, а ее повтор или любая следующая приводят к "вечному" NAK на этапе чтения результатов из BulkInEP. Проверял командный пакет побитово осциллографом - все на месте и причем на своем! Но увы ............
Что касается Вашей проблемы, попробуте описать свои действия с точностью до байта, начиная с Reset. Может совместными усилиями что-нить и надыбаем.
P.S. И кто у Вас в качестве Device?
|
|
|
|
|
Jul 8 2006, 09:25
|
Частый гость
 
Группа: Свой
Сообщений: 86
Регистрация: 3-05-06
Пользователь №: 16 717

|
В качестве девайса использую флэшку Transcend JetFlash, которая вроде бы как относится к USB Mass Storage Class Bulk-Only Transport.
После RESET'а проходят запросы: SetAddress, GetDeviceDescriptor, ещё раз GetDeviceDescriptor (но с другим значением в поле wLength), GetConfigurationDescriptor, ещё раз GetConfigurationDescriptor (но с другим значением в поле wLength), SetConfiguration, GetStringDescriptor(с индексом 0, т.е. запрос массива кодов LANGID). Все эти запросы вроде проходят нормально, т.е. сосдержимое полей пакетов соответствует спецификации. Только все эти запросы почему-то проходят не с первого раза, а с 3-го, 4-го. То есть последовательность прохождения запроса получается такая:
token setup пакет со стороны хоста data пакет со стороны хоста (в котором и содержится информация о запросе) handshake пакет со стороны устройства (ACK)
token IN пакет со стороны хоста NACK со стороны устройства token IN пакет со стороны хоста NACK со стороны устройства . . . так несколько раз . . token IN пакет со стороны хоста data пакет со стороны устройства (в этом пакете вобщем и содержится дескриптор устройства) handshake со стоорны хоста (ACK)
Далее, после того, как все вышеуказанные запросы проходят, хост посылает запрос GetStringDescriptor(с индексом 1). Этот запрос никак не может пройти и заканчивается таймаутом. Далее запрос GetStringDescriptor(с индексом 2) - тоже таймаут. и так далее...
P.S. Расписывать все запросы по пакетам с точностью до байта ОЧЕНЬ долго
|
|
|
|
|
Jul 10 2006, 10:47
|
Участник

Группа: Новичок
Сообщений: 19
Регистрация: 30-06-06
Из: Донецк
Пользователь №: 18 488

|
Из Вашего описания так-таки и не понятно какие именно >все эти запросы почему-то проходят не с первого раза, а с 3-го, 4-го. Если имеется ввиду, что на один pidSetUp Вы посылаете 3..4 pidIN, то все нормально, т.к.: >token IN пакет со стороны хоста - Давай >NACK со стороны устройства - Не готов! >token IN пакет со стороны хоста - Давай >NACK со стороны устройства - Не готов! . .так несколько раз . >token IN пакет со стороны хоста - Давай >data пакет со стороны устройства (в этом пакете ....) - Получи и отстань!
Если же Вы всю транзакцию целиком (SetUp и за ним куча In-ов) вынуждены повторять по 4..3 раза, то почему умалчиваете о том, чем завершаются неуспешные?
Теперь по поводу String-ов. Не пойму зачем Вам понадобились "Наименование изготовителя" и "Наименование продукта", ведь для нормальной работы они не нужны. Кроме того "Наименование продукта" Вы все равно получите в ответ на Bulk-Only команду INQUIRY. Скорее всего это чисто спортивный интерес. Ну да в конце концов это Ваше дело. Посмотрим как это делает WinXP: SanDisk Cruzer Mini Запрос - 80 06 00 03 00 00 02 00 - Определить длину строки с LANGID Ответ - 04 03 Запрос - 80 06 00 03 00 00 04 00 - Запрос строки с LANGID Ответ - 04 03 09 04 - ID языка Запрос - 80 06 03 03 09 04 02 00 - Определить длину строки с серийным номером Ответ - 2A 03 Запрос - 80 06 03 03 09 04 2A 00 - Запрос строки с серийным номером Ответ - 2A 03 53 00 4E 00 ..... - 2Ah байт - 'SNDK4108742C43B00106'
Generic USB Flash Disk 2.00 Запрос - 80 06 00 03 00 00 02 00 - Определить длину строки с LANGID Ответ - 04 03 Запрос - 80 06 00 03 00 00 04 00 - Запрос строки с LANGID Ответ - 04 03 09 04 - ID языка Запрос - 80 06 03 03 09 04 02 00 - Определить длину строки с серийным номером Ответ - 22 03 Запрос - 80 06 03 03 09 04 22 00 - Запрос строки с серийным номером Ответ - 22 03 31 00 30 00 ..... - 22h байт - '106C113CE5E30CB5' Аналогично на других флэшках. Короче. Вы упомянули, что отправляли "запрос массива кодов LANGID", но не понятно используете ли ID языка в запросах строк с индексом отличным от нуля? Если нет, то как раз в этом и проблема.
Удачи! P.S. Поскольку задачи у нас судя по всему очень похожие, очень интересно, как у Вас заработает Bulk-Only, которого Вам все равно не миновать.
|
|
|
|
|
Aug 31 2006, 07:54
|
Частый гость
 
Группа: Свой
Сообщений: 86
Регистрация: 3-05-06
Пользователь №: 16 717

|
Цитата(AlexBoss @ Jul 10 2006, 14:47)  P.S. Поскольку задачи у нас судя по всему очень похожие, очень интересно, как у Вас заработает Bulk-Only, которого Вам все равно не миновать. Запросы Bulk-Only проходят нормально кроме одного (INQUIRY), который упорно не хочет проходить (устройство постоянно отвечает NAK). Но если в драйвере отключить проведение этого запроса, то конфтгурация устройства проходит без проблем - с флэшкой можно работать (монтируется, читается, пишется).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|