ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:824.13KB ,
资源ID:24836699      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24836699.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(PCI驱动开发实现 vxworks.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

PCI驱动开发实现 vxworks.docx

1、PCI驱动开发实现 vxworks嵌入式系统中平台PCI模块驱动讲解1、PCI系统需求PCI网卡2、PCI总线的基础知识PCI是Peripheral Component Interconnect(外设部件互连标准)的缩写,它是目前个人电脑中使用最为广泛的接口,其位宽为32位或64位,工作频率为33MHz,最大数据传输率为133MB/sec(32位)和266MB/sec(64位)。可插接显卡、声卡、网卡、内置Modem、内置ADSL Modem、USB2.0卡、IEEE1394卡、IDE接口卡、RAID卡、电视卡、视频采集卡以及其它种类繁多的扩展卡. 目前PCI-E是PCI最新的发展方向,串行,

2、点对点传输,每个传输通道独享带宽;支持双向传输模式和数据分通道传输模式;在PCI-E 3.0规范中,X32端口的双向速率高达320Gbps,可以满足新一代的I/O接口,比如:千兆(GE)、万兆(10GE)的以太网技术、4G/8G的FC技术。实现PCI驱动开发需要了解的基础知识主要包括三个方面,PCI 控制器、PCI 设备以及 PCI 总线。PCI拓扑结构如下图,在总线结构中,ethernet、SCSI、video设备和pci-pci bridge都为PCI设备, CPU中包含PCI控制器、Pci bus0 和pci bus1为PCI设备总线。1、PCI总线每一个PCI device都有其uni

3、que PFA(PCI Fcntion Address)PFA由 bus number、device number、function number组成。一条PCI总线支持256个PFA,即支持256个PCI device。 每个PCI芯片都有自己的device number(取决于IDSEL管脚),每个PCI芯片占用8个PFA。 每个PCI芯片的第一个PCI device的PFA必为8的倍数。 若PCI device的配置空间中PCI_HEADER_TYPE寄存器的最高bit为1,说明此芯片还有其他PFA,即还有其他device,即当前芯片是 multi-function device. 在系

4、统中,每个PCI芯片上的所独有的信号线是:INTA、INTB、INTC、INTD、IDSEL 每个芯片上的IDSEL需要连到PCI总线中AD31:11中的一根,这对应于PCI device PFA的device number(1)接口控制管脚 (出问题时常测这些管脚)FRAME#:帧周期信号。Master驱动,表示一次访问的开始和持续时间。 FRAME#无效时,是传输的最后一个数据周期。IRDY#:Master准备好信号。TRDY#:Slave准备好信号。当这两者同时有效时,才能进行完整的数据传输,否则即为等待周期。在写周期,IRDY#信号有效时,表示有效的数据信号已在AD0AD31中建立;在

5、读周期,IRDY#信号有效时,表示Master已做好接收数据的准备。在写周期,TRDY#信号有效,表示Slave已做好了接收数据的准备。在读周期,TRDY#信号有效,表示有效数据已被送入AD0AD31中,STOP#:停止数据传送信号,由Slave发出。当它有效时,表示Slave请求Master终止当前的数据传送。IDSEL:初始化设备选择信号。在读写配置空间时,用作Slave的片选信号(Slave通常把IDSEL连到AD31:0上的一根,PFA中的device id就是这么确定的)DEVSEL#:设备选择信号,由Slave驱动,该信号有效时,当前Slave设备已被选中(2)时序读时序写时序:2

6、、PCI设备 每个PCI逻辑设备都有自己的配置空间,里面存储了一些基本信息,生产商,IRQ中断号,还有就是定义了mem空间和io空间的起始地址和大小。256字节的PCI配置空间分为64字节的头标区和192字节的设备相关区两部分。头标区的各个寄存器用来唯一地识别设备;设备相关区则保存一些与设备相关的数据。配置空间的头标区又分为两部分:前16个字节的定义在各种类型的PCI设备中都是一样的;剩余的字节随设备类型不同而有所不同。位于偏移地址0EH处的头标类型字段规定了头标区的布局结构。目前,规范定义了三种头标类型。嵌入式系统中中的PCI网卡的头标类型是0,所以下面我们就来详细说说其布局结构,至于其他类

7、型的头标请读者自行阅读。图3就是头标类型0的头标区的布局。头标区中的寄存器根据功能可分成下面几组:1. 设备的识别(1) 供应商代码:该寄存器用于识别PCI设备的制造商,具体代码由PCI SIG()分配。0FFFFH是无效的供应商代码。(2)设备代码。该寄存器用来标识某供应商生产的具体设备,代码由各供应商定义。供应商代码和设备代码,读者可以到网站(3)版本号。该寄存器用来定义指定设备的版本信息。(4)头标类型。该字段的第7位为“1”标识该设备是多功能设备,为“0”标识为单功能设备;该字段的06位就是上文表中所述的头标类型。(5)设备分类代码。用来标识设备的总体功能和特定的寄存器级编程接口。上面

8、5个字段均为只读类型,所有的PCI设备都必须实现其功能。 2. 设备控制和设备状态(1)命令寄存器为一个设备发出和响应PCI总线命令提供粗略的控制。下图就是命令寄存器格式。图 命令寄存器格式我们比较关注的位有:a.位0(I/O空间控制):控制对I/O空间访问的响应。该位为0时,禁止设备响应 对I/O空间的访问;该位为1时,允许设备响应I/O空间的访问。缺省设置为0。b.位1(存储器空间控制):控制一个设备对存储器空间访问的响应。该位为0时, 禁止响应;该位为1时,允许设备响应对存储器空间的访问。缺省设置为0。(2)状态寄存器用来记录PCI总线有关的状态信息。 3. 基址寄存器PCI设备中,除了

9、配置空间外,还有两个物理空间:内存空间和I/O空间。为了访问这两个地址空间,就必须使用基址寄存器。头标类型0中涉及3种基址寄存器:内存空间基址寄存器、I/O空间基址寄存器和扩展ROM基址寄存器。在所有的基址寄存器中,位0均为只读位并且用来决定能够是存储器空间还是I/O空间。如果该位为0,则表示映射到存储器空间;若为1则表示映射到I/O地址空间。 (1)存储器基地址寄存器映射到存储器空间的基址寄存器可以是32位宽度,也可以是64位宽度(支持映射 到一个64位地址空间时)32/64存储器基地址寄存器格式其中位0要用硬件方法使其恒为0。而位2和位1两位用来表示映射类型,具体如下:位2和位1映射类型0

10、0基地址寄存器为32位宽,可以在32位表示的存储器地址范围的任何地方进行映射01保留10基地址寄存器为64位宽,可以映射到以64位表示的存储器空间的任何地方11保留至于位3,若数据是可预取的,就应将它置为1,否则清0。该寄存器的区域各位用来将一设备映射到存储器空间。基地址寄存器中用于32位存储器译码器的位【314】和用于64位存储器译码器的位【634】称为基地址单元。它的作用是:确定与译码器相关的存储器的大小;给译码器分配地址。如果存储器设备需要小于4K的存储空间,规范建议存储器范围强行设为4KB。(2) I/O基地址寄存器映射到I/O空间的基址寄存器宽度总是32位:I/O基地址寄存器格式其中

11、位0值为1(用硬件实现的),位1为保留位并且其读出值必须为0,其余各位用来把设备映射到I/O空间。当基地址寄存器位0的返回值为1时,表示这是一个I/O译码器,而不是存储器译码器,位1保留并总是返回0,【31:2】是基地址单元,并用于确定需要的I/O块容量,设置它的起始地址。规范要求映射它的控制寄存器组到I/O空间的 设备不必请求每个I/O基地址寄存器超过256个单元。(3)确定块容量和分配地址范围要确定存储器的容量或I/O空间大小可以通过简单地向基地址寄存器写入全“1”并回读来确定。若返回一个是0值,则表示未实现基地址寄存器;如果读回地值为非0,则编程人员通过从基地址单元的最低有效位向上扫描返

12、回值以找到第一个被成功置“1”的位来确定所需存储器的容量或I/0空间的大小。假设寄存器的位0是一个加权二进制1,那么位1的值就是2,位2的值就是4,依此类推。这样,在基地址单元中第一个发现的1所对应的加权二进制值便是所需的空间数。这也是寄存器的第一个可读/可写位,在它之上的所有位钧定义为可读/可写位。这个信息发现后,程序将32/64位存储器起始地址或32位I/O地址写入基地址寄存器中。(4)扩展ROM基地址寄存器有些PCI设备,尤其是那些准备用于PC结构扩展板上的设备,需要EPROM作为扩展ROM。为此,在配置空间偏移地址30H处开始定义了四个字节的寄存器,用来处理这个扩展ROM的基地址和大小

13、。扩展ROM基地址寄存器格式该寄存器和32位基地址寄存器相比,除了位的编码和用途不同之外,其它功能完全相似。它的高21位对应于扩展ROM基地址的高21位。一个设备实际实现的位数取决于该设备要求多大的地址空间。例如,一个设备要求它的扩展ROM映射到一64KB存储区域时,它就应该实现此寄存器的高16位,其它5位用硬件方法使它们恒为0。凡是支持扩展ROM的设备必须实现这个寄存器。与设备无关的配置软件通过对扩展ROM基址寄存器的地址位上写入全“1”,然后再读回以确定设备要求多大的地址范围。所有的无关位上都返回0,从而有效地指出了地址边界,也就知道了设备要求的这一块地址空间的大小。一个设备要求的地址空间

14、范围不能超过16MB。这个寄存器的位0用来控制相应的设备是否能够接受对其扩展ROM的访问。当该位为0时,禁止访问设备的扩展ROM地址空间;当该位为1时,允许将本寄存器的其它位作为参数进行地址译码。命令寄存器中的存储器空间位优先于扩展ROM的使能位,但是,如果存储器空间位和扩展ROM的的使能位同时为1时,设备就必须响应对其扩展ROM的访问。扩展ROM的使能位在复位后应该为0。4. 其他寄存器其他寄存器包括一些本文不涉及到的寄存器,如中断引脚、中断线等等。3、PCI控制器PCI 控制器担当 PCI 接口与 CSB(统一系统总线) 之间的桥,如下图为MPC8349的PCI控制器结构主要完成如下功能:

15、(1)PCI设备配置空间的访问, 配置访问寄存器;(2)CPU和内存空间地址映射(outbound), I/O定序器实现;(3)PCI设备地址空间的映射(inbound), ATU寄存器;(4)PCI总线错误和状态等;1、PCI设备配置空间的访问CPU通过两个寄存器访问上面介绍的PCI设备配置空间:CFG_ADDR 和 CFG_DATA。下图我MPC8349中对应的两个寄存器:(1)PCI配置空间对应于一个PCI逻辑设备,所以要访问一个配置空间的某个寄存器,必须要指定:PCI总线号、PCI设备号、PCI设备功能号和寄存器号。配置地址寄存器的格式如下:3130 2423 1615 1110 87

16、 210使能位保留总线号设备号功能号寄存器号00第0、1位上的“0”是用来要求你只能按双字(4字节)来读写配置空间寄存器。第31位“使能位”用来决定是否允许访问配置空间:为“1”时表示可以访问;为“0”时表示不可以访问; (2)对CFG_DATA的操作就是对配置空间相应寄存器的操作数; (3)PCI配置空间中的BAR(Base Address Register)用来映射PCI设备的寄存器,里面的值是bus地址首地址,至于空间的大小,先向bar中写0xFFFFFFFFF,然后读取,选最低的一位非0的,比如为0x1000,那个空间的大小就为0x1000。 这里需要注意,当PCI配置成64bit或3

17、2bit时,BAR有区别。2、CPU和内存地址空间映射到PCI地址空间(outbound) 当CPU访问PCI设备的mem空间和io空间的寄存器时,需要进行地址转换。MPC8349有6个outbound窗口05用来将CPU内部地址转换为PCI总线地址。每个outbound窗口有如下三类寄存器: (1)外部PCI总线地址的基址outbound窗口转换后(外部PCI总线地址的基址,当使用64bit PCI时会用到第二个扩展寄存器) (2)CPU内部32bit地址的基址(EA) (3)窗口属性寄存器,大小、转换类型等等EN:设置此窗口是否使能 RTT/WTT:分别设置此窗口的存取方式(memory或

18、io) OWS:设置此窗口大小3、PCI地址映射到CPU和内存地址空间(inbound)当PCI设备访问MPC8349时,有3个inbound窗口13用来将PCI总线地址转换为CPU内部地址。和outbound窗口一样,inbound窗口有如下三类寄存器: (1)CPU内部32bit地址的基址(TA) (2)外部PCI总线地址的基址(使用64bit PCI时会用到第二个扩展寄存器)(3)窗口属性寄存器,大小、转换类型等等EN:设置此窗口是否使能 PF:设置此窗口是否开启prefetchable特性 TGI:Target Interface,见datasheet P883 RTT/WTT:设置P

19、CI外设访问CPU时的存取方式(snoop L2cache 等等) IWA:设置此窗口的大小3、驱动的实现嵌入式系统中平台PCI驱动目录结构如下:该PCI驱动主要分为三个主要部分: (1)PCI总线的基本操作;(2)mpc8349的pci控制器的配置;(3)板级PCI总线的支持和注册;1、PCI总线的基本操作(1)数据结构PCI控制器数据结构,包括了PCI控制基本的信息typedef struct tagDRV_PciCtrlerInfo_T PLT_INT32 lCtrlId; /* pci控制器id */ PLT_UINT32 ulState; /* pci控制器状态 */ PLT_UIN

20、T32 ulCacheLine; /* cache line大小 */ PLT_UINT32 ulLatencyTimer; /* 延迟时序参数 */ reg32_t *pulCfgAddr; /* 配置寄存器地址 */ reg8_t *pucCfgData; /* 配置数据地址 */ void *pvIoseq; /* io排序器地址 */ void *pvCtrl; /* 控制器私有指针 */ PLT_UINT32 ulFirstOutbNum;/* outbound区域在apstRegion中的第一 个编号,must less than ulFirstInbNum */ PLT_UINT

21、32 ulFirstInbNum; /* inbound区域在apstRegion中的第一个 编号 */ PLT_UINT32 ulTotalRegion; /* apstRegion中pci region的总数 */ DRV_PciRegion_S *apstRegion; /* pci region区域指针 */ DRV_PciCfgTable_S *pstCfgTable; /* pci 设备配置表指针 */ DRV_PciDevInfo_S*apstDevicesDRV_PCI_BUS_NUM_MAXDRV_PCI_DEVICES_NUM_MAX; /*pci设备信息指针 */ voi

22、d (*fpPciReset)(const struct tagDRV_PciCtrlerInfo_T *pstCtrl, PLT_UINT32 ulVal); /* pci控制器复位函数指针 */ PLT_INT32 (*fpPciInit)(struct tagDRV_PciCtrlerInfo_T *pstCtrl); /* pci控制器初始化函数指针 */ DRV_PciCtrlerInfo_S;PCI总线地址访问映射区域数据机构/* * brief pci region信息 */typedef struct tagDRV_PciRegion_T DRV_PCI_ADDR_T ulBu

23、sStart; /* pci总线起始地址,低32bits */ DRV_PCI_ADDR_T ulExtBusStart; /* pci总线起始地址,高32bits */ DRV_PHYS_ADDR_T ulPhysStart; /* 物理地址 */ DRV_PHYS_ADDR_T ulAddrAlloc; /* 空闲的物理地址,已经分配好的物理地址的尾部 */ DRV_PCI_SIZE_T ulSize; /* region大小 */ PLT_UINT32 ulFlags; /* region资源标记 */ DRV_PciRegion_S;(2)PCI总线的操作a)PCI设备配置空间的访问接

24、口,实现对PCI设备的配置:void DRV_PciConfigByteRead0(const DRV_PciCtrlerInfo_S *pstCtrl, DRV_PCI_DEV_T ulDev, PLT_UINT32 ulWhere, PLT_UINT8 *pucVal);DRV_PciConfigWordRead0();DRV_PciConfigDwordRead0();DRV_PciConfigByteWrite0();DRV_PciConfigWordWrite0();DRV_PciConfigDwordWrite0();b)PCI控制器实例的注册接口, 在MPC8349控制器配置后调

25、用此接口完成注册PLT_INT32 DRV_PciCtrlerRegister(DRV_PciCtrlerInfo_S *pstCtrlInfo);c) 向pci控制器注册pci设备, 例如DM9102网卡PCI设备注册到PCI控制器,就需要调用此接口PLT_INT32 DRV_PciDevAttach(DRV_PciDevInfo_S *pstDev);d) pci总线地址到内存物理地址的转换PLT_INT32 DRV_PciBusToPhys(const DRV_PciCtrlerInfo_S *pstCtrlInfo, DRV_PCI_ADDR_T ulBusAddr, PLT_UINT

26、32 ulFlags, DRV_PHYS_ADDR_T *pulPhyAddr);e ) 内存物理地址到pci总线地址的转换PLT_INT32 DRV_PciPhysToBus(const DRV_PciCtrlerInfo_S *pstCtrlInfo, DRV_PHYS_ADDR_T ulPhyAddr, PLT_UINT32 ulFlags, DRV_PCI_ADDR_T *pulBusAddr);f)为pci分配outbound空间,输出pci总线地址PLT_INT32 DRV_PciOutBRegionAllocate(const DRV_PciCtrlerInfo_S *pstPc

27、iCtrl, PLT_UINT32 ulSize, PLT_UINT32 ulIoMem, DRV_PCI_ADDR_T *pulBase);g)为pci分配inbound空间,输出内存物理地址PLT_INT32 DRV_PciInBoundRegionAllocate(const DRV_PciCtrlerInfo_S *pstPciCtrl, PLT_UINT32 ulSize, PLT_UINT32 ulIoMem, DRV_PHYS_ADDR_T *pulPhys);h) pci初始化 - 1.注册pci控制器 - 2.解复位pci总线 - 3.pci总线初始化 PLT_INT32 D

28、RV_PciInit(void)2、MPC8349的PCI控制器基本操作(1)数据结构a)PCI配置空间访问寄存器typedef struct tagDRV_PciCfgMpc834x_T reg32_t ulCfgAddr; reg32_t ulCfgData; reg32_t ulAck; reg8_t aucRes116U; DRV_PciCfgMpc834x_S;b)PCI 控制器outbound空间数据结构typedef struct tagDRV_PciOutBWinMpc834x_T reg32_t ulPotar; reg32_t ulRes0; reg32_t ulPobar

29、; reg32_t ulRes1; reg32_t ulPocmr; reg32_t ulRes2; DRV_PciOutBWinMpc834x_S;typedef struct tagDRV_IosMpc834x_T DRV_PciOutBWinMpc834x_S astPot6U; reg32_t ulres00x60; reg32_t ulPmcr; reg32_t ulRes1; reg32_t ulDtcr; reg32_t ulRes2; DRV_IosMpc834x_S;.c) PCI控制器错误和状态数据结构typedef struct tagDRV_PciCtrlMpc834x

30、_T reg32_t ulEsr; /* 0x00 */ reg32_t ulEcdr; /* 0x04 */ reg32_t ulEer; /* 0x08 */ reg32_t ulEatcr; /* 0x0C */ reg32_t ulEacr; /* 0x10 */ reg32_t ulEeacr; /* 0x14 */ reg32_t ulEdlcr; reg32_t ulEdhcr; reg32_t ulGcr; /* 0x20 */ reg32_t ulEcr; reg32_t ulGsr; /* 0x28 */ reg32_t aulRes03; /* 0x34 */ reg32_t ulPitar2; /* 0x38 */ reg32_t ulRes1; reg32_t ulPibar2; /* 0x40 */ reg32_t ulPiebar2; reg32_t ulPiwar2; reg32_t ulRes2; reg32_t ulPitar1; /* 0x50 */ reg32_

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1