完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
如何处理 UVC 端点收到的 CY_U3P_USB_EVENT_EP_UNDERRUN 错误? 如果我们通过 UVC 端点流式传输视频数据,在 MacOS 上更改分辨率时,有时会出现 UNDERRUN 事件,导致固件崩溃并停止运行。 需要如何处理这一事件? 我附上了一份日志,其中显示 EP 0x83 出现溢出。 下面是我们的事件处理程序。
case CY_U3P_USB_EVENT_EP_UNDERRUN: /* When USB host tries to read from FX3 but no data is found. * Can occur due to unexpected DMA resets and can cause FX3 to get stuck */ CyU3PDebugPrint (4, "UsbEventCB: CY_U3P_USB_EVENT_EP_UNDERRUN on EP 0x%x...rn", evdata); CyU3PUsbResetEndpointMemories(); break; 我在论坛上发现了一篇关于在处理程序中添加CyU3PUsbResetEndpointMemories() 并确保在重置 DMA 之前添加延迟的帖子。我们刚刚添加了 API 调用,并且已经实现了延迟,但问题仍然存在。我还添加了 CyU3PUsbInitEventLog 和 CyU3PUsbGetEventLogIndex 调用,这些调用可在本帖包含的日志文件中找到。我在 cyu3usb.h 中找到了一些定义,如 CYU3P_USB_LOG_USB3_PHY_OFF、CYU3P_USB_LOG_USBSS_RESET 和 CYU3P_USB_LOG_USBSS_CONNECT,但该文件似乎并未包含调试打印中出现的所有值。对于所有 DMA 复位,我们始终遵循以下顺序: CyU3PUsbSetEpNak(CY_FX_EP_UVC_VS, CyTrue);CyU3PBusyWait(100);CyU3PDmaChannelReset( glSingleChHandleUVCStream);CyU3PUsbFlushEp(CY_FX_EP_UVC_VS);CyU3PUsbSetEpNak(CY_FX_EP_UVC_VS, CyFalse); 我还找到了这篇帖子,其中建议查找 CYU3P_USBEP_SS_RESET_EVT 事件,并通过停滞端点来做出响应。 我们没有在日志中看到这个事件,但我们已经实施了这个修复,试图解决这个问题。 下面的代码可以让端点在收到该错误时停止运行: static voidCyFxApplnEPCB ( CyU3PUsbEpEvtType evtype, CyU3PUSBSpeed_t usbSpeed, uint8_t epNum ){ if (epNum == CY_FX_EP_UVC_VS) glBulkEpEvtCount++; if (evtype == CYU3P_USBEP_SS_RESET_EVT) { if (epNum == CY_FX_EP_UVC_VS) { CyU3PDebugPrint(2, "Halting UVC Bulk EP: %drn", glBulkRstCnt++); CyU3PUsbStall(CY_FX_EP_UVC_VS, CyTrue, CyFalse); } }}为了实际处理 USB 失速事件,我们的事件回调包括 else if ((bTarget == CY_U3P_USB_TARGET_ENDPT) (bRequest == CY_U3P_USB_SC_CLEAR_FEATURE) (wValue == CY_U3P_USBX_FS_EP_HALT)) // Use ENDPOINT HALT { /* Windows OS sends Clear Feature Request after it stops streaming, * however MAC OS sends clear feature request right after it sends a * Commit -> SET_CUR request. Hence, stop the video streaming and clear * the stall condition and sequence numbers */ glAbortCount++; /* If UVC is addressed, end stream */ if (wIndex == CY_FX_EP_UVC_VS) { CyU3PDebugPrint(4, "Video EP CLEAR_FEATURE(EP_HALT)rn"); CyU3PUsbSetEpNak (CY_FX_EP_UVC_VS, CyTrue); CyU3PBusyWait (125); CyFxUVCStreamStopHandler(); /* Actually stop stream */ CyU3PUsbResetEp(CY_FX_EP_UVC_VS); CyU3PUsbStall(CY_FX_EP_UVC_VS, CyFalse, CyTrue); CyU3PUsbSetEpNak (CY_FX_EP_UVC_VS, CyFalse); isHandled = CyTrue; CyU3PUsbAckSetup(); } 这些修复方法都没有解决问题。 如何解决? 只有在 MacOS 上,以及将 UVC 流媒体分辨率从一种分辨率切换到另一种不同帧频的分辨率时,我们才会看到这个问题。 当看到分辨率发生变化时,我们会停止任何活动数据流,使用 CyU3PConnectState(CyFalse, CyTrue) 断开 USB 连接,重置 DMA,然后使用 CyU3PConnectState(CyTrue, CyFalse) 重新连接 USB。 |
|
相关推荐
1个回答
|
|
处理UVC端点收到的CY_U3P_USB_EVENT_EP_UNDERRUN错误需要考虑以下几个步骤:
1. **理解错误原因**: - CY_U3P_USB_EVENT_EP_UNDERRUN错误通常发生在USB主机尝试从FX3读取数据,但没有找到数据时。这可能是由于意外的DMA重置引起的。 2. **日志分析**: - 你提到日志显示EP 0x83出现溢出。这意味着在该端点上,数据传输没有及时完成,导致数据丢失。这可能是由于分辨率更改或其他因素引起的。 3. **优化数据流**: - 确保在分辨率更改时,数据流的速率和大小能够适应新的分辨率。这可能需要调整DMA传输的参数,例如传输块大小或传输速率。 4. **增加错误处理**: - 在事件处理程序中,增加对CY_U3P_USB_EVENT_EP_UNDERRUN错误的处理逻辑。例如,当检测到此错误时,可以尝试重新初始化DMA传输,或者调整传输参数以适应当前的分辨率。 5. **代码示例**: - 在你的事件处理程序中,可以添加如下代码: ```c case CY_U3P_USB_EVENT_EP_UNDERRUN: { // 处理EP_UNDERRUN错误 uint8_t endpoint = event->ep_number & 0x7F; // 获取端点号 if (endpoint == 0x83) { // 重新初始化DMA传输 CyU3PDmaChannelReset(&dmaChannel); CyU3PDmaChannelSetConfiguration(&dmaChannel, &dmaConfig); CyU3PDmaChannelEnable(&dmaChannel, CYU3P_DMA_CHANNEL_ENABLE); // 调整传输参数 // 例如,调整传输块大小或传输速率 } break; } ``` 6. **测试和验证**: - 在修改代码后,需要在MacOS上进行测试,确保在分辨率更改时,UVC端点的数据流能够正常工作,不再出现UNDERRUN错误。 7. **监控和调试**: - 在实际使用中,持续监控设备的日志和性能,以便及时发现并解决可能出现的问题。可以使用调试工具或添加额外的日志输出来帮助诊断问题。 通过以上步骤,你应该能够处理UVC端点收到的CY_U3P_USB_EVENT_EP_UNDERRUN错误,并确保设备在分辨率更改时能够正常工作。 |
|
|
|
只有小组成员才能发言,加入小组>>
请教个XMC1404调试串口接收时为什么一直无法接收数据的问题
362 浏览 0 评论
TLE9879_BLDC电机启动需要用手拨一下才能转动,怎么解决?
6268 浏览 2 评论
4106 浏览 9 评论
请问TLE5012B_E1000 启动后为什么位置不能正确获取
3632 浏览 9 评论
1231 浏览 8 评论
457浏览 2评论
270浏览 2评论
376浏览 2评论
TLE9879_BLDC电机启动需要用手拨一下才能转动,怎么解决?
6272浏览 2评论
如果是打开已有的dave工程,怎么查看这个工程选择的mcu型号?
456浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 14:01 , Processed in 0.813013 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号