放弃了的mips usb isoc

来源:互联网 发布:nginx sticky module 编辑:程序博客网 时间:2024/05/01 20:21
前段时间在调一款mips芯片的usb camera,失败了。方案商提供的代码已经可用U盘。也就是ehci host controller的块传输,控制传输没有问题。camera对应的是等时传输,方案商未测试过。我花了6周的时间试了1.1camera及2.0 uvc camera。始终是ehci等时传输有问题,一直觉得这个可能是瓶颈,驱动设置camera 或uvc设置,降低性能会做的出来。但是到第6周的周末我找leiming帮我调,他的初步结论是ehci host本身的问题,于是我放弃了。leiming是很热心的人,很感谢。6周,又一个丢人的时间片。这是我工作中第2次放弃做一个模块。第1次是破解加密芯片,发现是硬件加密狗,无人曾破解过时放弃。
那么我把失败的尝试列一下:
有2种现象差别,其余的现象都差不多
uframe传输数据大于1024,multi大于1时,一直出现xactErr错误
uframe传输数据小于等于1024,multi等于1时,出现一会xactErr后出现babble错误

1.修改uvc的uvcvideo.h中每次传输使用到的URB数
/* Number of isochronous URBs. */
#define UVC_URBS 5
修改为
#define UVC_URBS 1
出现4次Failed to resubmit status URB (-38)就一次也没有,但是这个规律是N-1次出现,除了少了这个错误打印外依然是xactErr和babble。所以不认为改成1可以解决。-38 -EL2NSYNC错误出现在2.6.14的版本里,高版本内核是-EFBIG错误。

2.修改uvc的uvcvideo.h中每次传输最多用多少个iso包,一个包对应一个uframe
/* Maximum number of packets per isochronous URB. */
#define UVC_MAX_ISO_PACKETS 40
修改为
#define UVC_MAX_ISO_PACKETS 8
1,2,4,6,8,10,20之类的值都试过,也就是每次URB传输不用40个uframe传输,每次少一点,希望能解决ehci瓶颈,但是没效果,不管多少,都会出现babble

3.修改uvc的uvc_video.c中uvc_get_video_ctrl函数里一个uframe最大传输多少字节
ctrl->dwMaxPayloadTransferSize = le32_to_cpu(get_unaligned((__le32 *)&data[22]));
修改为
ctrl->dwMaxPayloadTransferSize = 512;
512,128,1024,等值都试过。camera有6个setting,虽然每个setting的max packet size不同,从128到3072.但是它们的uframe最大传输字节都是3072,也就是multi=3。马上就是xactErr错误

4.去掉uvc_driver.c中反应status的中断urb传输
/* Initialize the interrupt URB */
if ((ret = uvc_status_init(dev)) < 0)
{
uvc_printk(KERN_INFO, "Unable to initialize the status "
"endpoint (%d), status interrupt will not be "
"supported./n", ret);
}

5.方案商没有ehci capability register接口,读出来的值是0,它们用一个变量来代表register寄存器的值
Ehci_caps.hcs_params = 0x00000001;
Ehci_caps.hcc_params = 0x00000086;
因为不确定实际硬件到底是多少,所以将hcc修改多种组合无效果。
这里主要的2个参数:
1 isoc threshold为一个frame
2 periodic framelist长度为256,而不是1024

6.修改iso_stream_schedule里schedule不及时但是也没落后太久的处理,这个是根据网上的patch改的,但是改了后不产生ehci中断了
if (unlikely ((start + sched->span) > max))
goto ready;

其实也没试几种办法,也不至于大改ehci。没有能力解决问题,怎么办