USB2.0规范
+ -

USB设备控制请求

2026-08-18 本文链接为:http://www.usbzh.com/article/detail-1796.html ,欢迎转载,转载请附上本文链接。

USB设备标准控制请求有点多,一般有

GET_DESCRIPTOR

GET_DESCRIPTOR一般用于获取设备相关的描述符,主要的请求有:

SET_ADDRESS

SET_ADDRESS包括2个事务,分别为SETUP事务和0长度数据包确认事务(ZLP),按USB规格书定义,其实应在ZLP之后再写入SETUP发送过来的地址,但实际有些设备是在SETUP事务中就完成了写入,这在主机是兼容支持的。

SET_CONFIGURATION

  • 当配置index=0时表示反向选择配置,然后设备进入ADDRESSED阶段。
  • 当配置index!=0时表示选择配置,并打开其它的端点(非同步),开始进行通讯
static void USBD_SetConfig(USB_OTG_CORE_HANDLE  *pdev, USB_SETUP_REQ *req)
{
  static uint8_t  cfgidx;
  cfgidx = (uint8_t)(req->wValue);

  if (cfgidx > USBD_CFG_MAX_NUM )
  {
     USBD_CtlError(pdev , req);
  }
  else
  {
    switch (pdev->dev.device_status) 
    {
    case USB_OTG_ADDRESSED:
      if (cfgidx) 
      { 
        pdev->dev.device_config = cfgidx;
        pdev->dev.device_status = USB_OTG_CONFIGURED;
        USBD_SetCfg(pdev , cfgidx);
        USBD_CtlSendStatus(pdev);
      }
      else 
      {
         USBD_CtlSendStatus(pdev);
      }
      break;

    case USB_OTG_CONFIGURED:
      if (cfgidx == 0)
      {
        pdev->dev.device_status = USB_OTG_ADDRESSED;
        pdev->dev.device_config = cfgidx;
        USBD_ClrCfg(pdev , cfgidx);
        USBD_CtlSendStatus(pdev);
      } 
      else  if (cfgidx != pdev->dev.device_config) 
      {
        /* Clear old configuration */
        USBD_ClrCfg(pdev , pdev->dev.device_config);

        /* set new configuration */
        pdev->dev.device_config = cfgidx;
        USBD_SetCfg(pdev , cfgidx);
        USBD_CtlSendStatus(pdev);
      }
      else
      {
        USBD_CtlSendStatus(pdev);
      }
      break;

    default:                    
       USBD_CtlError(pdev , req);                     
      break;
    }
  }
}

GET_STATUS

设备状态2字节,可以按位或

#define USB_CONFIG_REMOTE_WAKEUP                           2
#define USB_CONFIG_SELF_POWERED                            1

参考代码:

static void USBD_GetStatus(USB_OTG_CORE_HANDLE  *pdev, USB_SETUP_REQ *req)
{
  switch (pdev->dev.device_status) 
  {
  case USB_OTG_ADDRESSED:
  case USB_OTG_CONFIGURED:

#ifdef USBD_SELF_POWERED
    USBD_cfg_status = USB_CONFIG_SELF_POWERED;
#else
    USBD_cfg_status = 0x00;
#endif
    if (pdev->dev.DevRemoteWakeup)//参见设备的SET_FEATUER和CLEAR_FEATUER
    {
      USBD_cfg_status |= USB_CONFIG_REMOTE_WAKEUP;
    }

    USBD_CtlSendData (pdev,(uint8_t *)&USBD_cfg_status,2);
    break;

  default :
    USBD_CtlError(pdev , req);
    break;
  }
}

SET_FEATURE

设备的SET_FEATUER可以有2种

  • USB_FEATURE_REMOTE_WAKEUP
  • USB_FEATURE_TEST_MODE
static void USBD_SetFeature(USB_OTG_CORE_HANDLE  *pdev, USB_SETUP_REQ *req)
{
  USB_OTG_DCTL_TypeDef     dctl;
  uint8_t test_mode = 0;

  if (req->wValue == USB_FEATURE_REMOTE_WAKEUP)
  {
    pdev->dev.DevRemoteWakeup = 1;  
    pdev->dev.class_cb->Setup (pdev, req);   
    USBD_CtlSendStatus(pdev);
  }

  else if ((req->wValue == USB_FEATURE_TEST_MODE) && ((req->wIndex & 0xFF) == 0))
  {
    dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL);
    test_mode = req->wIndex >> 8;
    switch (test_mode) 
    {
    case 1: // TEST_J
      dctl.b.tstctl = 1;
      break;

    case 2: // TEST_K    
      dctl.b.tstctl = 2;
      break;

    case 3: // TEST_SE0_NAK
      dctl.b.tstctl = 3;
      break;

    case 4: // TEST_PACKET
      dctl.b.tstctl = 4;
      break;

    case 5: // TEST_FORCE_ENABLE
      dctl.b.tstctl = 5;
      break;
    }
    SET_TEST_MODE = dctl;
    pdev->dev.test_mode = 1;
    USBD_CtlSendStatus(pdev);
  }
}

CLEAR_FEATUER

清除设备的远程唤醒,这一般发生在主机唤配设备之后https://www.usbzh.com/article/detail-1083.html

static void USBD_ClrFeature(USB_OTG_CORE_HANDLE  *pdev, USB_SETUP_REQ *req)
{
  switch (pdev->dev.device_status)
  {
  case USB_OTG_ADDRESSED:
  case USB_OTG_CONFIGURED:
    if (req->wValue == USB_FEATURE_REMOTE_WAKEUP)
    {
      pdev->dev.DevRemoteWakeup = 0; 
      pdev->dev.class_cb->Setup (pdev, req);
      USBD_CtlSendStatus(pdev);
    }
    break;
  default :
     USBD_CtlError(pdev , req);
    break;
  }
}
本文链接为:http://www.usbzh.com/article/detail-1796.html ,欢迎转载,转载请附上本文链接。

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936     USB技术交流3:1031974172

0 篇笔记 写笔记

打开UVC摄像头(特定类请求)数据分析
通过上节可以知道,设备支持4种的视频格式,且每种格式如下:MPJPG数据格式bFormatIndexbFrameIndex分辩率及及帧率11640x480x(30,15,10)121280x720x(30,15,10)131920x1080x(30,15......
UVC 选择单元控制请求
选择单元控制描述符设置或读取视频功能的选择器单元内的选择器控件的属性。选择器单元表示视频流源选择器。CUR、MIN和MAX属性的有效范围是从1到选择器单元的输入管脚数。这个值可以在选择器单元描述符的bNrInPins字段中找到。RES属性只能有一个值。控制选择子SU_INPUT_SELECT_CON......
UVC 视频流接口控制请求
视频流接口控制请求用于设置或读取视频函数的特定视频流接口内接口控制的属性。bmRequestType(1)bRequest(1)wValue (2)wIndex(2)wLength(2)Data(26~34~48)00100001SET_CUR选择器CS<<......
UAC 特性单元控制请求
特性单元控制请求对应于音频特性单元描述符。特性单元控制请求支持的选择子Control SelectorValueFU_CONTROL_UNDEFINED0x00MUTE_CONTROL0x01VOLUME_CONTROL0x02BASS_CONTROL0x03MID_CONTROL0x04TREBL......
UVC 扩展单元控制请求
扩展单元控制请求设置或读取扩展单元内的视频控件.bmRequestTypebRequestwValue(2)wIndexwLengthData00100001SET_CUR选择子扩展单元ID参数长度参数块bmRequestTypebRequestwValue(2)wIndexwLengthData1......
UVC 处理单元控制请求
处理单元控制请求用于设置或读取视频函数的处理单元内的视频控件的属性。Control SelectorValuePU_CONTROL_UNDEFINED0x00PU_BACKLIGHT_COMPENSATION_CONTROL0x01PU_BRIGHTNESS_CO......
UAC 音频流端点控制请求
音频流端点控制支持如下选择子:ControlSelector ValueEP_CONTROL_UNDEFINED0x00SAMPLING_FREQ_CONTROL0x01PITCH_CONTROL0x02SAMPLING_FREQ_CONTROL采样......
UVC 相机终端控制请求
相机终端控制有20种,分别如下:ControlSelectorValueCT_CONTROL_UNDEFINED0x00CT_SCANNING_MODE_CONTROL0x01CT_AE_MODE_CONTROL0x02CT_AE_PRIORITY_CON......
UVC 静止图像控制请求
静止图像控制请求于支持用于静止图像检索的方法2或3的视频功能是必需的。控制选择子VS_STILL_PROBE_CONTROLVS_STILL_COMMIT_CONTROL强制性请求见下表长度11偏移数据长度值描述0bFormatIndex1数字格式描述符的视频格式索引。通过将此字段设置为关联格式描述......
UVC 接口控制请求
接口控制请求用于设置或读取视频功能VideoControl接口相关控制的属性。bmRequestTypebRequestwValuewIndexwLengthData00100001
—————
10100001SET_CUR<......
再谈USB摄像头UVC视频流接口控制请求dwMaxVideoFrameSize和dwMaxPayloadTransferSize
刚开始的时候,我们做一件事是认真,一丝不苟。对于各个数据的考量力求做到精度,其实这个追求可能并不是因为我们因为项目上的要求,而是我们为了弄清一个事实,有了这个事实我们就可以随处吹牛逼,也成了我们在做新的类似的项目上的优势之资。言归正转,以前在windows下通过USB总线驱动虚拟的UVC摄像头都只......
USBIP 控制请求IRP_MJ_DEVICE_CONTROL
USBIP包括以下设备:typedef enum { VDEV_ROOT,//虚拟根设备FDO VDEV_CPDO,//虚拟USB控制器PDO VDEV_VHCI,//USB控制器FDO VDEV_HPDO,//USB根HUB PDO VDEV_VHUB, ......
LINUX&UVC视频控制请求与V4L2映射关系
从 Linux&UVC驱动栈 https://www.usbzh.com/article/detail-1322.html 一文可知,UVC驱动其实是一个中间层驱动程序,其启着承上启下的功能。在UVC驱动的下层是USBCore驱动,其实现的是USB设备初始化及通讯相关的功能实现。在UVC......
LINUX&UVC控制请求VIDIOC_QUERYCAP设备功能属性信息v4l2_capability
VIDIOC_QUERYCAP请求使用api函数ioctl,最终进行LINUX&UVC驱动中,根据设备节点的不同,执行的回调函数不同。VIDIOC_QUERYCAP请求用于返回设备支持的功能属性信息,其对应的结构体v4l2_capability。struct v4l2_capabilit......
USB端点控制请求
USB端点控制请求有以下几种SET_FEATUERCLEAR_FEATUREGET_STATUS 主机对端点发请求 │ 设备处于什么状态? ......
关注公众号
  • HID人机交互
  • Linux&USB
  • Linux-USB百科
  • MIDI V1.0
  • TinyUSB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB3测试
  • USB3知识点
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • USB资源
  • XHCI 1.2b 规范
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

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