【发布时间】: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。