USB-UAC麦克风音频数据传输USBD_STATUS_ISOCH_REQUEST_FAILED/USTSU状态C0000B00分析
今天,同事突然说麦克风出声问题了,插拔硬件可以恢复。让协助定位分析一下问题。
首先本人通过音频控制面板看到,当麦克风打开时,使用麦克风采集有声音的环境的声音,指定设备的音频控制面板的能量条无任何的波动。
本图似为效果演示,实际并非本设备
所以本人初步定位,音频设备无法读取到数据引起的。
无能量条一般有以下几种情况:
- 设备无数据
- 采集的数据为静音数据或PCM数据太小,能量条的跳动被忽略。
- 设备被静音。这种情况本人也经常遇到过,就是把麦克风的级别静音了。
为了确认是否无数据,使用了音频采集软件AudCity来录制,提示录制失败。所以几乎可确定是没有数据引起的。
为了进一步验证问题所在,采用了BUSHOUND抓包工具来抓包,经过了大量的测试,终于复现。
BUSHOUND抓到的数据:
- IRP状态码为:STATUS_SUCCESS/0xC0000001
- URB状态码为:USBD_STATUS_ISOCH_REQUEST_FAILED/0xC0000B00
关于IRP的分析这里本人不再说明,本身就是与windows驱协开发相关。这里我们重点关URB的状态码,这是可以通过BUSHOUND直接显示出来的.只要我们在BUSHOUND配置中选中USTS状态即可抓取到:
当错误时,可以看到类似这样的示例,这里以bad pipe handle错误信息配置演示:
言归正转,当URB的USTS状态码为USBD_STATUS_ISOCH_REQUEST_FAILED/0xC0000B00,该错误码的解释如下:
The host controller returns this error whenever all packets in an isochronous transfer complete with an error.
翻译过来说是USB主机控制器返回的同步传输中的URB中所有的数据包返回一个错误。
其实到这里,从操作系统的层面来讲,这已经是我们可以探究的极限了,但这远远还不能是我们极限。
我们知道,一个USB设备的URB请求包是发给其总线设备PDO的,该PDO一般由其总线驱动程序USB集线器创建,可能经过多层的USB集线器转发后,最终到达USB主机控制器这里,该设备是一个PCI/e设备。通过大概了解XP相关USB主机控制器及结合USBD_STATUS_ISOCH_REQUEST_FAILED,这里应为未收到相关的数据引起的。
实际任意一URB到USB主机控制器这一块,都是通过主机控制器对应的请求接口实现的。该请求接口的返回状态USB_MINIPORT_STATUS表示了URB的执行结果。对于同步传输,执行的宏为MP_SubmitIsoTransfer。
#define MP_SubmitIsoTransfer(de, ep, t, mpStatus) \ {\ KIRQL irql;\ USBPORT_ASSERT((de)->Fdo.MiniportDriver->\ RegistrationPacket.MINIPORT_SubmitIsoTransfer != NULL); \ USBPORT_AcquireSpinLock((de)->HcFdoDeviceObject, &(de)->Fdo.CoreFunctionSpin, &irql);\ (mpStatus) = \ (de)->Fdo.MiniportDriver->RegistrationPacket.MINIPORT_SubmitIsoTransfer(\ (de)->Fdo.MiniportDeviceData,\ &(ep)->MiniportEndpointData[0],\ &(t)->Tp,\ (t)->MiniportContext,\ (t)->IsoTransfer);\ USBPORT_ReleaseSpinLock((de)->HcFdoDeviceObject, &(de)->Fdo.CoreFunctionSpin, irql);\ }
对于同步传输,执行的结果有:
- USBMP_STATUS_SUCCESS
- USBMP_STATUS_BUSY
- 其它,使用USBPORT_ErrorCompleteIsoTransfer函数标识为USBD_STATUS_ISOCH_REQUEST_FAILED并返回.
到这里,其实只要再分析MINIPORT_SubmitIsoTransfer的函数即可。但这里再研究下去,感觉意义不是很大。不如从USB总线分析仪的角度来抓包分析。
USB总线分析仪这里使用的是南京沁恒USB总线分析仪-USB2.0-Monitor 来抓包。
当前向沁恒客服报暗号:USB中文网9折优惠,可享受沁恒USB总线分析仪9折优惠。数量有限,早到早得。
抓包的结果如下图示:
可以看到,当同步传输过程中,突然混入了一些控制请求,最终导致后面的同步传输IN令牌包后无DATA0数据引起的主机读不到数据。