标题 | 基于WDM的CPCI多串口数据通信卡驱动程序设计 |
范文 | 龚俊 张京 王璐 摘要:介绍Windows XP系统下,基于WDM架构的CPCI多串口数据通信卡驱动程序的设计及实现方法,并分析WDM架构下的多串口卡设备的驱动层次结构、总线驱动关键IRP事件的处理机制。最后,探讨其驱动程序安装及调试。 关键词:CPCI;WDM;多串口数据通信卡;Windows XP DOIDOI:10.11907/rjdk.151822 中图分类号:TP319 文献标识码:A 文章编号文章编号:16727800(2015)008011503 0 引言 CPCI是PICMG(国际工业计算机制造者联合会)组织于1994年提出的高性能工业计算机总线标准。CPCI总线以PCI电气规范为基础,解决了VME等总线技术与PCI总线不兼容的问题,其与传统PCI总线完全兼容,使得基于PC的x86架构等技术能在工业领域广泛使用。同时由于其接口作了重大改进,使得采用CPCI架构技术的工控电脑具有高可靠性、高密度优点。 本文CPCI多串口数据通信卡由西南自动化研究所自主研发设计生产,具有8通道RS232/422/485接口,各通道均可通过拨码开关进行协议间切换。硬件采用PLX9054桥与CPLD组合的方案,实现ST16C554串口控制器与CPCI总线间的数据访问,CPLD逻辑负责将8个串口的寄存器操作地址空间、中断分别映射到PCI可操作地址空间及中断向量上,供串口功能驱动进行使用。硬件结构框图如图1所示。 1 驱动程序框架 1.1 WDM驱动架构 WDM(Windows Driver Mode)是微软公司定义的驱动设计规范,其基于模块化设计思想,使得驱动开发更加规范可靠。WDM定义了一个基本模型,处理所有类型的数据,拥有总线驱动和类驱动。WDM 驱动体系定义驱动程序层次(见图2),将各层次的驱动程序按一定顺序排列起来。 图1 硬件结构[HJ] 图2 WDM中设备对象和驱动程序的层次结构 在单个硬件驱动程序堆栈中,不同位置的驱动程序扮演着不同的角色。功能驱动程序管理FDO所代表的设备,总线驱动程序管理计算机与PDO所代表设备的连接,过滤器驱动程序用于监视和修改IRP流[1]。 当总线驱动程序枚举硬件时,其作用相当于一个普通的功能驱动程序。检测到新硬件后,它改变为总线驱动程序角色,并为找到的硬件创建PDO,最终由PnP管理器负责加载该PDO的驱动程序。 1.2 CPCI多串口数据通信卡驱动架构 一般一个设备的驱动程序至少包括两个驱动程序: 一个是总线驱动程序,另一个是功能驱动程序。总线驱动程序通常由系统供应商提供,负责管理硬件与计算机的连接[2]。功能驱动程序,即通常所说的设备驱动程序,负责指挥硬件工作,例如初始化IO 请求等[3]。 在CPCI多串口数据通信卡驱动架构中,通信卡驱动程序也是由总线设备驱动和串口设备驱动组合而成。总线设备驱动负责枚举出当前板卡上的全部串口,并为每个串口分配其所需要的硬件IO地址及中断资源,负责处理每个子串口驱动各类型IRP请求。功能驱动则负责完成串口控制器的初始化、响应串口中断,接收与发送串口缓存区数据,对串口控制参数进行配置[4]。 1.3 标准文件操作 相比利用第三方工具开发出来的非标驱动程序,选用WDM架构开发的串口驱动,开发人员可直接使用标准的Windows系统文件操作函数CreateFile、ReadFile、WriteFile、CloseFile等即可对每个串口进行配置、数据接收、数据发送及关闭操作。同时还可支持目前市面上大部分第三方开发的标准串口应用程序(如串口助手、串口精灵等),带来极大便利。 2 驱动程序设计与实现 与单一功能的CPCI设备驱动开发相比,多串口数据通信卡驱动开发的难点在于对设备总线驱动的设计,该驱动既要完成其本身的总线功能角色,又要提供方法与串口功能驱动进行数据交互。 2.1 总线设备驱动 本文针对多串口数据通信卡驱动中总线设备驱动处理的几类关键IRP流程进行分析。 2.1.1 IRP_MN_QUERY_INTERFACE处理流程 串口设备驱动程序通过向总线设备驱动程序发送IRP_MN_QUERY_INTERFACE请求获得一个指向总线设备接口描述符的指针。串口在设备启动和停止时调用总线设备驱动程序中的函数来获得和释放总线设备所拥有的资源。总线设备驱动通过定义GUID为串口功能驱动程序提供接口,并与之互通。 2.1.2 IRP_MN_QUERY_ID处理流程 总线设备驱动要处理的最重要的PnP请求是IRP_MN_QUERY_ID。PnP管理器以多种形式发出此请求,用于获取设备标识符,而这些标识符能定位子设备的INF文件。响应此请求只需要返回一个包含设备标识符的值。逻辑查询串口代码如下(驱动中定义为CHILDTYPEA)则返回*SWCOM01。 static NTSTATUS HandleQueryId(PDEVICE_OBJECT pdo,PIRP Irp) { … case BusQueryDeviceID: if (pdx->flags & CHILDTYPEA) idstring = LDRIVERNAME L"*SWCOM01" … } 2.1.3 IRP_MN_START_DEVICE处理流程 PnP管理器通常使用IRP_MN_START_DEVICE来通知功能驱动程序,其硬件被赋予I/O资源,以及指导功能驱动程序作必要的硬件或软件设置,以便设备能正常工作。当前总线设备驱动程序在该IRP处理例程中,读取CPLD为各个串口分配的IO空间地址及中断号资源,初始化PLX9054桥芯片的中断使能参数配置,并最终调用IoCreateDevice函数为8个串口创建出独立的PDO对象,函数调用例程如下: status = IoCreateDevice(pdx->DriverObject,sizeof(PDO_EXTENSION),NULL, FILE_DEVICE_SERIAL_PORT,FILE_AUTOGENERATED_DEVICE_NAME,FALSE,&child); if (!NT_SUCCESS(status)) { KdPrint((DRIVERNAME " - IoCreateDevice (child) failed - %Xn",status)); return status; } 2.1.4 IRP_MN_QUERY_DEVICE_RELATIONS处理流程 当多串口数据通信卡插入机箱背板CPCI插槽后,Windows标准总线的驱动程序检测到设备,然后PnP管理器就像配置任何普通CPCI/PCI设备一样配置板卡。启动板卡后,PnP管理器向板卡的总线设备驱动发送一个带IRP_MN_QUERY_DEVICE_RELATIONS副功能码的PnP请求,以了解当前数据通信卡内部总线关系,判断其是否含有子设备。总线设备驱动处理该IRP请求后,告知PnP管理器当前板卡上包含的8个独立串口。 2.1.5 其它IRP 除上述几种IRP处理例程外,总线驱动实际开发中还实现了包含IRP_MN_QUERY_CAPABILITIES、IRP_MN_STOP_DEVICE、IRP_MN_REMOVE_DEVICE等通常WDM驱动所必须的处理例程,确保该驱动能完全覆盖串口功能设备驱动的IRP请求。 2.2 串口功能驱动程序 串口功能驱动主要参考微软公司的配套Windows XP DDK中自带的单个串口设备样例代码。在此基础上,配合总线设备驱动架构,在创建设备时加入与总线驱动相对应的接口函数代码,实现两个驱动间的功能接口对接、多串口端口枚举等功能。 在中断处理上,根据板卡多串口共享中断的特点,CPLD逻辑在判断出当前中断来源于具体的某个串口后,将CPLD中断状态寄存器置位。各串口驱动实例的中断处理函数ISR首先在中断触发后,对CPLD中断状态寄存器进行判断,若非本串口中断类型,则直接返回不作处理,等待下一次中断产生时再判断。若是本串口的中断位被置,将进行对应中断方式的数据发送、接收,完成后中断位被自动清除。 3 驱动程序开发调试环境 CPCI多串口通信卡驱动程序采用微软公司提供的Windows XP的DDK驱动开发环境进行驱动开发编译,使用build命令在DDK开发环境命令行下进行编译。 驱动调试时,借助微软公司提供的调试软件DebugView,通过检查关键处理流程代码处有无对应调试信息输出,完成驱动调用过程调试。此外,利用DriverStudio中的Windows系统底层调试工具SoftIce在驱动内部加入断点,可针对驱动程序开发过程中遇到的数据超界、内存访问异常等严重错误进行单步断点跟踪调试,准确定位驱动中错误所在的位置。 4 驱动程序安装使用 在插入多串口通信卡后,启动系统进入Windows桌面,系统会提示找到其它PCI桥设备,然后自动查找驱动程序,将安装路径指向驱动包路径,便可自动安装完成全部串口,安装完成后的设备管理器显示如图3所示。 图3 驱动安装后设备管理器显示 5 驱动程序测试 由于本串口驱动遵循了标准的WDM架构的串口驱动开发架构,因此可利用标准的串口测试程序进行测试,提高整个板卡的通用性及易用性。 硬件测试环境利用一台配有Intel i7-3555主板的标准x86 架构的CPCI机箱,装入CPCI多串口卡后,将配套的测试线缆与MOXA公司的两台uPort 1450型号多串口测试仪器的8个串口进行互连。 软件测试环境采用Windows XP系统,安装完成多串口通信卡的驱动程序及uPort 1450设备的驱动后,测试软件选用Access Port标准串口测试软件,版本号v1.37。 测试时,分别在RS232、RS422和RS485三种工作模式下,波特率选用9600、19200、38400、57600和115200五种常用波特率,生成15个测试项,在执行测试项时,多串口通信卡上的8个串口与两台uPort 1450的8个串口同时开始进行数据收发,进一步验证板卡上串口并行工作能力。 测试结束后,通过比较发送源数据与接收实际数据的个数,将发送数据文件和接收后转存的数据文件进行MD5校验计算后发现:多串口通信卡上的8个串口在全部测试过程中的数据通信均无丢数、错数现象,从而可知该CPCI多串口通信卡所使用的驱动程序完全满足标准串口的功能及性能要求。 6 结语 本文以基于CPCI总线的多串口通信卡为例,介绍了总线驱动开发中的关键处理流程的处理方法。目前该多串口通信卡已经在本所多个横向及纵向项目中的设备上得以应用,效果良好。 CPCI总线形式的各类板卡目前已经广泛应用于智能交通、航空航天、工业现场控制、军事系统等领域,在硬件设计时,往往考虑到成本、结构及用户定制化的要求,会出现越来越多的集成多种功能模块的CPCI板卡。本文多串口通信卡的多功能设备驱动架构将得到更为广泛应用及推广。 参考文献: [1] WALTER ONEY.Programming the microsoft windows driver mode second edition[M].Microsoft Press,2002 [2] 田泽,刘娟,王绮卉.基于WDM 的PCIE 驱动设计和实现[J].软件导刊,2010(4):910. [3] 张建新.Windows 2000内核结构的分析及驱动程序的编制[J].计算机工程与应用,2012(10):121123. [4] 田泽,刘娟,王绮卉.基于WDM 的PCIE 驱动设计和实现[J].软件导刊,2010,9(4):2930. (责任编辑:陈福时) |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。