4

我需要在 Windows 7 主机和 Linux 设备之间设置 USB 通信以进行数据传输。我能够在设备上编译 Linux 内核以在内核中包含 Gadget Zero 驱动程序(不是作为可加载模块 - Linux 版本 3.0.15)。我的项目有一些要求,这也解释了我为什么选择小工具零:

1) 在 Windows 7 主机上,必须使用内核模式驱动程序通过 USB 连接进行通信,以发送和接收批量数据。(速度不重要,一次不是很多数据)。

2)在linux设备上,除了通过USB链路轻松发送和接收数据外,对USB端没有要求。接收到的数据最终将被“解组”以调用另一个内核模块中的函数(以及那些打包并发送回主机的响应)。

3)多个linux设备将连接到主机,因此需要简单的方法来枚举连接的设备并与它们通信。

因此,由于要求,我决定不使用 Gadget Serial。我在 Win 7 主机的内核模式 (KMDF) 中通过虚拟 COM 端口发送和接收数据时遇到严重问题。WinUSB似乎不想打开我连接的设备(我在VS2012中使用模板中的KMDF windows USB驱动程序)另外,linux端的小工具串行驱动程序,我找不到接收和发送数据的功能。此外,由于某种原因,linux 设备上任何接收到的数据似乎都会回显给主机。(为了测试这一点,我在 Windows 中编写了一个简单的用户模式应用程序,这对我的项目来说是一个禁忌)。

小工具零,在 linux 端看起来要简单得多。我可以将 USB 线插入 Win7 主机,然后我可以让设备出现在设备管理器中。但是,我再次遇到通过链接进行通信的问题。小工具零有 2 个批量端点,所以这应该不是问题。肯定有人使用零配件使 Windows 主机和 linux 设备之间的数据通信成为可能?使用 Gadget Zero,应该很容易枚举连接的 linux 设备并与它们通信。

诀窍是将 Windows 端通信保持在内核模式。有人可以用零配件、Windows 7 KMDF 和一些示例源代码为我指明正确的方向吗?我很难相信以前没有人这样做过,因为我的互联网搜索结果并不多。(主要是使用 Gadget Serial 的用户模式解决方案)。

谢谢!

4

1 回答 1

2

所以你正在编写一个 Win32 驱动程序,你想在其中与你的 linuxed usb 通信?我没有写太多的win32内核代码,但我相信我在文档中看到了很大一部分,说“这就是你制作usb驱动程序的方式”......就是这样。换句话说,在内核模式下,您可以访问完整的内核 USB 层。您不需要现有的驱动程序或诸如此类的东西。

在 linux 端,您可以在不同的运行模式下使用串行小工具。只有默认的运行模式,将它自己注册为 VCP。还有一种更基本的模式:

modprobe g_serial use_acm=0

给它您自己的供应商 ID,您就可以附加您自己的自定义 win32 驱动程序。“多个 linux 设备”将由 Windows 处理。(将启动您的驱动程序的多个实例。)

顺便说一句,您看到的回声很可能是终端功能。(uarts 上的终端模式会回显。)连接时必须禁用它。现在你已经完成了,你还必须禁用 xon/xoff、esc 字符等。(标准遗留垃圾。)

还有一件事。我不确定小工具零是否真的将数据发送到线上。它用于测试小工具框架。(虽然我可能弄错了。)

无论如何,你几年前就已经解决了这个问题。我很高兴知道你想出了什么。

于 2014-12-10T11:13:37.833 回答