2012-07-24 136 views
2

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

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

2)在linux设备上,除了通过USB链接轻松发送和接收数据外,USB端没有要求。接收到的数据最终将被“解组”,以调用另一个内核模块中的函数(以及将这些响应打包并发送回主机)。 3)多个linux设备将连接到主机,因此需要简单的方法来枚举连接的设备并与它们进行通信。

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

Gadget Zero,它在linux上显得简单得多。我可以将USB电缆插入Win7主机,我可以让设备出现在设备管理器中。但是,我又遇到了通过链接进行沟通的问题。小工具零有两个批量端点,所以这不应该是一个问题。当然,有人使用Gadget Zero在Windows主机和Linux设备之间进行数据通信。使用Gadget Zero,应该很容易枚举连接的Linux设备并与它们进行通信。

诀窍是保持Windows端通信在内核模式下。有人可能用小工具零,Windows 7 KMDF和一些示例源代码指向正确的方向吗?我很难相信之前没有人做过这件事,因为我的网络搜索量并不多。 (主要是用Gadget Serial的用户模式解决方案)。

谢谢!

回答

2

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

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

modprobe g_serial use_acm=0 

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

您看到btw的回声很可能是终端功能。 (飞镖上的终端模式会回显。)连接时必须禁用它。而现在你已经掌握了它,你还必须禁用xon/xoff,esc等字符(标准传统垃圾。)

还有一件事。我不确定小工具零实际上是否将数据发送到线上。它意味着测试小工具框架。 (尽管我可能会误会)。

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

相关问题