Я создал небольшое встроенное устройство WinUSB, которое предлагает 2 массовые конечные точки. Это устройство может обмениваться данными с Linux и Windows10 без установки драйвера или файла .inf.
Теперь мы хотим использовать тот же API со встроенным Linux. Режим USB-Gadget предлагает Serial CDC/ACM и RNDIS-Ethernet и многое другое.
Мне удалось создать USB-гаджет с gadgetfs, у которого был только объемный ep. Я мог общаться с хостом Linux и Windows. USB-устройство имело /dev/ttyGS0 для связи. Но в Windows мне пришлось установить драйвер WinUSB вручную.
Я работаю с yocto над созданием встроенного ядра. Я добавил сюда строку кода: /linux-imx/drivers/usb/gadget/legacy/serial.c , f_serial.c, u_serial.h
для добавления дополнительной переменной os_desc и параметра use_winusb. Но полученный g_serial по-прежнему создает COM-порт в Windows10 или устройство без WinUSB. Для нашего устройства нам нужен только WinUSB-Device.
Гаджет RNDIS поддерживает WinUSB. Поэтому я попытался создать собственное устройство USB-Gadget с https://github.com/libusbgx/libusbgx. Но если я использую тип функции USBG_F_SERIAL, он не может создать WinUSB. См. ошибку:
Error setting function OS desc
Error: USBG_ERROR_NOT_FOUND : Not found (file or directory removed)
Если я использую USBG_F_RNDIS, он работает, и с управляемым дескриптором USB он распознается Windows как устройство WinUSB. Но Linux реализует это как сетевое устройство USB-ETH. USB-устройство не получает последовательного соединения /dev/ttyGS0 для связи.
Сейчас я читаю исходный код драйвера ядра Linux, чтобы найти место, где я могу просто преобразовать этот дескриптор операционной системы WinUSB в тип USBG_F_SERIAL. Но я думаю, что это займет месяц, чтобы пройти.
Любое решение будет в порядке. Патч для источников драйверов Linux g_serial или как настроить USB-Gadgetfs было бы здорово. Любая подсказка, куда поместить дополнительный код, тоже подойдет.