USB驱动之XHCI驱动调试总结一
最近调公司一款芯片的USB接口的驱动,USB3.0的控制器,枚举失败,有如下错误打印:
device descriptor read/8, error -110
即读设备描述符超时,通过USB协议分析仪抓包,发现host没有发出GET_DESCRIPTOR请求,分析怀疑:
1.驱动发出的GET_DESCRIPTOR请求数据不对
2.有cache一致性问题导致host取到的数据不对
通过在驱动中加打印,将GET_DESCRIPTOR请求的Transfer TRB和host收到的Event TRB的数据都打印出来,经过分析GET_DESCRIPTOR请求的Transfer TRB数据没有问题,host也收到了GET_DESCRIPTOR请求的中断和TransferEvent
TRB,但Event TRB的Completion Code为0x13,即Context State Error
这时大家都认为是cache一致性的问题导致host读TRB数据不对,用仿真器读取DDR里的数据分析,通过DCBAAP寄存器里的地址找到Device Context,然后找到EP Context 0,得到TR Dequeue Pointer,即EP0的Transfer Ring,DDR里的TRB与驱动打印出来的TRB数据一致,说明数据确实没有问题,那为啥host取数据不对呢?后来发现问题出在host的AXI总线属性配置上,默认配置的memory
type为device,而host会发非对齐的burst,导致host取数据不对,改为normal问题解决.
关于device和normal,在ARMv8的datasheet有相关描述: