Hi:
大家好, 我使用6670的EDMA实例1做数据搬移,使用的使EDMA通道6,shareregion 3,在使用之前注册了中断,注册的函数如下:
CpIntc_dispatchPlug(ccXferCompInt[edma3Id][tpccRegionUsed],EdmaInst1Test_CB,edma3Id,TRUE);
CpIntc_mapSysIntToHostInt(0, ccXferCompInt[edma3Id][tpccRegionUsed],ccXferHostInt[edma3Id][dsp_num]);
CpIntc_enableHostInt(0, ccXferHostInt[edma3Id][dsp_num]);
eventId = CpIntc_getEventId(ccXferHostInt[edma3Id][dsp_num]);
EventCombiner_dispatchPlug (eventId,CpIntc_dispatchLoc,ccXferHostInt[edma3Id][dsp_num],TRUE);
EventCombiner_enableEvent(eventId);
其中EdmaInst1Test_CB使我自己写的中断回调函数;配置完成EDMA实例1之后,开始搬移,EDMA完成搬移之后,发现EDMA 实例1对应的IER,IPR中都有值,且值为0x00000040,但是中断回调函数EdmaInst1Test_CB没有走到?
请各位大侠帮忙分析一下,这个原因是什么?
我怀疑是CPINTC没有收到EDMA的事件,或者收到了没有输出对应的Host事件,但是不知道该如何去验证这个猜想?请各位高人指点?
谢谢!
Andy Yin1:
1. 可能与你使用shadow region有关,建议你使用global region测试是否能否进入ISR;
2 关于EDMA中断的配置,需要配置CPINTC将system Event与host event映射,还需配置INTC将host event与INT映射. corepac user guide中有INTC相关的中断状态寄存器可以查看确认是否有事件路由到INTC.
中断配置:http://processors.wiki.ti.com/index.php/Configuring_Interrupts_on_Keystone_Devices
分享帖中有相应的PPT接收中断的配置:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/25518.aspx
Jerry Liu1:
回复 Andy Yin1:
谢谢Andy的回答,有两个问题想请教一下:
1 如何配置使用global region?
2 在配置当中,由于TPCC1的system enent号是固定的,shadow region 3是10,映射的主机事件是65,即CpIntc_mapSysIntToHostInt(0, ccXferCompInt[edma3Id][tpccRegionUsed],ccXferHostInt[edma3Id][dsp_num])函数中第二个参数值为10,第三个参数值为65;
eventId = CpIntc_getEventId(ccXferHostInt[edma3Id][dsp_num]),得到的eventId值是23,
后续还有函数EventCombiner_dispatchPlug (eventId,CpIntc_dispatchLoc,ccXferHostInt[edma3Id][dsp_num],TRUE)将23和CpIntc_dispatchLoc函数连接起来,请问23这个事件号的作用是什么,INTC最后产生的和硬件终端结合的事件号使23还是65?
谢谢!
Andy Yin1:
回复 Jerry Liu1:
在EDMA channel open的时候可以指定channel region,如下,请问你的region3是如何指定的?
chAttr.regionNum = CSL_EDMA3_REGION_GLOBAL; chAttr.chaNum = LTEDEMO_puschEdmaChanTable[i].ChIdx; hEdmaCh = CSL_edma3ChannelOpen (<EDEMO_EdmaChnObj[i], instNum, &chAttr, &status);
23是corepac内部中断控制器的事件号,需要配置INTC寄存器MUX将23与内部12个中断矢量表中的一个进行映射。
Jerry Liu1:
回复 Andy Yin1:
region3是在初始化EDMA实例1时指定的,和核号挂钩,核0使用region3,核1使用region4;
我昨天调试的时候发现当EDMA实例1使用DMA channel6完成指定数据搬移时,EDMA的IPR对应位是1;但是CorePac的Event flag register的第65位和第23位都是0;请问这种情况怎么解决?
谢谢!
Andy Yin1:
回复 Jerry Liu1:
首先确定EDMA IER相应bit使能,然后查看CPINTC及INTC的映射寄存器的值确定输入输出中断事件映射关系配置成功。
Jerry Liu1:
回复 Andy Yin1:
谢谢Andy您的回答。EDMA IER相应bit的值已经使能了,查看的使global region的地址;另外请教一下,在什么文档里面可以找到C6670的CPINTC的寄存器的地址?我查看了CIC的文档,里面只有寄存器的offset,没有绝对地址,然后查看了6670的数据手册,没有找到CIC相关的地址映射信息,INTC的寄存器是否使在CorePac中查看?谢谢!
Andy Yin1:
回复 Jerry Liu1:
CIC的基地址在C6670 data manual memory map章节有,CIC0的地址是0x02600000,这些地址在cslr.device.h中都有定义,如下
#define CSL_CP_INTC_0_REGS (0x02600000)#define CSL_CP_INTC_1_REGS (0x02604000)#define CSL_CP_INTC_2_REGS (0x02608000)
csl下有CIC相关的头文件对CIC的寄存器封装成相应的结构体。
INTC的寄存器是在corepac user guide。
Jerry Liu1:
回复 Andy Yin1:
Andy,谢谢您的指导,原来6670 manual memory map 里面的Secondary Interrupt controller就是CIC。