USB论坛
直播中

张伟

8年用户 1728经验值
私信 关注
[问答]

CX3获取扩展控制时出错了,为什么?

我正在尝试从 Windows 机器通过 UVC 控件访问扩展 ID。 以下是描述符文件的代码片段
/* 扩展单元描述符 */
0x 1C , /* 描述符大小 */
CX3_CS_INTRFC_DESCR , /*类特定的接口描述类型*/
0x 06 , /*扩展单元描述符类型*/
0x 03 , /*本终端ID*/

0x DC , 0x 95,0x F9,0x F3 , / * 16 字节 GUID* //* F3F995DC - 2632-4C4E - 92C9 -A04782F43BC8 */
0x 32、0x 26、0x 4E 、 0x 4C 、​​​​
0x C9 , 0x 92 , 0x A0 , 0x 47 ,
0x 82 , 0x F4 , 0x 3B , 0x C8 ,

0x 04 , /*此终端中的控件数量*/
0x 01 , /*此终端的输入引脚数量*/
0x 02 , /*源ID:2:连接到Proc单元*/
0x 03 , /*此终端的控制字段大小:3个字节*/
0x FF , 0x 00 , 0x 00 , /* 支持 8 个控件 */
0x 00 , /*字符串描述符索引:未使用*/

在 Windows 端,我使用以下代码...
#定义STAtiC_PROPSETID_VIDCAP_EXTENSIONCONTROL
0x F3F995DC L 、 0x 2632、0x 4C4E 、 0x 92、0x C9、0x A0、0x 47、0x 82、0x F4、0x 3B 、 0x C8​​​​​​​​​​​​​​
DEFINE_GUIDSTRUCT ( “F3F995DC-2632-4C4E-92C9-A04782F43BC8” , PROPSETID_VIDCAP_EXTENSIONCONTROL );
#定义PROPSETID_VIDCAP_EXTENSIONCONTROL DEFINE_GUIDNAMED ( PROPSETID_VIDCAP_EXTENSIONCONTROL )

静态HRESULT getExtensionUnitControls ( cx3_context_t * context ){
HRESULT hr = S_OK ;
控制寄存器* pKsControl =空值;
KSP_NODE节点;
BYTE * pData =新BYTE [ 10 ];
ULONG ulBytesReturned = 0 ;

hr =上下文-> pSource -> QueryInterface ( IID_PPV_ARGS ( & pKsControl ));
如果(失败(小时)){
std :: cerr << "无法获取 pks 控制错误 = " << _com_error ( hr ). ErrorMessage () << std :: endl ;
return 0;
}

GUID属性集= PROPSETID_VIDCAP_EXTENSIONCONTROL ;
ksNode .属性.设置= PROPSETID_VIDCAP_EXTENSIONCONTROL ;
ksNode .属性.Id = 0 ;​
ksNode .属性.标志= KSPROPERTY_TYPE_GET ;
ksNode.NodeId = 3 ;​​

hr = pKsControl- > KsProperty (
( PKSPROPERTY ) & ksNode ,
sizeof ( ksNode ),
p数据
1 ,
& ulBytesReturned
(英文):

如果(失败(小时)){
std :: cerr << "无法获取扩展控制 = " ;
printf ( "HRESULT = 0x %xn " , hr );
}别的{
std :: cout << "获得扩展控制 = " << pData [ 0 ] << std :: endl ;
}

return 0;
}

我不断收到 0x80070492 错误,该错误指出 GUID 无效。 我不确定我在这里遗漏了什么。

回帖(1)

那年我十七_

2025-5-23 18:20:43

在尝试通过UVC控件访问CX3的扩展ID时出错,可能的原因及解决方案如下:


1. GUID不匹配



  • 问题:设备描述符中的GUID与主机端使用的GUID不一致,或字节顺序错误。

  • 解决

    • 验证GUID字节顺序:确认设备描述符中的GUID按以下格式正确解析:
      Data1: F3F995DC (字节顺序: DC 95 F9 F3)
      Data2: 2632     (字节顺序: 32 26)
      Data3: 4C4E     (字节顺序: 4E 4C)
      Data4: 92 C9 A0 47 82 F4 3B C8 (直接顺序)

    • 主机端匹配:在Windows应用程序中,确保使用的GUID字符串为 F3F995DC-2632-4C4E-92C9-A04782F43BC8



2. 控制请求参数错误



  • 问题:构造UVC控制请求时,bmRequestTypewValuewIndex 等参数设置不当。

  • 解决

    • GET请求示例
      bmRequestType = 0xA1 (IN | Class | Interface)
      bRequest = 0x03       (VS_REQUEST_CODE)
      wValue = (控件选择子 << 8) | 控件号 (范围0-3)
      wIndex = (单元ID << 8) | 接口号 (如0x0300表示单元ID 3,接口0)

    • 确认单元ID(0x03)与描述符一致,且控件号不超过3。



3. 描述符结构异常



  • 问题:扩展单元描述符字段偏移或大小不符UVC规范。

  • 解决

    • 检查描述符布局:确保28字节描述符的字段顺序和长度符合UVC 1.5标准:
      bLength: 0x1C
      bDescriptorType: 0x24 (CS_INTERFACE)
      bDescriptorSubtype: 0x06 (Extension Unit)
      bUnitID: 0x03
      guidExtensionCode: 16字节GUID
      bNumControls: 0x04
      bNrInPins: 0x01
      baSourceID[0]: 输入引脚源ID(如0x01)
      bControlSize: 控制位图长度(如0x01)
      bmControls: 控件的位图(如0x01表示第一个控件有效)
      iExtension: 字符串描述符索引(可选)



4. 权限或驱动问题



  • 问题:应用程序权限不足或驱动未正确处理扩展请求。

  • 解决

    • 以管理员身份运行应用程序。

    • 确认设备管理器中的UVC设备无感叹号,尝试重新安装驱动。



5. USB拓扑配置错误



  • 问题:扩展单元未正确连接到输入/处理单元。

  • 解决

    • 检查描述符中baSourceID是否指向有效的源单元(如摄像头单元ID)。

    • 使用USB分析工具(如USBView)确认设备枚举后的拓扑结构。



6. 固件未处理扩展请求



  • 问题:CX3固件未实现扩展单元的控制请求处理。

  • 解决

    • 在CX3的UVC处理逻辑中,确保对VS_REQUEST_CODE的请求进行解析,并返回正确数据。



验证步骤



  1. USB抓包分析:使用Wireshark捕获控制请求,确认主机发送的请求参数是否符合预期,设备是否返回STALL或其他错误。

  2. 对比GUID:在主机和设备端分别打印GUID的二进制数据,确保完全一致。

  3. 简化测试:发送一个简单的GET_INFO请求(如控件号0),验证基本功能是否正常。


示例代码片段(主机端GUID定义,C++):


static const GUID GUID_EXTENSION_UNIT = 
{ 0xF3F995DC, 0x2632, 0x4C4E, {0x92, 0xC9, 0xA0, 0x47, 0x82, 0xF4, 0x3B, 0xC8} };

通过逐步排查上述关键点,应能定位并解决扩展控制访问失败的问题。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分