【问题标题】:usb_fill_bulk_urb with less buffer_length gives no garbage Transport stream data具有较小 buffer_length 的 usb_fill_bulk_urb 不会提供垃圾传输流数据
【发布时间】:2015-04-04 14:56:48
【问题描述】:

目前我正在使用 USB 连接到我的 Ubuntu 笔记本电脑 14.04 的 DVB-T2 加密狗

界面。

我正在使用以下应用程序来执行扫描和频道播放。 1. w_scan - 扫描并给我一个 channel.conf 文件 2. vlc ./channel.conf - 使用channel.conf中的调制参数播放频道

禁用 Pid 过滤后一切正常。但是当启用 Pid 过滤时,我看到了

屏幕上的宏块而不是平滑的 AV。就连 AV 也破了很多。

浏览驱动代码后,我尝试将 URB 缓冲区大小从 3K (21*188) 增加到

64K (348*188)。 AV变得流畅了。

这个urb缓冲区大小是下面函数中的buffer_length(传输缓冲区的长度)。

void usb_fill_bulk_urb (struct urb * urb, struct usb_device * dev, 无符号整数管道,无效* transfer_buffer, int buffer_length,usb_complete_t complete_fn, 无效 * 上下文);

如您所见,驱动程序使用 USB 传输的批量模式。

谁能解释一下为什么增加缓冲区可以解决宏块问题?

请给我一些建议,以便更好地理解这个问题。

提前致谢, 壁画

【问题讨论】:

  • 一个重要的观察,当我从完成处理程序中检查捕获缓冲区中的同步字节 0x47 时,我看到垃圾值。我尝试在完成处理程序中打印 urb->status 并观察返回 urb->对于损坏的数据包,状态为 0xffffff1b。知道为什么会这样吗?
  • 我将返回值 0xffffff1b 解码为 -79,即我们平台中的 EOVERFLOW。知道我为什么要观察这个问题吗?
  • 今天我能够进一步推进一点,发现在 IN 事务期间缺少 ACK。它是一种批量传输模式。因此,发送方在数据传输后期望接收方的 ACK。

标签: usb host


【解决方案1】:

终于找到了解决这个问题的方法,usb 帧大小和 urb 缓冲区大小应该相同(在我的例子中是 21x188)。在我的代码中,发现 USB 帧大小设置为 (348x188) 并且 urb 缓冲区大小为 (21x188),这导致了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 2012-09-01
    • 2015-08-03
    相关资源
    最近更新 更多