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

张开发
2026/4/19 4:03:32 15 分钟阅读

分享文章

PCI9x5x驱动移植支持PCI9054在win7下使用1
寄存器定义PCI9656与PCI9054在基地址、中断以及DMA操作方面的定义完全一样只有其它一些没用到的功能定义不同所以稍加改动就可以使用示例程序中的寄存器头文件。分配资源PLxPrepareHardware函数中分配资源对于PCI总线驱动使用BAR这个概念来分配寄存器资源BAR是Base Address Register的缩写也就是基地址寄存器32位PCI总线最多6个BAR根据找到顺序的不同从BAR0~BAR5。老驱动中9054分配资源操作按照资源序号BAR3对应本地译码地址读写操作FPGA应用层读写IO使用BAR2对应本地译码地址读写操作FPGA内核操作使用BAR1对应PCI9054地址读写操作9054不知道为何老驱动使用了两个BAR来操作相同的本地总线新驱动应该使用一个即可。新驱动中资源分配操作下面是PCI9656开发板的资源分配找到内存方式且长度对应0x200则对应BAR0地址映射给Regs直接使用结构体内成员来操作寄存器。找到IO方式且长度大于或者等于0x100则对应BAR1后续并没有处理这个资源。第一次找到内存方式且长度对应0x20000则对应BAR2后面映射地址给SRAMBase但是也没有用到这个地址。第二次找到内存方式且长度对应0x20000则对应BAR3实际上后面没有处理这个资源对于老产品总的资源数量有9个分配情况如下0 内存资源长度256BAR01 129号资源设备私有资源应该用不到2 IO资源长度256PCI9054地址BAR13 129号资源设备私有资源应该用不到4 内存资源长度131,0720x20000这个应该是最早9054开发板的资源分配信息老产品保留了这个设置实际应该对应本地地址操作FPGA。BAR25 129号资源设备私有资源应该用不到6 IO资源长度256本地地址操作FPGABAR37 129号资源设备私有资源应该用不到8 中断资源这个以后再处理。之前无法确定哪个资源对应本地IO因此需要测试52地址是否能返回0x3100来判断如果返回0x3100则说明是本地IO经过测试后6号资源BAR2对应本地寄存器2号资源BAR1对应PCI9054寄存器。他们都是IO资源可以直接使用READ_PORT_ULONG和WRITE_PORT_ULONG进行读写操作。内存资源需要使用“LocalMmMapIoSpace”函数转换后才能使用WRITE_REGISTER_ULONG和READ_REGISTER_ULONG操作。个人感觉IO资源操作更方便所以所有寄存器操作均使用IO资源。仿照示例驱动先找到的IO资源是PCI9054地址后找到的IO资源是本地资源。修改后的代码如下case CmResourceTypePort: //分配IO资源 bar NULL; if (!foundLocalPort !found9054Port desc-u.Port.Length 0x100) { found9054Port TRUE; bar BAR1-9054; DevExt-Regs (PPCI9656_REGS)UlongToPtr(desc-u.Port.Start.QuadPart); DevExt-RegsLength regsLength; } else if (!foundLocalPort desc-u.Port.Length 0x100) { foundLocalPort TRUE; bar BAR3-FPGA; DevExt-addrLocal (PUCHAR)UlongToPtr(desc-u.Port.Start.QuadPart); DevExt-localLength desc-u.Port.Length; } TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, - Port Resource [%08I64X-%08I64X], %s, i:%d length:%d, desc-u.Port.Start.QuadPart, desc-u.Port.Start.QuadPart desc-u.Port.Length, (bar) ? bar : unrecognized, i, desc-u.Port.Length); break;

更多文章