usb_fill_bulk_urb缓冲区长度较短,不提供垃圾传输流数据

usb_fill_bulk_urb缓冲区长度较短,不提供垃圾传输流数据,usb,host,Usb,Host,目前我正在开发一个DVB-T2加密狗,它使用USB连接到我的Ubuntu笔记本电脑14.04 接口 我正在使用以下应用程序执行扫描和频道播放。 1.w_scan-它扫描并给我一个channel.conf文件 2.vlc./channel.conf-使用channel.conf中的调制参数播放频道 禁用Pid过滤后,一切正常。但当启用Pid过滤时,我看到 屏幕上的宏块,而不是平滑AV。就连AV也被破坏了很多 在阅读驱动程序代码之后,我尝试将URB缓冲区大小从3K(21*188)增加到 64K(34

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

接口

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

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

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

在阅读驱动程序代码之后,我尝试将URB缓冲区大小从3K(21*188)增加到

64K(348*188)。AV变得平滑

此urb缓冲区大小是以下函数中的缓冲区长度(传输缓冲区的长度)

无效usb\u填充\u批量\u urb(结构urb*urb,结构usb\u设备*dev, 无符号整数管道,void*transfer\u缓冲区, int缓冲区长度,usb完成\u t完成\u fn, 无效*上下文)

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

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

给我一些建议,让我更好地理解这个问题

提前感谢,,
Murali

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

一个重要的观察结果,当我检查完成处理程序捕获的缓冲区中的syncbyte 0x47时,我看到垃圾值。我尝试在完成处理程序中打印urb->status,并观察返回urb->status为0xffff1b的损坏数据包。知道为什么会发生这种情况吗?我将返回值0xFFFF1B解码为-79,这在我们的平台中是EOVERFLOW。你知道我为什么会注意到这个问题吗?今天,我能够更进一步,发现在IN事务中缺少ACK。这是批量传输模式。因此,发送器期望在数据传输后收到来自接收器的ACK。可能的重复