PCI开发

来源:互联网 发布:ucm指标源码 编辑:程序博客网 时间:2024/05/22 01:51

Linux 启动时,首先会枚举PCI设备,然后才能访问PCI设备的配置空间。要枚举PCI设备,首先要知道PCI设备的地址,枚举的方式跟平台本身的有关系。根据 PCI接口规范,IDSEL引脚被用来做为PCI设备的片选。使能该设备的IDSEL管脚,才可以读写该设备的配置寄存器组。但PCI规范并没有定义 IDSEL管脚的连接方法,所以根据各开发板PCI设备的IDSEL管脚硬件连线方法的不同,访问PCI设备配置空间的方法也不同。

有PCI设备的IDSEL管脚是通过一电阻串联到PCI总线的地址线AD中某一根,这样可通过在访问PCI总线的地址期内往AD这些地址线一个个的置高电平,如果读回来的配置寄存器数据有效,主要是看从配置空间读出的设备号和厂商号,说明该地址线连了某设备的 IDSEL,若无效,说明未连接。如图(a)
还有的把PCI设备的IDSEL管脚与CPU的一个GPIO端口相连,这样就可以通过控制GPIO来灵活的控制PCI总线上某设备的使能或者失效。在这种硬件连接下,访问PCI设备配置空间时,需要先置该设备IDSEL管脚所连接的GPIO为高,再读写配置寄存器组。如图(b)此种连接方式我目前没看见过。

 

 

 

Header Type:bit[6:0]       值为0 普通PCI设备

                                        值为1 PCI

                                        值为2 Cardbus

                      Bit[7]     是否为单功能设备。通常确定一个PCI设备需要bus8位,256 dev(5位,32) func3位,8个)。

 

 

Command

pci_enable_device(struct pci_dev *dev)

此函数在PCI驱动程序的探测函数中(XXX_probe),激活设备。代码在/driver/pci/pci.c中。主要是设置commandbit[0]bit[1],这两位的作用是开启内存映射还是IO映射。

 

 

PCI Bar寄存器

PCI设备都有一个配置空间,其中有六个基址寄存器,0x100x24bar0bar5)。

OS初始化时会往这基址寄存器中写基址。每一个PCI设备使用的基址寄存器数目不一定相同。下面以DSP设备为例。Dsp做从设备,通过PCI接口与主设备相连。

首先OS会往bar1寄存器中写0xFFFF FFFF,读取得到0xFF80 0000bit[22:0]为只读,地址范围为8M,访问地址为bit[31:23]<< 22 | bit[22:0]。所以bit[31:23]OS写入写入的值。这个值是跟平台相关的。

下图中bit[3]:表示是预取还是非预取空间,如果是预取空间,CPU可缓存其内容,并可进行各种优化。I/0寄存器不应该由CPU缓存,否则可能造成值不一致。所以当为I/O寄存器映射时,应为非预取类型。

Bit[0]:为是映射到IO空间,还是内存空间。

其他PCI设备应该类似。

 

原创粉丝点击