UBOOT下IXP425 PCI驱动程序设计
2009-04-07 13:32

摘要:
本文说明了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控制器初始化
由于我们使用的目标板IXDP425中,IXP425工作在主模式下,因此这里只介绍主模式下的初始化过程。其过程如下:
1 为PCI控制器分配引脚。除了PCI控制器本身的连接外,IXP425还使用了GPIO的一部分引脚,这包括GPIO14时钟引脚,GPIO13 RESET引脚,GPIO8-11中断引脚。
2 配置寄存器PCI_AHBMEMBASE, PCI_AHBIOBASE,PCI_PCIMEMBASE,以及IXP425的Base Address Register,为IXP425内部的AHB与PCI地址转换做初始化。
3 扫描外部设备。通过在PCI总线上扫描来发现PCI设备,若在总线上读取到有设备ID则表示有设备存在,这是还应该读取设备的Base Address Register,以确定设备存储器的大小。
4 为每个设备分配基地址。通过扫描得到的存储器大小为外围设备计算统一的AHB总线上的基址,并把计算得到的基址写入相应PCI设备的Base Address Register。
4.2 连接网卡驱动程序
在U-BOOT中已经提供了EEPRO-100的驱动程序,只要把它同PCI的驱动程序连接就可以使用。
1 加入编译选项。在include/configs/ixdp425.h中加入#define CONFIG_EEPRO100,这样U-BOOT在编译时就会加上网卡部分的程序。
2 连接网卡驱动程序。在网卡的驱动程序中使用了两个宏来完成AHB地址和PCI地址的转换,bus_to_phys(a)提供了PCI地址到AHB地址的转换,phys_to_bus(a)提供了AHB地址到PCI地址的转换。这两个宏内部使用了一个结构表示第三节中所述寄存器的值。结构如下:
struct pci_region {
unsigned long bus_start; /* Start on the bus */
unsigned long phys_start; /* Start in physical address space */
unsigned long size; /* Size */
unsigned long flags; /* Resource flags */
};
在结构中定义了PCI地址的起始地址,AHB地址的起始地址,存储器大小和资源类型(Memory或I/O)等信息。在初始化中对这个结构赋值,然后调用函数pci_register_hose(hose);向系统注册就可完成网卡驱动程序的连接。

五 结论
本文介绍了如何为IXP425在U-BOOT下添加PCI驱动程序,说明了IXP425 PCI控制器的工作方式,最后说明了怎样把PCI网卡EEPRO-100加入到U-BOOT中。

参考文献
1 PCI Local Bus Specification Revision 2.2 .
2 Intel IXP4XX Product Line of Network Processors and IXC1100 Control Plane Processors Developer’s Manual. Intel Inc

UBOOT下IXP425 PCI驱动程序设计相关推荐

  1. u-boot下的DM驱动模型

    U-boot 下DM驱动模型的相关笔记 要注意的关键两点: DM驱动模型的一般流程bind->ofdata_to_platdata(可选)->probe 启动,bind操作时单独完成的,主 ...

  2. 实时linux下的PCI驱动开发(上)

    第一篇博客,忆苦思甜下先,当然,我尽量长话短说,但说来话长倒也无妨......这是我研究生阶段写的第一个Linux驱动,一入Linux深似海,从此Windows是路人.那是2009年冬天的第一场雪,王 ...

  3. linux驱动程序之PCI驱动程序设计

    文章目录 PCI驱动描述 PCI驱动注册 使能PCI设备 获取PCI配置寄存器基地址 中断 部分代码 PCI驱动描述 在linux内核中,PCI驱动使用 struct pic_driver 结构来描述 ...

  4. linux下ad数模转换驱动程序设计,iTOP-4412开发板实现3路ADC数模转换驱动例程

    学习下 linux 数模程序驱动的编写,本节我们实现的功能是实现三路 ADC 数模转换. 驱动程序 驱动程序的名字:"itop4412_adc.c". 要想把这个驱动注册到内核,先 ...

  5. uboot下phy的工作

    UBOOT的PHYCHIP配置 PHYCHIP的配置位于 include/configs/XXX_config.h中 #define CONFIG_YYY_ETH #define CONFIG_YYY ...

  6. sm总线控制器找不到驱动程序_细说嵌入式系统下的驱动程序设计

    嵌入式系统驱动程序的开发有别于WIndows或Linux.后者除了必须了解新设备的硬件特性,把控制硬件的程序尽快完成之外,还需要设法让驱动程序符合Windows或Linux的规定(大且复杂的架构).但 ...

  7. c 调用 linux驱动程序,Linux下的C编程实战(五)――驱动程序设计

    Linux下的C编程实战(五) ――驱动程序设计 1.引言 设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细节,一般来说,Linux的设备驱动程序需要完成如下功能: (1)初始 ...

  8. uboot 下spinand 驱动移植 ———1.驱动接口的添加到uboot中

    前面有篇文章谈到:https://blog.csdn.net/clam_zxf/article/details/108834541 平台驱动和单片机驱动异同,同样可以将uboot 除去它的引导加载:所 ...

  9. WindowsCE.Net下CAN卡的驱动程序设计

    近年来电力行业为了快速部署变电站,采用了建造整体变电所的方法:在生产基地将变电站的内部设备安装.调试完成,只留下与外界的接口,整体运到变电站所在地后进行安装和简单调试即可投入运行.其内部设备通过CAN ...

最新文章

  1. 配置oracle net,配置 Oracle Net 的3个重要文件
  2. 企业单点登录解决方案(CAS)之二安装要求
  3. Typora入门(1)
  4. 使用 github 和 jitpack 构建 android 依赖
  5. MyEclipse使用总结——MyEclipse去除网上复制下来的来代码带有的行号
  6. df的缺失值处理 df.isnull()和df.dropna()
  7. RTMP在NGINX的启动
  8. c语言文件压缩与解压缩实验报告,哈弗曼树的文件压缩和解压实验报告(C语言).doc...
  9. oracle 里数据的编码格式,oracle 数据的编码格式
  10. “鸡肋”的百度,掉队了 BAT? | 畅言
  11. androidstudio4.1.1 build model卡主_在C++中加载PyTorch1.4的FasterRCNN模型
  12. 苹果Mac上如何使用预览反转图片?
  13. 【图像修复】基于matlab GUI自适应空间滤波图像修复【含Matlab源码 840期】
  14. word中填充效果锁定纵横比_操作基础知识Word文字编辑
  15. 基于系统的软件测试报告,软件系统测试报告模板.doc
  16. 计算机网络考研笔记(持续更新)
  17. python webpy 开发文档_Python webpy微信公众号开发之 回复图文消息
  18. django-上下文处理器
  19. unity获取电磁笔压感_电磁屏技术如何实现真实笔锋精准点触
  20. web页面实现剪切板图片黏贴功能

热门文章

  1. 处理苹果IOS手机safari 浏览器自动识别电话并且黑化样式的问题
  2. 被上帝咬过一口的苹果
  3. JS_无法监听audio的ended事件,监听audio播放结束无效
  4. 怎么根据矩阵判断极大无关组_怎么根据矩阵判断极大无关组_什么是极大无关组?怎么判别?...
  5. 曙光数创成功签约中通服,共同推动通信行业数字化
  6. 双电梯电梯调度算法的简单分析
  7. BASYS3开发板与键盘连接实验
  8. 如何用普通电池给单片机供电?
  9. 37wan《龙之纹章》宠物岛全面更新
  10. 高瓴张磊:判断一个人是否靠谱,关键看4个维度