WinUSB
+ -

WinUsb的同步传输收发

2025-09-15 0 0

这里以USB Gddget- source/sink创建的设备为例,详见:https://www.usbzh.com/article/detail-1581.html

这里的同步端点位于inter=0,alt=1接口描述符下,有端点地址分别为0x02和0x82,PacektSize都为1024

接收例程为:

#define numPackets 10
void CWinUsbToolDlg::TestISORead()
{
    INT index = GetDlgItemInt(IDC_EDIT_ALT_INTERFACE);
    WINUSB_PIPE_INFORMATION info[4];
    for (int i = 0; i < 4; i++)
    {
        BOOL isok = WinUsb_QueryPipe(m_dev.m_WinusbHandle, index, i, &info[i]);
    }
    BOOL isok1 = m_dev.SetAlternate(index);

    UCHAR buff[1024* numPackets];
    WINUSB_ISOCH_BUFFER_HANDLE hIsochBuffer = NULL;
    BOOL bResult = WinUsb_RegisterIsochBuffer(m_dev.m_WinusbHandle, 0x82, buff, sizeof(buff), &hIsochBuffer);

    USBD_ISO_PACKET_DESCRIPTOR  IsoPacketDesc[numPackets];
    for (int i = 0; m_IsRcv; i++)
    {
        OVERLAPPED overlap;
        memset(&overlap, 0, sizeof(overlap));
        overlap.hEvent = m_dev.m_hEvent;
        ResetEvent(m_dev.m_hEvent);

        bResult = WinUsb_ReadIsochPipeAsap(hIsochBuffer, 0, sizeof(buff), FALSE, numPackets, IsoPacketDesc, &overlap);
        if (!bResult && GetLastError() != ERROR_IO_PENDING) 
        {
            printf("WinUsb_ReadIsochPipe failed immediately. Error: %d\n", GetLastError());
            break;
        }

        // 7. 等待异步操作完成(如果需要同步等待)
        DWORD dwBytesTransferred = 0;
        bResult = GetOverlappedResult(m_dev.m_WinusbHandle, &overlap, &dwBytesTransferred, TRUE);
        if (!bResult)
        {
            DWORD e = GetLastError();
            printf("GetOverlappedResult failed. Error: %d\n", GetLastError());
            break;
        }
    }

    if (hIsochBuffer != NULL)
    {
        WinUsb_UnregisterIsochBuffer(hIsochBuffer);
    }
}

发送例程:


void CWinUsbToolDlg::TestISOWrite()
{
    INT index = GetDlgItemInt(IDC_EDIT_ALT_INTERFACE);
    WINUSB_PIPE_INFORMATION info[4];
    for (int i = 0; i < 4; i++)
    {
        BOOL isok = WinUsb_QueryPipe(m_dev.m_WinusbHandle, index, i, &info[i]);
    }
    BOOL isok1 = m_dev.SetAlternate(index);

    UCHAR buff[1024 * numPackets];
    WINUSB_ISOCH_BUFFER_HANDLE hIsochBuffer = NULL;
    BOOL bResult = WinUsb_RegisterIsochBuffer(m_dev.m_WinusbHandle, 0x02, buff, sizeof(buff), &hIsochBuffer);

    for (int i = 0; m_IsRcv; i++)
    {
        OVERLAPPED overlap;
        memset(&overlap, 0, sizeof(overlap));
        overlap.hEvent = m_dev.m_hEvent;
        ResetEvent(m_dev.m_hEvent);
        memset(buff,i, 1024 * numPackets);

        bResult = WinUsb_WriteIsochPipeAsap(hIsochBuffer, 0, sizeof(buff), FALSE, &overlap);
        if (!bResult && GetLastError() != ERROR_IO_PENDING)
        {
            printf("WinUsb_ReadIsochPipe failed immediately. Error: %d\n", GetLastError());
            break;
        }

        // 7. 等待异步操作完成(如果需要同步等待)
        DWORD dwBytesTransferred = 0;
        bResult = GetOverlappedResult(m_dev.m_WinusbHandle, &overlap, &dwBytesTransferred, TRUE);
        if (!bResult)
        {
            DWORD e = GetLastError();
            printf("GetOverlappedResult failed. Error: %d\n", GetLastError());
            break;
        }
    }
}
HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

UVC 等时传输中的URB_ISOCH_TRANSFER
通过UVC规范可知,视频图像数据的读取可使用两种端点传输方式,分别为:BULK 块/批量传输方式ISO 等时/同步传输方式在Windows内核中,USB数据的读取是通过URB来进行传输的,其结构体是一个大大的共用体,根据数据传输的方式对应其不同的结构体,其内容如下:typedef _Struct_s......
UVC等时传输中的dwMaxPayloadTransferSize
UVC的视频流接口控制请求的数据大小可为26字节,34字节和48字节,其分别对应的是UVC的1.0,1,1和UVC1.5版本。在其整个视频流控制接口参数偏移地址22处的字段为一4字节的dwMaxPayloadTransferSize,根据其字段解释为“指定设备在单个有效负载传输中可以传输或接收的最大......
USB 等时/同步传输、块传输与转换设置在UVC摄像头驱动中的探讨
最近在Windows10 x64环境下,开发了一个虚拟UVC摄像头驱动。确切的来说这不是摄像头驱动,而是一个虚拟USB总线驱动。使用该虚拟总线驱动使用应用软件通过IOCTL控制总线子设备的创建与卸载。框架设计驱动安装完成后,是一个单纯的USB虚拟总线。应用软件通过发送自定义IOCTL码IOCTL......
USB 同步/等时传输方式
USB协议规定了四种传输类型:控制传输、批量传输、同步传输、中断传输。等时传输也有“同步传输”的叫法,一般用于要求数据连续、实时且数据量大的场合,其对传输延时十分敏感,类似用于USB摄像设备,USB语音设备等等。同步事务没有握手包。当一个同步传输中有多个事务时,最后一个事务之前的事务的数据长......
USB超高速 同步传输
正如USB2.0一样,超速同步传输类型是用来支持想要能容忍错误,周期性的轮询服务的传输流。超速跟USB2.0一样不发送起始帧,但是时序信息要通过同步时间戳包(ITP)被发送给设备。这个规格的协议层章详细描述了用来完成同步传输的包,总线事务和事务处理流程。也描述了怎么样传送时序信息给设备。超速同步传输......
基于UVC规范的USB摄像头数据传输模式的总结
根据UVC(USB VIDEO CLASS)规范,UVC视频数据传输方式支持:同步传输即ISO传输批量传输即BULK传输但是不同的操作系统对UVC规范的支持不一定是全量支持的:Windows操作系统对于windows操作系统,对UVC版本的支持情况如下:UVC 版本Windows ......
使用WinUSB读写USB设备
Windows为WinUSB设备提供了API,主要通过以下几个步骤访问设备。通过扩展描述符中的GUID查看接口的路径用接口的路径作为参数,调用CreateFile打开接口使用WinUsb_Initialize得到WinUSB句柄通过WinUsb_WritePipe和WinUsb_ReadPipe对......
WinUSB 简介
WinUSB是Windows从Vista操作系统版本以来,新增加的一个USB设备功能驱动程序。使用该驱动,可以将设备变成一个自定义通讯的设备,当然该驱动也可应用于自定义设备驱动程序。WinUSB的组成WinUSB包括两大部分,分别为内核部分和应用层部分:内核部分,主要是WinUSB.sys,该......
WinUSB的安装方法
使用工具zadig进行安装winusb以管理员方式运行zadig-2.4.exe,然后在菜单的选择中选择列出所有设备。这会软件会枚举系统中所有的USB设备,并显示在下列组合对话框中。我们选中我们需要安装winusb的设备,然后点击ReInstallDriver按钮进行安装。如本人选中一个USB扬声器......
手动分析使用BUSHOUND抓取同步传输的URB
BUSHOUND大家太熟了,使用它来进行数据抓包那不太太方便。但在BUSHOUND的抓取配置项中,有一个叫了URB的东西,我相信大家都没有选中过,因为一般来说,对WINDOWS USB驱动开发人员来说都不一定有用,更何况大家也只是用来抓取一下几个数据的输入输出,更没有必要进行USB的分析了。本人今天......
USB 同步传输端点的数据包PID序列及额外传输端点大小
对于同步传输:如果输入端点提供的负载数据小于端点描述符指定的最大负载数据,则主机端将不再该端点提供进一步的输入事务。这是因为所对USB设备来说,所有的数据传输都是由主机发起的。对于数据输入IN事务,虽然数据的传输方向为设备端到主机,但是该事务却是由主机发起。由于设备的输入端点提供的负载数据小于该......
USB摄像头同步传输的完成后URB参数
这几天不是闲来无事,一个工作的任务就是对手中一个USB摄像头进行驱动开发,并进行视频格式的转换。通过分析该USB摄像头可知,其采用的是同步传输,所以本人在开发的驱动中,使用同步的URB进行下发请求数据,然后在完成例程中获取数据。同步传输的URB本人在 手动分析使用BUSHOUND抓取同步传输的URB......
UAC麦克风同步传输的URB分析
之前写过同步传输的UVC摄像头的URB,文章名称为:手动分析使用BUSHOUND抓取同步传输的URB 。今天恰好手中有一个UVC麦克风,所以也拿来分析。也许和之前的文章有所重复,但是因为侧重点的不同,也许会有意想不到的小收获取。言归正转,我们知道,在UAC音频规范中,数据的传输不像UVC摄像头那样,......
USB摄像头同步传输H264遇到的花屏问题
以往拿到的摄像头数据传输都是批量传输,本人也只在音频驱动的开发中使用了同步传输。这次突然拿到一个摄像头,数据采用的是同步传输,本以为很简单的代码移植,却没有想到还是遇到了一个坑,自己花费了大力气来排查,在这期间自己也看了大量的资料,今天在这里做一个简单的总结。以前的摄像头拿到的USB摄像头如批量传......
USB2.0 同步传输数据包PID序列
同步传输方式分为全速模式和高速模式,低速模式不存在同步传输。全速传输模式下的数据包PID序列全速模式下的同步传输数据方式只使用DATA0包,因此接收方在接收数据时只会收到DATA0数据包。高速传输模式下的数据包PID序列高速模式下的数据包序列根据一个微帧中的事务个数不同,采用不同的数据包序列,使......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!