WinUSB使用控制端点0发送USB标准请求
2022-05-11
1154
0
向默认端点发出控制请求来与设备通信。
除了与接口关联的端点外,所有 USB 设备还有一个默认端点。 默认端点的主要用途是为主机提供可用来配置设备的信息。 不过,设备还可以将默认端点用于设备特定的用途。
控制命令包含一个 8 字节设置数据包,其中包括指定特定请求的请求代码和可选的数据缓冲区。 请求代码和缓冲区格式是供应商定义的。 在此示例中,应用程序将数据发送到设备来控制灯条。 用于设置灯条的代码是0xD8,为方便起见,它定义为SET_BARGRAPH_DISPLAY。 对于此请求,设备需要一个 1 字节数据缓冲区,该缓冲区通过设置相应的位来指定应点亮哪些元素。
应用程序可以通过用户界面 (UI) 对此进行设置,例如,通过提供总数为 8 个的一组复选框控件来指定应点亮灯条的哪些元素。 指定的元素对应于缓冲区中的相应位。 为避免编写 UI 代码,此部分中的示例代码将设置位以使备用灯亮起。
分配一个 1 字节数据缓冲区,并将数据加载到通过设置相应位来指定应点亮的元素的缓冲区中。
在调用方分配的结构中构造WINUSB_SETUP_PACKET数据包。 将成员初始化,以便表示请求类型和数据,如下所示:
调用 WinUsb_ControlTransfer ,通过传递设备的 WinUSB 接口句柄、设置数据包和数据缓冲区,将请求传输到默认终结点。 该函数在 LengthTransferred 参数中接收已传输到的设备的字节数。
BOOL SendDatatoDefaultEndpoint(WINUSB_INTERFACE_HANDLE hDeviceHandle)
{
if (hDeviceHandle==INVALID_HANDLE_VALUE)
{
return FALSE;
}
BOOL bResult = TRUE;
UCHAR bars = 0; //bar为控制请求携带的数据
WINUSB_SETUP_PACKET SetupPacket;
ZeroMemory(&SetupPacket, sizeof(WINUSB_SETUP_PACKET));
ULONG cbSent = 0;
//Set bits to light alternate bars
for (short i = 0; i < 7; i+= 2)
{
bars += 1 << i;
}
//Create the setup packet
SetupPacket.RequestType = 0;
SetupPacket.Request = 0xD8;
SetupPacket.Value = 0;
SetupPacket.Index = 0;
SetupPacket.Length = sizeof(UCHAR);
bResult = WinUsb_ControlTransfer(hDeviceHandle, SetupPacket, &bars, sizeof(UCHAR), &cbSent, 0);
if(!bResult)
{
goto done;
}
printf("Data sent: %d \nActual data transferred: %d.\n", sizeof(bars), cbSent);
done:
return bResult;
}
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936