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

 
 
> Последовательность пакетов на USB, при подключении клавиатуры через хаб
PAB
сообщение Feb 1 2008, 09:42
Сообщение #1


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

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



Есть такая ситуация: при подключении USB-клавиатуры через USB2.0 хаб к хост-контроллеру версии 1.1 клавиатура не работает (не проходит даже нумерация устройства); при прямом подключении клавиатуры к хост-контроллеру всё ОК. В книге "Universal Serial Bus System Architecture" прочитал, что при подключении USB2.0 хаба к 1.1 хост-контроллеру, хаб работает в full-speed mode (т.е. как 1.1 хаб): для передачи данных через хаб low-speed устройству (в моём случае это клавиатура) хост-контроллер должен перед каждым отправляемым пакетом выдавать преамбулу. Проверил это на логическом анализаторе - так оно и есть: преамбула -> token пакет -> преамбула -> пакет данных -> ожидание хэндшэйка от устройства. Но token пакет и пакет данных почему то через хаб не проходят (на upstream порте и преамбулы и пакеты есть, на downstream порте их уже нет crying.gif ). Соответственно устройство ничего не отвечает и запрос SetAddress не проходит. В чём может быть причина?????

P.S. флэшка через тот же хаб и с тем же хост-контроллером работает нормально
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
galjoen
сообщение Feb 1 2008, 12:59
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(PAB @ Feb 1 2008, 12:42) *
Проверил это на логическом анализаторе - так оно и есть: преамбула -> token пакет -> преамбула -> пакет данных -> ожидание хэндшэйка от устройства. Но token пакет и пакет данных почему то через хаб не проходят (на upstream порте и преамбулы и пакеты есть, на downstream порте их уже нет crying.gif ).

Вы уверены, что пакеты от хоста идут именно к устройству? М.б. это хост с хабом обменивается? Повесьте на обмен с хабом какой нибудь подглядыватель. Мне лично SnoopyPro нравится. Там всё видно будет.
Даже если клавиатурных запросов не увидите - всё равно понять, что хаб делает можно. В частности он должен говорить, что к нему устройство подцепилось.
Цитата(PAB @ Feb 1 2008, 12:42) *
Соответственно устройство ничего не отвечает и запрос SetAddress не проходит. В чём может быть причина?????

SetAddress это не первый запрос. До него по адресу=0 дескрипторы запрашиваются.
Go to the top of the page
 
+Quote Post
PAB
сообщение Feb 1 2008, 14:11
Сообщение #3


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

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



Цитата(galjoen @ Feb 1 2008, 15:59) *
Вы уверены, что пакеты от хоста идут именно к устройству? М.б. это хост с хабом обменивается? Повесьте на обмен с хабом какой нибудь подглядыватель. Мне лично SnoopyPro нравится. Там всё видно будет.
Даже если клавиатурных запросов не увидите - всё равно понять, что хаб делает можно. В частности он должен говорить, что к нему устройство подцепилось.


Я уверен, что пакеты идут к low-speed устройству (поскольку они предваряются преамбулами). В моём случае только одно low-speed устройство - клавиатура. Программный анализатор протокола увы не удастся подцепить поскольку всё это хозяйство проверяется на машине, работающей под линуксом.
По поводу запроса SetAddress: я и не утверждаю, что это первый запрос к устройству; я говорю лишь о том, что ситуация, когда в хаб передаются пакеты с преамбулами и до клавиатуры эти пакеты не доходят, происходит при запросе SetAddress. Возможна ли ситуация, когда этот запрос является первым?
Go to the top of the page
 
+Quote Post
galjoen
сообщение Feb 3 2008, 19:19
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(PAB @ Feb 1 2008, 17:11) *
Программный анализатор протокола увы не удастся подцепить поскольку всё это хозяйство проверяется на машине, работающей под линуксом.

Под линуксом-то как раз никаких доп. программ не надо. Он сам отлично весь протокол показывает.
Цитата(PAB @ Feb 1 2008, 17:11) *
По поводу запроса SetAddress: я и не утверждаю, что это первый запрос к устройству; я говорю лишь о том, что ситуация, когда в хаб передаются пакеты с преамбулами и до клавиатуры эти пакеты не доходят, происходит при запросе SetAddress.

SetAddress отличается от всех прочих запросов:
1. Хост шлёт SETUP по адресу=0.
2. Устойство отвечает ACK.
3. Хост шлёт IN1 по адресу=0
4. Устойство отвечает ACK (м.б. после нескольких NAK).
5. Устройство устанавливает свой адрес = 3-му байту в пакете SETUP. И после этого сразу-же отвечает токо по нему.
6. Хост тут-же шлёт пакет SETUP уже по новому адресу. И устройсво должно ему ACK ответить.
Если не ответит - хост опять SetAddress шлёт. И так 3 раз. Потом устройство неисправным признаёт.
У вас наверное новый адрес медленно устанавливается. Хост уже по новому адресу SETUP шлёт, а устройство не отвечает т.к. адрес=0 имеет.
Цитата(PAB @ Feb 1 2008, 17:11) *
Возможна ли ситуация, когда этот запрос является первым?

Невозможна. 1-й запрос - дескриптор DEVICE.
Цитата(PAB @ Feb 1 2008, 17:11) *
В моём случае только одно low-speed устройство - клавиатура.

А что это за клавиатура такая - low-speed??? Никогда таких не встречал! Отпишите - интересно.
Go to the top of the page
 
+Quote Post
PAB
сообщение Feb 5 2008, 18:31
Сообщение #5


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

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



Цитата(galjoen @ Feb 3 2008, 22:19) *
Под линуксом-то как раз никаких доп. программ не надо. Он сам отлично весь протокол показывает.


да, протокол он показывает, но на уровне запросов, а не на уровне пакетов (а хотелось бы посмотреть именно последовательность пакетов т.к. в них могут быть какие-нибудь ошибки поскольку хост не покупной, а свой на ПЛИСине )) )



Цитата(galjoen @ Feb 3 2008, 22:19) *
SetAddress отличается от всех прочих запросов:
1. Хост шлёт SETUP по адресу=0.
2. Устойство отвечает ACK.
3. Хост шлёт IN1 по адресу=0
4. Устойство отвечает ACK (м.б. после нескольких NAK).
5. Устройство устанавливает свой адрес = 3-му байту в пакете SETUP. И после этого сразу-же отвечает токо по нему.
6. Хост тут-же шлёт пакет SETUP уже по новому адресу. И устройсво должно ему ACK ответить.
Если не ответит - хост опять SetAddress шлёт. И так 3 раз. Потом устройство неисправным признаёт.
У вас наверное новый адрес медленно устанавливается. Хост уже по новому адресу SETUP шлёт, а устройство не отвечает т.к. адрес=0 имеет.


Может я чего не так понимаю, но из моего опыта запрос SetAddress проходит так:
1. Хост шлёт SETUP пакет по адресу=0
2. Хост шлёт пакет данных, в котором записан присваиваемый адрес устройства
3. Устройство отвечает ACK (может, не с первого раза, после нескольких NAKов)
4. Хост шлёт token in пакет по адресу 0
5. Устройство отвечает пакетом нулевой длины
6. Хост отправляет ACK

После этого к девайсу можно обращаться по назначенному адресу

Цитата(galjoen @ Feb 3 2008, 22:19) *
А что это за клавиатура такая - low-speed??? Никогда таких не встречал! Отпишите - интересно.


Самая обычная клавиатура Genius. Я НИКОГДА не встречал USB клавиатур, работающих на full-speed.

P.S. Мою первоначальную проблему удалось решить. Проблема была в том, что я (то есть хост) неправильно формировал преамбулу (к преамбуле добавлял последовательностью end-of-packet = 2*se0 + j - я думал, что преамбула такой же пакет как и все другие).
Go to the top of the page
 
+Quote Post
galjoen
сообщение Feb 6 2008, 12:50
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(PAB @ Feb 5 2008, 21:31) *
Может я чего не так понимаю, но из моего опыта запрос SetAddress проходит так:
1. Хост шлёт SETUP пакет по адресу=0
2. Хост шлёт пакет данных, в котором записан присваиваемый адрес устройства
3. Устройство отвечает ACK (может, не с первого раза, после нескольких NAKов)
4. Хост шлёт token in пакет по адресу 0
5. Устройство отвечает пакетом нулевой длины
6. Хост отправляет ACK

После этого к девайсу можно обращаться по назначенному адресу

Прошу прощения за мою ошибку. Насчёт SetAdress были неправы ни вы ни я.
Вот правильная последовательность:
1. Хост шлёт маркер SETUP с пакетом данных 8 байт по адресу=0 (присваевыемый адрес в нём =3 байту данных).
2. Устройство отвечает ACK (NAK в ответ на SETUP слать нельзя!).
3. Хост шлёт маркер IN по адресу 0.
4. Устройство отвечает маркером DATA1 с пакетом данных нулевой длины (может, не с первого раза, после нескольких NAKов на IN).
5. Хост отправляет ACK.

После этого хост сразу-же шлёт маркер SETUP с пакетом данных по новому адресу.
Думаю, что теперь насчёт SetAddress мы пришли к консенсусу!

Цитата(PAB @ Feb 5 2008, 21:31) *
да, протокол он показывает, но на уровне запросов, а не на уровне пакетов (а хотелось бы посмотреть именно последовательность пакетов т.к. в них могут быть какие-нибудь ошибки поскольку хост не покупной, а свой на ПЛИСине )) )

Честно говоря о том, что существуют программы, показывающие USB протокол на уровне маркеров и пакетов, я даже и не подозревал. Я думал, что это только аппаратным анализатором можно посмотреть. Может порекомендуете где такую программу взять? Мне была-бы очень полезна. Пусть не под линукс, пусть под Win.
Заранее благодарен.
Go to the top of the page
 
+Quote Post



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

 


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


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