嵌入式技术
UBOOT下IXP425 PCI驱动程序设计
摘要:
本文说明了IXP425 PCI控制器的结构和操作方法,然后说明了如何在UBOOT下为IXP425编写PCI驱动程序,最后说明了怎样驱动PCI网卡EEPRO-100。
一 引言
UBOOT是sourceforge下的一个开放源代码的项目,它是Universal Bootloader的简写,也就是通用启动程序的意思。通过选取不同的编译选项,可以引导多种处理器启动,如PowerPC,ARM,MIPS,X86等。
IXP425是Intel公司推出的一款使用XScale核的CPU,其内部有三个网络处理引擎,被广泛的运用于网络设备中。要使用网络处理引擎必须使用Intel提供的库,但由于版权的原因,UBOOT并没有提供对网络处理引擎的支持,因此其
不能使用网络。为了方便调试,我们为UBOOT编写了PCI的驱动程序,这样就能使用PCI网卡访问网络。
本文说明如何编写IXP425的PCI驱动程序,并以EEPRO-100网卡为例,说明了如何驱动PCI网卡。
二 PCI配置空间
每个PC I 设备有3 种物理空间: 配置空间、Memory空间和I/O 空间。配置空间是长度256 字节的一段连续空间,其中前64个字节为Header( 头标) , 其余192 字节为设备相关信息。在64 字节的Header 中, 前16 字节的定义是确定的,后48字节的具体含义因设备而异,图1为配置空间的头标区。
图1
配置空间中的一个重要部分是基地址寄存器(Base Address Register) , 它的内容是PCI 设备的地址空间映射到系统地址空间的起始物理地址。其中,bit0= 1 表示I/O 空间映射, bit0= 0 表示存储器空间映射。所有PC I 设备必须实现存储器空间映射或I/O空间映射。通过向BAR 写全1 然后读取相关寄存器即可确定所需地址空间的大小。
三 IXP425 PCI控制器
IXP425内部集成了PCI控制器,既支持在主模式也支持在从模式下工作,具体的工作模式可以在PCI控制状态寄存器的Bit0上读取,这一位在系统重起时由扩展总线的Bit1设置,为只读,若该位为1则IXP425作为主设备,若该位为0
则IXP425位从设备。
在IXP425中,PCI的寄存器可分为两类。一类可以直接由IXP425内部的AHB总线访问,和内存统一编址,提供了访问PCI配置空间的接口。另一类寄存器是PCI配置空间寄存器,它们符合PCI总线标准,其内容在第二节中介绍过。
3.1 配置方法
对于IXP425的PCI配置空间和外部设备的PCI配置空间,访问的方法是不同的,下面将分别说明。
a 访问IXP425配置空间
IXP425内部的PCI配置空间不能由AHB总线访问,IXP425提供了pci_crp_ad_cbe,pci_crp_wdata,pci_crp_rdata三个寄存器来完成对其内部PCI配置空间的访问。pci_crp_ad_cbe纪录要访问的地址和命令,pci_crp_wdata,
pci_crp_rdata分别为数据写入寄存器和数据读取寄存器。访问的过程如下:
1 在pci_crp_ad_cbe中写入要操作的命令和要访问寄存器的偏移量
2 如果要做写入操作,向pci_crp_wdata中写入数据;如果要作读取操作,从pci_crp_rdata中读取数据。
b 访问外部设备PCI配置空间
pci_np_ad,pci_np_cbe,pci_np_wdata,pci_np_rdata,这四个寄存器为一组non_pre_fetch寄存器,它们提供了访问外部PCI配置空间的方法。它们属于上面介绍的第一类寄存器,可以由AHB总线直接访问,编址分别为0xC0000000,0xC0000004,0xC0000008和0xC000000C。pci_np_ad是PCI总线地址寄存器,提供了访问外部PCI配置空间的地址。pci_np_cbe是PCI命令及字节控制寄存器,它将对外部PCI空间作相应的操作,这些操作包括读/写配置空间,读/写Memory空间及读/写I/O空间等,在配置的过程中主要是完成对配置空间的读写,Memory空间和I/O空间可以在配置完成后由CPU迸发的读写。pci_np_wdata,pci_np_rdata分别为需要读入或写入的数据,它们将被保存在这
两个寄存器中。对外部PCI空间的访问可分为如下的三个步骤:
1 在pci_np_ad中写入需要访问寄存器的地址,格式如图2示:
图2
PCI总线可以在模式0和1两种模式下工作,但IXP425只支持在模式0下工作,所以这里只说明了在模式0下的操作。这里要特别指出的是,选定特定的PCI设备需要把ID_SEL引脚置高电平,其功能如同片选信号,高电平的选择可以在pci_np_ad的11到31位完成,如连接外部设备ID_SEL引脚的为地址线31位则应该把第31位置1。
2 在pci_np_cbe写入要操作的命令
3 如果要写入数据,就在pci_np_wdata中写入数据;如果要读取数据,则可以在pci_np_rdata中读取
3.2 AHB地址与PCI地址间的转换
在进行Memory读/写和I/O读写时,可以用地址转换迸发的进行,下面说明了AHB地址和PCI地址间的转换关系。
a AHB空间到PCI空间的转化
在IXP425中,PCI的地址空间被分为四个窗口,共为64M,如表1示:
起始地址 结束地址
窗口一 ( 16MB ) 0x48000000 0x48FFFFFF
窗口二 ( 16MB ) 0x49000000 0x49FFFFFF
窗口三 ( 16MB ) 0x4A000000 0x4AFFFFFF
窗口四 ( 16MB ) 0x4B000000 0x4BFFFFFF
表1
当AHB总线上有如上的地址时,将会通过寄存器PCI_PCIMEMBASE转换。该寄存器被分为4个部分,每部分纪录了转换后的基地址。例如若PCI_PCIMEMBASE的值为0x12345678,若AHB总线地址为0x48012345,转换后的PCI地址为0x12012345。若AHB总线地址为0x4A005678,怎PCI总线地址为0x56005678。
b PCI地址到AHB地址的转化
PCI地址到AHB地址的转换通过PCI_AHBMEMBASE, PCI_AHBIOBASE,及在配置空间中的BAR0-5几个寄存器来控制。寄存器PCI_AHBMEMBASE被分为四部分,对应BAR0-3四个基址寄存器,负责PCI Memory周期的地址转换。假设PCI_AHBMEMBASE的值为0x01020304,BAR0值为0x20000000,BAR1的值为0x21000000, BAR2值为0x22000000,BAR3值为0x23000000。当PCI总线地址为0x21001234时,它将被映射到BAR1上,对应得AHB地址就为0x02001234。
寄存器PCI_AHBIOBASE和BAR5对应,PCI_AHBIOBASE纪录I/O在AHB总线上的基址,而BAR5纪录在PCI总线上的基址,它们的转换方法与上面Memory地址的转换方法相同。而落在BAR4范围内的地址将被直接转换到IXP425内的一个寄存器PCI Doorbell Register。
四 PCI驱动程序
4.1 PCI控制器初始化
全部0条评论
快来发表一下你的评论吧 !