WWX
Участник
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
|
|
« Ответ #2 : 11-10-2018 15:58 » |
|
еще в спецификации таблицу по таймаутам посмотрите. там может даже нагляднее. Table 7-14. Device Event Timings
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
WWX
Участник
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
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
WWX
Участник
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
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
WWX
Участник
Offline
|
|
« Ответ #7 : 16-10-2018 08:13 » |
|
а возможно надо просто перезапросить позже? Ну, когда закончу обработку ошибок, тогда будет ясно, прокатит ли. Но всё равно как-то странно. Что характерно, контроллер генерит запрос на прерывание не по получению NAK'а, а по возникновению ошибки. Хотя на шине я чётко вижу именно NAK, а других ошибок нет. и для Builk Для Bulk то понятно, но у меня Control EP 0. с другой стороны Вот это и странно: стандартное устройство себя так ведёт (Transcend). Обычный PC условно нормально с ней работает, хотя запросы при энумерации шлёт значительно реже, чем я. (Условно нормально, потому что там много ошибок на более высоком уровне в протоколе работы с Mass Storage, но, вроде бы, многие флешки этим грешат, а для пользователя это абсолютно прозрачно, т. к. ошибки корректируются.)
|
|
|
Записан
|
|
|
|
WWX
Участник
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
|
|
« Ответ #9 : 20-10-2018 14:28 » |
|
я не знаю при любой флешке такое?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
WWX
Участник
Offline
|
|
« Ответ #10 : 22-10-2018 07:17 » |
|
У меня в распоряжении три флешки (две обычных и одна немного специфическая в виде кардридера с некоторыми приблудами (но это, наверное, не важно)).
Когда хостом является обычный PC, то подобные ошибки? проявляются на каждой из них (а на одной, даже несколько раз).
Когда хостом являюсь я (т. е. плата, под которую я делаю хост), то при указанной последовательности команд ошибка проявляется только на двух флешках (одна из которых специфическая).
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #11 : 23-10-2018 20:06 » |
|
значит видимо дело действительно в таймаутах... в конце концов сейчас ко всему относятся столь безобразно-безалаберно, что я не удивлюсь)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
WWX
Участник
Offline
|
|
« Ответ #12 : 24-10-2018 09:24 » |
|
По поводу флешки, NAK'ающей в ответ на SETUP, склоняюсь к тому, что так и есть (по крайней мере других предположений у меня нет). Таймаут в 2 мкс тут прекрасно маскирует проблему.
А вот почему на более высоком уровне практически всегда отвергается первая полезная SCSI команда (у меня это - READ CAPACITY 10) остаётся не ясным. И никакие таймауты тут не помогают. Могу предположить, что в начале (после энумерации) Mass Storage устройство находится в каком-то не совсем рабочем состоянии, из которого оно начинает выходить только после получения команды (которую в первый (и только первый) раз отвергает). Но это только гипотеза...
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #13 : 24-10-2018 12:11 » |
|
так попробуйте ей что нибудь другое в первый раз сказать)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
WWX
Участник
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
|
|
« Ответ #15 : 24-10-2018 20:29 » |
|
информации не имею
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
|