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

 
 
> Проблема с enumeration при подключенииЕсть RTL-код USB функции, зашиваемый в FPGA, при подключении к хосту начинается процесс енумерации. USB-функции
kornukhin
сообщение Nov 21 2007, 11:17
Сообщение #1





Группа: Новичок
Сообщений: 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. зачем вообще нужно два раза отправлять дескриптор?

Ответьте, пожалуйста, если кто-нибудь сталкивался с чем-нибудь подобным или знает в чем тут дело.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
s868
сообщение Mar 18 2008, 08:40
Сообщение #2





Группа: Участник
Сообщений: 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>?
заранее благодарю.
Go to the top of the page
 
+Quote Post
galjoen
сообщение Mar 18 2008, 10:28
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 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 уж потом.
Go to the top of the page
 
+Quote Post
s868
сообщение Mar 21 2008, 08:33
Сообщение #4





Группа: Участник
Сообщений: 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, а чем либо другим (например джойстиком)?
Go to the top of the page
 
+Quote Post



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

 


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


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