我正在设计一个USB外围设备,偶尔会连接到Windows PC,并在每个方向传输几KB的数据 . 将有一个定制的PC应用程序,使用专有协议(即USB有效载荷)控制数据传输 .
我在以下链接中看到Microsoft描述了如何为USB设备编写驱动程序 . 但我需要一个吗?
Developing Windows client drivers for USB devices
PC应用程序是我们打算知道如何与设备通信的唯一应用程序,因此从应用程序共享的角度来看,不需要驱动程序 .
我可以直接将自定义协议烘焙到应用程序中,让应用程序对设备说“原始USB”,并且没有单独的驱动程序吗?
2 回答
“原始USB”,不,你不能从应用程序那样做 .
但是因为您也控制了设备,所以您可以将其显示为Windows提供的设备驱动程序之一,该设备驱动程序的通用性足以执行您想要的任何操作 .
那些设备类是HID(人机接口设备)和“WinUSB” . 其中,HID是跨平台的,但功能更受限制,WinUSB允许高性能数据传输以及中断 endpoints .
设置设备的字符串描述符以便Windows自动将其绑定到WinUSB驱动程序的说明是on MSDN
no need to write driver 还有另一种方法可以使用WriteFile函数编写你想要的设备:WinUSB,如何做到这一点:
包括WinUsb.h
将WinUsb.lib添加到链接库列表中 .
在Usb100.h中的一些宏 .
使用设备接口GUID获取设备路径 . 正确的GUID是您在INF中用于安装WinUsb.sys的GUID .
通过将在INF中定义的设备接口GUID传递给SetupDiGetClassDevs来获取设备信息集的句柄 . 该函数返回一个HDEVINFO句柄 .
调用SetupDiEnumDeviceInterfaces以枚举系统的设备接口并获取有关设备接口的信息 .
调用SetupDiGetDeviceInterfaceDetail以获取设备接口的详细数据 .
调用GetDevicePath函数以获取设备路径 .
将设备路径传递给CreateFile以获取设备的文件句柄 . Use ReadFile and Write File to communicate with device!
将文件句柄传递给WinUsb_Initialize以初始化WinUSB并获取WinUSB句柄 . 您在调用WinUSB API函数时使用设备的WinUSB句柄来识别设备,而不是设备的文件句柄 .
对于更高级的解决方案 - 使用功能:
WinUsb_QueryDeviceInformation获取设备的速度 .
WinUsb_QueryInterfaceSettings获取相应的接口描述符 . WinUSB句柄对应于第一个接口 .
WinUsb_QueryPipe获取有关每个 endpoints 的信息 .
WinUsb_WritePipe将缓冲区写入设备 - 默认行为:零长度写入在堆栈中向下转发 . 如果传输长度大于最大传输长度,WinUSB会将请求分成较小的最大传输长度请求并按顺序提交 .
更多功能和信息:http://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/winusb_howto.docx
出于调试目的,您可能需要:winusbtrace_tool https://blogs.msdn.microsoft.com/usbcoreblog/2010/02/05/how-to-generate-and-view-a-winusb-debug-trace-log/; Wireshark https://www.wireshark.org带有USBPcap插件 .
其他例子:http://searchingforbit.blogspot.com/2012/04/winusb-communication-with-stm32-part-1.html . 示例模板随Visual Studio一起提供 .
您还需要具备编写.inf文件的知识 .
另一种与USB通信的简便方法 - libusb-win32 https://sourceforge.net/projects/libusb-win32/
我的简单控制台应用程序将块发送到设备(原始数据立即写入设备绕过堆栈):