Пример #1
0
void e_irq_mask(e_irq_type_t irq, e_bool_t state)
{
	unsigned previous;

	previous = e_reg_read(E_REG_IMASK);

	if (state)
		e_reg_write(E_REG_IMASK, previous | (  1<<(irq - E_SYNC)));
	else
		e_reg_write(E_REG_IMASK, previous & (~(1<<(irq - E_SYNC))));

	return;
}
Пример #2
0
//void check(unsigned int *argu, unsigned int time, unsigned int mask0, unsigned int mask1){
void check(e_core_reg_id_t argu, unsigned int time, unsigned int mask0, unsigned int mask1){
	
	unsigned output = 0x0;
	unsigned set0 = 0;
	unsigned set1 = 0;
	unsigned int m0, m1, current, t;
	//unsigned int  _RegAdd;
	e_core_reg_id_t _RegAdd;
	t = time;
	_RegAdd = argu;
	m0 = mask0;
	m1 = mask1;

	//get core id
	e_coreid_t coreid;
	coreid = e_get_coreid();

	//save the current data
	current = e_reg_read(_RegAdd);

	//clear to 0
	e_reg_write(_RegAdd, current & m0);
	output = e_reg_read(_RegAdd);
	if(output != (current & m0)){
		set0 = 1;
		sprintf(outbuf + strlen(outbuf), "Core 0x%03x set Reg %-20s TO 0 FAILED! The current value is 0x%08x! Expecting 0x%08x!\n", 			coreid, reg[t], output, current & m0);
	}

	//set to 1
	e_reg_write(_RegAdd, current | m1);
	output = e_reg_read(_RegAdd);
	if(output != (current | m1)){
		set1 = 1;
		sprintf(outbuf + strlen(outbuf), "Core 0x%03x set Reg %-20s TO 1 FAILED! The current value is 0x%08x! Expecting 0x%08x!\n", 			coreid, reg[t], output, current | m1);
	}

	//clear to 0
	e_reg_write(_RegAdd, current & m0);
	output = e_reg_read(_RegAdd);
	if(output != (current & m0)){
		set0 = 1;
		sprintf(outbuf + strlen(outbuf), "Core 0x%03x set Reg %-20s TO 0 FAILED! The current value is 0x%08x! Expecting 0x%08x!\n", 			coreid, reg[t], output, current & m0);
	}

	if(set1 == 0 & set0 == 0)
		sprintf(outbuf + strlen(outbuf), "Core 0x%03x set Reg %-20s HAS  PASSED!\n", coreid, reg[t]);

	//store the old data
	e_reg_write(_RegAdd, current);

}
Пример #3
0
int main(void) {
	int i;
	int *pt;

	e_irq_attach(E_SW_EXCEPTION, swexception_isr);
	e_irq_attach(E_MEM_FAULT, memfault_isr);
	e_irq_attach(E_TIMER0_INT, timer0_isr);

	e_irq_attach(E_TIMER1_INT, timer1_isr);
	e_irq_attach(E_DMA0_INT, dma0_isr);
	e_irq_attach(E_DMA1_INT, dma1_isr);
	
	e_irq_attach(E_USER_INT, user_isr);

	e_irq_global_mask(E_FALSE);
	e_reg_write(E_REG_IMASK,0x0);

	//reset the target mem
	
	pt = (int *)0x5200;
	for(i=0;i<7;i++)
	{
		pt[i] = 0x0;
	}
	
	while(1) ;

	return EXIT_SUCCESS;
}
Пример #4
0
int main(void) 
{
	unsigned i;
	
	*signal = start;

	//attach the isr handlers
	e_irq_attach(E_SW_EXCEPTION, swexception_isr);
	e_irq_attach(E_MEM_FAULT, memfault_isr);
	e_irq_attach(E_TIMER0_INT, timer0_isr);
	e_irq_attach(E_TIMER1_INT, timer1_isr);
	e_irq_attach(E_DMA0_INT, dma0_isr);
	e_irq_attach(E_DMA1_INT, dma1_isr);
	e_irq_attach(E_USER_INT, user_isr);


	//enable interrupts
	e_irq_global_mask(E_FALSE);
	e_reg_write(E_REG_IMASK,0x0);

	//initialize the target mem
	result = (unsigned *)resultbase;
	for(i=0;i<7;i++)
	{
		result[i] = 0x0;
	}
	
	//wait for the finished signal from master
	while(*signal != finish) ;

	return EXIT_SUCCESS;
}
Пример #5
0
void check_ILAT(unsigned int num){
	unsigned output, current, t;
	unsigned set0 = 0;
	unsigned set1 = 0;
	e_core_reg_id_t _RegAdd;
	t = num;
	_RegAdd = E_REG_ILAT;

	//get core id
	e_coreid_t coreid;
	coreid = e_get_coreid();

	//save the current data
	current = e_reg_read(_RegAdd);

	//clear to 0
	e_reg_write(E_REG_ILATCL, 0xffffffff);
	output = e_reg_read(_RegAdd);
	if(output != 0x0){
		set0 = 1;
		sprintf(outbuf + strlen(outbuf), "Core 0x%03x set Reg %-20s TO 0 FAILED! The current value is 0x%08x! Expecting 0x%08x!\n", 			coreid, reg[t], output, 0x0);
	}

	//set to 1
	e_reg_write(E_REG_ILATST, 0xffffffff);
	output = e_reg_read(_RegAdd);
	if(output != 0xffffffff){
		set1 = 1;
		sprintf(outbuf + strlen(outbuf), "Core 0x%03x set Reg %-20s TO 1 FAILED! The current value is 0x%08x! Expecting 0x%08x!\n", 			coreid, reg[t], output, 0xffffffff);
	}

	//clear to 0
	e_reg_write(E_REG_ILATCL, 0xffffffff);
	output = e_reg_read(_RegAdd);
	if(output != 0x0){
		set0 = 1;
		sprintf(outbuf + strlen(outbuf), "Core 0x%03x set Reg %-20s TO 0 FAILED! The current value is 0x%08x! Expecting 0x%08x!\n", 			coreid, reg[t], output, 0x0);
	}

	if(set1 == 0 & set0 == 0)
		sprintf(outbuf + strlen(outbuf), "Core 0x%03x set Reg %-20s HAS  PASSED!\n", coreid, reg[t]);

	//store the old data
	e_reg_write(_RegAdd, current);
}
Пример #6
0
int main(void)
{
	unsigned k,i,j;
	unsigned *dst, *mst;
	unsigned tran;
	e_dma_desc_t dma_desc;
	tran = 128;

	dst = (unsigned *)0x2000;
	mst = (unsigned *)0x4000;

	e_reg_write(E_REG_DMA0CONFIG, 0);
	e_reg_write(E_REG_DMA1CONFIG, 0);

	// Initialize the buffer in receiver core
	for (i=0; i<tran*5; i++)
	{ 
		dst[i]  = 0x00000000;
	}
	
	mst[0] = 0x00000000;
	
	// Initialize the auto dma register in receiver core
	e_reg_write(E_REG_DMA0AUTODMA0, 0x00000000);

	// Prepare for the descriptor slave dma 
	
	e_dma_set_desc(E_DMA_0,(E_DMA_ENABLE|E_DMA_WORD), 0x0000,
	0x0000, 0x0004,
	0x0400, 0x0001,
	0x0000, 0x0000,
	0x0000,(void *)dst, &dma_desc);
	
	// Wait for the signal to start dma transfering
	
	while(*mst == 0x00000000){};
	
	e_dma_start(&dma_desc, E_DMA_0);
	
	e_dma_wait(E_DMA_0);
	
	return 0;
}
int trace_start_wait_all()
{
	unsigned irqState;
	e_irq_global_mask(E_FALSE);
	e_irq_attach(E_WAND_INT, wand_trace_isr);
	e_irq_mask(E_WAND_INT, E_FALSE);
	__asm__ __volatile__("wand"); // Set our WAND bit
	__asm__ __volatile__("idle"); // Idle and wait for an interrupt
	irqState = e_reg_read(E_REG_STATUS);
	irqState = irqState & (~0x8);  // This is the WAND interrupt flag
	e_reg_write(E_REG_FSTATUS, irqState);
	//e_ctimer_start(E_CTIMER_1, E_CTIMER_CLK); // Start counting
	return 0;
}
Пример #8
0
static void sync(void)
{
	uint32_t irq_state;

	/* enable WAND interrupt */
	e_irq_attach(WAND_BIT, wand_trace_isr);
	e_irq_mask(WAND_BIT, E_FALSE);

	/* WAND + IDLE */
	__asm__ __volatile__("wand");
	__asm__ __volatile__("idle");

	/* acknowledge interrupt */
	irq_state = e_reg_read(E_REG_STATUS);
	irq_state &= ~WAND_BIT;
	e_reg_write(E_REG_STATUS, irq_state);
}
Пример #9
0
unsigned e_ctimer_stop(e_ctimer_id_t timer)
{
// TODO convert to assembly to eliminate 2 function calls.
	unsigned shift;
	unsigned mask;
	unsigned config;
	unsigned count;

	shift = (timer) ? 8:4;
	mask = 0xf << shift;
	config = e_reg_read(E_REG_CONFIG);
	// stop the timer
	e_reg_write(E_REG_CONFIG, config & (~mask));

	count = e_reg_read(timer ? E_REG_CTIMER1 : E_REG_CTIMER0);

	return count;
}
Пример #10
0
int main(void) {
	//initialize
	int i;
	unsigned row, col, delay, num;
	unsigned *ivt;

	e_irq_global_mask(E_FALSE);
	e_irq_attach(E_WAND_INT, wand_isr);
	e_irq_mask(E_WAND_INT, E_FALSE);

	row     = e_group_config.core_row;
	col     = e_group_config.core_col;
	num     = row * e_group_config.group_cols + col;
	pause   = (volatile uint32_t *) (0x7000);
	result  = (volatile unsigned *) (0x8f000000 + 0x4*num);
	delay   = 0x2000 * num + 0x2000;

	if (num == 0)
		*pause = 0;

	*result = 0xdeadbeef;

	for(i=0; i<0x10000; i++)
	{
		*result = i;
		e_wait(E_CTIMER_0, delay);

		if (num == 0)
			while ((*pause));


		__asm__ __volatile__("wand");
		__asm__ __volatile__("idle");

		// clear wand bit
		state = e_reg_read(E_REG_STATUS);
		state = state & (~0x8);
		e_reg_write(E_REG_FSTATUS, state);
	}

	return EXIT_SUCCESS;
}
Пример #11
0
int main(void)
{
	e_coreid_t coreid;
	unsigned int *po;
	unsigned int reg;
	unsigned int p_value;
	unsigned int flag3, flag4, flag5;
	unsigned int temp;		
	unsigned int k;	
	unsigned *pass;
	pass = (unsigned *)7000;
	po= (unsigned *) 0x600c;
	po[0] = 0x00000000;
	global_index = (unsigned *)0x80802000;

	while(1)
	{
		pass[0] = (unsigned)0x00000000;
		while(po[0] == (unsigned) 0x00000000)
		{};
		
		sprintf(outbuf,"");
		// Store the previous value of the register	
		p_value = e_reg_read(*po);
		// Disable interrupts

		e_irq_global_mask(E_TRUE);	

		//For register EILAT
			// Clear the EILAT
			e_reg_write(E_REG_ILATCL, (unsigned)0xffffffff);
			temp = e_reg_read(*po);
			if (temp == (unsigned)0x00000000) 
			{
				flag3=1;
			}
			else
			{
				flag3=0;
				sprintf(outbuf,"We get 0x%08x instead of 0x%08x, ILAT\n", temp, 0x00000000);
				global_index[0] = global_index[0] + 1;
			}
			
			// Set the EILAT
			e_reg_write(E_REG_ILATST, (unsigned)0xffffffff);
			temp = 	e_reg_read(*po);
			if (temp == (unsigned)0x000003ff)
			{
				flag4=1;
			}else
			{
				flag4=0;
				sprintf(outbuf + strlen(outbuf),"We get 0x%08x instead of 0x%08x, ILAT\n", temp, 0x000003ff);
				global_index[0] = global_index[0] + 1;
			}
			
			// Clear the EILAT
			
			e_reg_write(E_REG_ILATCL, (unsigned)0xffffffff);
			temp = e_reg_read(*po);
			if (temp == (unsigned)0x00000000)
			{
				flag5=1;
			}else{
				flag5=0;
				sprintf(outbuf + strlen(outbuf),"We get 0x%08x instead of 0x%08x, ILAT\n", temp, 0x00000000);
				global_index[0] = global_index[0] + 1;
			}
			
			if ((flag3 == 1) && (flag4 == 1) && (flag5 == 1))
			{
				pass[0] = 0xdeadbeef;
			}
			
			// Set the register to the previous value
			e_reg_write(*po, p_value);
			po[0] = (unsigned) 0x00000000;

			// Enable the interrupts
			e_irq_global_mask(E_FALSE);
	}

			return EXIT_SUCCESS;
}
Пример #12
0
int main(void) {
	//initialize
	int *p0, *p1, *p2;
	int core_num, value, fault;
	unsigned conf;
	int i,j,k,co;
//	co = 0;
	fault = 0;

	for(i=0;i<4;i++) 
	{
		for(j=0;j<4;j++) 
		{
			core_num = i * 4 + j;
			//initialize the target mem
			p2  = e_get_global_address(i,j,(void *)target);
			*p2 = 0x0;
			p1  = e_get_global_address(i,j,(void *)E_REG_MULTICAST);
/*			
			switch(core_num)
			{
				case  0: *p1 = _Z; break;
				case  1: *p1 = _X; break;
				case  2: *p1 = _Y; break;
				case  3: *p1 = _Z; break;
				case  4: *p1 = _W; break;
				case  5: *p1 = _Y; break;
				case  6: *p1 = _Z; break;
				case  7: *p1 = _W; break;
				case  8: *p1 = _X; break;
				case  9: *p1 = _Z; break;
				case 10: *p1 = _W; break;
				case 11: *p1 = _X; break;
				case 12: *p1 = _Y; break;
				case 13: *p1 = _W; break;
				case 14: *p1 = _X; break;
				case 15: *p1 = _Y; break;
				default: break; 	
			}
*/			
			switch(core_num)
			{
				case  0: *p1 = _X; break;
				case  1: *p1 = _X; break;
				case  2: *p1 = _Y; break;
				case  3: *p1 = _Y; break;
				case  4: *p1 = _X; break;
				case  5: *p1 = _X; break;
				case  6: *p1 = _Y; break;
				case  7: *p1 = _Y; break;
				case  8: *p1 = _Z; break;
				case  9: *p1 = _Z; break;
				case 10: *p1 = _W; break;
				case 11: *p1 = _W; break;
				case 12: *p1 = _Z; break;
				case 13: *p1 = _Z; break;
				case 14: *p1 = _W; break;
				case 15: *p1 = _W; break;
				default: break; 	
			}
			
		}
	}

	e_wait(E_CTIMER_0, 0x30000);

	//set the transaction mod to multicast
	conf = e_reg_read(E_REG_CONFIG);
	conf = conf & 0xffff0fff;
	conf = conf | 0x00003000;
	e_reg_write(E_REG_CONFIG, conf);	


	//do the multicast
	p0 = (int *) _Xmail;
	*p0 = 0x111;
	
	//wait for some time
//	for(k=0;k<50;k++) {co++;}

	p0 = (int *) _Ymail;
	*p0 = 0x222;

//	for(k=0;k<50;k++) {co++;}

	p0 = (int *) _Zmail;
	*p0 = 0x333;

//	for(k=0;k<50;k++) {co++;}

	p0 = (int *) _Wmail;
	*p0 = 0x444;


	//set the transaction mod to regular transaction
	conf = e_reg_read(E_REG_CONFIG);
	conf = conf & 0xffff0fff;
	e_reg_write(E_REG_CONFIG, conf);	


	e_wait(E_CTIMER_0, 0x30000);

	//check the results
	for(i=0;i<4;i++) 
	{
		for(j=0;j<4;j++) 
		{
			core_num = i * 4 + j;
			//get the target mem address
			p2 = e_get_global_address(i,j,(void *)target);
/*			
			switch(core_num) 
			{	
				case  0: value = _Zvalue; break;
				case  1: value = _Xvalue; break;
				case  2: value = _Yvalue; break;
				case  3: value = _Zvalue; break;
				case  4: value = _Wvalue; break;
				case  5: value = _Yvalue; break;
				case  6: value = _Zvalue; break;
				case  7: value = _Wvalue; break;
				case  8: value = _Xvalue; break;
				case  9: value = _Zvalue; break;
				case 10: value = _Wvalue; break;
				case 11: value = _Xvalue; break;
				case 12: value = _Yvalue; break;
				case 13: value = _Wvalue; break;
				case 14: value = _Xvalue; break;
				case 15: value = _Yvalue; break;
				default: break; 	
			}
*/			
			switch(core_num) 
			{	
				case  0: value = _Xvalue; break;
				case  1: value = _Xvalue; break;
				case  2: value = _Yvalue; break;
				case  3: value = _Yvalue; break;
				case  4: value = _Xvalue; break;
				case  5: value = _Xvalue; break;
				case  6: value = _Yvalue; break;
				case  7: value = _Yvalue; break;
				case  8: value = _Zvalue; break;
				case  9: value = _Zvalue; break;
				case 10: value = _Wvalue; break;
				case 11: value = _Wvalue; break;
				case 12: value = _Zvalue; break;
				case 13: value = _Zvalue; break;
				case 14: value = _Wvalue; break;
				case 15: value = _Wvalue; break;
				default: break; 	
			}
			
			if(*p2 != value)
				fault++;
		}
	}

	//check the final result
	*mailbox = fault;

	return EXIT_SUCCESS;
}
Пример #13
0
int main(void)
{
	unsigned mesh_reg;
	unsigned mesh_reg_modify;
	unsigned time_c, time_p;
	unsigned time;
	unsigned tran,k,i,j,h,m,n,q;
	unsigned *mailbox, *mode;
	unsigned *commander;
	unsigned *counter;
	unsigned *master, *slave, *p;
	unsigned *row, *col;
	unsigned *n_row, *n_col;
	unsigned *neighbour0, *neighbour1, *neighbour2, *neighbour3;
	
	row = (unsigned *)0x5000;
	col = (unsigned *)0x5004;
	n_row = (unsigned *)0x5008;
	n_col = (unsigned *)0x500c;
	master = (unsigned *)0x2000;
	p =(unsigned *) 0x2000;
	slave = (unsigned *) e_get_global_address(*row, *col, p);
	commander = (unsigned *)0x5100;
	p = (unsigned *) 0x5300;
	counter = (unsigned *) e_get_global_address(*row, *col, p);
	mailbox = (unsigned *)0x6000;
	mode = (unsigned *)0x5400;
	tran = 2048;
	
	// Core number 
	k = (e_group_config.core_row)*e_group_config.group_cols + (e_group_config.core_col);
	
	// Broadcast to all the other neighbours
	p = (unsigned *)0x5100;
	e_neighbor_id(E_PREV_CORE, E_ROW_WRAP, n_row, n_col);
	neighbour0 = (unsigned *) e_get_global_address(*n_row, *n_col, p) ;
	
	e_neighbor_id(E_NEXT_CORE, E_ROW_WRAP, n_row, n_col);
	neighbour1 = (unsigned *) e_get_global_address(*n_row, *n_col, p) ;
	
	e_neighbor_id(E_PREV_CORE, E_COL_WRAP, n_row, n_col);
	neighbour2 = (unsigned *) e_get_global_address(*n_row, *n_col, p) ;
	
	e_neighbor_id(E_NEXT_CORE, E_COL_WRAP, n_row, n_col);
	neighbour3 = (unsigned *) e_get_global_address(*n_row, *n_col, p) ;
	
	// Initialize master and slave
	for(i=0; i<tran; i++)
	{
		master[i] = 0xdeadbee9;
		slave[i] = 0x00000000;
	}
	
	while(1)
	{
		//Clear the mode box
		mode[0] = 0xdeadbeef;	

		// Clear the start commander 
		commander[0] = 0x00000000;
		
		// Wait for the mesh event
		while(mode[0] == 0xdeadbeef)
		{};
		
		q = mode[0];
		mesh_reg = e_reg_read(E_REG_MESH_CONFIG);
		mesh_reg_modify = mesh_reg & 0xffffff0f;
		mesh_reg_modify = mesh_reg_modify |mesh_type[1][q]; 
		e_reg_write(E_REG_MESH_CONFIG, mesh_reg_modify);
		
		// Set the ctimer
		e_ctimer_set(E_CTIMER_0, E_CTIMER_MAX) ;		
		
		// Waiting for the signal to start transfering
		while(commander[0] != 0xdeadbeef)
		{};
		
		// Start the ctimer and select the time type
		time_p = e_ctimer_start(E_CTIMER_0, E_CTIMER_MESH_0);
	
		// Broadcast to all the other neighbours
		neighbour0[0] = 0xdeadbeef;
		neighbour1[0] = 0xdeadbeef;
		neighbour2[0] = 0xdeadbeef;
		neighbour3[0] = 0xdeadbeef;
		
		e_dma_copy(slave, master, 0x2000);	
		
		// Wait for transfer finishing
		while(slave[2047] != 0xdeadbee9 )
		{};
		counter[k] = 1;
	
		// Get the time now
		time_c = e_ctimer_get(E_CTIMER_0);
	
		time = time_p - time_c;		
		
		// Output the result
		mailbox[q] = time;
		
		// Load the original value of E_REG_MESH_CONFIG
		e_reg_write(E_REG_MESH_CONFIG, mesh_reg);
	
		// Check if all the mesh events have been through
		if(q == 12)
		{
			break;
		}
	}
	return 0;
}
Пример #14
0
int main(void)
{
    unsigned mesh_reg;
    unsigned mesh_reg_modify;
    unsigned time_c, time_p;
    unsigned time;
    unsigned time_c1, time_p1;
    unsigned time1;
    unsigned i,j,q,m,n,k;
    unsigned *commander;
    unsigned *counter;
    unsigned *mailbox,*mode;
    unsigned *n_row, *n_col;
    unsigned *neighbour0, *neighbour1, *neighbour2, *neighbour3, *p;

    commander = (unsigned *)0x5100;
    counter = (unsigned *)0x5300;
    mailbox = (unsigned *)0x6000;
    mode = (unsigned *)0x5400;
    n_row = (unsigned *)0x5008;
    n_col = (unsigned *)0x500c;
    p = (unsigned *)0x5100;

    // Broadcast to neighbours
    e_neighbor_id(E_PREV_CORE, E_ROW_WRAP, n_row, n_col);
    neighbour0 = (unsigned *) e_get_global_address(*n_row, *n_col, p) ;

    e_neighbor_id(E_NEXT_CORE, E_ROW_WRAP, n_row, n_col);
    neighbour1 = (unsigned *) e_get_global_address(*n_row, *n_col, p) ;

    e_neighbor_id(E_PREV_CORE, E_COL_WRAP, n_row, n_col);
    neighbour2 = (unsigned *) e_get_global_address(*n_row, *n_col, p) ;

    e_neighbor_id(E_NEXT_CORE, E_COL_WRAP, n_row, n_col);
    neighbour3 = (unsigned *) e_get_global_address(*n_row, *n_col, p) ;

    // Get core information
    k = e_group_config.core_row * e_group_config.group_cols + e_group_config.core_col;

    while(1)
    {
        // Clear the counter of finishing transfering
        for(m=0; m<(e_group_config.group_rows*e_group_config.group_cols); m++)
        {
            counter[m] = 0;
        }

        // Initialize the commander and counter
        counter[k] = 1;

        //Clear the mode box
        mode[0] = 0xdeadbeef;

        // Clear the start commander
        commander[0] = 0x00000000;

        // Wait for the mesh event
        while(mode[0] == 0xdeadbeef)
        {};

        q = mode[0];

        mesh_reg = e_reg_read(E_REG_MESH_CONFIG);
        mesh_reg_modify = mesh_reg & 0xffffff0f;
        mesh_reg_modify = mesh_reg_modify |mesh_type[1][q];
        e_reg_write(E_REG_MESH_CONFIG, mesh_reg_modify);

        // Set the ctimer
        e_ctimer_set(E_CTIMER_0, E_CTIMER_MAX) ;

        // Waiting for the signal to start transfering
        while(commander[0] != 0xdeadbeef)
        {};

        // Start the ctimer and select the time type
        time_p = e_ctimer_start(E_CTIMER_0, E_CTIMER_MESH_0);

        // Broadcast to all the other neighbours
        neighbour0[0] = 0xdeadbeef;
        neighbour1[0] = 0xdeadbeef;
        neighbour2[0] = 0xdeadbeef;
        neighbour3[0] = 0xdeadbeef;


        while((counter[0]&counter[1]&counter[2]&counter[3]&counter[4]&counter[5]&counter[6]
                &counter[7]&counter[8]&counter[9]&counter[10]&counter[11]&counter[12]&counter[13]
                &counter[14]&counter[15]) == 0) {};

        time_c = e_ctimer_get(E_CTIMER_0);

        time = time_p - time_c;
        mailbox[(*mode)] = time;

        // Load the original value to E_REG_MESH_CONFIG system register
        e_reg_write(E_REG_MESH_CONFIG, mesh_reg);

        if(mode[0] == 12)
        {
            break;
        }
    }
    return 0;
}