Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: USB host  (Прочитано 29300 раз)
0 Пользователей и 1 Гость смотрят эту тему.
WWX
Постоялец

ru
Offline Offline

« : 11-10-2018 10:41 » 

Доброго времени суток.

Требуется подключить к некоторой плате (имеющей USB 2.0 host контроллер) USB Mass Storage.
На Full-speed всё работает, а вот на High-speed начинаются проблемы.
1. Обнаружилось, что после инициализации хоста перед энумерацией требуется некоторая задержка. Так и должно быть?
2. (Самое важное) На одной из имеющихся флешек не проходит энумерация даже с этой задержкой. Запрос GET_DESCRIPTOR проходит, а SET_ADDRESS завершается NAK'ом на SETUP (именно на SETUP!) фазе.
Такого быть не должно в принципе, но если происходит, то что это может означать?
Может я слишком быстро шлю запросы, т. к. миллисекундные задержки между запросами как-бы решают проблему?

Заранее спасибо.
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 11-10-2018 15:48 » 

таймауты расписаны в "Universal Serial Bus Specification Revision 2.0"
"7.1.7.3 Connect and Disconnect Signaling" до "7.1.7.7 Resume"
попробуйте сравнить с вашими, может правда рано делаете запросы? там вроде 10мс после сброса требуется?

еще вот тут выжимка, посмотрите
https://blogs.msdn.microsoft.com/usbcoreblog/2009/10/30/how-does-usb-stack-enumerate-a-device/
и вот тут неплохая была https://www.beyondlogic.org/usbnutshell/usb6.shtml

PS ошибки в пакетах не могут быть? кабель? порт?
« Последнее редактирование: 12-10-2018 12:21 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 11-10-2018 15:58 » 

еще в спецификации таблицу по таймаутам посмотрите. там может даже нагляднее.
Table 7-14. Device Event Timings
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WWX
Постоялец

ru
Offline Offline

« Ответ #3 : 15-10-2018 08:06 » 

Спасибо за быстрый ответ (самому, к сожалению, не всегда получается быстро отвечать...).

Перечитал про таймауты. Вроде всё выдерживается.

Более подробное описание того, что происходит на шине:

H: SOF - 134.616 us
Статус фаза от предыдущего запроса (GET_DEVICE_DESCRIPTOR):
H: OUT - 139.716 us
H: DATA1 - 140.132 us
D: ACK - 140.566 us
Сетап фаза нового запроса (SET_ADDRESS):
H: SETUP - 145.032 us
H: DATA0 - 145.450 us
D: NAK - 146.000 us

Как видно, перед началом нового запроса проходит более 4 мкс.
(А вот если добавить ещё 2 мкс, то всё проходит.)

На обычном PC временные промежутки в разы больше.

Цитата
PS ошибки в пакетах не могут быть? кабель? порт?

Сами пакеты без ошибок (если выдерживать таймаут после сброса (сейчас я выдерживаю вообще 1 с.)). Кабеля вроде нормальные (фирменные от анализатора). А с портом что может быть не так?
« Последнее редактирование: 15-10-2018 11:59 от WWX » Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 15-10-2018 12:38 » 

а bInterval для этой control endpoint - сколько стоит?
Цитата
For high-speed bulk/control OUT endpoints, the bInterval must specify the maximum NAK rate of the endpoint. A value of 0 indicates the endpoint never NAKs. Other values indicate at most 1 NAK each bInterval number of microframes. This value must be in the range from 0 to 255.
порт - может подгорел слегка, данные не доходят. но вряд ли это бы проявлялось только в одном месте...
« Последнее редактирование: 15-10-2018 12:42 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WWX
Постоялец

ru
Offline Offline

« Ответ #5 : 15-10-2018 14:10 » 

Это control endpoint под номером 0. Если я ничего не путаю, её нет в цепочке дескрипторов, выдаваемой по запросу GET_DESCRIPTOR_CONFIGURATION.
В любом случае до этого места не доходит, т. к. валится на запросе SET_ADDRESS (и только после него должен быть GET_DESCRIPTOR_CONFIGURATION).
Другие имеющиеся флешки (в т. ч. та, с которой должно работать конечное устройство) энумерацию проводят нормально, и не NAK'ают в ответ на SETUP (хотя вообще NAK'ов много - но это стандартом допускается).

Сейчас допиливаю обработку ошибок (её в любом случае нужно делать). Надеюсь, что после этого будет работать с любой флешкой.
В каком-то смысле хорошо, что проявляется ошибка (есть на чём проверить обработку ошибок), но хотелось бы понять кто не прав, ведь устройство не должно NAK'ать в ответ на SETUP (это вроде бы нарушение стандарта). Либо флешка тормознутая попалась (хоть и написано Ultra Speed), либо я что-то не так делаю (знать бы только что...).
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 15-10-2018 20:08 » 

а возможно надо просто перезапросить позже? в конце концов
Цитата
An endpoint can inform the host that it is busy by responding with NAK....
и для Builk -
Цитата
NAK indicates that the data was received without error but that the host should resend the data because
the function was in a temporary condition preventing it from accepting the data (e.g., buffer full).
с другой стороны
Цитата
8.4.5.4 Function Response to a SETUP Transaction
SETUP defines a special type of host-to-function data transaction that permits the host to initialize an
endpoint’s synchronization bits to those of the host. Upon receiving a SETUP token, a function must
accept the data. A function may not respond to a SETUP token with either STALL or NAK and the
receiving function must accept the data packet that follows the SETUP token. If a non-control endpoint
receives a SETUP token, it must ignore the transaction and return no response.
и в USB in a NutShell пишут что
Цитата
Functions cannot issue a STALL or NAK packet in response to a setup packet.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WWX
Постоялец

ru
Offline Offline

« Ответ #7 : 16-10-2018 08:13 » 

Цитата
а возможно надо просто перезапросить позже?
Ну, когда закончу обработку ошибок, тогда будет ясно, прокатит ли. Но всё равно как-то странно.

Что характерно, контроллер генерит запрос на прерывание не по получению NAK'а, а по возникновению ошибки. Хотя на шине я чётко вижу именно NAK, а других ошибок нет.

Цитата
и для Builk
Для Bulk то понятно, но у меня Control EP 0.

Цитата
с другой стороны
Вот это и странно: стандартное устройство себя так ведёт (Transcend).
Обычный PC условно нормально с ней работает, хотя запросы при энумерации шлёт значительно реже, чем я.
(Условно нормально, потому что там много ошибок на более высоком уровне в протоколе работы с Mass Storage, но, вроде бы, многие флешки этим грешат, а для пользователя это абсолютно прозрачно, т. к. ошибки корректируются.)
Записан
WWX
Постоялец

ru
Offline Offline

« Ответ #8 : 19-10-2018 10:31 » 

И ещё вопрос (чтобы не создавать новую тему).

Сейчас для работы с флешкой я использую следующую последовательность SCSI команд:

REQUEST SENSE
READ CAPACITY 10 <----- Завершается ошибкой
REQUEST SENSE <----- Получаю "пояснительные данные" из-за ошибки в предыдущей команде
READ CAPACITY 10 <----- Начиная с этой команды всё работает нормально
READ 10
... (дальше всё нормально)

В "пояснительных данных" вижу следующее:
Sense Key = 0x06
Additional Sense Code (Mandatory) = 0x28
Additional Sense Code Qualifier (Mandatory) = 0x00

Что согласно таблице (из документа usbmass-ufi10.pdf) означает:
Цитата
NOT READY TO READY TRANSITION - MEDIA CHANGED

Так и должно быть?
(Я имею в виду завершение с ошибкой первой полезной команды.)

Что характерно, практически тоже самое наблюдается на шине, где хостом является обычный PC (как под управлением Windows или Linux, так и под BIOS'ом (если я понятно выразился)).
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 20-10-2018 14:28 » 

я не знаю А черт его знает... при любой флешке такое?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WWX
Постоялец

ru
Offline Offline

« Ответ #10 : 22-10-2018 07:17 » 

У меня в распоряжении три флешки (две обычных и одна немного специфическая в виде кардридера с некоторыми приблудами (но это, наверное, не важно)).

Когда хостом является обычный PC, то подобные ошибки? проявляются на каждой из них (а на одной, даже несколько раз).

Когда хостом являюсь я (т. е. плата, под которую я делаю хост), то при указанной последовательности команд ошибка проявляется только на двух флешках (одна из которых специфическая).
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 23-10-2018 20:06 » 

значит видимо дело действительно в таймаутах... в конце концов сейчас ко всему относятся столь безобразно-безалаберно, что я не удивлюсь)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WWX
Постоялец

ru
Offline Offline

« Ответ #12 : 24-10-2018 09:24 » 

По поводу флешки, NAK'ающей в ответ на SETUP, склоняюсь к тому, что так и есть (по крайней мере других предположений у меня нет). Таймаут в 2 мкс тут прекрасно маскирует проблему.

А вот почему на более высоком уровне практически всегда отвергается первая полезная SCSI команда (у меня это - READ CAPACITY 10) остаётся не ясным. И никакие таймауты тут не помогают.
Могу предположить, что в начале (после энумерации) Mass Storage устройство находится в каком-то не совсем рабочем состоянии, из которого оно начинает выходить только после получения команды (которую в первый (и только первый) раз отвергает). Но это только гипотеза...
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 24-10-2018 12:11 » 

так попробуйте ей что нибудь другое в первый раз сказать)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WWX
Постоялец

ru
Offline Offline

« Ответ #14 : 24-10-2018 14:14 » 

Пробовал.

Если вначале послать REQUEST_SENSE (на текущий момент это рабочий вариант), т. е. так:
Цитата
REQUEST SENSE
READ CAPACITY 10 <----- Завершается ошибкой
REQUEST SENSE <----- Получаю "пояснительные данные" из-за ошибки в предыдущей команде
READ CAPACITY 10 <----- Начиная с этой команды всё работает нормально
READ 10
, то прокатывает только для одной из имеющихся флешек.
(Обычный PC, кстати, так не мелочится (не шлёт вначале REQUEST_SENSE) и получает "ошибку" на первой "полезной" команде даже для этой флешки.)

Пробовал TEST_UNIT_READY ставить вначале - ничего не меняется.

Завершается ошибкой именно первая "полезная" команда, а не диагностическая (из тех, что я пробовал).

Сейчас я делаю также, как и обычный PC: в случае ошибки делаю REQUEST_SENSE, а затем повторно посылаю провалившуюся команду.

Просто хотелось бы понять: так и должно быть, или можно сделать по-нормальному?..
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 24-10-2018 20:29 » 

информации не имею А черт его знает...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines