PCI9x5x驱动移植支持PCI9054在win7下使用4

PCI9x5x驱动移植支持PCI9054在win7下使用4

接上文,本文章继续记录中泰联创的数据采集卡驱动翻新过程。

添加软件FIFO

还是先让Qoder写代码“参考sys目录下的SFIFO.cpp,在zt9054/sys目录下生成C语音的头文件和c文件,sfifo定义成一个结构,使用函数操作,只需要加批量读和批量写函数就可以,还要考虑可以用在DMA传输中,以及读写同步的问题。”
Qoder很快就完成了任务,并且报告如下:

Qoder生成报告

现在我已经完成了您要求的任务,实现了以下功能:

  1. 创建了C语言版本的SFIFO头文件(SFifo.h),其中包含:
    • SFE和SFIFO结构体定义
    • 批量读写函数声明
    • DMA相关函数声明
    • 同步机制(自旋锁和事件)
  2. 创建了C语言版本的SFIFO实现文件(SFifo.c),其中包含:
    • 完整的批量读写功能实现
    • 同步机制(使用自旋锁和内核事件)
    • DMA支持功能
    • 内存管理和错误处理
  3. 创建了测试文件(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模块和SFIFO
    • ADInitDma: 配置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: 清空SFIFO
  • PCI8KPLX_IOCTL_AD_GET_SFIFO_INFO: 获取SFIFO信息

Public.h中添加了IOCTL定义

6. 更新项目文件 ✅
  • Pci9x5x.vcxproj中添加了AD.c的编译配置
7. 包含必要的头文件 ✅
  • Precomp.h中添加了drvvar.hAD.h的包含

核心功能实现

DMA数据采集流程
  1. 硬件FIFO半满 → 触发本地中断 → ADIsr启动DMA传输
  2. DMA完成 → 触发DMA通道0中断 → ADDmaIsr将数据写入SFIFO
  3. 数据量达到阈值 → 触发DPC → 信号事件通知应用层
  4. 应用层读取 → 通过PCI8KPLX_IOCTL_AD_READ_BULK IOCTL读取数据
关键特性
  • 使用新生成的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):

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)安全规范。

详细解释

  1. 警告含义拆解
  • [Version] section:驱动安装文件(INF/INX)的核心段,用于声明驱动版本、兼容系统、签名级别等关键信息;
  • PnpLockdown=1:是 Windows Vista 及以后系统引入的 PnP 安全锁配置项,作用是:
    • 限制驱动对硬件资源(如 IO 端口、内存映射)的无权限访问,强制驱动通过系统正规接口(如 WDF/WDM 的资源分配函数)获取硬件资源;
    • 提升驱动的安全性和稳定性,避免驱动直接操作硬件导致系统崩溃或安全漏洞;
  • warning 1324:这是 WDK 的编译警告(非错误),不影响驱动编译和基本运行,但不符合微软的驱动开发最佳实践,在严格的签名 / 认证场景下可能被拒绝。
  1. 为什么 Windows 7 需要这个配置
    Windows 7 作为 Vista 的后续版本,继承了 PnP 安全锁机制,虽然缺少PnpLockdown=1驱动仍能加载,但会触发系统兼容性警告,且在 64 位系统开启驱动强制签名后,可能影响驱动的正常安装。

解决方法(直接修改 inx 文件)

找到pci9x5x.inx文件的[Version]段,添加PnpLockdown=1即可,示例如下:

[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 框架已自动处理资源权限。

总结

  1. 警告 1324 是 WDK 提醒驱动缺少 PnP 安全锁配置,非致命错误但建议修复;
  2. 解决核心是在[Version]段添加PnpLockdown=1,符合 Windows 7 的安全规范;
  3. 该配置不影响你之前移植的寄存器读写、AD 采集等功能,仅提升驱动的系统兼容性。
posted @ 2026-01-24 17:35  自由的好好干活  阅读(14)  评论(0)    收藏  举报