PLX9054做PCI卡映射地址问题
各位大佬,谁用过PLX9054勒,请教下“PCIBAR2,PCIBAR3寄存器,后面会提到LOCAL总线管理了两部分地址空间,space0和space1。PCIBAR2,”space0和space1是什么勒?怎么去理解?PLX9054本地LA, LD就一组勒。2,LAS0BA:SPACE0基地址寄存器。这个寄存器与PCI总线的PCIBAR2寄存器相互对应,即LOCAL端的FPGA(MCU)就是通过访问这个地址来访问PCIBAR2所指的PCI内存空间。
若此时LAS0RR设为0x80000001,而PCIBAR2设置值是0XE7000000.则对于PCI空间0XE7000000的访问就会映射到对本地空间0x80000001的访问。映射图如下。
这个“对于PCI空间0XE7000000的访问就会映射到对本地空间0x80000001”PCI空间就是PCIBUS AD到PLX9054的地址0xE7000000,然后PLX9054到FPGA的LA就是0x80000001,这个是怎么对应的勒?怎么去计算的。有谁能指点下吗?谢谢。(可加微信 微信红包感谢 谢谢) 很久以前做过类似的。。你直接用plx驱动打开,然后你就知道怎么用了。。 wye11083 发表于 2022-7-9 15:13
很久以前做过类似的。。你直接用plx驱动打开,然后你就知道怎么用了。。
(引用自2楼)
我没理解PCIBUS 和localbus之间的地址是怎么映射的,之前我以为是PCI BUS如果是地址1,PLX9054 LocalBus 的LA地址也会是1,但实际好像不是这么会是。能帮我解释下这个吗? jsh560 发表于 2022-7-9 16:07
我没理解PCIBUS 和localbus之间的地址是怎么映射的,之前我以为是PCI BUS如果是地址1,PLX9054 LocalBus...
(引用自3楼)
你把它当成个地址转换器就行了。从a转到b。 wye11083 发表于 2022-7-9 16:52
你把它当成个地址转换器就行了。从a转到b。
(引用自4楼)
是的,从a到b,但这个对应关系勒? “ 对于PCI空间0XE7000000的访问就会映射到对本地空间0x80000001”,比如我PC 通过API写的是ox00000004地址,PLX9054 LocalBus LA输出的是多少? PC写0x00000008,localbus LA又是多少?
前面你说的“你直接用plx驱动打开”是指的这个吗?
jsh560 发表于 2022-7-9 17:06
是的,从a到b,但这个对应关系勒? “ 对于PCI空间0XE7000000的访问就会映射到对本地空间0x80000001” ...
(引用自5楼)
你需要先了解什么是基地址base,什么是offset。映射就是base换一下,offset不变。驱动程序,不是配置软件。你要自己写程序读写localbus。 wye11083 发表于 2022-7-9 17:19
你需要先了解什么是基地址base,什么是offset。映射就是base换一下,offset不变。驱动程序,不是配置软件 ...
(引用自6楼)
“你需要先了解什么是基地址base,什么是offset。映射就是base换一下,offset不变”好的 ,谢谢老师指点方向。这块我去补习下。
“你要自己写程序读写localbus” 是的,我弄这个要和上位机结合,手上有一个案例是:上位机发送语句:
void CWITH_PCI_LED_RUNDlg::OnLED4()
{
// TODO: Add your control notification handler code here
LEDSel = 0x04;
rc = PlxBusIopWrite(hDevice,IopSpace0,0x00000004,TRUE,&LEDSel,1,BitSize8);
}
void CWITH_PCI_LED_RUNDlg::OnLEDRUN()
{
// TODO: Add your control notification handler code here
LEDSel = 0x05;
rc = PlxBusIopWrite(hDevice,IopSpace0,0x00000004,TRUE,&LEDSel,1,BitSize8);
}
从API函数中:
PlxBusIopWrite(
HANDLE hDevice,
IOP_SPACE IopSpace,
U32 address,
BOOLEAN bRemap,
VOID *pBuffer,
U32 ByteCount,
ACCESS_TYPEAccessType
);
U32地址发送的是0x00000004;但下位机FPGA:
if(ads & lwr & !blast & readyflag == 1'b1 & la == 14'b1)
begin
LEDByControl <= ld;
readyflag <= 1'b0;
end
收到的地址数据是la==14'b1;
这个PCI bus总线地址是0x00000004,local bus地址却变成了1,PCI9054根据什么转换来的,EEPROM烧录的如上内容。
这个我没理解到,请问如果PC发送PCI bus地址是0x00000008, 那local bus地址又会是多少勒? 老师,这个能帮我说说吗。谢谢。 jsh560 发表于 2022-7-9 20:53
“你需要先了解什么是基地址base,什么是offset。映射就是base换一下,offset不变”好的 ,谢谢老师指点 ...
(引用自7楼)
这个你原理图接的是la。。。所以你fpga看到的地址就是((上位机地址&偏移量掩码)|下位机基地址)/4。。。
所以你输入地址8,fpga看到的就是8/4=2,因为你这压根就没有接la啊。
注意这个字节写入的话要看字节使能。读的话不出意外的话,只能按32位去读,cpu去做字节读,数据你要映射好。这个是标准pci流程,我记得只支持32位读写(字节使能)。 wye11083 发表于 2022-7-9 21:25
这个你原理图接的是la。。。所以你fpga看到的地址就是((上位机地址&偏移量掩码)|下位机基地址) ...
(引用自8楼)
哦哦 明白了这个例子了。
PLX9054 LOCAL BUS只有LA物理连接线。
我试着老师您说的方法去推导:“对于PCI空间0XE7000000的访问就会映射到对本地空间0x80000001”好像不成立勒。 这个怎么来的还是没搞明白。 wye11083 发表于 2022-7-9 21:25
这个你原理图接的是la。。。所以你fpga看到的地址就是((上位机地址&偏移量掩码)|下位机基地址) ...
(引用自8楼)
反复看了相关配置介绍的文章,我有点质疑:
“2、 LOCAL配置寄存器
SPACE0对应的寄存器。
LAS0BA:SPACE0基地址寄存器。这个寄存器与PCI总线的PCIBAR2寄存器相互对应,即LOCAL端的FPGA(MCU)就是通过访问这个地址来访问PCIBAR2所指的PCI内存空间。
若此时LAS0RR设为0x80000001,而PCIBAR2设置值是0XE7000000.则对于PCI空间0XE7000000的访问就会映射到对本地空间0x80000001的访问。映射图如下。"
图片中介绍:LAS0RR:表明Local总线Space0映射到PCI总线空间的范围大小,这么理解它表示的是一个范围。
“LAS0BA:SPACE0基地址寄存器。这个寄存器与PCI总线的PCIBAR2寄存器相互对应,即LOCAL端的FPGA(MCU)就是通过访问这个地址来访问PCIBAR2所指的PCI内存空间。” FPGA通过Local 地址访问LAS0BA----它与PCI总线PCBAR2地址对应。 这样的话前面LAS0RR,应该是LAS0BA才对吧?
jsh560 发表于 2022-7-10 00:16
反复看了相关配置介绍的文章,我有点质疑:
“2、 LOCAL配置寄存器
(引用自10楼)
pci协议设备只有bus master才可以访问任意内存,否则只能被cpu从bar地址访问。访问规则就是基址+偏移量。 wye11083 发表于 2022-7-10 08:42
pci协议设备只有bus master才可以访问任意内存,否则只能被cpu从bar地址访问。访问规则就是基址+偏移量。 ...
(引用自11楼)
哦哦,谢谢老师指点。没实际用过,现在还有点茫然。做的板子也还在焊接中。方便能留个联系方式吗,可以的话能直接联系、请教你。谢谢。 现在都没pci接口了吧,芯片也停产了。 zjykwym 发表于 2022-7-10 19:18
现在都没pci接口了吧,芯片也停产了。
(引用自13楼)
还能买到,我用的B85 PLUS主板,有这个槽。 wye11083 发表于 2022-7-9 21:25
这个你原理图接的是la。。。所以你fpga看到的地址就是((上位机地址&偏移量掩码)|下位机基地址) ...
(引用自8楼)
老师,方便认识下 再请教下这个PLX9054设置吗?谢谢 jsh560 发表于 2022-7-13 21:58
老师,方便认识下 再请教下这个PLX9054设置吗?谢谢
(引用自15楼)
你照着他们提供的例程看看吧。很简单的。你试一下就知道了。上位机打开设备之后查找bar地址,然后就可以直接读写bar地址,下面芯片自动转成fpga地址。
除了bus master可能不太好做,那个需要做scatter-gather,从内存抓数据。 wye11083 发表于 2022-7-13 22:10
你照着他们提供的例程看看吧。很简单的。你试一下就知道了。上位机打开设备之后查找bar地址,然后就可以 ...
(引用自16楼)
老师,再请教下“PCI内存空间地址和I/O地址空间”有什么区别勒? jsh560 发表于 2022-8-10 00:38
老师,再请教下“PCI内存空间地址和I/O地址空间”有什么区别勒?
(引用自17楼)
这是两种指令,前者直接用*(volatile uint32_t*)addr访问 ,后者必须使用in out 汇编指令。 我听到消息说PLX9054这个芯片9月份就停产,不接订单了。9月份之前还能订货,货期52周。 LThunder 发表于 2022-8-10 09:51
我听到消息说PLX9054这个芯片9月份就停产,不接订单了。9月份之前还能订货,货期52周。 ...
(引用自19楼)
不是说早就停产了,只是库存还比较多嘛 wye11083 发表于 2022-8-10 06:48
这是两种指令,前者直接用*(volatile uint32_t*)addr访问 ,后者必须使用in out 汇编指令。 ...
(引用自18楼)
哦哦,感谢了。 wye11083 发表于 2022-8-10 06:48
这是两种指令,前者直接用*(volatile uint32_t*)addr访问 ,后者必须使用in out 汇编指令。 ...
(引用自18楼)
老师,再打扰下你哈:
“1、 PCI配置寄存器:主要用来配置与PCI总线相关的寄存器,例如,设备ID,供应商ID,类别代码,版本号,系统供应商ID,子系统ID等。PCI设备ID为9054,供应商ID为10B5,类别代码0680。对应寄存器如下:
主要介绍一下最后四个寄存器,这四个主要完成LOCAL端总线相关的寄存器在PCI总线的映射,以及LOCAL总线管理的地址空间在PCI总线上的映射。这四个寄存器都是由系统进行配置的,无法通过EEPROM配置。其中PCIBAR0,PCIBAR1,比较好理解,就是把LOCAL总线配置寄存器,DMA寄存器,运行寄存器映射到对应的内存空间去,配置的值就是他们在内存空间的起始地址。
下面介绍PCIBAR2,PCIBAR3寄存器,后面会提到LOCAL总线管理了两部分地址空间,space0和space1。PCIBAR2,PCIBAR3就是把这两部分映射到PCI总线地址上,即把这两个空间映射到PC机的内存空间。PCIBAR2的配置值就是LOCAL总线端space0空间映射到PCI内存空间的起始地址,PCIBAR3的配置值则是LOCAL总线端space1空间映射到PCI内存空间的起始地址。而LOCAL总线端SPACE0和SPACE1在local端的实际地址及范围,则是由LOCAL配置寄存器决定。下面介绍LOCAL端配置寄存器。”
网上资料介绍PCIBAR0,PCIBAR1,PCIBAR2,PCIBAR3,这四个PCI配置寄存器由系统进行配置,我看到相关介绍都是一个SDK软件,向EEPROM中写值,这个系统配置这几个地址的值,程序中没有向他写入值(或地址),系统去哪读取设计人员需要分配的地址勒?比如A设计人员需要把相同的PCI卡在A电脑分配PCI初始地址(0xFFFF0000), B设计人员把相同的PCI卡在B电脑分配PCI初始地址(0x11110000),上面说由系统进行配置,如果没有哪去设定,系统怎么知道设计人员的想法?呵呵,可能比较低级问题,如果方便,请老师指点下,谢谢。 jsh560 发表于 2022-8-11 01:48
老师,再打扰下你哈:
“1、 PCI配置寄存器:主要用来配置与PCI总线相关的寄存器,例如,设备ID,供应商I ...
(引用自22楼)
按pci协议,eeprom初始存的是bar地址空间大小(我记得是fffff000之类的掩码格式,你可以查手册),pci bios扫描时会随机分配一块这么大的地址给它。如果分配失败,bios好像要写ffffffff进去,查pci手册有说明。所以bar寄存器是bios设置的。 wye11083 发表于 2022-8-11 06:28
按pci协议,eeprom初始存的是bar地址空间大小(我记得是fffff000之类的掩码格式,你可以查手册),pci bi ...
(引用自23楼)
可不可以这么理解bar这四个寄存器设置,初始值或起始地址其实也是bios会去读eeprom寄存器的设置? jsh560 发表于 2022-8-11 08:04
可不可以这么理解bar这四个寄存器设置,初始值或起始地址其实也是bios会去读eeprom寄存器的设置? ...
(引用自24楼)
是的。你看pci手册。 jsh560 发表于 2022-8-11 08:04
可不可以这么理解bar这四个寄存器设置,初始值或起始地址其实也是bios会去读eeprom寄存器的设置? ...
(引用自24楼)
你想想如果把你同样的卡插了两块,这个地址该怎么办,就知道为什么这样设计了。。。
卡只管它需要多大的一块地址空间,实际哪一块地址给它是系统扫描的时候动态决定的。 wye11083 发表于 2022-8-11 09:01
是的。你看pci手册。
(引用自25楼)
谢谢老师回复。 redroof 发表于 2022-8-11 09:03
你想想如果把你同样的卡插了两块,这个地址该怎么办,就知道为什么这样设计了。。。
卡只管它需要多大的 ...
(引用自26楼)
嗯,了解。我现在想是不是应该这么个理解过程。EEPROM里面可以设置memory rang和local bus初始地址,local bus中的初始地址才是我们用户直接需要和eeprom设置的,至于PCI卡内存系统自动分配的初始地址我们用户层面可以不用管,上位机通过API操作的地址可能只是offset偏移地址,local bus中知道local初始地址和offset就可以操作了。不知道这么理解对不对。
页:
[1]