Когда хостам USB требуется IN-пакет нулевой длины в конце передачи с чтением управления?

Я пишу код для USB-устройства. Предположим, что USB-хост начинает передачу управления чтением для чтения некоторых данных с устройства, а количество запрошенных данных (wLength в пакете установки) кратно максимальному размеру пакета конечной точки 0. Затем, после того как хост получил все данные (в виде нескольких IN-транзакций с пакетами данных максимального размера), будет ли он инициировать еще одну IN-транзакцию, чтобы узнать, есть ли еще данные, даже если больше быть не может?

Вот пример последовательности событий, которые меня интересуют:

  1. Процесс перечисления USB: сообщается, что максимальный размер пакета на конечной точке 0 равен 64.
  2. Транзакция SETUP-DATA-ACK запускает передачу управления чтением, wLength = 128.
  3. Транзакция IN-DATA-ACK доставляет хосту первые 64 байта данных.
  4. Транзакция IN-DATA-ACK доставляет хосту последние 64 байта данных.
  5. IN-DATA-ACK с пакетом DATA нулевой длины? Эта транзакция когда-либо происходит?
  6. Транзакция OUT-DATA-ACK завершает статусную фазу передачи; передача окончена.

Я проверил это на своем компьютере (Windows Vista, если это имеет значение), и ответ был нет: хост был достаточно умен, чтобы знать, что данные больше не могут быть получены от устройства, даже если все пакеты отправленные устройством, были заполнены (максимальный размер разрешен на конечной точке 0). Мне интересно, есть ли хосты, которые недостаточно умны и попытаются выполнить другую транзакцию IN и ожидать получения пакета данных нулевой длины.

Кажется, я прочитал соответствующие части спецификаций USB 2.0 и USB 3.0 на сайте usb.org, но не нашел решения этой проблемы. Буду признателен, если кто-нибудь укажет мне нужный раздел в любом из этих документов.

Я знаю, что может понадобиться пакет нулевой длины, если устройство решит отправить меньше данных, чем хост запросил в wLength.

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

Спасибо всем, кто может ответить на этот вопрос!


person David Grayson    schedule 18.09.2010    source источник
comment
У USB есть несколько заведомо плохих реализаций. Помогите сделать его более надежным: будьте либеральны в том, что вы принимаете, и консервативны в том, что вы делаете. Поэтому убедитесь, что ваше устройство не сломается в этом случае. Ни один совместимый хост не будет заботиться о том, чтобы вы вернули пустой пакет на третий запрос.   -  person MSalters    schedule 21.09.2010


Ответы (4)


Внимательно прочитайте спецификацию USB:

Стадия данных передачи управления от конечной точки к хосту завершается, когда конечная точка выполняет одно из следующих действий:

  • Передал именно тот объем данных, который был указан на этапе настройки
  • Передает пакет с размером полезной нагрузки меньше, чем wMaxPacketSize, или передает пакет нулевой длины

Итак, в вашем случае, когда wLength == размер передачи, ответ НЕТ, вам не нужен ZLP.

Если wLength > размер передачи и (размер передачи % размер ep0) == 0, ответ ДА, вам нужен ZLP.

person MBR    schedule 20.04.2012
comment
Является ли отправка ZLP в первом случае нецелесообразным, когда в этом нет необходимости? - person cp.engr; 12.08.2016

Как правило, USB использует пакет меньше максимальной длины, чтобы обозначить конец передачи. Таким образом, в случае передачи, которая является целым числом, кратным максимальной длине пакета, для разграничения используется ZLP.

Вы часто видите это в наливных трубах. Например, если у вас есть передача 4096 байт, она будет разбита на целое число пакетов максимальной длины плюс один пакет нулевой длины. Если в драйвере ПО установлен достаточно большой приемный буфер, ПО более высокого уровня получает всю передачу сразу, когда происходит ZLP.

Передача управления — это особый случай, потому что у них есть поле wLength, поэтому ZLP не является строго обязательным.

Но я бы настоятельно рекомендовал ПО быть гибким в обоих случаях, так как вы можете увидеть вариации с различными кремниевыми хостами USB или низкоуровневыми драйверами HCD.

person Nils    schedule 15.01.2011
comment
ZLP не является строго необходимым — нет, это может быть необходимо на этапе DATA запросов на чтение управления, потому что устройство может отправлять меньше данных, чем указано в wLength (например, для дескриптора устройства запрашивается 64 байта, но передано только 18 байт) - person Igor Liferenko; 14.08.2018

Я хотел бы расширить ответ MBR. спецификация USB 2.0 в разделе 5.5.3 гласит:

Стадия данных передачи управления от конечной точки к хосту завершается, когда конечная точка выполняет одно из следующих действий:

  • Передал именно тот объем данных, который был указан на этапе настройки
  • Передает пакет с размером полезной нагрузки меньше, чем wMaxPacketSize, или передает пакет нулевой длины

Когда этап данных завершен, хост-контроллер переходит к этапу состояния вместо того, чтобы продолжать другую транзакцию данных. Если хост-контроллер не переходит к этапу состояния после завершения этапа данных, конечная точка останавливает канал, как описано в разделе 5.3.2. Если получена полезная нагрузка данных, превышающая ожидаемую. от конечной точки IRP для передачи управления будет прерван/отменен.

Я сделал ударение на одном из предложений в этой цитате, потому что оно, по-видимому, конкретно говорит о том, что должно делать устройство: оно должно «останавливать» канал, если хост пытается продолжить фазу данных после того, как это было сделано, и это делается, если все запрошенные данные были переданы (т. е. количество переданных байтов больше или равно wLength). Я думаю, что остановка относится к отправке STALL-пакета.

Другими словами, в этой ситуации устройству не нужен пакет нулевой длины, и фактически спецификация USB говорит, что оно не должно его предоставлять.

person David Grayson    schedule 02.01.2014
comment
все запрошенные данные должны быть скорректированы на все данные указанные в wLength - person Igor Liferenko; 14.08.2018

Вам не нужно. (*)

Весь смысл wLength в том, чтобы сообщить хосту максимальное количество байтов, которое он должен попытаться прочитать (но он может прочитать меньше!)

(*) Я видел устройства, которые аварийно завершали работу, когда запросы IN/OUT выполнялись в неправильное время во время передачи управления (при отладке нашего хост-решения). Таким образом, любой хост, делающий то, о чем вы беспокоитесь, убил бы эти устройства и, надеюсь, их нет на рынке.

person Boris    schedule 21.09.2010
comment
Непонятно, что подразумевается под сообщением хосту - wLength отправляется хостом, а не хосту. - person Igor Liferenko; 14.08.2018