搜索
bottom↓
回复: 27

PLX9054做PCI卡映射地址问题

[复制链接]

出100入0汤圆

发表于 2022-7-9 15:01:25 | 显示全部楼层 |阅读模式
各位大佬,谁用过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[31:0]到PLX9054的地址0xE7000000,然后PLX9054到FPGA的LA[31:2]就是0x80000001,这个是怎么对应的勒?怎么去计算的。有谁能指点下吗?谢谢。(可加微信 微信红包感谢 谢谢)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入442汤圆

发表于 2022-7-9 15:13:53 来自手机 | 显示全部楼层
很久以前做过类似的。。你直接用plx驱动打开,然后你就知道怎么用了。。

出100入0汤圆

 楼主| 发表于 2022-7-9 16:07:51 | 显示全部楼层
wye11083 发表于 2022-7-9 15:13
很久以前做过类似的。。你直接用plx驱动打开,然后你就知道怎么用了。。
(引用自2楼)

我没理解PCIBUS 和localbus之间的地址是怎么映射的,之前我以为是PCI BUS如果是地址1,PLX9054 LocalBus 的LA地址也会是1,但实际好像不是这么会是。能帮我解释下这个吗?

出0入442汤圆

发表于 2022-7-9 16:52:57 来自手机 | 显示全部楼层
jsh560 发表于 2022-7-9 16:07
我没理解PCIBUS 和localbus之间的地址是怎么映射的,之前我以为是PCI BUS如果是地址1,PLX9054 LocalBus  ...
(引用自3楼)

你把它当成个地址转换器就行了。从a转到b。

出100入0汤圆

 楼主| 发表于 2022-7-9 17:06:41 | 显示全部楼层
wye11083 发表于 2022-7-9 16:52
你把它当成个地址转换器就行了。从a转到b。
(引用自4楼)

是的,从a到b,但这个对应关系勒? “ 对于PCI空间0XE7000000的访问就会映射到对本地空间0x80000001”  ,比如我PC 通过API写的是ox00000004地址,PLX9054 LocalBus LA[31:2]输出的是多少? PC写0x00000008,localbus LA又是多少?
前面你说的“你直接用plx驱动打开”是指的这个吗?


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入442汤圆

发表于 2022-7-9 17:19:54 来自手机 | 显示全部楼层
jsh560 发表于 2022-7-9 17:06
是的,从a到b,但这个对应关系勒? “ 对于PCI空间0XE7000000的访问就会映射到对本地空间0x80000001”   ...
(引用自5楼)

你需要先了解什么是基地址base,什么是offset。映射就是base换一下,offset不变。驱动程序,不是配置软件。你要自己写程序读写localbus。

出100入0汤圆

 楼主| 发表于 2022-7-9 20:53:50 | 显示全部楼层
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_TYPE  AccessType
    );

U32地址发送的是0x00000004;但下位机FPGA:
if(ads & lwr & !blast & readyflag == 1'b1 & la[13:0] == 14'b1)
                        begin
                                LEDByControl[7:0] <= ld[31:24];
                                readyflag <= 1'b0;
                        end
收到的地址数据是la[13:0]==14'b1;

这个PCI bus总线地址是0x00000004,local bus地址却变成了1,  PCI9054根据什么转换来的,EEPROM烧录的如上内容。
这个我没理解到,请问如果PC发送PCI bus地址是0x00000008, 那local bus地址又会是多少勒? 老师,这个能帮我说说吗。谢谢。

出0入442汤圆

发表于 2022-7-9 21:25:06 来自手机 | 显示全部楼层
jsh560 发表于 2022-7-9 20:53
“你需要先了解什么是基地址base,什么是offset。映射就是base换一下,offset不变”好的 ,谢谢老师指点 ...
(引用自7楼)

这个你原理图接的是la[31:2]。。。所以你fpga看到的地址就是((上位机地址&偏移量掩码)|下位机基地址)/4。。。

所以你输入地址8,fpga看到的就是8/4=2,因为你这压根就没有接la[1:0]啊。

注意这个字节写入的话要看字节使能。读的话不出意外的话,只能按32位去读,cpu去做字节读,数据你要映射好。这个是标准pci流程,我记得只支持32位读写(字节使能)。

出100入0汤圆

 楼主| 发表于 2022-7-9 21:47:46 | 显示全部楼层
wye11083 发表于 2022-7-9 21:25
这个你原理图接的是la[31:2]。。。所以你fpga看到的地址就是((上位机地址&偏移量掩码)|下位机基地址) ...
(引用自8楼)

哦哦 明白了这个例子了。  

PLX9054 LOCAL BUS只有LA[31:2]物理连接线。

我试着老师您说的方法去推导:“对于PCI空间0XE7000000的访问就会映射到对本地空间0x80000001”好像不成立勒。 这个怎么来的还是没搞明白。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出100入0汤圆

 楼主| 发表于 2022-7-10 00:16:52 | 显示全部楼层
wye11083 发表于 2022-7-9 21:25
这个你原理图接的是la[31:2]。。。所以你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才对吧?  


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入442汤圆

发表于 2022-7-10 08:42:29 来自手机 | 显示全部楼层
jsh560 发表于 2022-7-10 00:16
反复看了相关配置介绍的文章,我有点质疑:

“2、 LOCAL配置寄存器

(引用自10楼)

pci协议设备只有bus master才可以访问任意内存,否则只能被cpu从bar地址访问。访问规则就是基址+偏移量。

出100入0汤圆

 楼主| 发表于 2022-7-10 09:32:31 来自手机 | 显示全部楼层
wye11083 发表于 2022-7-10 08:42
pci协议设备只有bus master才可以访问任意内存,否则只能被cpu从bar地址访问。访问规则就是基址+偏移量。 ...
(引用自11楼)

哦哦,谢谢老师指点。没实际用过,现在还有点茫然。做的板子也还在焊接中。  方便能留个联系方式吗,可以的话能直接联系、请教你。谢谢。

出0入17汤圆

发表于 2022-7-10 19:18:20 | 显示全部楼层
现在都没pci接口了吧,芯片也停产了。

出100入0汤圆

 楼主| 发表于 2022-7-10 22:29:21 | 显示全部楼层
zjykwym 发表于 2022-7-10 19:18
现在都没pci接口了吧,芯片也停产了。
(引用自13楼)

还能买到,我用的B85 PLUS主板,有这个槽。

出100入0汤圆

 楼主| 发表于 2022-7-13 21:58:56 | 显示全部楼层
wye11083 发表于 2022-7-9 21:25
这个你原理图接的是la[31:2]。。。所以你fpga看到的地址就是((上位机地址&偏移量掩码)|下位机基地址) ...
(引用自8楼)

老师,方便认识下 再请教下这个PLX9054设置吗?谢谢

出0入442汤圆

发表于 2022-7-13 22:10:48 来自手机 | 显示全部楼层
jsh560 发表于 2022-7-13 21:58
老师,方便认识下 再请教下这个PLX9054设置吗?谢谢
(引用自15楼)

你照着他们提供的例程看看吧。很简单的。你试一下就知道了。上位机打开设备之后查找bar地址,然后就可以直接读写bar地址,下面芯片自动转成fpga地址。

除了bus master可能不太好做,那个需要做scatter-gather,从内存抓数据。

出100入0汤圆

 楼主| 发表于 2022-8-10 00:38:44 | 显示全部楼层
wye11083 发表于 2022-7-13 22:10
你照着他们提供的例程看看吧。很简单的。你试一下就知道了。上位机打开设备之后查找bar地址,然后就可以 ...
(引用自16楼)

老师,再请教下“PCI内存空间地址和I/O地址空间”有什么区别勒?

出0入442汤圆

发表于 2022-8-10 06:48:29 来自手机 | 显示全部楼层
jsh560 发表于 2022-8-10 00:38
老师,再请教下“PCI内存空间地址和I/O地址空间”有什么区别勒?
(引用自17楼)

这是两种指令,前者直接用*(volatile uint32_t*)addr访问 ,后者必须使用in out 汇编指令。

出0入42汤圆

发表于 2022-8-10 09:51:01 | 显示全部楼层
我听到消息说PLX9054这个芯片9月份就停产,不接订单了。9月份之前还能订货,货期52周。

出100入0汤圆

 楼主| 发表于 2022-8-10 18:36:15 来自手机 | 显示全部楼层
LThunder 发表于 2022-8-10 09:51
我听到消息说PLX9054这个芯片9月份就停产,不接订单了。9月份之前还能订货,货期52周。 ...
(引用自19楼)

不是说早就停产了,只是库存还比较多嘛

出100入0汤圆

 楼主| 发表于 2022-8-10 18:41:48 来自手机 | 显示全部楼层
wye11083 发表于 2022-8-10 06:48
这是两种指令,前者直接用*(volatile uint32_t*)addr访问 ,后者必须使用in out 汇编指令。 ...
(引用自18楼)

哦哦,感谢了。

出100入0汤圆

 楼主| 发表于 2022-8-11 01:48:25 | 显示全部楼层
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),上面说由系统进行配置,如果没有哪去设定,系统怎么知道设计人员的想法?  呵呵,可能比较低级问题,如果方便,请老师指点下,谢谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入442汤圆

发表于 2022-8-11 06:28:50 来自手机 | 显示全部楼层
jsh560 发表于 2022-8-11 01:48
老师,再打扰下你哈:
“1、 PCI配置寄存器:主要用来配置与PCI总线相关的寄存器,例如,设备ID,供应商I ...

(引用自22楼)

按pci协议,eeprom初始存的是bar地址空间大小(我记得是fffff000之类的掩码格式,你可以查手册),pci bios扫描时会随机分配一块这么大的地址给它。如果分配失败,bios好像要写ffffffff进去,查pci手册有说明。所以bar寄存器是bios设置的。

出100入0汤圆

 楼主| 发表于 2022-8-11 08:04:46 来自手机 | 显示全部楼层
wye11083 发表于 2022-8-11 06:28
按pci协议,eeprom初始存的是bar地址空间大小(我记得是fffff000之类的掩码格式,你可以查手册),pci bi ...
(引用自23楼)

可不可以这么理解bar这四个寄存器设置,初始值或起始地址其实也是bios会去读eeprom寄存器的设置?

出0入442汤圆

发表于 2022-8-11 09:01:34 来自手机 | 显示全部楼层
jsh560 发表于 2022-8-11 08:04
可不可以这么理解bar这四个寄存器设置,初始值或起始地址其实也是bios会去读eeprom寄存器的设置? ...
(引用自24楼)

是的。你看pci手册。

出300入477汤圆

发表于 2022-8-11 09:03:54 来自手机 | 显示全部楼层
jsh560 发表于 2022-8-11 08:04
可不可以这么理解bar这四个寄存器设置,初始值或起始地址其实也是bios会去读eeprom寄存器的设置? ...
(引用自24楼)

你想想如果把你同样的卡插了两块,这个地址该怎么办,就知道为什么这样设计了。。。
卡只管它需要多大的一块地址空间,实际哪一块地址给它是系统扫描的时候动态决定的。

出100入0汤圆

 楼主| 发表于 2022-8-11 09:04:23 来自手机 | 显示全部楼层
wye11083 发表于 2022-8-11 09:01
是的。你看pci手册。
(引用自25楼)

谢谢老师回复。

出100入0汤圆

 楼主| 发表于 2022-8-11 09:11:24 来自手机 | 显示全部楼层
redroof 发表于 2022-8-11 09:03
你想想如果把你同样的卡插了两块,这个地址该怎么办,就知道为什么这样设计了。。。
卡只管它需要多大的 ...

(引用自26楼)

嗯,了解。我现在想是不是应该这么个理解过程。EEPROM里面可以设置memory rang和local bus初始地址,local bus中的初始地址才是我们用户直接需要和eeprom设置的,至于PCI卡内存系统自动分配的初始地址我们用户层面可以不用管,上位机通过API操作的地址可能只是offset偏移地址,local bus中知道local初始地址和offset就可以操作了。不知道这么理解对不对。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-16 14:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表