DSP

基于TMS320C6205的内嵌PCI设备WDM驱动程序开发

2019-07-13 20:22发布

摘 要:采用内嵌PCI的DSP主芯片可以简化设备PCI接口的软硬件复杂度,缩短系统开发的周期,降低开发成本。本文以工程项目为背景,详细讨论了以TMS320C6205 为核心的内嵌PCI设备WDM驱动程序开发方法。该方法在实际中得到了很好的应用,满足了总体技术指标。
关键词:WDM驱动程序;内嵌PCI接口;从模式写;主模式读;动态连接库
引言
PCI( Peripheral Component Interconnect) 总线规范是为了提高微机总线的数据传输速度而制定的一种局部总线标准。它具有开发性好,传输速度高等优点。但是以往基于DSP 的PCI 系统开发由于内部没有PCI接口,必须外接接口芯片,这样,系统不得不多加一块接口芯片,调试复杂,性价比较低。
本文所设计的“激光标记机DA板卡”采用了TI公司的DSP TMS320C6205作为主芯片,它在片内集成了一个主/从模式,32 Bit/ 33 MHz ,3. 3 V 的PCI接口。因为内嵌了PCI接口,所以设备PCI接口的软硬件复杂度得到简化,性价比较高。在自行设计基于PCI 总线的数据传输设备时,需要开发相应的设备驱动程序。下面主要以“激光标记机DA板卡”为例,介绍在WINDOWS 2000/XP环境下,如何实现基于WDM模型的PCI卡驱动程序。
1系统结构与实现方案
“激光标记机DA板卡”是一块通过PCI接口与主机通信的高速“DA板卡”。该卡接收来自PC机的数据进行数值处理,并将数字信号转换成两路模拟量控制两片振镜的偏转。其功能框图设计如图1:
“激光标记机DA板卡”主芯片是TMS320C6205芯片,外围控制部分包括复位控制、电源控制、时钟系统、JTAG端口。它通过PCI接口与主机进行通信,驱动程序负责提供接口函数将标记头工作的技术参数,标记数据等从主机传给“激光标记机DA板卡”,同时反馈“激光标记机DA板卡”工作的各种状态信号给主机。
2TMS320C6205 PCI模块及其控制寄存器简介
2.1控制寄存器
DSP TMS320C6205内嵌的PCI 主要包含三类寄存器:PCI 配置寄存器、PCI I/ O 寄存器
以及存储器映射外围寄存器。
PCI 配置寄存器包含标准的PCI 配置信息(如供应商ID、产品ID 等) ,其结构符合PCI
规范2.2版本。
PCI的I/O寄存器位于PCI主机的I/O空间,包括:主机状态寄存器(Host Status Register,HSR),主机-DSP控制寄存器(Host-to-DSP Control Register,HDCR),DSP页寄存器(DSP Page Register,DSPP)。其中HSR 标明主机的状态,HDCR 用于主机对DSP 的控制,DSPP 主要是和Base0 一起定义一段存储器空间。PCI I/O 寄存器只能由PCI主机通过基址1寄存器(Base 1 address register)或基址2寄存器(Base 2 address register)的空间映射进行访问。
存储器映射外围寄存器,映射在DSP存储空间中,用于DSP控制PCI接口。其中PCI接口的主模式数据传输,其相关的控制寄存器包括:DSPMA,PCIMA,PCIMC。

图1 “激光标记机DA板卡” 功能框图
2.2访问地址控制
PCI 端口通过3 个基地址寄存器(Base0 ,Base1 ,Base2) 能够访问DSP 全部的存储器映射空间。如图 2 显示了Base0地址构成, PCI地址的bit 21:0与DSPP 寄存器的bit 9:0 一起定义了可预取4Mbytes的DSP 存储器空间。如图3 Base1地址构成,PCI地址的bit 22:0与一个固定偏移值0x01800000定义了8Mbytes不可预取的存储器映射寄存器。Base2 定义了16bytes 的I/O 空间 。

3WDM驱动程序设计与实现
3.1WDM驱动开发工具介绍
目前开发WDM 驱动程序通常有3 种工具,Windows DDK, DriverStudio 和Windriver 。其中Windows DDK 需要对整个体系结构有很好的理解和掌握, 因此开发难度最高, 开发周期也很长。目前常用Numega 公司的DriverStudio 和Jungo 公司的WinDriver。考虑到开发效率和Windows 平台下的兼容性,设计中选用了主流的开发工具DriverStudio。DriverStudio是NuMega公司为简化设备驱动程序的开发、调试及测试而提供的开发工具包,它包含DriverMonitor、DriverWorks和SoftICE等开发工具。
3.2驱动程序模块
DSP TMS320C6205内嵌的PCI接口支持从模式写(外部主机将数据写入DSP),从模式读(外部主机从DSP读出数据),主模式写(DSP将数据写入外部主机),主模式读(DSP从外部主机读取数据),4种类型数据传输。因此TMS320C6205内嵌PCI 设备驱动程序模块主要包括设备初始化模块、从模式读、写模块、主模式读模块,定时回掉模块等。下面介绍设备驱动程序几个主要模块的具体实现。
(1)设备初始化模块: 初始化模块主要在OnStartDevice ( )中实现, 在这里驱动程序将得到PnP 管理器为 PCI 数据采集卡所分配的硬件资源, 包括Base0、Base1、Base2基地址; 对TMS320C6205 PCI 接口配置空间进行初始化; 初始化中断;初始化定时器及使能“DA板卡”PCI中断等。以Base 2硬件资源分配代码为例进行说明:
status = m_IoPortRange0.Initialize(
pResListTranslated,
pResListRaw,
m_pPciConfig->BaseAddressIndexToOrdinal(2),
);
执行上面语句,分配 Base2硬件资源后,就可以调用m_IoPortRange0的读写成员函数,对Base 2基地址寄存器确定的16 Byte I/O空间进行访问。
(2)从模式读、写模块: 从模式数据传输依靠上位机来执行读写操作。本系统驱动提供了三个函数接口:
void PCIDevice::SerialIoctlReadReg(KIrp I)
void PCIDevice::SerialIoctlWriteReg(KIrp I)
void PCIDevice::SerialIoctlWriteMem(KIrp I)
上面三个函数都是I/O控制函数,对应的IOCTL定义如下:
#define PCIDRV_IOCTL_WRITEREG CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define PCIDRV_IOCTL_READREG CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define PCIDRV_IOCTL_WRITEMEM CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
其中SerialIoctlReadReg和SerialIoctlReadReg函数,通过BASE1来读写DSP上单个寄存器。
SerialIoctlWriteMem函数,通过Base0来写DSP上的存储区。写过程中,PCI地址与DSPP中的固定偏移值结合,形成DSP目的地址,在传输过程中控制地址自动递增。
(3)主模式读模块:为了提高将标记数据从上位机传给激光标记机DA板卡的速度,主模式读模块采用了DMA数据传输方式。主模式读模块又可以划分为DMA准备就绪回掉模块、DMA传输启动模块、中断处理模块、中断延迟处理模块。其关系如下图4:

图4主模式读数据模块关系图
DMA准备就绪回掉模块,主要完成DMA传输前的准备工作,如将上位机虚拟地址转换为物理地址,计算数据传输大小等。它也负责完成数据传输完后的清理和返回工作。
DMA传输启动模块,负责操作DSP上的PCI寄存器,启动一帧DMA数据传输。部分代码如下:
/*清空PCIMC控制寄存器*/
m_MemoryRange1.outd(PCIMC, 0x00000000);
/*设置DSP上的地址*/
m_MemoryRange1.outd(DSPMA, targetAddr);
/*设置上位机从设备的源地址*/
m_MemoryRange1.outd(PCIMA, srcAddr)
/*启动DMA传输*/
m_MemoryRange1.outd(PCIMC, val);
中断处理模块,当1帧数据传输完成完毕时,产生DSP CPU中断,DSP下位机的中断处理程序,通过INTA管角向PCI上位机发送中断信号。系统内核的中断派发器负责调用驱动程序的中断服务。中断处理模块首先需要确定该中断是否是由本设备产生的,这可以通过读入对应的DSP 控制字寄存器来判断。如果中断处理模块发现该中断的确是由DSP 产生,中断处理模块将向DSP 的适当控制寄存器写入控制字标识此中断已被响应。
中断延迟处理模块,由于中断处理模块占用的系统时间过多会严重影响系统的性能,必须尽快从中断处理模块返回以降低CPU 所处的中断优先级。因此,在中断处理模块中仅完成上述对时序要求较高的工作,而将其他处理工作放在中断延迟处理模块中进行。中断延迟处理模块主要调用KDmaTransfer类的成员函数Continue完成延迟处理工作,并回掉DMA准备就绪回掉模块开始下一帧数据传输。
(4)定时回掉模块:当采用主模式读方式传输数据时,为防止数据传输失败,而驱动一直等待中断,不返回,导致上层应用程序挂起,使用了定时回掉模块。当数据传输超过规定的时间后,它负责强制返回。DriverStudio的KTimedCallback类封装了定时控制操作。其成员函数Set可以设置及启动定时器。
4驱动与应用程序通信
应用程序一般调用系统提供的API函数如CreateFile,ReadFile,WriteFile,DeviceIoControl等来与底层的驱动程序通信。但这些API函数使用复杂,上层应用程序开发人员调用很不方便。所以本系统将API函数封装成动态连接库,并提供了如表1 以方便使用的接口函数。
表1 驱动程序接口函数表

通过这些接口。上层应用程序开发人员可以非常方便的操作“激光标记机DA板卡”,而不用去了解复杂的API函数。
5结论
采用内嵌PCI的DSP主芯片可以简化设备PCI接口的软硬件复杂度,缩短系统开发的周期,降低开发成本,是实现设备高速PCI数据传输的一种有效方案。
本文设计的基于内嵌PCI接口的“激光标记机DA板卡”是实现高速激光标记的一种重要方法。其中板卡的PCI驱动程序是,激光标记系统的一个关键问题。它实现了板卡的主、从模式两种访问方式,并且在应用中性能非常稳定。且在实际标记系统中测得,主模式写最大传输速度可以达到320Mb/s,从模式下读写速度可以达到40Mb/s。完全能满足目前高速激光标记系统的要求。
本文作者创新点: 提出了采用内嵌PCI接口的DSP主芯片是设备实现高速PCI数据传输的一种有效方案。并提出了用DriverStudio快速开发此类设备PCI驱动程序的方法。 http://www.cediy.com/webHtml/Article/mcu/1132220081205090800.html