繁体   English   中英

使用PCIe在主机和端点之间进行数据传输

[英]Data transfer between host and endpoint using PCIe

最近几天以来,我正在尝试开发主机与端点之间的数据传输,但是我无法执行该实现。我尝试了如何使用某些调用(pci_read_long)读取配置空间,它已成功读取了诸如vendor_id之类的数据, device_id ...等。

在配置空间BAR(基地址寄存器)中存储了内存地址以及它的I / O地址,它取决于第0位。出现问题是由于我正在读取10h地址寄存器,例如,让我们考虑值0XFE000000我正在做的是清除最后四个位,然后对这些位进行补码,最后将1加到该地址,然后结果表明该地址的大小。

我的问题是:

  • 每当我使用此pci_write_long写入特定地址位置(FE000000)时,我都会(FE000000)分段错误。
  • 为什么我在写作时面临细分错误? 谁能帮助我解决此问题,计算内存大小是否正确(上述步骤)。
  • 关于bar:它代表内存基址吗?

来到我的代码:

int  c = pci_write_long(dev,0X10,0xFFFFFFFF);//write all 1's to that location

c = pci_read_long(dev,0x10); //reading the address
printf("c = %x\n",c);

for(i=0;i<4;i++)             //clearing the last four bits
        c = c & ~(1<<i);
printf("c = %x\n",c);

c = ~c;                    // 1's complement
c =c+1;                    //add the one to that address

printf("c = %x\n",c);          // size of the address

int  ch1 = pci_write_byte(dev,c,0xf);  // i am facing the segmentation fault here
printf("ch1 = %x\n",ch1);

ch1 = pci_read_byte(dev,c);         // again i am reading the the data current location 
printf("final read = %x\n",ch1);

这是实现代码的正确方法吗? 如果不正确,您可以提供任何相关信息或任何链接吗?

每当我使用此pci_write_long写入特定的地址位置(FE000000)时,我都会遇到分段错误。

pci_write_long()用于访问“端点”配置空间。 您尝试访问的地址是内存映射端点的内部寄存器,您可以简单地使用指针来实现。 只要知道设备的内部寄存器结构,只需mmap()地址即可像普通缓冲区一样访问它。 您会看到0xFFFFFFFF的首次写入成功,因为您正在写入配置空间中的偏移量0x10。 下一次导致分段错误的写入操作是,您正在写入与配置空间库无效的偏移量0xFE000000。 还有一点,如果您使用的是ARM,那么此内存是否即PCIe控制器的内存范围位于0xFE000000? 如果不是这种情况,则您正在访问无效的内存。

为什么我在写作时面临细分错误? 谁能帮助我解决此问题,计算内存大小是否正确(上述步骤)。

上面给出了崩溃的原因。 大小计算算法看起来正确。 您可以简单地将计算出的尺寸与EP数据表中提到的BAR尺寸相匹配,以确保。

关于bar:它代表内存基址吗?

它表示您的端点或设备的内部寄存器/内存在主机地址空间区域中的映射位置。 您可以使用主机中的相同地址来访问设备的内部寄存器,就像访问本地内存缓冲区一样。 如果您的架构具有适当的虚拟内存,则在访问前只需mmap()地址即可。

编辑1-我可以看到您正在写全1并试图读取地址。 您首先输入的不是主机地址空间中的任何地址。 我相信您在使用BAR时需要清除一些误解。

1-获取BAR大小。 2-将主机地址写入您要EP内部寄存器映射的BAR。 (对于ARM,该地址应来自PCIe控制器的地址范围。请查看您的电路板的手册)-通过在命令寄存器中写入0x3来启用内存事务访问。 3-从您的C代码中,执行该地址的mmap()4-立即访问该地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM