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.

PCIE MSI中断的配置



小弟学习K1_STK(从官网下的最新的例程keystone软件开发包)里面的PCIE(例程),这个是例程里面RC端和EP端用的是MSI中断。PCIE_int_cfg.number_tx_MSI = PCIE_16_MSI;这个结构体里面配置了MSI16这个中断向量。然后工程跑的是loopback模式。调用了这个语句KeyStone_PCIE_RC_MSI_allocate((PCIE_MSI_Regs *)&gpPCIE_EP_regs->MSI_CAP,PCIE_RC_BAR0_ADDRESS+((Uint32)&gpPCIE_app_regs->MSI_IRQ)-(Uint32)gpPCIE_app_regs);,这个语句的大致意思就是MSI中断配置。那是不是我只要改之前的那个结构体赋值,比如说是PCIE_16_MSI,然后不用管调用的那个函数,就可以触发16号PCIE中断呢?

  • PCIE协议规定的MSI的大致工作流程是:

    1. EP 申请2^n个MSI向量

    2. RC分配2^m个向量给某个EP (m<=n)

    3. 然后,EP可以触发任何一个RC分配给他的中断向量

    详细信息请参与PCIE协议。

    K1_STK实现中的“PCIE_int_cfg.number_tx_MSI = PCIE_16_MSI;” 表示的是EP申请16个MSI中断向量; "KeyStone_PCIE_RC_MSI_allocate”是RC分配MSI中断向量的示例;MSI中断的触发是由函数“KeyStone_PCIE_generate_MSI”实现的。

    STK实现的更多信息请参阅文档。

    KeyStone_1_PCIE_STK_User's_Guide.doc
  • 谢谢您的回答,现在重新看了一下您写的例程,感觉和带BIOS的那个PDK的例程特别不一样。这里面的结构体定义挺多的挺复杂的。而且又要开cache,还有一个什么prefetchable存储区的配置。我现在就是想实现两片6678用PCIE进行通信,不用cache。然后数据量最大是256M。肯定是开辟32个8M的region。然后采用的是RC->EP->RC这样的测试方式。打算采用MSI中断。之前的那个PDK的例程是查询方式。您能给一下满足我这个需求的建议吗。我怕对您的程序改动太大实现不了功能。因为我是初学者,您这个程序我理解起来得一段时间。您可以简答告诉我重点要注意哪些函数的修改吗

  • 完整的PCIE协议可比我们这个示例代码复杂:) 我们的文档和代码都假设用户已经熟知PCIE协议哦

    不过示例中的一些测试代码如果你不用的话可以不用管,如“PCIE_DSP_core_performance.c”和“PCIE_Edma_Performance.c”

    重点把“KeyStone_PCIE_Init_drv.c”和“PCIE_Intc.c”搞清楚。

    在你理解清楚我们的例程的基础上,你只需要裁剪一些代码和修改一些参数就应该可以实现你的要求。