This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TMS320C6678:从 FPGA 端点读取 PCIe 条形数据

Guru**** 2538960 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/675379/rtos-tms320c6678-pcie-bar-data-read-from-fpga-endpoint

器件型号:TMS320C6678

工具/软件:TI-RTOS

您好!

我正在尝试使用 PCIe 使用 C6678定制板读取数据。 C6678是 RC、FPGA 是 PCIe 总线上的 EP。

我能够执行链路训练并读取远程设备 ID 和供应商 ID、但它们会按顺序交换、这可能是因为字节不匹配。

我正在关注 PCIe_examplpleProject 中的示例以及 TI E2E 论坛上的一些修改。

在 FPGA 端、我已将 BAR0和 BAR1配置为8MB 大小。

在 C6678 DSP 端、我为区域1和区域2配置了出站转换。

区域1:LO:0x00100001、HI:0x0

区域2:LO:0x00200001、HI:0x0

之后、我配置了 FPGA 的远程条。

BAR0

pcieBarCfg_t     barCfg;
barCfg.location = pcie_LOCATION_REMOTE;
barCfg.mode     = pcie_EP_MODE;
barCfg.base     = 0x00100000;
barCfg.prefetch = pcie_BAR_NON_PREF;
barCfg.type     = pcie_BAR_TYPE32;
barCfg.memSpace = pcie_BAR_MEM_MEM;
barCfg.idx      = 0;

第1条

pcieBarCfg_t     barCfg;
barCfg.location = pcie_LOCATION_REMOTE;
barCfg.mode     = pcie_EP_MODE;
barCfg.base     = 0x00200000;
barCfg.prefetch = pcie_BAR_NON_PREF;
barCfg.type     = pcie_BAR_TYPE32;
barCfg.memSpace = pcie_BAR_MEM_MEM;
barCfg.idx      = 1;
出站翻译和条形图配置已成功完成。
但是、当我尝试从区域1 (0x60800000)和区域2 (0x61000000)读取数据时、我将在0x60800000和以0x01开头的序列之间交替获取数据、该序列以2为步长增加。
请告诉我在配置和数据读取中缺少哪些步骤。
谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    团队将收到通知。 他们将直接在此处发布反馈。

    BR
    Tsvetolin Shulev
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您告诉您正在设置8MB 内存窗口、但您的基址分别为10_0000和20_0000、分别为1MB 和2MB。 规格要求基座至少在存储器窗口宽度处对齐。 因此、其中一个窗口的对齐方式可能是2MB、因此对于4或8个窗口、但8MB 窗口的对齐方式应该是8MB。 因此,首先要检查barCfg.base的是。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我认为 PCIe 示例将 Ob_size 设置为8MB。 请检查您是否将其修改为1MB。 如果是、则需要从0x6010_0000和0x6020_0000进行读取。

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您指出这一点、我重新配置了遥控杆、如下所示:

    BAR0

    pcieBarcfg_t barCfg;
    barCfg.location = PCIe_location_remote;
    barCfg.mode = PCIe_EP_MODE;
    barCfg.base = 0x00800000;
    barCfg.prefetch = PCIe_bar_non_PREF;
    barCfg.type = PCIe_bar_TYPE32;
    barCfg.memSpace = PCIe_bar_MEM_MEM;
    barCfg.idx = 0;

    第1条
    pcieBarcfg_t barCfg;
    barCfg.location = PCIe_location_remote;
    barCfg.mode = PCIe_EP_MODE;
    barCfg.base = 0x01000000;
    barCfg.prefetch = PCIe_bar_non_PREF;
    barCfg.type = PCIe_bar_TYPE32;
    barCfg.memSpace = PCIe_bar_MEM_MEM;
    barCfg.idx = 1;

    和出站区域为:

    区域1:LO:0x00800001、HI:0x0

    区域2:LO:0x01000001、HI:0x0

    已成功配置出站转换和条形图配置、
    我在内存浏览器中观察到 PCI 应用程序和配置寄存器。

    * 0x21800208 = 0x00800001 (OB 区域1为低电平)
    * 0x2180020C = 0x0 (OB 区域1为高电平)
    * 0x21800210 = 0x01000001 (OB 区域2低电平)
    * 0x21800214 = 0x0 (OB 区域2高电平)

    和远程配置空间中
    * 0x21802010 = 0x00800000 (远程条1原始寄存器值)
    * 0x21802014 = 0x00800000 (远程条2原始寄存器值)

    当我尝试从存储器0x60800000中读取数据时、我将获取备用数据0x60800000和0。
    当我尝试从存储器0x61000000进行读取时、我将获得交替数据0x61000000和0x60800000。

    我正在读取0x00080000的远程 BAR1基地址
    远程 bar2基地址我正在读取0x00100000

    您能不能指出我犯了什么错误?

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    看起来您正在进行正确的设置、但让我们确保没有拼写错误。

    [引用用户="Arun Singh26"]

    和远程配置空间中
    * 0x21802010 = 0x00800000 (远程条1原始寄存器值)
    * 0x21802014 = 0x00800000 (远程条2原始寄存器值)

    当我尝试从存储器0x60800000中读取数据时、我将获取备用数据0x60800000和0。
    当我尝试从存储器0x61000000进行读取时、我将获得交替数据0x61000000和0x60800000。

    我正在读取0x00080000的远程 BAR1基地址
    远程 bar2基地址我正在读取0x00100000

    [/报价]

    我在前两行中看到差异、应为0x0080_0000和0x0100_0000。 这与您的陈述的最后两行不匹配。

    在您提到的原始帖子中、设备/供应商 ID 以某种方式交换、是否仍然观察到? 您在 FPGA 端看到了什么以及编程了什么?

    我们知道、您调试 FPGA 的能力是什么? 如果您使用的是 Xilinx、电路板上是否有编程电缆和编程接头? 您是否熟悉 ChipScope?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨!
    让我逐一回答您的问题:

    这不是拼写错误、前两行是从存储器浏览器窗口引用的、然后是通过读取 reg 命令读取寄存器。

    getRegs_rem.vndDevId =&vend_test_rem;
    getRegs_rem.type0BarIdx =&type0BarIdx_rem;
    if ((RetVal = PCIe_readRegs (handle、PCIe_location_remote、&getRegs_rem))!= PCIe_RET_OK)

    System_printf ("远程 Vedor ID 读取失败!\n");


    然后我观察结构 type0Baridx_rem、因为基址是0x00080000 (基址是原始寄存器[31:20])。

    与供应商 ID 和设备 ID 相同的是,当我在内存浏览器(*0x21802000)中观察时,它们的顺序是正确的(器件 ID 位于较高的16位),但在结构中,vend_test_rem 它们的值是交换的(供应商 ID 代替器件 ID,反之亦然)。

    FPGA 器件= kintex 7.
    工具= Xilinx Vivado
    是的、我在板上有编程电缆和编程接头、我熟悉 Chipscope、但我在 Xilinx ISE 上使用了该电缆、在 Vivado 中可能需要一些时间。

    我认为从 FPGA 方面、我将以正确的顺序获得数据、只有解释。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、至少对于 VND/开发 ID、我们会看到相同的情况。 我刚刚签入了我的设置

    参数[15:0] CFG_VEN_ID = 16'h10EE、
    参数[15:0] CFG_DEV_ID = 16'h0007、 

    我明白了

    ==== >远程配置=== >VndDevId
    :RAW = 0x710ee、VND = 0x7、Dev = 0x10ee 

    我想我已经找到了原因、对我来说、它看起来像是 CSL 错误、但我们也会更好地听到开发人员的声音。

    在\TI\pdk_C6670_1_2_6\packages\ti\drv\PCIe\src\pciecfg.c 中、第一个函数是

    pcieRet_e pcie_read_vndDevId_reg
    (
    CSL_pcie_cfg_space_endpointRegs * baseAddr、
    pcieVndDevIdReg_t * reg
    )
    {
    uint32_t val = reg->raw = baseAddr->vender_device_ID;
    
    pci_getEndpoint bits (vender_vendor_vertbits、cs_v32_t vvert_t val = reg->vert_vert_vert_vert_vert_vert_vert_vert_vert_vert_vert_vert_
    CSL_PCIe_CFG_SPACT_ENSOLED_VENDON_DEVICE_ID_DEVICE_ID、REG->DevID);
    
    返回 PCIe_RET_OK;
    }// PCIe_read_vndDevId_reg *
    
    PCIe_getbits 是简单的宏 AS
    #define PCIe_getbits (val、field、final_result)\
    final_result=(val 和 field#_mask)>> field##_shift;
    

    最后、在 TI\pdk_C6670_1_2_6\packages/ti\cSL\cslr_pcie_cfg_space_endpoint.h 中、我们看到:

    /*
    
    
    
    
    
    
    
    (vender_device_ID */#define CSL_PCIe_CFG_SPACT_END_Fender_DEVICE_ID_vender_ID_vender_ID_CFG_SPACE (0xFFFFFF_CFG_SPACE_END_DEVICE_ID_vender_vender_vender_vender_vender_vender_v800_vu_v088u_vu_vender_v0u_v0u_v0u_CFG_vender_v_vender_v_vender_v0u_v_v_v0u_v0u_v0u_v_v_v0u_v_v_v0u_v_v_v0u_v_v0u_v_v_v0u_v_v_vu_v_v_v_v_vu_vu_vu_vu_vue_vue_vue_vue_vue_vue_vue_vue_vue_vue_vue_vue_vue_v64ue_
    
    
    

    掩码和移位表明 VndID 应该位于上半字中、与在该处放置0x8888的复位值相同。

    我相信您可能会忽略供应商/设备 ID 交换一段时间、我看到完全相同的交换、这对您的案例没有任何诊断重要性。

    现在更接近配置。 在本例中、我有

    #define FPGA_BAR0_BASE 0x00000000
    #define FPGA_BAR1_BASE 0x08000000 

    当我查看具有存储器浏览器的 FPGA 时、我看到了

    0x21802000000710EE00100446058000000000000000000000
    0x2180201408000000000000000000000000000000 00000000 00000000 00000000
    

    请注意、0x21802010上的 BAR0读取为零、0x21802014上的 BAR1读取为080000、与我配置的完全相同。 不过、在您的案例中、我们看到了

    [引用用户="Arun Singh26"]

    * 0x21802010 = 0x00800000 (远程条1原始寄存器值)
    * 0x21802014 = 0x00800000 (远程条2原始寄存器值)

    [/报价]

    其中两个条的读数相同、而 BAR1应为 barCfg.base = 0x01000000。

    当我询问 FPGA 调试时、我会插入事务接口并监控 BAR_HIT 信号以及 Trn_rd 和 Trn_TD。 了解 TLP 格式后、您可以轻松解码读取请求中的地址和返回完成者的有效载荷。 但 Vivado、我完全理解您的意思、让我们先尝试在 DSP 端分步执行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    由于您使用索引0和1、远程条是 BAR0和 BAR1、是的、它们位于0x21802010和0x21802014、它们被错误地称为 BAR1和 BAR2。 但是、它们的值应该与您编程的值相匹配、但现在它们不匹配。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、我没有检查此拼写错误、我实际上在这些地址获得了正确的值、实际上当我通过 PCIe_readRegs 命令读取这些寄存器时、在该结构中、基址只是不同的。 但现在我可以假设这可能是因为 CSL 错误、唯一重要的是寄存器原始值、它是正确的、当我尝试读取条形寄存器时、仍然会得到垃圾值。

    * 0x21802010 = 0x00800000 (远程条0原始寄存器值)
    * 0x21802014 = 0x01000000 (远程条1原始寄存器值)

    如果我在这个阶段之前是正确的、那么获取垃圾数据的其他可能方法是什么、另外需要注意的是(0x60800000)处的值是相同的寄存器地址。

    您能告诉我远程配置空间中的远程命令和状态寄存器(0x21802004)值是多少吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、lding、
    请仔细查看我之前的帖子中的最新更新、并指出我在读取数据时犯了什么错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    遥控杆似乎正常。

    我的远程状态和命令寄存器值为0x00100446、即:

    1 MEM_SP
    2 BUS_MS
    6 PAR_ERR_RESP
    10 INTX_DIS 
    20 CAP_LIST

    没什么特别的、我禁用了传统 INTx、因为我们使用的是 MSI。

    以下是我对 FPGA 配置空间的了解:

    0x21802000000710EE00100446058000000000000000000000 080000000000000000000000 0x21802020
    0000000000000000000710EE000000000000004000000000000000FF
    0x218020407E0348010000000800DB5805200000540000000000000000000100100000800000000 00000000 00000000 00000000 00000000 0000x22060 00000000 00000000 00000000
    00000000 000000010
    00000000 00000000 00000000 00000000 00000000 00000008000000 00010 00000000 00000000 00000000 00000000 00000000000 000000010 00000000 00000000 00000000000 00000000000 0008000000 00000000000 0000000000000000000000000000000
    0x218020A00000000000000000000000000000000000000000000000000000000000000000
    0x218020C00000000000000000000000000000000000000000000000000000000000000000
    0x218020E00000000000000000000000000000000000000000000000000000000000000000
    0x218021000001000301000A3500000001000000000000000000000000 00000000 00000000 00000000 00000000
    

    请注意、我必须使用 MSI、因此我的设置可能会与基址有一些不同。 但是、我看不到、这里还有什么可以拧紧的。

    我们可以知道、FPGA 端有何种应用? 您希望条形图上有哪些数据?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我的远程状态和命令寄存器值为0X00100000、我认为这是主要问题。
    在 FPGA 端、我进行了基本的 PCIe 内核初始化、其中配置了两个8MB 大小的条。
    我想先回送数据、然后再进一步开发、我尝试从 DSP 写入数据、然后读取相同的数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    确实是这样。  

    让我猜一下:您配置远程条、但不显式配置状态和命令寄存器。 如果是这样,你就像我3年前一样陷入了陷阱。

    TI 示例在技术上是正确的。 但是、作为 RC、EP 确实会自行配置其配置寄存器、这很容易实现、因为它们是处理器。 对于 FPGA、情况稍有不同。 FPGA EP 运行背后的逻辑是准备好并处理来自 RC 的配置请求。 因此、在您的情况下、应由 RC、DSP 负责配置远程状态和命令寄存器。 FPGA 的配置空间布局与 DSP 的布局相匹配、因此您可以使用以下内容:

    pcieRegisters_t setRegs;
    pcieStatusCmdReg_t statusCmd;
    
    memset (&setRegs、0、sizeof (setRegs));
    memset (&StatusCmd、 0、sizeof (StatusCmd));
    
    setRegs.statusCmd =&StatusCmd;
    PCIe_readRegs (handle、PCIe_location_remote、 setRegs);
    
    //StatusCmd.busMs = 1;//启用总线主控
    //StatusCmd.dis = 1;//将 DIS 设置为禁用传统 Intr ->使用 MSI
    //StatusCmd.resp = 1;
    StatusCmd.memSp = 1;
    
    PCIe_writeRegs (handle、PCIe_locations);
    

    根据我的理解、器件需要设置 MEM_SP 位来响应存储器访问。 为供参考、我留下了注释字段、使总线主控和禁用有利于 MSI 的旧 INTx 成为可能。 如果您需要、请谨慎操作、FPGA 中 PCIe 功能的布局可能与 DSP 不同。

    我记得、以防万一、Spartan 6的基本 PIO 设计提供了一些小内存作为 PIO 访问的目标。 您的设计中是否有这样的内存&

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    实际上、命令和状态寄存器在我的脑海中、所以我在 EP 模式下运行了相同的 DSP 代码、然后检查了寄存器值、它是0X00100146。 我只需在远程配置命令寄存器中写入该值。 但在我的案例中、这个问题仍然存在。 实际上、在该 DSP 示例代码中、两个 DSP 都以相同的方式进行配置、并且它们的命令寄存器值完全相同。
    实际上、该 PCIe 条上的数据与地址空间值(0x60800000)相同、它是否提供任何提示?

    是的、我可以访问该存储器、因为我在 FPGA 用例中使用了相同的示例。

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、如果您已经配置了 FPGA 的状态命令寄存器、看起来这就是我们在 DSP 端可以做的所有事情。
    至于你有的奇怪的读数,我很难判断。 您可能会认为、传入 TLP 的 DWORD 会逐个切片、并且标头承载地址的第三个字会以错误的方式被锁存、而不是数据。 恐怕现在是插入 ChipScope 的时候了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我收到相同的错误、我跟踪了此帖子数天。

    我的 EP 是一款运行"7系列 FPGA 集成块、适用于 PCI Express v3.2 "的 Kintex-7。  

    希望有人可以修复并分享。

    e2e.ti.com/.../7384.log20180330.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    如果您不介意共享您的 PCIe 设置代码、我可以在我的机器上运行它、以确保它能够与成熟的设计配合使用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    拉格里奇
    感谢您为本主题提供帮助、并分享您的许多经验!

    Arun 和 user4248043、
    您能否使用 CCS 存储器窗口提供从0x2180_0000到0x2180_3000的 PCIe 寄存器转储? 谢谢!

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    感谢您回复我的问题。
    我将在下周一为您提供代码和 CCS 内存窗口、作为对我的工作站的访问权限。

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有新消息吗?