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