我需要在Windows 7主机和Linux设备之间设置USB通信以进行数据传输。我能够在设备上编译Linux内核以在内核中包含Gadget Zero驱动程序(而不是可加载模块 - Linux版本3.0.15)。我的项目有一些要求,这也解释了为什么我选择Gadget Zero:
1)在Windows 7主机上,必须使用内核模式驱动程序通过USB连接进行通信,以发送和接收批量数据。 (速度并不重要,一次不是很多数据)。
2)在linux设备上,USB端没有要求,除了通过USB链接轻松发送和接收数据。收到的数据最终将被“解组”以调用另一个内核模块中的函数(并将这些响应打包并发送回主机)。
3)多个Linux设备将连接到主机,因此需要简单的方法来枚举连接的设备并与之通信。
因此,由于要求,我决定反对Gadget Serial。我在Win 7主机中通过内核模式(KMDF)中的虚拟COM端口发送和接收数据时遇到严重问题。 WinUSB似乎不想打开我连接的设备(我在VS2012中使用KMDF windows USB驱动程序)另外,linux端的小工具串口驱动程序,我找不到接收和发送数据的功能。此外,由于某种原因,Linux设备上收到的任何数据似乎都会回传给主机。 (为了测试这一点,我在Windows中编写了一个简单的用户模式应用程序,这对我的项目来说是禁止的。)
Gadget Zero,在linux端看起来更简单。我可以将USB线插入Win7主机,我可以让设备出现在设备管理器中。但是,我再次遇到通过链接进行通信的问题。 Gadget Zero有2个批量端点,所以这应该不是问题。当然,有人使用Gadget Zero在Windows主机和Linux设备之间进行数据通信?使用Gadget Zero,可以很容易地枚举连接的Linux设备并与它们进行通信。
诀窍是将Windows端通信保持在内核模式。是否有人可能会使用Gadget Zero,Windows 7 KMDF和一些示例源代码向我指出正确的方向?我很难相信之前没有人这样做过,因为我的互联网搜索没有太多。 (主要是使用Gadget Serial的用户模式解决方案)。
谢谢!
答案 0 :(得分:2)
所以你正在编写一个Win32驱动程序,你想在其中与linuxed的USB通信?我没有写过很多win32内核代码,但我相信我已经在文档中看到了一个很大的部分,说“这就是你如何让usb驱动程序”......这就是它。换句话说,在内核模式下,您可以访问完整的内核usb层。您不需要现有的驱动程序或诸如此类的东西。
在Linux端,您可以在不同的运行模式下使用串行小工具。只有默认运行模式,将其自身注册为VCP。存在一种更基本的模式:
modprobe g_serial use_acm=0
给它自己的供应商ID,你就可以附加你自己的自定义win32驱动程序了。 “多个Linux设备”将由Windows处理。 (将启动您的驱动程序的多个实例。)
你看到的回声很可能是一个终端功能。 (uart上的终端模式将回显。)连接时必须禁用它。而现在,你也必须禁用xon / xoff,esc chars等(标准遗留垃圾。)
另一件事。我不确定小工具零实际上是否将数据发送到线路上。它用于测试小工具框架。 (虽然我可能会弄错。)
无论如何,几年前你已经多次解决了这个问题。我很高兴知道你想出了什么。