Vxworks下PCI设备驱动程序的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Vxworks下PCI设备驱动程序的设计与实现
摘要:VxWorks在嵌入式军工产品中的应用越来越广泛。

本文详细描述了在VxWorks操作系统下PCI总线驱动程序的设计与实现过程。

关键词:VxWorks PCI驱动中断
1.引言
VxWorks是一种运行在嵌入式设备上的高性能、可裁减性的嵌入式实时操作系统,是专门为实时嵌入式系统设计开发的操作系统,其良好的可靠性和卓越的实时性被广泛地应用在军事、航空、航天等高精尖技术及实时性要求极高的领域中。

本文详细讨论了工程实践中在VxWorks操作系统下,对基于PCI 总线设备驱动程序的设计与开发过程,具有较强的通用性。

2.系统概要
本系统主要包括三种模块的驱动:开关量板驱动,A/D板驱动以及串口板驱动,其结构框图如图2-1所示:
图2-1 系统结构框图
系统通过这三种模块的驱动程序来完成对系统相应功能的实现。

3.程序设计
开发驱动程序的首要任务就是确定访问设备的地址。

VxWorks 系统上电后POST软件会依次扫描系统中所有的PCI设备,并为它们分配相映的地址。

所以针对PC1总线结构设备的驱动程序主要开发步骤即:确定设备的PCI配置信息、确定设备的内部存储器、寄存器基地址及中断号、设备初始化、中断服务程序以及对设备的具体读写操作等。

每个PCI设备具有三种物理空间:存储器空间、1/O空间和配置空间。

配置空间是长度为256字节的一段连续的空间,其中前64字节为Header(头标),其余192字节为设备相关信息,在64字节的Header中,前16字节的定义是确定的,后48字节的具体含义因设备而异。

驱动程序首先要找到所有驱动的板卡,确定对它的访问方式是内存映射还是I/O映射,这样驱动程序就可以直接使用这些地址进行操作。

4.驱动实现
VxWorks下PCI设备驱动程序实现的过程可以概括为:调用系统函数查找到相应的设备,然后查询硬件设备上的资源信息,包括内存空间基地址、I/O空间基地址、中断向量等资源,如果有中断需要挂接中断服务程序,最后实现读写操作。

4. 1查找PCI设备
if((pciFindDevice (VENDOR_ID,DEVICE_ID, Index, &busNo, &deviceNo,&funcNo))== OK)
{
logMsg("Found PCI device! \n", 0, 0,0, 0,0,0);
}
对于多块PCI板卡,需要根据各自的VENDOR_ID及DEVICE_ID来进行查找。

4. 2获得设备资源
根据设备的总线号busNo、设备号deviceNo、功能号funcNo,通过调用pciConfigInLong ,pciConfigInByte获得设备映射的内存基地址memBase和I/O基地址ioBase以及中断号irq,核心代码如下: pciConfigInLong(busNo,deviceNo,funcNo,PCI_CFG_BASE_ADD RESS_0, &memBase);
pciConfigInLong(busNo,deviceNo,funcNo,PCI_CFG_BASE_ADD RESS_l, &ioBase);
获得的基地址要分别与存储器屏蔽位PCI_MEMBASE_MASK和I/O屏蔽位PCI_IOBASE_MASK相与,才能得到真正板卡的内存基地址和I/O基地址。

4.3映射内存空间
为使板卡的内存空间和I/O空间可用,必须在MMU ( Memory Management Unit )表中添加内部存储器地址空间,操作方法可以通过直接修改sysLib.c中的sysPhysMemDesc,这种方法灵活性不好,也
可以在程序中调用sysMmuMapAdd来实现,该方法是动态的具有较强的灵活性。

例如:
if(sysMmuMapAdd((void*)memBase,MEM_SIZE,(UINT)
INIT_STATE_MASK,(UINT) INIT_STATE)==ERROR) {
logMsg("pci map memory failed \n",0,0,0,0,0,0);
return(ERROR);
}
4.4中断服务程序
通过板卡中断线的irq可以获得系统分配的中断号,在挂接中断服务程序前先禁止该中断,利用操作系统提供的函数pciIntconnect 将中断服务程序与中断向量连接起来,然后打开中断,使能并响应中断。

中断服务程序代码要尽可能简练,使其能尽快返回,不能造成系统阻塞而影响系统性能。

在中断服务程序中要判断发生的中断是否为自己产生的。

若是,则执行所提供的相应处理,例如清除中断,为下一次中断的到来做好准备;如不是,退出即可。

5.结束语
本文介绍了VxWorks操作系统下PCI总线设备驱动程序的开发与实现过程,为后续的工作奠定了基础,具有较强的通用性。

相关文档
最新文档