这段时间,又在对龙芯盒子的PCI的总线进行编程。目前有了一点点进展,发现PCI总线也是很复杂的东西。由于所有其它外设都是挂在PCI总线上,如果要对外设进行编程,就得对PCI比较了解,并且可以对它编程。
PCI总线是一条平等的总线,所有设备都是平等的。在某一时刻会有一个设备是主设备。PCI的设备是一棵树的结构,以CPU为根,桥设备为树干,其它设备为叶子。由于PCI的设备是即插即用的,因此它的总线有多少设备不是固定的,那么它又是怎么样发现所有的设备的呢?它就是通过枚举所有设备,也就是由总线上寻找所有设备,比如从总线0开始,就会找到一个桥设备,这个桥设备就是在北桥那里。然后通过这个总线,就可以向下查找,就会找到南桥设备,找到显示卡设备,找到USB的主控器等等。PCI的设备为了能有自动配置的功能,就需要在固定的位置里放置一些寄存器。在PCI的规范里,定义了一段叫做配置空间的寄存器组,CPU就是通过北桥里的寄存器设置,然后根据总线号和设备号就会到PCI设备的第一个功能设备。接着读取PCI配置空间里的寄存器,就可以知道这个PCI设备是做什么使用了,这个就是class编码。比如龙芯里的USB的主控器的分类编码就是0x0C031043,从这个分类码中的0C03就可以知道它是USB的设备,后面的10说明它是OHCI协议接口,43是USB主控器的版本。这样就可以分类不同的设备了。
找到了设备之后,就是需要对它编程。而编程,就需要对寄存器的操作。