/*
* IPC.c
* 核间通信的函数,包含
* 核间发送中断函数: IPC_IssueIntToCore(uint32_t IntCoreNum,uint32_t SRCSnum)
* 核间中断响应函数:
*
* Created on: 2016-12-13
* Author: xujing
*/
#include <stdlib.h>
#include <math.h>
#include <csl_chip.h>
#include <ti/csl/src/intc/csl_intc.h>
#include <my_common.h>
#include <IPC.h>
extern volatile Uint8 Flag_MutilCore_Sync;
extern Uint8 IPC_Hand;
// BOOT and CONFIG dsp system modules Definitions
#define CHIP_LEVEL_REG 0x02620000
// Boot cfg registers
#define KICK0 *(unsigned int*)(CHIP_LEVEL_REG + 0x0038)
#define KICK1 *(unsigned int*)(CHIP_LEVEL_REG + 0x003C)
#define KICK0_UNLOCK (0x83E70B13)
#define KICK1_UNLOCK (0x95A4F1E0)
#define KICK_LOCK 0
//---------------------------------------------------------------------
//Uint8 CCD1TrackOk,IRTrackOk,CCD2TrackOk,DSPTrackOk;//标记主核接收到哪个核的中断
//Uint8 InterruptFromDSP7;//标记主核接收到DSP7的中断
//---------------------------------------------------------------------
/* IPCGR Info */
int32_t iIPCGRInfo[CORENUM] = {
IPCGR0,
IPCGR1,
IPCGR2,
IPCGR3,
IPCGR4,
IPCGR5,
IPCGR6,
IPCGR7
};
/* IPCAR Info */
int32_t iIPCARInfo[CORENUM] = {
IPCAR0,
IPCAR1,
IPCAR2,
IPCAR3,
IPCAR4,
IPCAR5,
IPCAR6,
IPCAR7
};
//---------------------------------------------------------------------
/********************************************************************************
* 函数: IPC_IssueIntToCore
* 说明: 给指定内核发送IPC中断,进行核间中断通信
* 参数说明:IntCoreNum---要发送给的内核ID(0--7)
* SRCSnum ---对应内核反应的源ID,对应IPCAR寄存器(0--27)
*
* 备注:2016-4-27xujing
********************************************************************************/
void IPC_IssueIntToCore(uint32_t IntCoreNum,uint32_t SRCSnum)
{//给下一个内核发送中断的程序
*(volatile uint32_t *) iIPCGRInfo[IntCoreNum] = (1<<(4+SRCSnum));//source ID识别SRCS0
*(volatile uint32_t *) iIPCGRInfo[IntCoreNum] |= 1;//在相应core产生一个内部中断脉冲
}
/********************************************************************************
* 函数: IPC_ISR
* 说明: 判断IPC中断来自哪一个内核,根据不同内核设置不同标记
* 每一个内核触发DSP0时采用不同的source ID,这样DSP0就可以通过判断应答
* 来判断中断内核来源。
* 只接收DSP1/3/5的回复中断,分别采用ID=SRCS1/SRCS3/SRCS5
* 参数说明:
*
* 备注:2016-4-27xujing
********************************************************************************/
void IPC_ISR()
{//中断服务程序,
uint32_t CoreNum = DNUM;
volatile uint32_t read_ipcgr;
uint32_t mySRCS1;
// Unlock Config
KICK0 = KICK0_UNLOCK;
KICK1 = KICK1_UNLOCK;
read_ipcgr = *(volatile Uint32 *) iIPCGRInfo[CoreNum];//读取应答信息
*(volatile uint32_t *) iIPCARInfo[CoreNum] = read_ipcgr;//清除应答的SRCC及相应的SRCS
// Unlock Config
KICK0 = KICK0_UNLOCK;
KICK1 = KICK1_UNLOCK;
if (IPC_Hand==0)
{
IPC_Hand=1;
}
//判断是哪个SRCC
mySRCS1=(uint32_t)((read_ipcgr>>5)&0x1);
Flag_MutilCore_Sync=(mySRCS1>0)? 1:Flag_MutilCore_Sync;
/* mySRCS1=(uint32_t)((read_ipcgr>>5)&0x1);//取SRCS1
mySRCS3=(uint32_t)((read_ipcgr>>7)&0x1);//取SRCS3
mySRCS5=(uint32_t)((read_ipcgr>>9)&0x1);//取SRCS5
InterruptFromDSP7=(uint32_t)((read_ipcgr>>11)&0x1);//取SRCS7
//设标记
CCD1TrackOk=(mySRCS1>0)? 1: CCD1TrackOk;
IRTrackOk=(mySRCS3>0)? 1: IRTrackOk;
CCD2TrackOk=(mySRCS5>0)? 1: CCD2TrackOk;
DSPTrackOk=1;
*/
}