реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ПРОВЕДЕНИЕ СТАНДАРТНЫХ ЗАПРОСОВ USB, ПОМОГИТЕ КТО МОЖЕТ!!!!!!!!!!&#
PAB
сообщение Jul 5 2006, 09:02
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 3-05-06
Пользователь №: 16 717



При отладке USB хост-контроллера возникает следующая проблема: при проведении запроса GetDescriptor устройство отвечает NAK (причем не в начале запроса, а после того как хост отсылает token IN пакет, после которого устройство должно бы прислать свой дескриптор в качестве пакета данных). Запрос SetAddress проходит нормально (хотя не с первого раза), некоторые другие запросы также завершаются успешно. В чем может быть причина такого странного поведения? ПОМОГИТЕ КТО МОЖЕТ!!!!!!!!!!!!!!!! help.gif
Go to the top of the page
 
+Quote Post
AlexBoss
сообщение Jul 5 2006, 17:16
Сообщение #2


Участник
*

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



> после того как хост отсылает token IN пакет, после которого устройство должно бы прислать свой дескриптор в качестве пакета данных

Дело в том, что Device требуется время, чтобы сформировать ответный пакет данных на Ваш запрос
GetDescriptor, впрочем как и на большинство других запросов. Поскольку на момент получения
token IN ответ еще не был заложен в девайсовский буфер передачи, его аппаратура автоматом
отфутболивает Host-у NAK.
Ваша задача осознать, что это всего-лишь НЕГОТОВНОСТЬ и послать повторный IN-token, а точнее долбить Device IN-ами до тех пор, пока не получите ACK, или какую-либо ошибку, или не вымотаете тайм-аут.

Удачи!
Go to the top of the page
 
+Quote Post
PAB
сообщение Jul 6 2006, 10:31
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 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). Хост так и не получает дескриптор устройства, и как следствие не проходит нормальная конфигурация устройства. Соответственно не получается работать с устройством (записывать на него или читать с него).
Go to the top of the page
 
+Quote Post
PAB
сообщение Jul 6 2006, 10:43
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 3-05-06
Пользователь №: 16 717



Может быть стоит увеличить время таймаута? Хотя с другой стороны 5секунд должно хватать на то, чтоб устройство отдало свой дескриптор..... sad.gif
Go to the top of the page
 
+Quote Post
-=Sergei=-
сообщение Jul 6 2006, 15:27
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 339
Регистрация: 26-10-04
Пользователь №: 985



Цитата(PAB @ Jul 5 2006, 13:02) *
При отладке USB хост-контроллера возникает следующая проблема: при проведении запроса GetDescriptor устройство отвечает NAK (причем не в начале запроса, а после того как хост отсылает token IN пакет, после которого устройство должно бы прислать свой дескриптор в качестве пакета данных). Запрос SetAddress проходит нормально (хотя не с первого раза), некоторые другие запросы также завершаются успешно. В чем может быть причина такого странного поведения? ПОМОГИТЕ КТО МОЖЕТ!!!!!!!!!!!!!!!! help.gif


Значит по какойто причине контроллер не может подготовить дискрптор к передаче. Либо что то напутали с адресами в токене IN.
Go to the top of the page
 
+Quote Post
AlexBoss
сообщение Jul 6 2006, 17:40
Сообщение #6


Участник
*

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



Ага!!! Ну в таком случае мы с Вами где-то собратья по несчастью. Правда у меня все SetUp транзакции проходят без проблем. Зато похожая проблема возникает при попытке работать с флэшкой в Bulk-Only протоколе. Первая команда (любая) завершается успешно, а ее повтор или любая следующая приводят к "вечному" NAK на этапе чтения результатов из BulkInEP. Проверял командный пакет побитово осциллографом - все на месте и причем на своем! Но увы ............

Что касается Вашей проблемы, попробуте описать свои действия с точностью до байта, начиная с Reset. Может совместными усилиями что-нить и надыбаем.

P.S. И кто у Вас в качестве Device?
Go to the top of the page
 
+Quote Post
PAB
сообщение Jul 8 2006, 09:25
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 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. Расписывать все запросы по пакетам с точностью до байта ОЧЕНЬ долго
Go to the top of the page
 
+Quote Post
AlexBoss
сообщение Jul 10 2006, 10:47
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 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, которого Вам все равно не миновать.
Go to the top of the page
 
+Quote Post
PAB
сообщение Aug 31 2006, 07:54
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 86
Регистрация: 3-05-06
Пользователь №: 16 717



Цитата(AlexBoss @ Jul 10 2006, 14:47) *
P.S. Поскольку задачи у нас судя по всему очень похожие, очень интересно, как у Вас заработает Bulk-Only, которого Вам все равно не миновать.


Запросы Bulk-Only проходят нормально кроме одного (INQUIRY), который упорно не хочет проходить (устройство постоянно отвечает NAK). Но если в драйвере отключить проведение этого запроса, то конфтгурация устройства проходит без проблем - с флэшкой можно работать (монтируется, читается, пишется).
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01491 секунд с 7
ELECTRONIX ©2004-2016