为什么dwc3 usb控制器没有报告xfercomplete事件?还是小工具司机错过了那个事件? &g



使用usb连接到PC的Android手机,打开rndis,然后在手机和PC之间进行iperf测试。经过几个小时的测试,rndis的端点ep1out没有收到小工具驱动程序在发送传输命令后应该接收的xfercomplete事件。

我尝试将事件缓冲区大小从256扩大到4096,也将grxfifosize从默认值扩大,但问题仍然存在。

手机有8个cortex-A53核心,但我们留下1个小核心(cpu0)和1个大核心(cpu7)在线,并且由于吞吐量原因,通过设置dwc irq的smp_affinity设置dwc中断不路由到cpu0。所以dwc3_interrupt运行在cpu7, dwc3_thread_interrupt也运行在cpu7。

很奇怪,如果我们把irq路由到cpu0,而dwc3_thread_interrupt运行在不同的核心(cpu7),这个问题就消失了,不明白为什么。

代码是开源的synopsys,你可以在kernel/drivers/usb/dwc3/gadget.c

https://github.com/aosp-mirror/kernel_msm/blob/e8adfc30ff9282a728fd8b666b6418308164c415/drivers/usb/dwc3/gadget.c

提前感谢。

最后,找到了答案,事件缓冲区中的事件数据被延迟到中断和EVENTCOUNT寄存器之后。当问题发生时,事件缓冲区中的数据是上一轮的脏数据。通过多次读取数据,得到了正确的结果。

所以,它不是错过了xfercomplete,而是延迟了。不知道为什么会发生延迟,应该在传输完成后产生中断。

最新更新