我创建了一个小型嵌入式WinUSB设备,它提供2个批量端点。此设备可以在不安装驱动程序或.inf文件的情况下与Linux和Windows10进行通信。
现在我们想在嵌入式Linux中使用相同的API。USB小工具模式提供串行CDC/ACM和RNDIS以太网等。
我能够用只有批量ep的小工具创建一个USB小工具。我可以与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仍然会在Windows10中创建COM端口,或者不创建WinUSB设备。对于我们的设备,我们只需要WinUSB设备。
RNDIS小工具确实支持WinUSB。所以我试着用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小工具都会很棒。任何提示,将额外的代码放在哪里也可以。
我想更改内核,但幸运的是找到了:https://blog.soutade.fr/post/2016/07/create-your-own-usb-gadget-with-gadgetfs.html
此代码使添加WinUSB功能变得容易。
WinUSB修改版本的来源:https://github.com/rundekugel/gadgetfsd/tree/WinUSB