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.

AM6421: M4F core isolation

Part Number: AM6421

Hi,

I'm using TMDS64GPEVM. I know that we can do a core reset isolation in M4F. I have gone through TRM also and I got few details of enabling it.

But I don't know where to configure this. Could you provide me, how to do a core reset isolation for M4F core?

Any application note or examples for this?

Thanks in advance

  • Hi,

    Do you use Processor SDK Linux or MUC+ SDK on AM6421?

  • MCU+SDK on AM6421

  • Hi,

    I am routing your query to the MCU+ SDK team for comments.

  • Hi,

    Have you tried by writing a non-zero value to this CTRLMMR_RST_MAGIC_WORD Register? You can either add register write snippet in code or write via CCS memory browser.

    *(volatile uint32_t) 0x0451817C = 0x1;

    Regards,

    Prasad

  • Hi,

    Just realized that this register is protected register and needs control module unlock. Please follow below modified steps -

    1. Run CTRL_Unlock(unsigned int addr) gel function. If dont want to use CCS, you can copy unlock code from (C:\ti\ccs1040\ccs\ccs_base\emulation\gel\AM64x\AM64_common\AM64_common.gel) into your application.

    2. Write 1 to register.

    Pasting gel function here for reference -

    CTRL_Unlock(unsigned int addr)
    {
    	int offset,base,partition,unlock_flag;
    	unsigned int debug_info = 1;
    	
    	//Determine which partition the address offset is 
    	
    	base = 0xFFFE0000 & addr;   //get address base
    	offset = 0x1FFFF & addr;  //get offset
    	
    	
    	//get partition
    	partition = offset >> 14;
    	
    	if(debug_info) {
    	    GEL_TextOut("base = %x\n",,,,,base);
    		GEL_TextOut("offset = %x\n",,,,,offset);
    		GEL_TextOut("partition = %x\n",,,,,partition);
    	}
    	if(partition==0)
    	{
    		Write_MMR(base+LOCK0_KICK0_OFFSET, KICK0_UNLOCK_VAL);
    		Write_MMR(base+LOCK0_KICK1_OFFSET, KICK1_UNLOCK_VAL);
    		unlock_flag = Read_MMR(base+LOCK0_KICK0_OFFSET) & 0x1;
    	}		
    	else if (partition==1)
    	{
    		Write_MMR(base+LOCK1_KICK0_OFFSET, KICK0_UNLOCK_VAL);
    		Write_MMR(base+LOCK1_KICK1_OFFSET, KICK1_UNLOCK_VAL);
    		unlock_flag = Read_MMR(base+LOCK1_KICK0_OFFSET) & 0x1;
    	}
    	else if (partition==2)
    	{
    		Write_MMR(base+LOCK2_KICK0_OFFSET, KICK0_UNLOCK_VAL);
    		Write_MMR(base+LOCK2_KICK1_OFFSET, KICK1_UNLOCK_VAL);
    		unlock_flag = Read_MMR(base+LOCK2_KICK0_OFFSET) & 0x1;
    	}	
    	else if (partition==3)
    	{
    		Write_MMR(base+LOCK3_KICK0_OFFSET, KICK0_UNLOCK_VAL);
    		Write_MMR(base+LOCK3_KICK1_OFFSET, KICK1_UNLOCK_VAL);
    		unlock_flag = Read_MMR(base+LOCK3_KICK0_OFFSET) & 0x1;
    	}	
    	else if (partition==5)
    	{
    		Write_MMR(base+LOCK5_KICK0_OFFSET, KICK0_UNLOCK_VAL);
    		Write_MMR(base+LOCK5_KICK1_OFFSET, KICK1_UNLOCK_VAL);
    		unlock_flag = Read_MMR(base+LOCK5_KICK0_OFFSET) & 0x1;
    	}
    	else if (partition==6)
    	{
    		Write_MMR(base+LOCK6_KICK0_OFFSET, KICK0_UNLOCK_VAL);
    		Write_MMR(base+LOCK6_KICK1_OFFSET, KICK1_UNLOCK_VAL);
    		unlock_flag = Read_MMR(base+LOCK6_KICK0_OFFSET) & 0x1;
    	}	
    	else
    	{
    		GEL_TextOut("Invalid CTRLMMR Partition\n");
    	}	
    	
    	//Check for unlock
    	if(debug_info){
    		if(unlock_flag == 1)
    			GEL_TextOut("CTRLMMR Partition successfully unlocked!\n");
    		else
    			GEL_TextOut("Error: CTRLMMR Partition did not unlock!\n");
    	}
    }
    

    Regards,

    Prasad

  • Hi,

    Hope above suggestion helps you. Let me know if any further questions. 

    Regards,

    Prasad