This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AET Trace active issue

Hi  Experts,

I am using the latest ctools lib with my custom keystone2 board to get ETB data on AET interrupt . The related libs I am using are aetlib.l66_elf, dsptrace.c66xx_elf.lib and tietb.c66ak2hxx_c66xx_elf.lib.

My issue is that when DSP core entered the interrupt caused by program range event, I can't get the correct ETB data !

Here is my ETB initialize code for two AET jobs:

TriggerConditionParams = AET_JOBPARAMS;
TriggerConditionParams.programRangeStartAddress = (uint32_t)JIP_ETB_TRIGGER_START_ADDR;
TriggerConditionParams.programRangeEndAddress = (uint32_t)JIP_ETB_TRIGGER_END_ADDR;
TriggerConditionParams.triggerType = AET_TRIG_AINT;     //AET_TRIG_HALT_CPU

/* AET start Trace condition */
StartTraceParams.programAddress = (uint32_t) &StartTraceFunction;
StartTraceParams.traceTriggers = AET_TRACE_TIMING | AET_TRACE_PA;
StartTraceParams.traceActive = AET_TRACE_ACTIVE;

 

 The AET triggered the interrputs when PC pointer entered the specific range as expected. However the etb data read is only 20 words which is much less than 1024 word as expected. I am supposing that the StartTraceFunction does not really activate the etb trace. And the tdf file  generated file has proved this - no useful information at all.

Any suggestions on this ?  Attached file has more detailed information. 

#include "_kernel/jip_config.h"

#if JIP_ETB_SWITCH
#include "jip_DSPTraceExport.h"
#include "jip_ETBInterface.h"
#include "jip_aet.h"


#define ETB_BUFFER_SIZE_IN_DWORD     (1024)

#define BYTE_SWAP32(n) \
	( ((((uint32_t) n) << 24) & 0xFF000000) |	\
	  ((((uint32_t) n) <<  8) & 0x00FF0000) |	\
	  ((((uint32_t) n) >>  8) & 0x0000FF00) |	\
	  ((((uint32_t) n) >> 24) & 0x000000FF) )


//ETBLib variables
static eETB_Error  etbRet;
static ETB_errorCallback pETBErrCallBack =0;
static ETBStatus etbStatus;
static ETBHandle* pETBHandle=0;
static uint32_t etbWidth, retSize=0;


//DSPTraceLib variables
static eDSPTrace_Error dspRet;
static DSPTrace_errorCallback pDSPErrorCallBack=0;
static DSPTraceHandle* pDSPHandle=0;

static uint32_t pBuffer[ETB_BUFFER_SIZE_IN_DWORD];

/* Function Prototypes */


void StartTraceFunction()
{
   volatile int32_t dummy1 =0, dummy2=0;
   dummy1++;

   dummy2 += dummy1 + 20;

   dummy2++;

   return;
}


void dummyFunction()
{
   volatile int32_t dummy1 =0, dummy2=0;
   dummy1++;

   dummy2 += dummy1 + 20;

   dummy2++;

   return;
}


static void getETBData()
{

	dummyFunction();

	/*** Get ETB data ***/


	/* ******************************* IMP. NOTE ****************************/
	/* Setting TEND will terminate Trace gracefully if you don't have an    */
	/* End Trace Job or an End All Trace job.                               */
	/* ******************************* IMP. NOTE ****************************/
	uint32_t traceState = 0;
	uint32_t new_traceState = DSPTRACE_SET_TEND;
	DSPTrace_getState(pDSPHandle, &traceState);
	if ( (traceState & DSPTRACE_STATE_TEND) != DSPTRACE_STATE_TEND ){

		DSPTrace_setState(pDSPHandle, new_traceState);
	}


		/* Now disable trace capture - ETB receiver */
		etbRet = ETB_disable(pETBHandle);
		if(etbRet != eETB_Success)
		{
			while(1);
		}

		/* Disable DSP Trace Export */
		dspRet= DSPTrace_disable(pDSPHandle);
		if(dspRet != eDSPTrace_Success)
		{
			while(1);
		}


	/* Check the ETB status */
	etbRet= ETB_status(pETBHandle, &etbStatus);
	if(etbRet != eETB_Success)
	{
		while(1);
	}

	if(etbStatus.canRead == 1)
	{
		etbRet = ETB_read(pETBHandle, pBuffer, etbStatus.availableWords, 0, etbStatus.availableWords, &retSize);
		if(etbRet != eETB_Success)
		{
			while(1);
		}


#if 0
		/* Transport ETB data */
		/* this example uses JTAG debugger via CIO to transport data to host PC */
		/* An app can deploy any other transport mechanism to move the ETB buffer to the PC */
		FILE* fp = fopen("D:\\programs\\dsp\\base\\CToolsLib\\temp\\DSP_etbdata.bin", "wb");
		if(fp)
		{
			uint32_t sz = 0;
			uint32_t i = 1;
			size_t fret;
			char *le = (char *) &i;

			while(sz < retSize)
			{
				uint32_t etbword = *(pBuffer+sz);
				if(le[0] != 1) //Big endian
					etbword = BYTE_SWAP32(etbword);

				fret = fwrite((void*) &etbword, 4, 1, fp);

				if ( fret < 1 ) {
					jip_general_printf(JIP_LOG_TYPE_CONSOLE,JIP_VERB_ERROR,"Error writing data to  - %s \n", "C:\\temp\\etbdata.bin");
					return;
				}

				sz++;
			}

			fclose(fp);
		}
#endif

	}

	while(1);

}

void jip_init_etb_trigger()
{
	AET_jobParams TriggerConditionParams;
	AET_jobParams StartTraceParams = AET_JOBPARAMS;
	AET_jobParams TriggerWatchDataRangeParams;


	/*Clear AET interrupt flag in TCU_CNTL register*/
	TCU_CNTL = TCU_CNTL | 0x00A00000;
	/*Enable AET interrupt in TCU_CNTL register*/
	if((TCU_CNTL & 0x00020002) != 0x00020002)
	{
		TCU_CNTL = 0x1;
		TCU_CNTL = 0x000A0000;
		TCU_CNTL = 0x00020002;
	}


	/*** Setup ETB receiver ***/
	/* Open ETB module */
	etbRet = ETB_open(pETBErrCallBack, eETB_Circular, DNUM, &pETBHandle, &etbWidth);
	if(etbRet != eETB_Success)
	{
		jip_general_printf(JIP_LOG_TYPE_CONSOLE,JIP_VERB_ERROR,"Error opening ETB\n");
		return;
	}
	/* Enable ETB receiver */
	etbRet = ETB_enable(pETBHandle, 0);
	if(etbRet != eETB_Success)
	{
		jip_general_printf(JIP_LOG_TYPE_CONSOLE,JIP_VERB_ERROR,"Error enabling ETB\n");
		return;
	}



	/*** Setup Trace Export ***/
	/* Open DSP Trace export module */
	dspRet = DSPTrace_open( pDSPErrorCallBack, &pDSPHandle);
	if(dspRet != eDSPTrace_Success)
	{
		jip_general_printf(JIP_LOG_TYPE_CONSOLE,JIP_VERB_ERROR,"Error opening DSP Trace Export block\n");
		return;
	}
	/* Setup trace export clock to FCLK/3 */
	dspRet= DSPTrace_setClock(pDSPHandle, 3);
	if(dspRet != eDSPTrace_Success)
	{
		jip_general_printf(JIP_LOG_TYPE_CONSOLE,JIP_VERB_ERROR,"Error setting up DSP trace export clock\n");
		return;
	}
	dspRet= DSPTrace_enable(pDSPHandle, 0, 0);
	if(dspRet != eDSPTrace_Success)
	{
		jip_general_printf(JIP_LOG_TYPE_CONSOLE,JIP_VERB_ERROR,"Error enabling DSP trace export\n");
		return;
	}


	/*AET Trigger condition*/
	/*
	 * Remember to set BRKEN=2 in Expressions window if you want to halt the cpu
	 * */
	TriggerConditionParams = AET_JOBPARAMS;
	TriggerConditionParams.programRangeStartAddress = (uint32_t)JIP_ETB_TRIGGER_START_ADDR;
	TriggerConditionParams.programRangeEndAddress   = (uint32_t)JIP_ETB_TRIGGER_END_ADDR;
	TriggerConditionParams.triggerType = AET_TRIG_HALT_CPU;//AET_TRIG_AINT;//AET_TRIG_HALT_CPU

    /*Add Watch Data Range params*/
	TriggerWatchDataRangeParams = AET_JOBPARAMS;
	TriggerWatchDataRangeParams.dataStartAddress = JIP_ETB_TRIGGER_DATA_START_ADDR;
	TriggerWatchDataRangeParams.dataEndAddress   = JIP_ETB_TRIGGER_DATA_END_ADDR;
	TriggerWatchDataRangeParams.triggerType = AET_TRIG_HALT_CPU;//AET_TRIG_AINT;
	TriggerWatchDataRangeParams.readWrite = AET_WATCH_WRITE;
	TriggerWatchDataRangeParams.refSize = AET_REF_SIZE_WORD;

    /* AET start Trace condition */
	StartTraceParams.programAddress = (uint32_t) &StartTraceFunction;
	StartTraceParams.traceTriggers = AET_TRACE_TIMING | AET_TRACE_PA;
	StartTraceParams.traceActive = AET_TRACE_ACTIVE;

	/* Initialize AET */
	AET_init();

	/* Claim the AET resource */
	if (AET_claim())
		return;


/* ******************************* IMP. NOTE ****************************/
	    /* DSPTrace_setState will not change the TEND state until after         */
	    /* AET_claim is executed successfully. Must clear TEND if currently set.*/
	/* ******************************* IMP. NOTE ****************************/
	{
		uint32_t traceState = 0;
		uint32_t new_traceState = DSPTRACE_CLR_TEND;
		DSPTrace_getState(pDSPHandle, &traceState);
		if ( (traceState & DSPTRACE_STATE_TEND) == DSPTRACE_STATE_TEND ){

			DSPTrace_setState(pDSPHandle, new_traceState);
		}
		DSPTrace_getState(pDSPHandle, &traceState);
		if ( (traceState & DSPTRACE_STATE_TEND) == DSPTRACE_STATE_TEND )
			jip_general_printf(JIP_LOG_TYPE_CONSOLE,JIP_VERB_ERROR,"TEND detected - BAD\n");
		else
			jip_general_printf(JIP_LOG_TYPE_CONSOLE,JIP_VERB_INFO,"TEND not detected - GOOD\n");
	}


    /*set up the trigger condition*/
	if (AET_setupJob(AET_JOB_TRIG_ON_PC_RANGE, &TriggerConditionParams))
	{
		jip_general_printf(JIP_LOG_TYPE_CONSOLE,JIP_VERB_ERROR,"Error setting up AET trigger resources\n");
		return;
	}

    /*set up the trigger condition of data range*/
	if (AET_setupJob(AET_JOB_TRIG_ON_DATA_RANGE, &TriggerWatchDataRangeParams))
	{
		jip_general_printf(JIP_LOG_TYPE_CONSOLE,JIP_VERB_ERROR,"Error setting up AET trigger resources TriggerWatchDataRangeParams\n");
		return;
	}

	/* Set up the desired start trace job */
	if (AET_setupJob(AET_JOB_START_STOP_TRACE_ON_PC, &StartTraceParams))
	{
		jip_general_printf(JIP_LOG_TYPE_CONSOLE,JIP_VERB_ERROR,"Error setting up AET trace resources\n");
		return;
	}

	jip_general_printf(JIP_LOG_TYPE_CONSOLE,JIP_VERB_INFO,"trigger job index = %d,trace job index = %d\n",TriggerConditionParams.jobIndex,StartTraceParams.jobIndex);

	/* Enable AET */
	if (AET_enable())
		return;
	{
		volatile int i,j;
		for(i = 0;i<1000;i++)
		{
             j++;

		}
	}

	StartTraceFunction();


#if 0

	OtherFunction();
	OtherFunction();
	OtherFunction();

	ETBTriggerFunction();

	/* Clear the job that we've programmed */
	AET_releaseJob(TriggerConditionParams.jobIndex);
	AET_releaseJob(StartTraceParams.jobIndex);

#endif

	return;
}


//AET RTOS interrupt service routine
void jip_AetRtosIsr()
{
    static uint32_t jip_aet_isr_counter = 0;
    jip_aet_isr_counter++;


    Hwi_clearInterrupt(JIP_AET_RTOS_INTR_NUM);
    /*If AET interrupt flag is not cleared, this interrupt will not be generated
	again and again So clear AET interrupt flag in TCU_CNTL register to re-arm the AET interrupt*/
	TCU_CNTL = TCU_CNTL | 0x00A00000;

    if( jip_aet_isr_counter > 0)
    {
	    getETBData();
    }


}


#else

void jip_init_etb_trigger(){}
void jip_AetRtosIsr(){}

#endif

Thanks.