linux上的pcie内存访问
Posted
技术标签:
【中文标题】linux上的pcie内存访问【英文标题】:pcie memory access on linux 【发布时间】:2017-04-28 01:18:33 【问题描述】:我正在尝试制作自己的 pcie 卡。我使用带有用于 pci express 的 spartan 6 集成块的 xilinx spartan 6 sp605 板。我的目标系统是 ubuntu 16.04。当我执行 lspci 时,我的计算机正在看到 pcie 卡,但我无法从 pcie 卡读取内存。我使用这个工具我发现无需制作驱动程序就可以从设备中读取内存,
https://github.com/billfarrow/pcimem/blob/master/README
我使用 spartan 6 集成块附带的示例代码,使用以下代码从 pcie 卡写入内存
wire [31:0] data_reg;
wire [10:0] add_reg;
assign add_reg = 11'b00000000000;
assign data_reg = 32'b00001111111111111111111111111111;
PIO_EP_MEM_ACCESS EP_MEM (
.
.
.
// Memory Write Port
.wr_addr_o(add_reg), // O [10:0]//wr_addr
.wr_be_o(wr_be), // O [7:0]
.wr_data_o(data_reg), // O [31:0]//wr_data
.wr_en_o(wr_en), // O
.wr_busy_i(wr_busy) // I
);
然后我使用 ./pcimem pciesystemfile/resource0 0 w
验证 00001111111111111111111111111111 已写入内存,但它不存在我正在读取 111111111111111111111111111111111 代替
对我可能做错的任何帮助将不胜感激
先谢谢了!
【问题讨论】:
【参考方案1】:好的!经过一番摆弄,我想通了。
所以这不是读取和写入数据到 pci 内存的正确位置
// Memory Write Port
.wr_addr_o(add_reg), // O [10:0]//wr_addr
.wr_be_o(wr_be), // O [7:0]
.wr_data_o(data_reg), // O [31:0]//wr_data
.wr_en_o(wr_en), // O
.wr_busy_i(wr_busy) // I
);
显然在代码的这个阶段,数据被分成字节,其中整个单词中的每个字节都被颠倒了,我在我发布的原始问题中读取的数据一定被我误读了。
感谢您的帮助!
【讨论】:
以上是关于linux上的pcie内存访问的主要内容,如果未能解决你的问题,请参考以下文章