各位专家,请教一个C66x多核裸跑同时加载问题:
目前使用KE2VM-HK开发板,SOC为662AK12。ARM侧跑在Linux上,DSP上电处于idle状态。ARM侧起一个进程加载8个DSP核的程序,DSP程序都加载至L2上,操作过程如下:
第一步: 下载程序前,设置寄存器如下:
while(PTSTAT(x) != 0);
PDCTL(x) = 1;
// de-assert DSP local reset
MDCTL(y) &= 0xFFFFFFE0;
MDCTL(y) = P_MDCTL_RESETISO_ENABLE | P_MDCTL_LRST_DEASSERT | P_MDCTL_NEXT_ENABLE;
P_PTCMD |= (1<<x);
while(PTSTAT(x) != 0);
第二步:读取程序文件,写入各自DSP的L2中
// 代码略
第三步:下载程序后,设置寄存器如下:
DSP_BOOT_MAGIC(core_no) = dsp_cinit_addr;
while(PTSTAT(x) != 0);
PDCTL(x) = 1;
// de-assert DSP local reset
MDCTL(y) &= 0xFFFFFFE0;
MDCTL(y) = P_MDCTL_RESETISO_ENABLE | P_MDCTL_LRST_DEASSERT | P_MDCTL_NEXT_ENABLE;
P_PTCMD |= (1<<x);
while(PTSTAT(x) != 0);
第四步:设置寄存器给IPC
P_BOOTCFG_KICK0 = 0x83E70B13;
P_BOOTCFG_KICK1 = 0x95A4F1E0;
P_BOOTCFG_DSP_IPCGR0 = 0x11;
P_BOOTCFG_DSP_IPCGR1 = 0x11;
P_BOOTCFG_DSP_IPCGR2 = 0x11;
P_BOOTCFG_DSP_IPCGR3 = 0x11;
P_BOOTCFG_DSP_IPCGR4 = 0x11;
P_BOOTCFG_DSP_IPCGR5 = 0x11;
P_BOOTCFG_DSP_IPCGR6 = 0x11;
P_BOOTCFG_DSP_IPCGR7 = 0x11;
P_BOOTCFG_KICK0 = 0;
P_BOOTCFG_KICK1 = 0;
如上操作后,通过DSP程序往内存写数据验证是否正确跑,结果发现0、2、4、6在跑,1、3、5、7初始化成功,但没有中断响应,ARM侧的操作有没有可能操作方法不对?
烦请各位专家帮忙看下。
Aquarius:
回复 Thomas Yang1:
我尝试过分别触发8个核,测试的结果还是1、3、5、7的数据没有更新,不排除DSP程序本身有问题导致测试不符合预期。我只是想确认下,上述的操作流程是否正确。谢谢!
Aquarius:
回复 Thomas Yang1:
另外,今天再次过了一遍手册,其中有两个寄存器:
BOOTCOMPLETE,在正常跑起来后,该寄存器对应的DSP的位置是否应该都是1;假如不是0是不是意味着DSP没有正常跑起来?
PWRSTATECT中,假如DSP的boot_magic地址是在L2,BIT5~6是否需要设置为11?
xin he2:
Aquarius:
你好,请问你的代码中DSP_BOOT_MAGIC(core_no)的值是多少呢?是0x1X8FFFFC 吗?
Aquarius:
回复 xin he2:
你好!DSP_BOOT_MAGIC地址是0x1X8FFFFC。
xin he2:
回复 Aquarius:
Aquarius:
好的,谢谢。我现在也是让ARM先启动一个OS,然后利用ARM加载DSP可执行程序,但是一旦ARM在uboot启动时加载了skern-keystone-evm.bin固件,DSP程序运行就会不正常。请问有遇到过这种情况吗?另外MDCTL(y)这个指的是哪个寄存器?
Aquarius:
回复 xin he2:
没有遇到你说的这种情况。MDCTL(y)是PSC相关的寄存器,这个文档里有详细说明《KeyStone Architecture Power Sleep Controller (PSC) User's Guide》
Aquarius:
回复 Thomas Yang1:
后来证明是DSP程序有问题导致测试结果不符合预期,目前问题已解决,谢谢!
xin he2:
回复 xin he2:
Aquarius:
请问复位DSP的话需要执行哪些操作呢?方便留一个邮箱吗,以后一起交流。