当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]近期根据研究需要,收集资料整理出这篇文章,本次文章介绍了Windows XP下PCI9054的驱动开发环境的搭建方法,该方法所选择的开发平台为VC6.0+DDK+DriverStudio.总结了调试过程中容易出现的错误,以便初学者及同类开发者进行参考。

摘 要:近期根据研究需要,收集资料整理出这篇文章,本次文章介绍了Windows XP下PCI9054的驱动开发环境的搭建方法,该方法所选择的开发平台为VC6.0+DDK+DriverStudio.总结了调试过程中容易出现的错误,以便初学者及同类开发者进行参考。

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\DriverStudio\DriverWorks\source 目录下的VdwLib.dsw工程,得到vdw_wdm.lib 文件。

原因分析:配置开发环境时,安装DriverStudio3.1 时缺失\DriverWorks\Source\vdwlibs.dsw 目录下的vdw_wdm.lib 文件,需要重新编译。

(2)fatal error C1083: Cannot open include file: 'warning.h':

No such file or directory

解决办法:DriverStudio 菜单→ DDK Build Setting… 中选择我们先前安装的DDK 的目录,假如安装的目录是D :

\WINDDK\2600,这样就可以编译通过。

原因分析:未选中DDK 环境。

(3) fatal error C1051 : program database file, ‘…\compuware\

driverstudio\driverworks\source\obj\i386\wdmchecked\

vdw_wdm.pdb', has an obsolete format, delete it and recompile

解决办法:只要把连接目录下的文件删除再编译一次就可以了。

(4) Linking with DDK linker…

LINK : fatal error LNK1181 : cannot open input file'ntstrsafe.lib'

Error executing link.exe.

解决办法:在工程→设置→连接选框中把ntstrsafe.lib 这个连接项去掉,或者从2003DDK中复制一份即可。

原因分析:这个文件在xpDDK 里面是没有的,在2003DDK 里面有。

(5) CVTRES : fatal error CVT1102 : out of memory ; 40bytes required

LINK : fatal error LNK1123 : failure during conversion toCOFF :file invalid or corrupt

解决办法:将VC 中的cvtres.exe 复制,替换ddk 中的cvtres.exe, 各自路径为D :\WINDDK\2600\bin\x86 和D :

\Program Files\VC++\Bin.

(6) E :\pci\PCI\PCI905~1.2\sys>call D :\Program Files\DDK\bin\setenv.bat D :\Program Files\DDK chk

D :\Program 不是内部或外部命令,也不是可运行的程序或批处理文件。

E :\pci\PCI\PCI905~1.2\sys>build.exe -ceZ

build.exe 不是内部或外部命令,也不是可运行的程序或批处理文件。

Tool returned code : 0

能生成。sys 文件,但是加载DDK 的build with build.exe出现这个错误。

解决办法:利用DDK 下的Win XP Checked Build Environment找到放置驱动的目录进行build -ceZ.中间如果出现BUILD :Compile errors : not linking … didirectory 错误,此错误产生原因是DDK 的安装目录不能有空格。例如,原先的目录是D :\Program Files\DDK,改成D :\WINDDK 即可。

(7) 安装驱动时还出现“无法安装硬件驱动”信息。

原因分析:产生这个问题的原因很多,本项目在调试时,发现EEPROM 的配置文件有问题,其中一个数据位写入错误,修改配置文件后才能使用。

5 结 语

CFL-03 型风温廓线雷达数字中频接收机是数据传输的枢纽,PCI9054 又是数据传输的桥梁,正确地进行驱动开发和数据采集对于整个系统的运行有着重要的意义。采用VC6.0+DDK+DriverStudio 这种模式,优点在于不仅能够进行硬件开发,还能很好地进行调试,从而更好地进行数据分析,满足系统的设计要求。此外,对于PCI9054 驱动开发,还可以采用WinDriver7.0 进行开发,能够缩短开发周期和调试时间,达到很好的经济效益。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式系统和底层驱动开发中,C语言因其高效性和可控性成为主流选择,但缺乏原生单元测试支持成为开发痛点。本文提出一种基于宏定义和测试用例管理的轻量级单元测试框架方案,通过自定义断言宏和测试注册机制,实现无需外部依赖的嵌入...

关键字: C语言 嵌入式系统 驱动开发

在Linux设备驱动开发中,等待队列(Wait Queue)是实现进程睡眠与唤醒的核心机制,它允许进程在资源不可用时主动放弃CPU,进入可中断睡眠状态,待资源就绪后再被唤醒。本文通过C语言模型解析等待队列的实现原理,结合...

关键字: 驱动开发 C语言 Linux

在数字化时代,电子墨水屏(E-Ink)因其独特的显示效果和低功耗特性,在电子书、智能手写本等领域得到了广泛应用。然而,电子墨水屏的刷新率一直是其发展的瓶颈,如何在保证低功耗的同时提高刷新率,成为了驱动开发中的一个重要课题...

关键字: 电子墨水屏 E-Ink 驱动开发

在Linux驱动开发中,设备树(Device Tree)作为一种描述硬件信息的数据结构,扮演着至关重要的角色。它使得操作系统能够以一种更加灵活和标准化的方式识别和管理硬件设备。然而,在实际的开发过程中,设备树配置错误或理...

关键字: Linux 驱动开发 Debug

在嵌入式系统与设备驱动开发的广阔领域中,时钟、定时器以及延时函数扮演着至关重要的角色。它们不仅是系统时间管理的基石,更是实现高效、精确控制硬件行为的关键工具。本文将深入探讨这三种机制在驱动开发中的具体应用、实现方式及注意...

关键字: 驱动开发 嵌入式系统 延时函数

在Linux内核的广阔领域中,驱动开发是连接硬件与软件、实现设备功能的关键环节。在这个过程中,文件操作函数与I/O操作函数作为两大核心工具,各自扮演着不可或缺的角色。本文旨在深入探讨这两种函数在Linux驱动开发中的区别...

关键字: I/O操作函数 文件操作函数 Linux 驱动开发

史胜辉,在MTK工作了11年,一直在基带芯片的USB驱动领域做开发和验证。从最开始做USB2.0/3.0 IP验证和驱动开发到后面带领团队做上层协议驱动开发,以及跟硬件设计部门合作开发全新的USB硬件加速器。

关键字: 基带芯片 驱动领域 驱动开发

点击上方名片关注我们朱老师推荐语:此岗位为AIoT终身成长大会员同学提供的自己公司的岗位内推,总部在深圳,是一家专业从事闭路电视监控设备、会议摄像机的研发、制造、销售的高科技企业,有学过嵌入式课程或者海思项目的同学,想换...

关键字: 开发工程师 linux驱动 驱动开发

最近在学习MIPI接口的LCD驱动开发与调试,这里我主要用的是MIPI-DSI接口,它学习起来真的是太复杂了,特别是对于我这种很久都没写驱动来说更是头疼,但是头疼归头疼,工作咱们还是要完成的,那就只能硬着头皮往下肝吧!首...

关键字: MIPI 驱动开发 调试

关注、星标嵌入式云IOT技术圈,精彩及时送达来源|  Linux与SoC整理出了6种驱动开发时与设备注册、设备树相关的调试方法,彼此间没有优先级之分,每种方法不一定是最优解,但可以作为一种debug查找问题的手段,快速定...

关键字: 驱动开发
关闭