Полученные клиентом адреса конечных точек USB-функций Linux отличаются от описанных для ep0. - PullRequest
0 голосов
/ 07 ноября 2019

Я использую functionfs в устройстве на базе Android, чтобы разрешить подключение к нему через USB. Я записал дескрипторы в ep0, и хост-компьютер видит дескрипторы с устройства и может подключаться к конечным точкам. Однако, как представляется, functionfs игнорирует адреса конечных точек, записанные в ep0, вместо этого нумеруя конечные точки последовательно от 1 (как видно из дескрипторов, отправляемых на хост-компьютер). Хуже того, кажется, что это делается отдельно для конечных точек и конечных точек, поэтому при попытке получить конечную точку массового вывода 1 и объемную конечную точку 2 они оба отображаются для хоста как конечная точка 1!

  1. Почему functionfs перенумеровывает конечные точки?

https://www.kernel.org/doc/Documentation/usb/functionfs.txt говорит

С точки зрения пространства пользователя это файловая система, которая при монтировании обеспечивает "ep0 "файл. Драйвер пользовательского пространства должен записывать дескрипторы и строки в этот файл. Не нужно беспокоиться о конечных точках, интерфейсах или номерах строк, а просто предоставить дескрипторы, например, если функция была единственной (конечные точки и номера строк начинаются с единицы, а номера интерфейсов начинаются с нуля). FunctionFS изменяет их по мере необходимости, а также обрабатывает ситуацию, когда числа различаются в разных конфигурациях.

Когда записываются дескрипторы и строки, появляются файлы ep # (по одному для каждой объявленной конечной точки), которые обрабатывают связь на одной конечной точке. Опять же, FunctionFS заботится о действительных числах и изменении конфигурации (что означает, что файл «ep1» может быть действительно сопоставлен, скажем, с конечной точкой 3 (и когда конфигурация изменится с (скажем) конечной точкой 2)). «ep0» используется для получения событий и обработки запросов на установку.

, что указывает на то, что перенумерация является преднамеренной. Но я не понимаю, почему это должно быть необходимо - конечно, если на устройстве имеется несколько функций, каждая из которых является отдельным интерфейсом USB и получает собственный набор конечных точек.

Как исправить конечные точки на те, которые ожидает клиент?

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

Как могут работать входящие и исходящие конечные точки с одинаковыми адресами?

Насколько я понимаю, USB не позволяет использовать одну и ту же конечную точку для обоих направлений (кроме контрольной конечной точки),Так как же может быть правильным, чтобы functionfs давал обоим конечным точкам входа и выхода один и тот же адрес?

Код в https://github.com/torvalds/linux/blob/master/tools/usb/ffs-test.c содержит следующее:

    .hs_descs = {
    .intf = {
        .bLength = sizeof descriptors.fs_descs.intf,
        .bDescriptorType = USB_DT_INTERFACE,
        .bNumEndpoints = 2,
        .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
        .iInterface = 1,
    },
    .sink = {
        .bLength = sizeof descriptors.hs_descs.sink,
        .bDescriptorType = USB_DT_ENDPOINT,
        .bEndpointAddress = 1 | USB_DIR_IN,
        .bmAttributes = USB_ENDPOINT_XFER_BULK,
        .wMaxPacketSize = cpu_to_le16(512),
    },
    .source = {
        .bLength = sizeof descriptors.hs_descs.source,
        .bDescriptorType = USB_DT_ENDPOINT,
        .bEndpointAddress = 2 | USB_DIR_OUT,
        .bmAttributes = USB_ENDPOINT_XFER_BULK,
        .wMaxPacketSize = cpu_to_le16(512),
        .bInterval = 1, /* NAK every 1 uframe */
    },

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

Я использую ядро ​​4.1.15;Я не могу изменить это, но я могу изменить драйвер при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...