简介:PLX SDK帮助文档清晰版面向从事PCI/PCIe总线开发、驱动移植与嵌入式底层调试的工程师,以及需要查阅PLX芯片软件接口的技术人员,帮助解决SDK安装、许可合规与接口调用中的疑问。资源包共1个文件,为1份PDF文档,大小约1.71MB,内容以PLX SDK User Manual(Version 6.50,2011年9月)为主体,涵盖软件许可协议、保修条款、版权声明、软件使用条款及许可终止等法律与使用规范,并附有目录结构,便于按章节定位。文档明确说明PLX软件按“AS IS”提供、不承担默示担保,用户不得子许可、出租、转让或用于商业目的,终止许可后须销毁全部副本,这些条款对合规使用尤为关键。目前已有525人学习下载,适合需要快速查阅官方许可与使用边界、避免法律风险的开发者参考。
1. 拿到 PLX SDK 6.50 手册先别翻 API:这份 2011 年的文档到底能解决什么
如果你手里有一块基于 PLX 桥片的板卡,驱动装不上、寄存器读出来全是 0xFF、DMA 跑一半就挂,那你大概率会搜到这份 PLX SDK User Manual Version 6.50。它发布于 2011 年 9 月,配套的是 PLX SDK 6.50 这套主机侧软件包,覆盖 Windows 和 Linux 两个平台,内容从驱动安装、目录结构、调试工具一直到 API 参考,是一份完整的工程手册而不是入门教程。很多人拿到 PDF 第一反应是直接跳到第 5 章 API 列表,结果发现函数签名看懂了,但设备根本打不开——因为真正的入口在第 2 章和第 3 章:驱动怎么装、服务怎么起、SDK 目录怎么摆、API 库怎么链。这份文档能解决的核心问题就一个:让你从「板卡插上去系统认不出」走到「能用 PlxPci_DeviceOpen 打开设备并读写寄存器」。适合谁?做 PCI/PCIe 板卡驱动适配、板级调试、产线测试的嵌入式工程师,尤其是手上只有二手板卡、原厂支持已经断档的情况。不适合谁?想找一份现代 PCIe 教程的人,这份文档默认你已经懂 PCI 配置空间和 BAR 映射。
2. 驱动安装与 SDK 目录结构:从设备管理器黄色感叹号到能打开设备
2.1 Windows 下两种驱动路径的选择逻辑
PLX SDK 在 Windows 下提供两种驱动形态,文档 2.5 节写得很清楚:一种是 Plug and Play 驱动,走标准 INF 安装流程,适合设备有固定 Vendor ID / Device ID 的场景;另一种是 PCI/PCIe Service Driver,通过服务控制管理器加载,适合需要动态启停、或者设备 ID 被改过的场景。选哪个不是拍脑袋,判断依据是:你的板卡 EEPROM 里烧的 ID 是不是 PLX 默认值。如果是默认值,PnP 驱动直接装;如果被客户改过,就得改 INF 文件,文档 2.5.1.2 专门讲了怎么改。
改 INF 的关键是找到[PLX]段里的 VID/PID 匹配行,把默认的10B5换成你实际的 Vendor ID。这里有个血泪经验:改完 INF 后必须清掉%windir%\inf\oem*.inf里的缓存副本,否则系统还是按旧 INF 匹配。常见做法是:
# 以管理员身份运行,清掉驱动缓存后重新扫描 pnputil /enum-drivers # 找到对应的 oemXX.inf,记下编号 pnputil /delete-driver oemXX.inf /uninstall # 然后在设备管理器里右键扫描硬件改动逻辑说明:pnputil /enum-drivers列出所有第三方驱动包,/delete-driver加/uninstall会把驱动从驱动仓库移除。参数上注意,如果不加/uninstall,驱动包还在仓库里,下次插设备可能又被自动装上。这一步不做,你会遇到「明明改了 INF,设备管理器还是显示旧驱动」的玄学问题。
2.2 Service Driver 的注册与启停
Service Driver 走的是另一条路,文档 2.5.2 给了三种安装方式:SCM API、sc.exe 命令行、手动改注册表加重启。实际干活我一般用 sc.exe,因为可脚本化:
# 创建服务,binPath 指向 SDK 安装目录下的驱动文件 sc create PlxService binPath= "C:\PLX\SDK\Driver\PlxService.sys" type= kernel start= demand # 启动服务 sc start PlxService # 停止服务 sc stop PlxService逻辑说明:type= kernel表示内核驱动,start= demand表示手动启动,不随系统开机自动加载。参数上,binPath=后面必须跟一个空格再跟路径,这是 sc.exe 的语法坑,少空格会报参数错误。启动后可以用sc query PlxService看 STATE 是不是 RUNNING。如果启动失败,先看%windir%\System32\drivers\下驱动文件在不在,再看事件查看器里有没有签名相关的错误——2011 年的驱动在 Win10 之后可能遇到签名强制问题,这是这份老文档没覆盖的边界。
2.3 SDK 目录结构与 API 库的链接方式
文档 3.1 节给了 SDK 目录结构,核心是Api、Driver、Samples、Tools四个目录。Api下是 PlxApi.lib 和 PlxApi.dll,Samples下是示例工程。链接的时候有个选择:静态链 PlxApi.lib 还是动态调 PlxApi.dll。静态链省事,但你的程序必须和 SDK 版本严格对应;动态调灵活,但要注意 32/64 位匹配。我一般用动态调,因为产线机器上可能装不同版本 SDK:
// 动态加载 PlxApi.dll 的典型写法 HMODULE hPlx = LoadLibraryA("PlxApi.dll"); if (!hPlx) { /* 检查是不是位数不匹配 */ } typedef int (*PlxPci_DeviceOpen_t)(PLX_DEVICE_KEY*, PLX_DEVICE_OBJECT**); PlxPci_DeviceOpen_t pDeviceOpen = (PlxPci_DeviceOpen_t)GetProcAddress(hPlx, "PlxPci_DeviceOpen");逻辑说明:LoadLibraryA加载 DLL,失败时先查GetLastError(),返回 193 就是位数不匹配。GetProcAddress拿函数地址,函数名必须和文档 5.1 节里的完全一致,大小写敏感。参数上,PLX_DEVICE_KEY结构体在 PlxApi.h 里定义,需要填bus、slot、function三个字段,这些值从设备管理器或者 PLXMon 里读。
3. PLXMon 与调试工具:寄存器读写、EEPROM 编辑和性能测试怎么落地
3.1 PLXMon 三种访问模式的区别与选用
文档 4.3.1 节把 PLXMon 的访问模式分成 PCI Mode、EEPROM File Edit Mode、Serial Mode 三种。PCI Mode 是直接通过驱动访问在线设备,最常用;EEPROM File Edit Mode 是离线编辑 EEPROM 镜像文件,不碰硬件;Serial Mode 走串口,适合设备还没枚举到 PCI 总线的情况。选用逻辑很简单:设备能在设备管理器里看到,用 PCI Mode;要预烧 EEPROM 文件,用 File Edit Mode;设备完全没反应,试试 Serial Mode。
PCI Mode 下打开 PLXMon,如果设备列表是空的,先确认驱动装没装、服务起没起。文档 4.3.4 节专门讲了「Unknown Device」的处理:PLXMon 认不出芯片型号时,需要手动指定 PLX Chip Type。这一步不做,寄存器对话框里全是灰的。指定型号的依据是板卡上桥片的丝印,比如 PEX 8311、PEX 8712 这些。
3.2 寄存器读写与 EEPROM 操作的具体步骤
寄存器对话框在 4.3.3.1 节,操作路径是:选设备 → 选 Chip Type → 打开 Register Dialog → 选寄存器组 → 读写。这里有个参数要注意:PCI 配置空间和本地配置空间是两套地址,PLXMon 里用不同的 Tab 区分。读出来全是 0xFFFFFFFF 通常意味着 BAR 没映射成功,先回设备管理器看资源选项卡有没有冲突。
EEPROM 操作在 4.3.3.2 节,支持读、写、擦、校验。写 EEPROM 前必须确认供电稳定,我遇到过写一半掉电导致 EEPROM 内容半新半旧,设备直接不枚举。常见做法是先读出来存成文件备份:
# 在 PLXMon 命令行界面里操作,文档 4.3.6 节有命令列表 eeprom read 0 0x100 eeprom_backup.bin # 参数:起始地址 0,长度 0x100,输出文件 eeprom write 0 0x100 new_config.bin # 写完后校验 eeprom verify 0 0x100 new_config.bin逻辑说明:read把 EEPROM 内容 dump 到文件,write写入,verify逐字节比对。参数上,地址和长度都是十六进制,长度不要超过 EEPROM 实际容量。校验失败说明写入过程中有错误,不要直接重启设备,先重新写一遍。
3.3 性能测试对话框的参数含义
文档 4.3.5 节讲了 Performance Measure Dialog,分 DMA Performance Test 和 Direct Slave Performance Test 两项。DMA 测试测的是板卡和主机内存之间的传输带宽,Direct Slave 测的是主机直接读写板卡本地内存的带宽。参数上,Transfer Size 决定单次传输数据量,Iterations 决定重复次数,这两个值直接影响结果可信度。Transfer Size 太小(比如 4KB 以下),测出来的是握手开销不是真实带宽;Iterations 太少,结果波动大。
文档 4.3.5.1 节有个「Notes before Using the Performance Measure」,里面提到测试前要关掉其他占用总线的程序。这条不是废话,我实测过,后台跑一个磁盘拷贝,DMA 带宽能掉 30%。测试结果里重点看两个数:平均带宽和最大延迟。平均带宽决定吞吐,最大延迟决定实时性够不够。
4. API 调用避坑:DeviceFind、DmaChannelOpen 和 CommonBuffer 的常见翻车点
4.1 PlxPci_DeviceFind 返回设备数量不对
文档 5.1 节里PlxPci_DeviceFind的原型是传入一个PLX_DEVICE_KEY数组和数量指针,返回实际找到的设备数。常见翻车是:数组开太小,函数返回的数量大于数组容量,后面的设备信息被截断。解决方法是先传 NULL 和 0 探一下数量,再分配数组:
U32 deviceCount = 0; PLX_STATUS status = PlxPci_DeviceFind(NULL, &deviceCount, 0); // 第一次调用只拿数量 PLX_DEVICE_KEY* devices = (PLX_DEVICE_KEY*)malloc(sizeof(PLX_DEVICE_KEY) * deviceCount); status = PlxPci_DeviceFind(devices, &deviceCount, 0); // 第二次调用拿具体信息逻辑说明:第一次传 NULL 是探测模式,函数只写deviceCount不写数组。参数上,第三个参数是设备索引偏移,多板卡场景下用来分批取。注意PlxPci_DeviceFindEx是扩展版,支持按 Vendor ID / Device ID 过滤,文档 5.1 节有单独条目。
4.2 DmaChannelOpen 的通道号与属性设置
PlxPci_DmaChannelOpen在文档 5.1 节,参数是设备对象、通道号、属性结构体。翻车点在于通道号:不同 PLX 芯片支持的 DMA 通道数不一样,PEX 8311 只有通道 0,PEX 8712 有通道 0 和 1。传了不存在的通道号,返回PLX_STATUS_INVALID_PARAMETER。属性结构体里DmaChannel和DmaMode两个字段最关键,DmaMode决定是块传输还是散列传输。
PlxPci_DmaSetProperties用来改传输方向、传输大小这些参数。注意这个函数必须在DmaChannelOpen之后、DmaControl启动之前调用,顺序错了不生效。文档里没强调顺序,但实测就是这样。
4.3 CommonBuffer 映射与释放的配对
PlxPci_CommonBufferMap和PlxPci_CommonBufferUnmap必须配对,文档 5.1 节两个条目挨着。常见翻车是程序异常退出时没调 Unmap,导致下次运行 Map 失败,返回PLX_STATUS_INSUFFICIENT_RESOURCES。解决办法是用try/finally或者atexit保证释放:
void* pBuffer = NULL; PLX_STATUS status = PlxPci_CommonBufferMap(hDevice, &pBuffer, 0x1000); if (status != PLX_STATUS_OK) { /* 处理错误 */ } // 使用缓冲区 // 退出前必须释放 PlxPci_CommonBufferUnmap(hDevice, pBuffer);逻辑说明:CommonBufferMap分配的是物理连续内存,大小必须是页对齐的。参数上,第三个参数是请求大小,实际分配可能更大。Unmap传回的指针必须和 Map 得到的一致,不能传偏移后的地址。
5. 常见问题排查:驱动加载失败、寄存器读写异常和 DMA 传输中断
5.1 驱动加载失败,设备管理器显示黄色感叹号
现象:设备管理器里设备带黄色感叹号,属性里错误代码 10 或 28。原因:错误代码 10 是设备无法启动,通常是驱动和硬件 ID 不匹配;错误代码 28 是驱动未安装。解决:先看硬件 ID,确认 VID/PID 和 INF 里写的一致;再看驱动签名,2011 年的驱动在 64 位系统上可能被签名强制拦住,需要临时禁用签名强制或者给驱动重新签名。
5.2 寄存器读出来全是 0xFFFFFFFF
现象:PLXMon 或者 API 读寄存器,返回值全是 0xFFFFFFFF。原因:BAR 没映射成功,或者设备根本没上电。解决:先查设备管理器资源选项卡,看 Memory Range 有没有分配;再看板卡供电,PCIe 插槽的 3.3V 和 12V 都要正常;最后确认 Chip Type 选对了,选错型号会导致寄存器地址偏移全错。
5.3 DMA 传输跑到一半就停
现象:DMA 传输开始正常,跑几秒后卡住,PlxPci_DmaStatus返回错误。原因:常见的是传输描述符链断了,或者目标内存页被换出。解决:检查描述符链的物理地址是否连续,用PlxPci_CommonBufferMap分配的内存不会换出;再看 DMA 通道的中断有没有正常触发,中断丢失会导致状态机卡死。
5.4 EEPROM 写入后设备不枚举
现象:EEPROM 写完后重启,设备直接消失。原因:写入了错误的配置,比如把 Vendor ID 改成了非法值。解决:用 Serial Mode 或者外部编程器重新烧回备份文件。预防措施就是写之前先eeprom read备份,这条我在 3.2 节强调过,但值得再说一遍。
5.5 API 返回 PLX_STATUS_INSUFFICIENT_RESOURCES
现象:调用PlxPci_DeviceOpen或者PlxPci_CommonBufferMap返回资源不足。原因:上次程序异常退出没释放资源,或者系统内存碎片化严重。解决:先重启设备驱动(sc stop再sc start),再不行重启系统;长期方案是保证程序异常路径也走资源释放。
6. 从手册到产线脚本:用命令行接口批量验证板卡
文档 4.3.6 节的 Command-Line Interface 是这份手册里最容易被忽略但产线最实用的部分。PLXMon 支持命令行模式,可以把寄存器读写、EEPROM 校验、性能测试写成脚本批量跑。我一般用这个做产线终检:每块板卡插上后自动跑一遍寄存器读写和 DMA 回环,结果写日志。
具体做法是先用 PLXMon 的交互模式把命令序列调通,再存成脚本文件。文档 4.3.8 节讲了命令行变量,支持用变量存设备句柄和地址。一个典型的产线脚本结构是:
# 产线终检脚本示例,基于 PLXMon 命令行 device open 0 # 打开第一个设备 reg read 0x00 0x10 # 读配置空间前 0x10 个字节 eeprom verify 0 0x100 golden.bin # 和黄金文件比对 dma test 0 0x10000 100 # 通道 0,传输 64KB,重复 100 次 device close 0逻辑说明:device open的参数是设备索引,reg read的参数是起始地址和长度,eeprom verify的参数是起始地址、长度和参考文件,dma test的参数是通道号、传输大小和迭代次数。每个命令的返回值可以重定向到日志文件,用findstr或者grep过滤 FAIL。
这里有个技巧:产线脚本里不要用固定延时等 DMA 完成,要用dma status轮询。固定延时在快机器上浪费时间,在慢机器上可能不够。轮询间隔我一般设 10ms,超时设 5 秒。超时后先dma stop再dma start重试一次,还失败就标记板卡不良。
从那以后我每次拿到一份老 SDK 手册,都先翻命令行接口和调试工具章节,而不是直接看 API 列表——因为 API 是给程序用的,命令行是给人用的,产线排障的时候人比程序快。希望帮到你。
本文还有配套的精品资源,点击获取