主要讲PCI设备的硬件访问方法。
1、PCI的硬件结构
CPU发出的地址是CPU地址,可能是访问底下任何一个设备。地址范围不一样,访问到的外设就不一样。在嵌入式中,通常将4G内存地址空间分成好几个区域,不同的访问分给不同的地址。桥内存控制器会把CPU地址转换成addr_pci。PCI总线上的地址会到达底下的设备。此时就会引入一个问题,谁来相应这个地址(bridge底下挂载着总线,pci总线上有很多pci设备)?
为了解决上述问题,需要去配置每个设备对应的地址范围(对每个设备进行分配固定地址)。首先就要知道每个设备需要多大的地址空间,例如A设备需要1MB,B设备需要2MB等等。驱动程序需要把PCI地址中的某一段分配给这个设备例如A-B。
步骤:
(1)读设备上的配置寄存器,得到设备的种类,得到需要申请的地址大小。如何选中要配置的设备呢?通过IDSEL信号选中设备(初始化的时候应该会对每个issel号扫描一遍)。
(2)驱动程序分配对应大小的PCI地址给设备。
(3)将地址访问写回PCI的配置寄存器。
(4)配置好后就可以像内存一样读写。