基于数字中频接收机总线驱动开发的研究
0 引言
CFL-03 型风温廓线雷达数字中频接收机主要完成中频模拟信号的模数转换、数字下变频、数字滤波等处理,最终生成数字I、Q 信号,通过PCI9054 总线以DMA方式送到工控机内存中,由信号处理软件进行时域积累、脉压、去直流、加窗、FFT 变换,形成多谱勒功率谱密度分布数据,再进行谱积累、谱估计等处理。
1 PCI9054 芯片简介
PCI9054 是由美国PLX 公司生产的先进的PCI I/O 加速器,采用了先进的PLX 数据流水线结构技术,符合PCI 本地总线规范2.2 版;针对不同的处理器及局部总线特性,有M、C、J 三种模式可选;配有可选的串行E2PROM 接口,本地总线时钟可与PCI 时钟异步。PCI9054 内部有6 种可编程的FIFO,以实现零等待突发传输及本地总线与PCI 总线之间的异步操作;支持主模式、从模式、DMA 传输方式,被广泛应用于嵌入式系统中,是目前主控设备PCI 桥接器的主流芯片。
2 环境搭建
开发工具由Visual C++ 6.0、Windows XP DDK 和Compuware DriverStudio 3.1 组成。首先,按照Visual C++ 6.0、Windows XP DDK、Compuware DriverStudio 3.1 的顺序安装这三个软件。其次,DriverStudio 安装之后,在Visual C++6.0 编成工具栏中自动添加了一个菜单DriverStudio.然后,在Visual C++ 6.0 中打开DriverWorks\source 目录下的VdwLibs.
dsw,之后选择DriverStudio工具栏的DDK Build Setting,设置DDK 所在的目录,例如D :\WINDDK\2600.最后,选择Batch Build 菜单,点击Rebuild All,创建自己的库文件。否则编译WDM 程序时,将出现编译错误。
3 PCI 驱动程序的创建
创建一个PCI 驱动程序框架的一般顺序是:点击开始→程序→ Compuware DriverStudio → develop → driver wizards.
在弹出一个选择驱动程序工程类型的界面后,即可选择第一个DriverWorks project.接下来便可按照图1 所示的步骤选择默认。
创建驱动程序框架时,需要声明所需的资源,如存储器空间和I/O 空间,中断和DMA 等。其方法可按图2 所示的步骤均选择默认,直到结束。
这样,通过上述步骤就生成了一个工作区和两个工程,两个工程分别是驱动程序和WIN32 控制台的应用程序,可用于测试。框架程序生成后,还需要进行修改,以实现本项目修改时,首先应配置E2PROM 的值,因为PC19054 的初始化是根据其配置E2PROM中的值来进行的;其次,本项目采用DMA方式传输。DMA 传输指无需CPU 的控制,在2 个存储区进行直接的数据传输。此外,还需要重写DMA 启动函数DMAStart(),设置每次DMA 传输所需的PCI 地址( 主机物理内存地址)、本地地址、传输大小、传输方向等,并置DMA 启动位。这样,每次数据捕获满而中断到来,要启动DMA 传输时,只需调用DMAStart() 函数即可。下面重点介绍DMA 程序的执行过程:
(1)插入PCI 卡,总线驱动扫描到新硬件,硬件安装向导提示安装,导入INF 文件。由I/O 管理器打开sys 文件,执行DriverEntry 例程,然后执行AddDevice 例程。
(2) 重启系统。系统在启动时, 发出IRP_MJ_START.驱动捕获此IRP, 并执行OnStartDevice() 例程,完成系统初始化。包括系统的资源列表、KDmaAdapter、KcommonDmaBuffer、中断和DPC.
(3)当执行用户程序的“读”或“写”时,用户程序向驱动发出IRP_MJ_READ 或IRP_MJ_WRITE,于是执行Read()(或Write())例程。由于使用了IRP 串行技术,在例程最后调用QueueIrp(),就将执行IRP的操作交给了StartIo 例程来完成。
(4)在StartIo 中,调用SerialRead() 例程(或SerialWrite()例程)。
(5) 在SerialRead() 例程中, 创建DMA 传输控制类KDmaTransfer *m_CurrentTransfer 的实例。
(6)m_CurrentTransfer->Initiate() 例程,调用回调函数OnDmaReady.OnDmaReady 检测DMA 有无结束,结束则使用Terminate(),如果没有结束,则调用DMAStart()。
(7)DMAStart() 通过写9054 寄存器,完成DMA 操作。
在完成一次后,会产生一个中断。
(8)ISR 服务例程会捕获此中断要求。在清除了中断标志后,调用DPC 服务例程。
(9)DPC 例程中, 调用m_CurrentTransfer->Continue()例程,则程序回到(6)步。
修改了程序之后,再设置工程PCI9054 为当前工程,执行build 菜单下的rebuild all,生成PCI9054.sys 并编译成功后,PCI 板卡就可以安装了。
4 常见错误及解决办法
在调试过程中容易出现的错误及解决方法如下:
(1)fatal er ror LNK1181 : cannot open input f ile
“…\DriverStudio\DriverWorks\lib\I386\checked\vdw_wdm.lib”
解决办法:编译…\Compuware\DriverS
- usb总线驱动粗略过程(OHCI协议)(12-15)
- 总线驱动加载设备错误解决(12-15)
- 总线的驱动能力/负载能力(12-14)
- 基于MCP2515的Linux CAN总线驱动程序设计(12-01)
- I2C总线驱动程序(11-21)
- 51单片机I2C总线驱动程序(11-18)