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):

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

详细解释

  1. 警告含义拆解
  • Version\] section:驱动安装文件(INF/INX)的核心段,用于声明驱动版本、兼容系统、签名级别等关键信息;

    • 限制驱动对硬件资源(如 IO 端口、内存映射)的无权限访问,强制驱动通过系统正规接口(如 WDF/WDM 的资源分配函数)获取硬件资源;
    • 提升驱动的安全性和稳定性,避免驱动直接操作硬件导致系统崩溃或安全漏洞;
  • warning 1324:这是 WDK 的编译警告(非错误),不影响驱动编译和基本运行,但不符合微软的驱动开发最佳实践,在严格的签名 / 认证场景下可能被拒绝。
  1. 为什么 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 框架已自动处理资源权限。

总结

  1. 警告 1324 是 WDK 提醒驱动缺少 PnP 安全锁配置,非致命错误但建议修复;
  2. 解决核心是在[Version]段添加PnpLockdown=1,符合 Windows 7 的安全规范;
  3. 该配置不影响你之前移植的寄存器读写、AD 采集等功能,仅提升驱动的系统兼容性。
相关推荐
不怕犯错,就怕不做6 小时前
Linux内核默认允许多个进程打开同一字符设备
linux·驱动开发·嵌入式硬件
不怕犯错,就怕不做7 小时前
RK3562+RK817在关机状态下提升充电电流至2A解决方案
linux·驱动开发·嵌入式硬件
猫猫的小茶馆8 小时前
【Linux 驱动开发】三. 应用程序调用驱动过程分析
linux·arm开发·驱动开发·stm32·单片机·嵌入式硬件·pcb工艺
猫猫的小茶馆11 小时前
【Linux 驱动开发】四. 平台总线驱动
linux·c语言·arm开发·驱动开发·嵌入式硬件·mcu·物联网
小手智联老徐11 小时前
漫谈 Linux 声卡驱动开发的设备树与 I2S
linux·运维·驱动开发
小手智联老徐11 小时前
Jetson Orin Nano 音频设置与开发之 DTS
linux·驱动开发·音视频
松涛和鸣14 小时前
DAY61 IMX6ULL UART Serial Communication Practice
linux·服务器·网络·arm开发·数据库·驱动开发
颜子鱼1 天前
Linux驱动-INPUT子系统
linux·c语言·驱动开发
Lueeee.1 天前
llseek 定位设备驱动实验
linux·驱动开发