调用K1STK这个文件夹下的KeyStone的PCIE例程实现两片TMS320C6678进行通信。EP端可以发送中断给RC,要是让RC给EP端发中断,在这个例程基础上如何修改?文档里面只是简单地说了一句RC可以给EP发中断,但是并没有详细的说。还望高人指点。
Shuxin Zhao:
回复 Brighton Feng:
首先。RC如果往EP端的gpPCIE_app_regs->MSI_IRQ这个寄存器里写数据,这个是通过远端访问的吗?还是通过outbound的方式去触发它。这是第一个问题。我看那个EP给RC的中断在STK里面是通过outbound触发的。那我这个RC给EP是直接写?还是通过什么机制给它写。第二个问题是写什么?往这个寄存器里随意写吗?第三个问题是我用不用做这个中断的初始化,还是直接将那个PCIE的一级中断挂到那14个可用中断上,然后修改一下.asm文件里面的内容就可以,还是它的中断是二级中断吗?要用CIC和INTC去转一下吗,谢谢
Shuxin Zhao:
回复 Brighton Feng:
首先。RC如果往EP端的gpPCIE_app_regs->MSI_IRQ这个寄存器里写数据,这个是通过远端访问的吗?还是通过outbound的方式去触发它。这是第一个问题。我看那个EP给RC的中断在STK里面是通过outbound触发的。那我这个RC给EP是直接写?还是通过什么机制给它写。第二个问题是写什么?往这个寄存器里随意写吗?第三个问题是我用不用做这个中断的初始化,还是直接将那个PCIE的一级中断挂到那14个可用中断上,然后修改一下.asm文件里面的内容就可以,还是它的中断是二级中断吗?要用CIC和INTC去转一下吗,谢谢
Brighton Feng:
回复 Shuxin Zhao:
RC如果往EP端的gpPCIE_app_regs->MSI_IRQ这个寄存器里写数据,是通过outbound窗口直接写。可以把RC的一个outbound region映射到EP的BAR0,而gpPCIE_app_regs->MSI_IRQ在EP的BAR0的空间内。
不论是RC还是EP模式,KeyStone一共支持32个MSI中断(参见PCIE user guide 的 Table 2-10 PCIESS Interrupt Events),中断路由的配置也一样。
区别在于,RC往EP写可以是0~31之间的任意值;而EP往RC写时需遵循PCIE协议规定的中断号分配和使用机制。
Shuxin Zhao:
回复 Brighton Feng:
好的我明白了,那也就是我的RC的一个outbound region专门做成发送中断的,在EP端的Inbound时候把BAR0还有BAR0 MASK配置好,使他能收到这个outbound的地址。然后在IB_offset这个寄存器把偏移地址改成是0x21800054,就可以收到RC写来的数据了。在中断服务函数直接置标记位就可以了是吧。那EP端的中断直接把CSL_GEM_PCIEXPRESS_MSI_INTN这个事件挂到4号中断就可以接收到了吧?
Brighton Feng:
回复 Shuxin Zhao:
你的理解基本正确。
不过BAR0的inbound映射是固定的(直接映射到gpPCIE_app_regs),不可配。
所以你在RC端访问寄存器的地址应该是(BAR0 对应的outbound region起始地址)+(MSI_IRQ在gpPCIE_app_regs中的偏移)
Shuxin Zhao:
回复 Brighton Feng:
谢谢,那我可不可以这么理解,BAR0是专门用来传输中断信号的呢,因为PCIE的文档里面说的是BAR0和MSI_IRQ有着关系。那我就认为是BAR0是专门用来接收中断的可以吗?
Shuxin Zhao:
回复 Brighton Feng:
BAR0的Inbound是固定的,那也就是说我在IB_OFFSET这个寄存器里面随便写个地址就可以。他对我BAR0的接收中断不影响。我在RC端配置的outbound region的起始地址只要和我的EP端BAR0的地址对上,然后设置好MASK。RC端只要往你说的那个地址随便写个数就可以了是吧,EP端就会收到我的中断?
Brighton Feng:
回复 Shuxin Zhao:
BAR0是专门用来访问gpPCIE_app_regs的,其中包括MSI_IRQ。
IB_OFFSET和BAR0的inbound映射没有关系,IB_OFFSET是用来设置其它BAR的inbound映射的.
Shuxin Zhao:
回复 Brighton Feng:
那您看我这样配置EP是否可以收到RC的中断。首先RC端outbound的配置是:OB_SZIE = 8M ,OB_OFFSET_INDEX0 = 0X20000001(最后一位是使能region0的),然后EP端的配置是BAR0 = 0X20000000。BAR0的MASK配置成0x7FFFFF。IB_BAR0 = 0,IB_START0_LO = 0X20000000,IB_OFFSET0 = 任意值(这个不影响)。然后EP端中断的初始化直接用的是STK里面的PCIE工程的Keystone_Interrupt_Init()这个,EP端的中断应该也是直接挂到4号中断就可以了吧。也就是CSL_GEM_PCIEXPRESS_MSI_INTN<<CSL_CGEM_INTMUX1_INTSEL4_SHIFT,然后在RC端的位置是我往0X60000000 + (((Uint32)&gpPCIE_app_regs->MSI_IRQ)-(Uint32)gpPCIE_app_regs)这个位置随便写个数字。然后它就会路由到PCIE的地址0x20000054这个位置,然后EP端通过BAR配置好应该就可以接收到了吧。我在中断服务函数里面置标记位,发现标记为没被置上,我这样的配置对不对啊
TI中文支持网
