USB论坛
直播中

廖阿朋

9年用户 1369经验值
私信 关注
[问答]

如何修改cycx3_uvcdscr.c以便 Amcap可以调整我的曝光时间?

我需要能够使用 Windows 功能来控制 Cypress 连接的传感器的曝光时间。
使用IID_IAMVideoProcAmp函数,但是这个前提好像需要摄像头本身支持这个控制。 当我使用 Amcap 打开相机时,尽管我已经编写了曝光控制程序,但我无法控制相机的曝光时间。 在 Amcap 中它是灰色的。
请问如何修改cycx3_uvcdscr.c 以便 Amcap 可以调整我的曝光时间?

回帖(1)

刘玉兰

2025-5-20 18:13:36

为了让AmCap能够通过Windows UVC接口控制Cypress传感器的曝光时间,需要修改cycx3_uvcdscr.c中的UVC描述符,确保曝光控制属性被正确声明。以下是关键步骤和示例代码:




步骤1:确认硬件支持


确保传感器支持通过UVC协议调整曝光时间(例如,支持PU_EXPOSURE_TIME_ABSOLUTE_CONTROL属性)。




步骤2:修改UVC描述符


cycx3_uvcdscr.c中,找到Processing Unit(PU)描述符,在bmControls字段中启用曝光控制位:


// 原始代码可能类似:
PU_DESCRIPTOR(0,
    VIDEO_PROCESSING,
    (PU_CONTROL_BACKLIGHT_COMPENSATION | PU_CONTROL_GAIN), // bmControls
    ...)

// 修改后,添加PU_EXPOSURE_TIME_ABSOLUTE_CONTROL:
PU_DESCRIPTOR(0,
    VIDEO_PROCESSING,
    (PU_CONTROL_BACKLIGHT_COMPENSATION | PU_CONTROL_GAIN | PU_CONTROL_EXPOSURE_TIME_ABSOLUTE), // 启用曝光控制
    ...)



步骤3:映射属性到UVC规范


确保曝光时间属性与UVC规范一致。在uvc_controls.h中确认以下宏定义:


#define PU_CONTROL_EXPOSURE_TIME_ABSOLUTE  0x00000080 // 对应bmControls的bit7



步骤4:实现控制请求处理


在固件中处理SET_CUR/GET_CUR请求,将曝光值传递给传感器:


// 在CyU3PUVCControlCallback函数中添加处理逻辑:
case PU_EXPOSURE_TIME_ABSOLUTE_CONTROL:
    if (reqType == UVC_SET_CUR) {
        // 从pData读取曝光值,写入传感器寄存器
        sensor_set_exposure(*(uint32_t*)pData);
        return CY_U3P_SUCCESS;
    } else if (reqType == UVC_GET_CUR) {
        // 从传感器读取当前曝光值,填充到pData
        *(uint32_t*)pData = sensor_get_exposure();
        return CY_U3P_SUCCESS;
    }
    break;



步骤5:编译并验证



  1. 重新编译固件并烧录到设备。

  2. 检查描述符:使用USBTreeView确认曝光控制是否在PU的bmControls中启用。

  3. AmCap测试:打开AmCap,进入属性页面,确认曝光控制已可调节。




注意事项



  • 权限问题:确保应用以管理员权限运行。

  • 驱动签名:若使用自定义驱动,需禁用驱动签名验证。

  • 替代工具:使用DirectShow-Camera-Control测试接口是否暴露。


通过上述修改,AmCap应能通过UVC接口调整曝光时间。若问题依旧,需进一步检查传感器寄存器配置或Windows驱动兼容性。

举报

更多回帖

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