|
Проблема с enumeration при подключенииЕсть RTL-код USB функции, зашиваемый в FPGA, при подключении к хосту начинается процесс енумерации. USB-функции |
|
|
|
Nov 21 2007, 11:17
|
Группа: Новичок
Сообщений: 8
Регистрация: 5-06-07
Пользователь №: 28 186

|
Есть RTL-код USB функции, зашиваемый в FPGA, при подключении к хосту начинается процесс енумерации. Выполняется следующая последовательность: 1. setup-data0(get_descriptor)-ack 2. in-data1-ack 3. out-data1(null packet)-ack 4. reset line 5. setup-data0(set_address)-ack 6. in-data1(null packet)-ack 7. setup(по присвоенному адресу 0x3)-data0(get_descriptor)-ack
На следующем шаге начинаются проблемы 8. in(address-0x3)-data1 - ... Хост не отвечает подтверждением на отправленный ему дескриптор. Смотрел на осциллографе - пакет правильный, PID на месте, CRC сходится, межпакетный интервал - тоже. При этом, если вместо дескриптора отправить ему нулевой пакет данных, то подтверждение появится и перейдем к шагу 9.
9. out-data1(null packet)-ack
Из этого возникают следующие вопросы: 1. точно ли в п.8 нужно отправлять дескриптор 2. зачем хост отвечает подтверждением на нулевой пакет и продолжает процесс енумерации, если требовал дескриптор 3. зачем вообще нужно два раза отправлять дескриптор?
Ответьте, пожалуйста, если кто-нибудь сталкивался с чем-нибудь подобным или знает в чем тут дело.
|
|
|
|
|
 |
Ответов
|
Mar 18 2008, 08:40
|
Группа: Участник
Сообщений: 14
Регистрация: 28-12-07
Пользователь №: 33 700

|
спасибо большое vmp (Дата Nov 21 2007, 14:33) за лог, очень помогло. возникли вопросики касательно некоторых моментов: 1. касательно фрагмента ______________________________________________________________________________ Container title<GetDescriptor (Configuration)> device<1> endpoint<0> status<OK> speed<HS> time<4.408 958 750> Transaction type<SETUP> device<1> endpoint<0> status<ACK> speed<HS> time<4.408 958 750> Packet id<SETUP> devAddr<1> epNum<0> crc5<0x1D> speed<HS> time<4.408 958 750> Packet id<DATA0> length<8> data<80 06 00 02 00 00 FF 00> crc16<0xA4E9> speed<HS> time<4.408 959 083> Packet id<ACK> speed<HS> time<4.408 959 567> ConsecutiveTransaction count<216> type<IN> device<1> endpoint<0> status<NAK> speed<HS> time<4.408 963 050> Transaction type<IN> device<1> endpoint<0> status<ACK> speed<HS> time<4.409 551 517> Packet id<IN> devAddr<1> epNum<0> crc5<0x1D> speed<HS> time<4.409 551 517> Packet id<DATA1> length<32> data<09 02 20 00 01 01 00 80 64 09 04 00 00 02 08 06 50 00 07 05 81 02 00 02 00 07 05 02 02 00 02 00> crc16<0x434A> speed<HS> time<4.409 551 833> Packet id<ACK> speed<HS> time<4.409 552 883> Transaction type<OUT> device<1> endpoint<0> status<ACK> speed<HS> time<4.409 555 850> Packet id<OUT> devAddr<1> epNum<0> crc5<0x1D> speed<HS> time<4.409 555 850> Packet id<DATA1> length<0> crc16<0x0000> speed<HS> time<4.409 556 167> Packet id<ACK> speed<HS> time<4.409 556 500> ______________________________________________________________________________
как я понимаю, осуществляется запрос на дескриптор конфигурации, длина которого составляет 9байт судя по документации. до этого приходил аналогичный запрос на длину 9байт (и они были отправлены - все согласно штатному расписанию усб), а теперь он снова пришел, но уже ожидается 256 байт. (1-й вопрос: почему отправляется повторный запрос 80 06 00 02 00 00 FF 00 и каков формат ответа на него)
2. также непонятно, почему на запрос 9-байтного дескриптора отправляется ответ не 9 байт, а 32 (!). я смотрел исходники на ИАРе и там тоже почему-то этот дескриптор был МАЛО ТОГО что длинее 9байт, да еще и имел в своем составе другие дескрипторы: #pragma data_alignment=4 const Int8U UsbStandardConfigurationDescriptor[] = { sizeof(UsbStandardConfigurationDescriptor_t), UsbDescriptorConfiguration, (1*sizeof(UsbStandardConfigurationDescriptor_t)+ 1*sizeof(UsbStandardInterfaceDescriptor_t)+ 2*sizeof(UsbStandardEpDescriptor_t)), (1*sizeof(UsbStandardConfigurationDescriptor_t)+ 1*sizeof(UsbStandardInterfaceDescriptor_t)+ 2*sizeof(UsbStandardEpDescriptor_t)) >> 8, 1, 1, 0, UsbConfigurationCommmonAttr, UsbConfigPower_mA(100), sizeof(UsbStandardInterfaceDescriptor_t), UsbDescriptorInterface, 0, 0, 2, UsbDeviceClassStorage, MscSubClassScsi, MscProtocolBulkOnly, 0, sizeof(UsbStandardEpDescriptor_t), UsbDescriptorEp, UsbEpIn(BulkInEp>>1), UsbEpTransferBulk, BulkInEpMaxSize, BulkInEpMaxSize>>8, 0, sizeof(UsbStandardEpDescriptor_t), UsbDescriptorEp, UsbEpOut(BulkOutEp>>1), UsbEpTransferBulk, BulkOutEpMaxSize, BulkOutEpMaxSize>>8, 0, 0, };
============ но простите, UsbStandardInterfaceDescriptor и UsbStandardEpDescriptor должны по идее отправляться на запросы типа 80 06 00 04 .... и на 80 06 00 05 в ОБЩЕМ НЕПОНЯТНО (((
2-й вопрос: почему UsbStandardInterfaceDescriptor и UsbStandardEpDescriptor выдаются на запрос UsbStandardConfigurationDescriptor а не на свои индивидуальные?
3. в моей программе выдаются ответы на запросы, согласно логу энумерации флешки (на XPsp1 на high speed) и до приведеного выше момента (включительно) они совпадают. но после этого вместо запроса Packet id<DATA0> length<8> data<80 06 00 03 00 00 FF 00> у меня появляется запрос <80 06 00 06 00 00 0a 00> на уточняющий дескриптор устройства.... 3-й вопрос: что мне ответить на запрос <80 06 00 06 00 00 0a 00>? заранее благодарю.
|
|
|
|
|
Mar 18 2008, 10:28
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(s868 @ Mar 18 2008, 11:40)  ============ но простите, UsbStandardInterfaceDescriptor и UsbStandardEpDescriptor должны по идее отправляться на запросы типа 80 06 00 04 .... и на 80 06 00 05 в ОБЩЕМ НЕПОНЯТНО ((( Таких запросов в USB не бывает. Цитата(s868 @ Mar 18 2008, 11:40)  2-й вопрос: почему UsbStandardInterfaceDescriptor и UsbStandardEpDescriptor выдаются на запрос UsbStandardConfigurationDescriptor а не на свои индивидуальные? См. выше. full speed режим имеет запросы DEVICE=1, CONFIGURATION=2, STRING=3 и всё. Поэтому обычно CONFIGURATION сначала 4 байта запрашивают чтоб общую длину узнать (она в 3..4 байтах), а потом с этой длиной запрос делают.( В W98 не так было. Там сразу > килобайта запрашивали. А в вашем случае почему то FF запрашивает, что ОЧЕНЬ странно.) Это чтоб все дескрипторы всех интерфейсов, EP, классов (HID, MassStorage и т.п.), присоединённые дескрипторы и т.д. и т.д. получить. А в high speed ещё запрос =6 добавляется. Цитата(s868 @ Mar 18 2008, 11:40)  3. в моей программе выдаются ответы на запросы, согласно логу энумерации флешки (на XPsp1 на high speed) и до приведеного выше момента (включительно) они совпадают. но после этого вместо запроса Packet id<DATA0> length<8> data<80 06 00 03 00 00 FF 00> Это запрос стринга. В смысле на каком языке у вас стринги написаны. Хотя тоже длина =FF почему то??? Раз его не запросил - до этого что то не поняли. Цитата(s868 @ Mar 18 2008, 11:40)  у меня появляется запрос <80 06 00 06 00 00 0a 00> на уточняющий дескриптор устройства.... 3-й вопрос: что мне ответить на запрос <80 06 00 06 00 00 0a 00>? заранее благодарю. Это high speed запрос. Рекомендую сначала в режиме full speed работы добится. А high speed уж потом.
|
|
|
|
|
Mar 21 2008, 08:33
|
Группа: Участник
Сообщений: 14
Регистрация: 28-12-07
Пользователь №: 33 700

|
galjoen, благодарю за ответ. еще вопросик появился. мое устройство сейчас выдает ответы на первые стандартные запросы, согласно логу энумерации флешки, приведеному во втором посте этой ветки. в общем после этого РС видит девайс как ЗАПОМИНАЮЩЕЕ УСТРОЙСТВО ДЛЯ USB. ответы на запросы давались следующие (после того как устройство было адресовано):
Reciver request 80 06 00 02 00 00 09 00 (standart configuration descriptor) // Prepare to respond <09 02 12 00 01 01 00 80 64>
Reciver request 80 06 00 03 00 00 ff 00(<GetDescriptor (String lang IDs)>) // Prepare to respond <04 03 09 04>
Reciver request 80 06 03 03 09 04 ff 00<GetDescriptor (String iSerialNumber)> // Prepare to respond <1A 03 31 00 39 00 36 00 42 00 30 00 41 00 30 00 30 00 30 00 39 00 36 00 36 00>
Reciver request 80 06 00 02 00 00 ff 00 GetDescriptor (Configuration) // Prepare to respond <09 02 20(12) 00 01 01 00 80 64 09 04 00 00 02(00) 08 06 50 00
вопрос - где и что в ответах на запросы нужно поменять, чтоб РС увидел девайс не ЗАПОМИНАЮЩИМ УСТРОЙСТВОМ ДЛЯ USB, а чем либо другим (например джойстиком)?
|
|
|
|
Сообщений в этой теме
kornukhin Проблема с enumeration при подключенииЕсть RTL-код USB функции, зашиваемый в FPGA, при подключении к хосту начинается процесс енумерации. USB-функции Nov 21 2007, 11:17 vmp Есть логи энумерации флешки, снятые аппаратным ана... Nov 21 2007, 11:33 kornukhin Спасибо за логи, но вопрос заключается не в том, к... Nov 21 2007, 16:12 Седой По моему нужно сделать FAQ по USB и занести туда п... Nov 21 2007, 21:12 kornukhin Всем спасибо за помощь - натолкнули на решенеие.
... Nov 22 2007, 08:47  Седой Цитата"4. After receiving the first 8 bytes o... Nov 23 2007, 20:46   galjoen Цитата(s868 @ Mar 21 2008, 11:33) Reciver... Mar 21 2008, 11:12    s868 Цитата(galjoen @ Mar 21 2008, 15:12) ....... Mar 21 2008, 12:09     galjoen Цитата(s868 @ Mar 21 2008, 15:09) это сде... Mar 21 2008, 14:27
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|