要发送数据,USBHandleBusy首先检查UOWN位是否为零,如果是,可以调用USBGenWrite来发数据。 这个函数可以指定端点号,指向要发送数据的指针以及要发送的数据长度,调用此函数开始发送数据,并置UOWN为1,最后返回数据缓冲区指针。 USB模块接着就能自动将数据发送出去而不需要固件代码的干涉。当端点收到一个带数据的输入令牌后,USB模块自动发送这些数据,然后置UOWN为零,这样程序代码就能接收为发送下一个数据包作准备了。 在设备端,批量传输和中断传输几基本差不多,除了端点类型外,它们的唯一区别在于主机端,所以要使用中断传输,只需要用中断方式替换每个批量实例,同时设置WINUSB_INTERRUPT_EP为2(或者其它支持中断的端点)、设置WINUSB_INTERRUPT_IN_EP_SIZE 和WINUSB_INTERRUPT_OUT_EP_SIZE的值与端点描述符里的一致。 控制传输 因为每种传输模式都分成了几个阶段,而控制传输相较于批量和中断传输更为复杂。控制传输第一步是检测收到的请求,在Setup阶段,软件可得知这个请求是指向所整个设备还是特定接口。 // Check the Setup packet to find out if the request is
// directed to an interface, names the WinUSB interface ID,
// and is a Vendor request.
if(SetupPkt.Recipient != RCPT_INTF) return;
if(SetupPkt.bIntfID != WINUSB_INTF_ID) return;
if(SetupPkt.RequestType != VENDOR) return;
// It’s a vendor-specific request to the WinUSB interface.
// Decode the request and call a routine to handle it.
switch(SetupPkt.bRequest)
{
case WINUSB_REQUEST_1:
// The Data stage is host-to-device.
WinusbControlWriteTransferHandler();
break;
case WINUSB_REQUEST_2:
// The Data stage is device-to-host.
WinusbControlReadTransferHandler();
break;
}
上面代码能判断两个请求,一个是主机到设备的数据阶段,另一个是设备到主机的数据阶段。WINUSB_REQUEST_1和WINUSB_REQUEST_2都是厂商定义请求。 我在我把PIC范例代码的控制传输请求部分作了很小的修改就实现了厂商自定义请求,对于请求应答部分代码,我以Get_Descriptor应答为模型实现的。 安装设备 主机端使用WinUSB来驱动设备。 Windows利用inf文件来为设备提供相关驱动信息,在WinUSB的inf文件里包含了设备的VID和PID,这个VID和PID应和设备描述符里的值一致,另外还有一个叫GUID的值(128bit),GUID被识别不同的设备类型。 GUID有几种方法生成,在Visual Studio标准版和更高版本里,选择Tools > Create GUID就可以生成,另外还可以利用微软的GUID生成器(guidgen.exe),或者GUID在线生成器(在网上可以找到)。 要将我工程里的inf文件用于你自己的项目里,需要修改PID、VID以及GUID,GUID的值在 [Version] 小节的ClassGUID里修改: ClassGUID = {36FC9E60-C465-11CF-8056-444553540000}
//更改大括号里的值为自己的GUID值
%USB\MyDevice.DeviceDesc% = USB_Install, USB\VID_0925&PID_1456
//设备VID和PID在inf文件的[Manufacturer]小节里,形式如上
//上面VID的值是0x0925,PID的值是0x1456,实际应用时改成你设备描述里对应的值
要安装WinUSB,PC必须有三个dll,在WDK里有这三个文件,你可以将其打包到你的安装软件里,在Vista以上系统你不需要额外提供这三个文件,因为系统已经有这三个文件了 当设备第一次插入PC后,windows搜索符合PID和VID值的INF文件,必要情况下需要用户定义这个INF文件的位置。 设置正确安装后,在设备管理器的“通用串行总线控制器”里就能找到此设备,不懂怎么打开设备管理器,网上搜搜。 Writing Applications
|