在接触PCIe接口的这两年当中,遇到了很多关于PCIe启动的问题,做了一个汇总,以加固自己的认识和了解,也希望可以帮助其他新入门的同学,少走弯路。
首先,第一步,先介绍一下PCIe的枚举过程(关于PCIe的路由,架构等知识不在本文中进行介绍,请查阅相关资料)
在系统上电或者Reset之后,设备会有一个初始化的过程,这个过程中设备的寄存器都是无意义的,当初始化之后,所有寄存器数据稳定并且有意义。这是才可以进行Configuration和设备的枚举。
如图,在系统初始化时,只有RC被硬编码为bus0,枚举过程将从bus0 开始。
再次还要介绍两个概念,PCie设备中有Device ID和Vendor ID,它们都是硬编码在芯片当中,不同的设备有着不同的ID,其中值FFFFh保留 ,任何设备不能使用。当RC发出一个Configuration读请求时,如果返回的不是FFFFh,那么系统就认为存在这样的设备,如果返回的为FFFFh那么系统就认为不存在这个设备。
枚举程序将要探测Bus