有一个裸核加载DSP程序的问题困扰了几天,麻烦帮忙看下!
这周我写了一个ARM侧加载DSP0代码的程序,K2EVM-HK开发板上电ARM侧跑起来,从/home目录下读取dsp.hex文件,将内容写入到DSP0的L2中(目前所有代码都放置在L2中),然后让DSP0跑起来往MSAM中写一段数据。用仿真器可以看到代码已经写入L2中,但是貌似DSP0没有跑起来。
对DSP的操作如下:
//下载程序前的复位DSP
static void localRestDsp(void)
{
// assert DSP local reset
P_MDCTL15 &= ~ P_MDCTL_LRST_DEASSERT;
P_MDCTL15 &= 0xFFFFFFE0;
P_MDCTL15 |= P_MDCTL_NEXT_SWRSTDISABLE | P_MDCTL_RESETISO_ENABLE;
P_PDCTL8 |= 1;
usleep(10000);
P_PTCMD |= (1 << 8);
usleep(10000);
}
//下载程序后的使能DSP工作,其中dsp_cinit_addr是DSP代码的cinit地址
static void enableDsp(unsigned long dsp_cinit_addr)
{
P_BOOTCFG_KICK0 = 0x83E70B13;
P_BOOTCFG_KICK1 = 0x95A4F1E0;
P_BOOTCFG_DSP_BOOT_ADDR0 = (unsigned long) dsp_cinit_addr;
P_BOOTCFG_KICK0 = 0;
P_BOOTCFG_KICK1 = 0;
// de-assert DSP local reset
P_MDCTL15 = P_MDCTL_RESETISO_ENABLE | P_MDCTL_LRST_DEASSERT | P_MDCTL_NEXT_ENABLE;
P_PDCTL8 = 1;
usleep(10000);
P_PTCMD |= (1 << 8);
}
其中相关宏定义如下:
#define P_PTCMD *(unsigned int *)(ppsc+0x120) //0x02350120
#define P_PDCTL8 *(unsigned int *)(ppsc+0x320) //0x02350320 DSP0
#define P_MDCTL15 *(unsigned int *)(ppsc+0xA3C) //0x0235083C DSP0
#define P_MDCTL_RESETISO_NO 0x0
#define P_MDCTL_RESETISO_ENABLE 0x100
#define P_MDCTL_LRST_ASSERT 0x0
#define P_MDCTL_LRST_DEASSERT 0x10
#define P_MDCTL_NEXT_SWRSTDISABLE 0x0
#define P_MDCTL_NEXT_ENABLE 0x3
#define P_BOOTCFG_KICK0 *(unsigned int *)(pbootCfg+0x38) //0x02620038 // 83E70B13
#define P_BOOTCFG_KICK1 *(unsigned int *)(pbootCfg+0x3C) //0x0262003C // 95A4F1E0
#define P_BOOTCFG_DSP_BOOT_ADDR0 *(unsigned int *)(pbootCfg+0x40) //0x02620040
有以下几个问题:
1. 考虑到以后会有对已经运行的DSP下载程序的操作,我现在的代码是先reset DSP0,然后再enable DSP0,假如想达到这个目的,是否是通过PTCMD、MDCTL、PDCTL进行操作即可?
2. DSP的BOOT地址,是不是填写c_int地址,DSP_BOOT_ADDR0寄存器内容是填写DSP的相对地址,还是整个SOC的绝对地址?
3. 上面ARM侧加载DSP裸核程序的流程是不是有问题,假如有问题正确的流程应该是什么样的,有没有示例参考?
HG:
建议你用示例程序debug一下,ti官网提供了很多demo。
Aquarius:
回复 HG:
可否提供个针对性的例子,我找了些,但没有太针对性的示例,谢谢!