PCIe实践之路:PCIe转USB Host驱动

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abcamus/article/details/80370649

PCIe实践之路:PCIe转USB Host驱动

本次调试PCIe RC驱动,通过PCIe转USB芯片扩展出的USB口接入U盘。RC平台为ARM-A7,运行裸机环境,EP为一款PCIe转USB3.0芯片,提供PCIe gen2 1X物理接口,接到4X插槽上。

一、芯片选型

PCIe转USB3.0芯片为vl805,网上没有找到datasheet,驱动只有windows下的,但是通过官网信息判断有linux支持,所以应该是标准xhci host芯片。

二、调试流程

  • link training
  • root complex枚举
  • 下游设备枚举
  • USB设备枚举
  • U盘读写

link training比较顺利,由于之前有过验证,在代码初始化完成后已经成功link up。通过访问PCI cap list,枚举到支持的功能列表,特别是PCI Extended Capability中的device control and status状态寄存器要重点关注。配置RC的BAR0/BAR1,如果支持msi/msi-x,那么配置msi/msi-x capability结构体,这一块要系统支持。

通过outbound transaction去发起mem rd/wr request,配置EP的Base Address Register,发现只有一块64-bit的memory bar,这一块BAR其实就映射了pci-xhci寄存器空间。vl805这块芯片支持PCI Extended Capability和MSI-X capability,注意device control and status寄存器。

USB设备枚举,首先确定xhci的基址为对应到vl805 BAR0的ddr地址,就像在本地读写寄存器一样可以访问xhci配置空间,完成command ring, event ring等的配置。然后start host controller,发现ep出现了received master abort,排查了两天,发现是RC BAR0设计上的问题,导致不认mem wr请求,修改到BAR1后正常。枚举hub发现port对应的端口号为4和5,两个口上插上USB3.0 U盘,然后检查usb portsc寄存器可以看到进入U0,link speed为SUPERSPEED。注意trb的映射地址要确保落在BAR Range中(实践发现EP发送的mem rd/wr tlp_header.address无需落入BAR Range即可访问ddr)

关于USB枚举和读写调试遇到了一个问题,host controller一直会报received master abort,经查RC有UR error,这个肯定是non-posted request导致的。基本可以判断是mem rd遇到了问题。但是具体是哪一笔read以及为什么会有这笔read就很难判断了。正好借到了一台PCIe分析仪,神器一上,就发现原来是一笔64bit mem rd导致的UR。这个地址属于scratchpad array中的地址,经查发现是分配scratchpad的时候没有对ddr清0,导致高32位地址存在垃圾数据。按照scratch buffer num的要求分配了31块8KB的buffer并清零后枚举顺利完成。读写一次通过,yeah! 从晚上7点多搞到11点半,终于基本功能通了,第二天10点人家就要来拿回分析仪,也算是一次让人挺难忘的调试经历。

猜你喜欢

转载自blog.csdn.net/abcamus/article/details/80370649