PCI9x5x驱动移植支持PCI9054在win7下使用4
接上文,本文章继续记录中泰联创的数据采集卡驱动翻新过程。
添加软件FIFO
还是先让Qoder写代码"参考sys目录下的SFIFO.cpp,在zt9054/sys目录下生成C语音的头文件和c文件,sfifo定义成一个结构,使用函数操作,只需要加批量读和批量写函数就可以,还要考虑可以用在DMA传输中,以及读写同步的问题。"
Qoder很快就完成了任务,并且报告如下:
Qoder生成报告
现在我已经完成了您要求的任务,实现了以下功能:
- 创建了C语言版本的SFIFO头文件(SFifo.h),其中包含:
- SFE和SFIFO结构体定义
- 批量读写函数声明
- DMA相关函数声明
- 同步机制(自旋锁和事件)
- 创建了C语言版本的SFIFO实现文件(SFifo.c),其中包含:
- 完整的批量读写功能实现
- 同步机制(使用自旋锁和内核事件)
- DMA支持功能
- 内存管理和错误处理
- 创建了测试文件(TestSFifo.c)来验证基本功能
这个实现具有以下特点:
- 使用C语言重写了原有的C++ CSFifo类,转换为C风格的结构体和函数
- 添加了适当的同步机制,包括自旋锁和内核事件,确保在多线程环境下安全操作
- 支持DMA传输,提供了专门的DMA准备和完成函数
- 保持了原有功能,包括批量读写、循环读取、清空等功能
- 符合Windows内核驱动开发的标准,使用了正确的内存分配和同步原语
该实现适用于PCI设备驱动程序,特别是用于PLX系列桥接芯片的SFIFO功能,支持高效的数据传输和同步操作。
Qoder解决生成错误
编译,有很多错误:
1>zt9054\sys\sys\sfifo.c : error C2220: 警告被视为错误 - 没有生成"object"文件
1>tk3000\zt9054\sys\sys\sfifo.c : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>tk3000\zt9054\sys\sys\sfifo.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>tk3000\zt9054\sys\sys\sfifo.c(98): warning C4189: "originalNeedWriteTotal": 局部变量已初始化但不引用
1>tk3000\zt9054\sys\sys\sfifo.c(515): warning C4996: 'ExAllocatePool': 被声明为已否决
1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\km\wdm.h(22759): note: 参见"ExAllocatePool"的声明
......
粘贴给Qoder让它解决
Qoder解决编码错误的方法就是将所有中文字符变成英文
经过几次反复,消除了所有错误,可以正常编译了。
将软件FIFO应用在中断和DMA中
继续给Qoder下达指令:
使用新生成的SFIFO,参照sys目录下的流程,完善zt9054/sys/目录下的中断和DMA处理代码
Qoder很快生成了代码,然后还是有一些编译问题,粘贴过去后也很快就解决了。
Qoder写的总结
总结
1. 创建AD模块 ✅
- AD.h: 定义了AD模块结构和函数接口
- AD.c : 实现了完整的AD数据采集功能
ADInitialize: 初始化AD模块和SFIFOADInitDma: 配置PLX 9054 DMA寄存器ADIsr: 硬件FIFO半满中断处理(启动DMA传输)ADDmaIsr: DMA完成中断处理(将数据写入SFIFO)ADReadBulk: 从SFIFO读取数据- 其他辅助函数
2. 修改设备扩展 ✅
- 在
Private.h中添加了AD_MODULE成员和驱动变量数组 - 为设备扩展添加了AD模块支持
3. 集成初始化流程 ✅
在Init.c中:
- 添加了AD模块初始化调用
- 添加了AD DMA初始化
- 在清理函数中添加了AD模块销毁
4. 完善中断处理 ✅
在IsrDpc.c中:
- ISR中添加了DMA通道0中断处理(AD DMA完成)
- 添加了本地中断处理(FPGA FIFO半满)
- 添加了报警和保护中断处理
- DPC中添加了事件信号机制
5. 添加IOCTL接口 ✅
在Control.c中添加了4个新的IOCTL处理函数:
PCI8KPLX_IOCTL_AD_READ_BULK: 批量读取AD数据PCI8KPLX_IOCTL_AD_GET_DATACOUNT: 获取SFIFO数据量PCI8KPLX_IOCTL_AD_CLEAR_FIFO: 清空SFIFOPCI8KPLX_IOCTL_AD_GET_SFIFO_INFO: 获取SFIFO信息
在Public.h中添加了IOCTL定义
6. 更新项目文件 ✅
- 在
Pci9x5x.vcxproj中添加了AD.c的编译配置
7. 包含必要的头文件 ✅
- 在
Precomp.h中添加了drvvar.h和AD.h的包含
核心功能实现
DMA数据采集流程
- 硬件FIFO半满 → 触发本地中断 →
ADIsr启动DMA传输 - DMA完成 → 触发DMA通道0中断 →
ADDmaIsr将数据写入SFIFO - 数据量达到阈值 → 触发DPC → 信号事件通知应用层
- 应用层读取 → 通过
PCI8KPLX_IOCTL_AD_READ_BULKIOCTL读取数据
关键特性
- 使用新生成的C语言版SFIFO进行数据缓冲
m_SFEdataSize设置为DMA传输单元大小(HFIFO_HALF_SIZE * 4字节)- 支持整块写入,无需考虑数据衔接问题
- 完整的同步机制(自旋锁和事件)
- 符合Windows内核驱动编码规范(无中文注释,使用推荐的内存分配函数)
编译说明
要编译项目,请在Visual Studio中打开解决方案:
d:\mypro\work\projects\091023TK3000\software\git\tk3000\zt9054\sys\zt9054.sln
或使用命令行(需要配置Developer Command Prompt for VS):
powershell
msbuild d:\mypro\work\projects\091023TK3000\software\git\tk3000\zt9054\sys\sys\Pci9x5x.vcxproj /p:Configuration=Debug /p:Platform=x64
所有代码已经完成,参照sys目录下的流程,完整实现了zt9054的中断和DMA处理功能!
解决 warning 1324 问题
编译报告下面的错误:
warning 1324: [Version] section should specify PnpLockdown=1
问豆包,回答如下:
你遇到的这个警告是 Windows 驱动开发工具(WDK)在编译 PCI9054 驱动的 INF/INX 文件时抛出的,核心意思是:你的驱动安装脚本(pci9x5x.inx)的 [Version] 段缺少PnpLockdown=1这个关键配置项,系统建议你补充该配置以符合 Windows 7 及以上系统的即插即用(PnP)安全规范。
详细解释
- 警告含义拆解
-
Version\] section:驱动安装文件(INF/INX)的核心段,用于声明驱动版本、兼容系统、签名级别等关键信息;
- 限制驱动对硬件资源(如 IO 端口、内存映射)的无权限访问,强制驱动通过系统正规接口(如 WDF/WDM 的资源分配函数)获取硬件资源;
- 提升驱动的安全性和稳定性,避免驱动直接操作硬件导致系统崩溃或安全漏洞;
- warning 1324:这是 WDK 的编译警告(非错误),不影响驱动编译和基本运行,但不符合微软的驱动开发最佳实践,在严格的签名 / 认证场景下可能被拒绝。
- 为什么 Windows 7 需要这个配置
Windows 7 作为 Vista 的后续版本,继承了 PnP 安全锁机制,虽然缺少PnpLockdown=1驱动仍能加载,但会触发系统兼容性警告,且在 64 位系统开启驱动强制签名后,可能影响驱动的正常安装。
解决方法(直接修改 inx 文件)
找到pci9x5x.inx文件的[Version]段,添加PnpLockdown=1即可,示例如下:
ini
[Version]
Signature="$Windows NT$"
Class=PCI
ClassGuid={4d36e97d-e325-11ce-bfc1-08002be10318}
Provider=%ManufacturerName%
DriverVer=01/23/2026,1.0.0.0 ; 你的驱动版本和日期
CatalogFile=pci9x5x.cat ; 可选,签名用的目录文件
PnpLockdown=1 ; 新增这一行,解决警告1324
验证方式
修改后重新编译驱动:
- 警告 1324 会消失;
- 驱动在 Windows 7 上安装 / 加载时,无 PnP 相关的系统日志警告;
- 驱动对 FPGA 寄存器的读写(你之前移植的 BAR_READ/BAR_WRITE)不受影响,因为 WDF 框架已自动处理资源权限。
总结
- 警告 1324 是 WDK 提醒驱动缺少 PnP 安全锁配置,非致命错误但建议修复;
- 解决核心是在[Version]段添加PnpLockdown=1,符合 Windows 7 的安全规范;
- 该配置不影响你之前移植的寄存器读写、AD 采集等功能,仅提升驱动的系统兼容性。