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.

TMS320F28388D: Boot over Message RAM content is not copied from message ram to associated RAM locations

Part Number: TMS320F28388D
Other Parts Discussed in Thread: C2000WARE

Dear TI-Support team,

in my bootloader I like to start the Co-CPUs CPU2 and the CM core with the boot option `IPC Message Copy to RAM Boot`. I thought after a successfull boot I have to read some data at the associated RAM locations.

For CPU2 the code has to be copied to M1-RAM starting at address 0x400 and for CM the code has to be copied to S0-RAM starting at address 0x20000800. I thought after a successfull boot I can read some data of these locations. But unfortunately I just read 0000 at these locations after connecting with the debugger and reading the memory.

CPU2 memory browser content at address 0x400

CM memory browser content at address 0x20000800

This is my Bootupconfiguration:

/// Start Adresses of the Sectors, which must be copied during MSGRAM BOOT Option
/// for CPU2 and CM. Sectors with this start Adress shall not be transfered during
/// the dynamic program load service.
#define MSGRAM_BOOT_SECTOR_CPU2     0x00000400
#define MSGRAM_BOOT_SECTOR_CM       0x20000800

/// IPC BOOTMODE Register values, for booting from ipc msgram copy boot option
/// For more details see sprui0 (tech. ref. guide) kap. 5.7.2.2 `IPCBOOTMODE Details`
#define IPC_BOOTMODE_REG_CONTENT_CPU2   0x5A0AC80C
#define IPC_BOOTMODE_REG_CONTENT_100_CM 0x5A0A640C  //If CM-Core runs on 100 MHz
#define IPC_BOOTMODE_REG_CONTENT_120_CM 0x5A0A780C  //If CM-Core runs on 120 MHz

#pragma DATA_SECTION("MSGRAM_CPU1_TO_CPU2")
volatile UInt16 txMsgramToCPU2[IPC_MSGRAM_SIZE];

#pragma DATA_SECTION("MSGRAM_CPU2_TO_CPU1")
volatile UInt16 rxMsgramFromCPU2[IPC_MSGRAM_SIZE];

#pragma DATA_SECTION("MSGRAM_CPU_TO_CM")
volatile UInt16 txMsgramToCM[IPC_MSGRAM_SIZE];

#pragma DATA_SECTION("MSGRAM_CM_TO_CPU")
volatile UInt16 rxMsgramFromCM[IPC_MSGRAM_SIZE];

if(core == CPU_CPU2)
{
    bootAddress = MSGRAM_BOOT_SECTOR_CPU2;
    bootModeRegContent = IPC_BOOTMODE_REG_CONTENT_CPU2;
    targetCpu = TO_CPU2;
    txMsgram = txMsgramToCPU2;
    archAddrInc = 1;
}
else if(core == CPU_CM)
{
    bootAddress = MSGRAM_BOOT_SECTOR_CM;
    bootModeRegContent = IPC_BOOTMODE_REG_CONTENT_120_CM;
    targetCpu = TO_CM;
    txMsgram = txMsgramToCM;
    archAddrInc = 2;
}

After copying the bootup code to the desired message rams, my boot configuration of the CO-CPUs is this:

pModule->IPC_Boot_Pump_Reg->IPC_BOOTMODE = bootModeRegContent;
pModule->IPC_Flag_Ctr_Reg->IPC_SET = IPC_FLAG0;
if(core == CPU_CPU2)
{
    SysCtl_controlCPU2Reset(SYSCTL_CORE_DEACTIVE);
    while(SysCtl_isCPU2Reset() == true);
}
else
{
    SysCtl_controlCMReset(SYSCTL_CORE_DEACTIVE);
    while(SysCtl_isCMReset() == true);
}
timeStamp = time::getSystemTime100us();
while(pModule->IPC_Flag_Ctr_Reg->IPC_STS & IPC_FLAG0)
{
    //wait till the CORE has acknowledge the configuration
    if((time::getSystemTime100us() - timeStamp) > 5000)
    {
        //DEBUG
        debug::time[targetCpu] = time::getSystemTime100us() - timeStamp;
        debug::targetCpu = targetCpu;
        debug::IPC_BootPumpReg[targetCpu].IPC_BOOTMODE = pModule->IPC_Boot_Pump_Reg->IPC_BOOTMODE;
        debug::IPC_BootPumpReg[targetCpu].IPC_BOOTSTS = pModule->IPC_Boot_Pump_Reg->IPC_BOOTSTS;
        debug::IPC_BootPumpReg[targetCpu].IPC_PUMPREQUEST = pModule->IPC_Boot_Pump_Reg->IPC_PUMPREQUEST;
        debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_ACK = pModule->IPC_Flag_Ctr_Reg->IPC_ACK;
        debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_CLR = pModule->IPC_Flag_Ctr_Reg->IPC_CLR;
        debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_COUNTERH = pModule->IPC_Flag_Ctr_Reg->IPC_COUNTERH;
        debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_COUNTERL = pModule->IPC_Flag_Ctr_Reg->IPC_COUNTERL;
        debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_FLG = pModule->IPC_Flag_Ctr_Reg->IPC_FLG;
        debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_RSVDREG = pModule->IPC_Flag_Ctr_Reg->IPC_RSVDREG;
        debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_SET = pModule->IPC_Flag_Ctr_Reg->IPC_SET;
        debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_STS = pModule->IPC_Flag_Ctr_Reg->IPC_STS;
        //DEBUG
        return PROCESS_TIMEOUT;
    }
}
//DEBUG
debug::time[targetCpu] = time::getSystemTime100us() - timeStamp;
debug::targetCpu = targetCpu;
debug::IPC_BootPumpReg[targetCpu].IPC_BOOTMODE = pModule->IPC_Boot_Pump_Reg->IPC_BOOTMODE;
debug::IPC_BootPumpReg[targetCpu].IPC_BOOTSTS = pModule->IPC_Boot_Pump_Reg->IPC_BOOTSTS;
debug::IPC_BootPumpReg[targetCpu].IPC_PUMPREQUEST = pModule->IPC_Boot_Pump_Reg->IPC_PUMPREQUEST;
debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_ACK = pModule->IPC_Flag_Ctr_Reg->IPC_ACK;
debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_CLR = pModule->IPC_Flag_Ctr_Reg->IPC_CLR;
debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_COUNTERH = pModule->IPC_Flag_Ctr_Reg->IPC_COUNTERH;
debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_COUNTERL = pModule->IPC_Flag_Ctr_Reg->IPC_COUNTERL;
debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_FLG = pModule->IPC_Flag_Ctr_Reg->IPC_FLG;
debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_RSVDREG = pModule->IPC_Flag_Ctr_Reg->IPC_RSVDREG;
debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_SET = pModule->IPC_Flag_Ctr_Reg->IPC_SET;
debug::IPC_Flag_Ctr_Reg[targetCpu].IPC_STS = pModule->IPC_Flag_Ctr_Reg->IPC_STS;
//DEBUG
                return PROCESS_FINISHED;

CPU2 seems to start without problems. The code runs to the return PROCESS_FINISHED state My Debug variables has this content:

ipc::debug::time	unsigned long[2]	[68,5001]	0x0000B37C@Data	
	[0]	unsigned long	68	0x0000B37C@Data

[0]	struct IPC_Boot_Pump_Reg_t	{IPC_BOOTSTS=0x00000000,IPC_BOOTMODE=0x5A0AC80C,IPC_PUMPREQUEST=0x00000000} (Hex)	0x0000B322@Data	
	IPC_BOOTSTS	unsigned long	0x00000000 (Hex)	0x0000B322@Data	
	IPC_BOOTMODE	unsigned long	0x5A0AC80C (Hex)	0x0000B324@Data	
	IPC_PUMPREQUEST	unsigned long	0x00000000 (Hex)	0x0000B326@Data	

[0]	struct IPC_Flag_Ctr_Reg_t	{IPC_ACK=0x00000000,IPC_STS=0x00000000,IPC_SET=0x00000000,IPC_CLR=0x00000000,IPC_FLG=... (Hex)	0x0000B2A2@Data	
	IPC_ACK	unsigned long	0x00000000 (Hex)	0x0000B2A2@Data	
	IPC_STS	unsigned long	0x00000000 (Hex)	0x0000B2A4@Data	
	IPC_SET	unsigned long	0x00000000 (Hex)	0x0000B2A6@Data	
	IPC_CLR	unsigned long	0x00000000 (Hex)	0x0000B2A8@Data	
	IPC_FLG	unsigned long	0x00000001 (Hex)	0x0000B2AA@Data	
	IPC_RSVDREG	unsigned long	0x00000000 (Hex)	0x0000B2AC@Data	
	IPC_COUNTERL	unsigned long	0xE5D488E9 (Hex)	0x0000B2AE@Data	
	IPC_COUNTERH	unsigned long	0x00000072 (Hex)	0x0000B2B0@Data	


The CM Core stucks with IPCBOOTSTS content 0x80801004 (Bit 23 - Had fault occured).

The code runs to the `PROCESS_TIMEOUT` state -> This is the content of my Debug variables

ipc::debug::time	unsigned long[2]	[68,5001]	0x0000B37C@Data	
	[0]	unsigned long	68	0x0000B37C@Data	
	[1]	unsigned long	5001	0x0000B37E@Data	

[1]	struct IPC_Boot_Pump_Reg_t	{IPC_BOOTSTS=0x80801004,IPC_BOOTMODE=0x5A0A780C,IPC_PUMPREQUEST=0x00000000} (Hex)	0x0000B328@Data	
	IPC_BOOTSTS	unsigned long	0x80801004 (Hex)	0x0000B328@Data	
	IPC_BOOTMODE	unsigned long	0x5A0A780C (Hex)	0x0000B32A@Data	
	IPC_PUMPREQUEST	unsigned long	0x00000000 (Hex)	0x0000B32C@Data	

[1]	struct IPC_Flag_Ctr_Reg_t	{IPC_ACK=0x00000000,IPC_STS=0x00000001,IPC_SET=0x00000000,IPC_CLR=0x00000000,IPC_FLG=... (Hex)	0x0000B2B2@Data	
	IPC_ACK	unsigned long	0x00000000 (Hex)	0x0000B2B2@Data	
	IPC_STS	unsigned long	0x00000001 (Hex)	0x0000B2B4@Data	
	IPC_SET	unsigned long	0x00000000 (Hex)	0x0000B2B6@Data	
	IPC_CLR	unsigned long	0x00000000 (Hex)	0x0000B2B8@Data	
	IPC_FLG	unsigned long	0x00000001 (Hex)	0x0000B2BA@Data	
	IPC_RSVDREG	unsigned long	0x00000000 (Hex)	0x0000B2BC@Data	
	IPC_COUNTERL	unsigned long	0x33B8A446 (Hex)	0x0000B2BE@Data	
	IPC_COUNTERH	unsigned long	0x00000071 (Hex)	0x0000B2C0@Data	

In the first place I thought if everything is correct I have to see my code at the RAM locations M!-RAM for CPU2 and S0-RAM for CM. As you see from the screenshots I only read `0000`.

As you can see I perform the boot up procedere as described in Table 5-19 and 5-20 @ tech.- ref guide

I hope you can help me with this. Let me know if you need more information.

Best regards

Christian Peters

  • Can you confirm you have connected to CPU2 core when you looked at the contents from 0x400 ?

    Also can you try to change the contents from memory browser in ccs and update me.

  • Yes I'm connected to the CPU2 Core, when reading the memory browser at Address 0x400. I'am just connected before running the code on cpu1.

    I can modify the RAM content with the debugger.

  • Unfortunately in the C200ware there is no example for this Boot option. Is my approach correct? Why isn't the Code copied to the desired locations?

  • Can you share the log in CCS console when you connect CPU2.

    One possibility could be that gel file reinitializes the RAM to 0 on connect. Just want to confirm that.

  • The Memory will be initialized after connect. But at the moment the CPU1 performs the message ram boot option, the debuger is already connected to CPU2. Anyways here is the log after connecting to CPU2:

    C28xx_CPU2: GEL Output: 
    Memory Map Initialization Complete
    

  • Is theire a working example existent, I can play with to figure out what my problem is?

  • Hello TI Support team,

    is there someone out there who has experience with this Boot Option and can provide me some help?

    As additional Information this is my clock vonfiguration of the CPU-Cores

    #ifdef USE_20MHZ_XTAL
    //-----------------configuration for USE_20MHZ_XTAL BEGIN----------------------
    
    //
    // Define to pass to SysCtl_setClock(). Will configure the clock as follows:
    // PLLSYSCLK = 20 MHz (XTAL_OSC) * 40 (IMULT) / (2 (REFDIV) * 2 (ODIV) * 1 (SYSDIV)) = 200 MHz
    //
    #define DEVICE_SETCLOCK_CFG          (SYSCTL_OSCSRC_XTAL | SYSCTL_IMULT(40) | \
                                          SYSCTL_REFDIV(2) | SYSCTL_ODIV(2) | \
                                          SYSCTL_SYSDIV(1) | SYSCTL_PLL_ENABLE | \
                                          SYSCTL_DCC_BASE_1)
    //
    // Define to pass to SysCtl_setAuxClock(). Will configure the clock as follows:
    // AUXPLLCLK = 20 MHz (XTAL_OSC) * 50 (IMULT) / (2 (REFDIV) * 4 (ODIV) * 1 (AUXPLLDIV) ) = 125 MHz
    //
    #define DEVICE_AUXSETCLOCK_CFG       (SYSCTL_AUXPLL_OSCSRC_XTAL | SYSCTL_AUXPLL_IMULT(50) |  \
                                          SYSCTL_REFDIV(2U) | SYSCTL_ODIV(4U) | \
                                          SYSCTL_AUXPLL_DIV_1 | SYSCTL_AUXPLL_ENABLE | \
                                          SYSCTL_DCC_BASE_0)
    
    //
    // Set up the auxiliary PLL so a 60 MHz output clock is provided to the USB module.
    // This fixed frequency is required for all USB operations.
    // AUXPLLCLKUSB = 20 MHz (XTAL_OSC) * 48 (IMULT) / (2 (REFDIV) * 4 (ODIV) * 2(AUXPLLDIV) ) = 60 MHz
    
    //
    #define DEVICE_AUXSETCLOCK_CFG_USB  (SYSCTL_AUXPLL_OSCSRC_XTAL | SYSCTL_AUXPLL_IMULT(48) | \
                                         SYSCTL_REFDIV(2U) | SYSCTL_ODIV(4U) | \
                                         SYSCTL_AUXPLL_DIV_2 | \
                                         SYSCTL_AUXPLL_ENABLE | \
                                         SYSCTL_DCC_BASE_0)
    
    //-----------------configuration for USE_20MHZ_XTAL END------------------------
    #else
    //-----------------configuration for USE_25MHZ_XTAL BEGIN----------------------
    //
    // Define to pass to SysCtl_setClock(). Will configure the clock as follows:
    // PLLSYSCLK = 25 MHz (XTAL_OSC) * 32 (IMULT) / (2 (REFDIV) * 2 (ODIV) * 1 (SYSDIV)) = 200 MHz
    //
    #define DEVICE_SETCLOCK_CFG          (SYSCTL_OSCSRC_XTAL | SYSCTL_IMULT(32) | \
                                          SYSCTL_REFDIV(2) | SYSCTL_ODIV(2) | \
                                          SYSCTL_SYSDIV(1) | SYSCTL_PLL_ENABLE | \
                                          SYSCTL_DCC_BASE_1)
    //
    // Define to pass to SysCtl_setAuxClock(). Will configure the clock as follows:
    // AUXPLLCLK = 25 MHz (XTAL_OSC) * 40 (IMULT) / (2 (REFDIV) * 4 (ODIV) * 1 (AUXPLLDIV) ) = 125 MHz
    //
    #define DEVICE_AUXSETCLOCK_CFG       (SYSCTL_AUXPLL_OSCSRC_XTAL | SYSCTL_AUXPLL_IMULT(40) | \
                                          SYSCTL_REFDIV(2U) | SYSCTL_ODIV(4U) | \
                                          SYSCTL_AUXPLL_DIV_1 | SYSCTL_AUXPLL_ENABLE | \
                                          SYSCTL_DCC_BASE_0)
    
    //
    // Set up the auxiliary PLL so a 60 MHz output clock is provided to the USB module.
    // This fixed frequency is required for all USB operations.
    // AUXPLLCLKUSB = 25MHz (XTAL_OSC) * 48 (IMULT) / (2 (REFDIV) * 5 (ODIV) * 2 (AUXPLLDIV) ) = 60 MHz
    
    //
    #define DEVICE_AUXSETCLOCK_CFG_USB  (SYSCTL_AUXPLL_OSCSRC_XTAL | SYSCTL_AUXPLL_IMULT(48) | \
                                         SYSCTL_REFDIV(2U) | SYSCTL_ODIV(5U) | \
                                         SYSCTL_AUXPLL_DIV_2 | \
                                         SYSCTL_AUXPLL_ENABLE | \
                                         SYSCTL_DCC_BASE_0)
    //-----------------configuration for USE_25MHZ_XTAL END------------------------
    #endif
    
    
    void initClock(void)
    {
        SysCtl_setClock(DEVICE_SETCLOCK_CFG);
        SysCtl_setAuxClock(DEVICE_AUXSETCLOCK_CFG_USB);
        SysCtl_setCMClk(SYSCTL_CMCLKOUT_DIV_1, SYSCTL_SOURCE_AUXPLL);
    }

    it is called in start up phase of CPU1 core way before setting the boot up configuration for CPU2 and the CM.

  • Since the memory is initialized, you are seeing it as zero's after connect.

    remove gel file for CPU2 and try connecting it or remove the memory init code in gel file and try.

  • But as I told, I am already connected with nothing load on CPU2 Core. I removed the *.gel Files for CPU2 and the CM Core in my ccxml file. I only use the f28388d_cpu1.gel file on CPU1.

    Which steps do I have to make, to be connected with my debugger to all cores and running my application, which boots the CPU2 and CM Core with the "IPC Message Copy to RAM" Boot option?

  • I have an update,

    both cores reply with BOOTSTS = 0x80801004. Here is the content of the ipc pointer structs. Index 0 is the ipc driver struct to cpu2 and  index 1 is the ipc driver struct to cm.

    ipc::ppIpcModule	struct IPC_Instance_t *[2]	[0x0000B40E {IPC_Flag_Ctr_Reg=0x0005CE00 {IPC_ACK=0x00000000,IPC_STS=0x00000001,IPC_SET=...,IPC_SendCmd_Reg=...,... (Hex)	0x0000ADE6@Data	
    	[0]	struct IPC_Instance_t *	0x0000B40E {IPC_Flag_Ctr_Reg=0x0005CE00 {IPC_ACK=0x00000000,IPC_STS=0x00000001,IPC_SET=...,IPC_SendCmd_Reg=... (Hex)	0x0000ADE6@Data	
    		*([0])	struct IPC_Instance_t	{IPC_Flag_Ctr_Reg=0x0005CE00 {IPC_ACK=0x00000000,IPC_STS=0x00000001,IPC_SET=0x00000000,IPC_CLR=...,IPC_SendCmd_Reg=... (Hex)	0x0000B40E@Data	
    			IPC_Flag_Ctr_Reg	struct IPC_Flag_Ctr_Reg_t *	0x0005CE00 {IPC_ACK=0x00000000,IPC_STS=0x00000001,IPC_SET=0x00000000,IPC_CLR=0x00000000,IPC_FLG=... (Hex)	0x0000B40E@Data	
    			IPC_SendCmd_Reg	struct IPC_SendCmd_Reg_t *	0x0005CE10 {IPC_SENDCOM=0x00230001,IPC_SENDADDR=0x00000000,IPC_SENDDATA=0x00000000,IPC_REMOTEREPLY=... (Hex)	0x0000B410@Data	
    			IPC_RecvCmd_Reg	struct IPC_RecvCmd_Reg_t *	0x0005CE18 {IPC_RECVCOM=0xFFFFFFFE,IPC_RECVADDR=0x00000400,IPC_RECVDATA=0x00000000,IPC_LOCALREPLY=... (Hex)	0x0000B412@Data	
    			IPC_Boot_Pump_Reg	struct IPC_Boot_Pump_Reg_t *	0x0005CE20 {IPC_BOOTSTS=0x80801004,IPC_BOOTMODE=0x5A0AC80C,IPC_PUMPREQUEST=0x00000000} (Hex)	0x0000B414@Data	
    				*(IPC_Boot_Pump_Reg)	struct IPC_Boot_Pump_Reg_t	{IPC_BOOTSTS=0x80801004,IPC_BOOTMODE=0x5A0AC80C,IPC_PUMPREQUEST=0x00000000} (Hex)	0x0005CE20@Data	
    					IPC_BOOTSTS	unsigned long	0x80801004 (Hex)	0x0005CE20@Data	
    					IPC_BOOTMODE	unsigned long	0x5A0AC80C (Hex)	0x0005CE22@Data	
    					IPC_PUMPREQUEST	unsigned long	0x00000000 (Hex)	0x0005CE24@Data	
    			IPC_IntNum	unsigned long[8]	[0x0084010D,0x0085010E,0x0086010F,0x00870110,0x00000000...] (Hex)	0x0000B416@Data	
    			IPC_MsgRam_LtoR	unsigned long	0x0003A000 (Hex)	0x0000B426@Data	
    			IPC_MsgRam_RtoL	unsigned long	0x0003B000 (Hex)	0x0000B428@Data	
    			IPC_Offset_Corr	unsigned long	0x00000002 (Hex)	0x0000B42A@Data	
    	[1]	struct IPC_Instance_t *	0x0000B42C {IPC_Flag_Ctr_Reg=0x0005CE40 {IPC_ACK=0x00000000,IPC_STS=0x00000001,IPC_SET=...,IPC_SendCmd_Reg=... (Hex)	0x0000ADE8@Data	
    		*([1])	struct IPC_Instance_t	{IPC_Flag_Ctr_Reg=0x0005CE40 {IPC_ACK=0x00000000,IPC_STS=0x00000001,IPC_SET=0x00000000,IPC_CLR=...,IPC_SendCmd_Reg=... (Hex)	0x0000B42C@Data	
    			IPC_Flag_Ctr_Reg	struct IPC_Flag_Ctr_Reg_t *	0x0005CE40 {IPC_ACK=0x00000000,IPC_STS=0x00000001,IPC_SET=0x00000000,IPC_CLR=0x00000000,IPC_FLG=... (Hex)	0x0000B42C@Data	
    			IPC_SendCmd_Reg	struct IPC_SendCmd_Reg_t *	0x0005CE50 {IPC_SENDCOM=0x00230001,IPC_SENDADDR=0x00000000,IPC_SENDDATA=0x00000000,IPC_REMOTEREPLY=... (Hex)	0x0000B42E@Data	
    			IPC_RecvCmd_Reg	struct IPC_RecvCmd_Reg_t *	0x0005CE58 {IPC_RECVCOM=0xFFFFFFFE,IPC_RECVADDR=0x00000000,IPC_RECVDATA=0x00000000,IPC_LOCALREPLY=... (Hex)	0x0000B430@Data	
    			IPC_Boot_Pump_Reg	struct IPC_Boot_Pump_Reg_t *	0x0005CE60 {IPC_BOOTSTS=0x80801004,IPC_BOOTMODE=0x5A0A780C,IPC_PUMPREQUEST=0x00000000} (Hex)	0x0000B432@Data	
    				*(IPC_Boot_Pump_Reg)	struct IPC_Boot_Pump_Reg_t	{IPC_BOOTSTS=0x80801004,IPC_BOOTMODE=0x5A0A780C,IPC_PUMPREQUEST=0x00000000} (Hex)	0x0005CE60@Data	
    					IPC_BOOTSTS	unsigned long	0x80801004 (Hex)	0x0005CE60@Data	
    					IPC_BOOTMODE	unsigned long	0x5A0A780C (Hex)	0x0005CE62@Data	
    					IPC_PUMPREQUEST	unsigned long	0x00000000 (Hex)	0x0005CE64@Data	
    			IPC_IntNum	unsigned long[8]	[0x00D00B09,0x00D10B0A,0x00D20B0B,0x00D30B0C,0x00D40B0D...] (Hex)	0x0000B434@Data	
    			IPC_MsgRam_LtoR	unsigned long	0x00039000 (Hex)	0x0000B444@Data	
    			IPC_MsgRam_RtoL	unsigned long	0x00038000 (Hex)	0x0000B446@Data	
    			IPC_Offset_Corr	unsigned long	0x00000001 (Hex)	0x0000B448@Data	
    

    Something might not be correct yet. I thought weather or not if there is a runable program in the message ram with this boot option the content should be copied to the desired addresses or am I wrong?

    To make some more things clear here more details to the programs for CPU2 and CM

    Content of the bootup part of the cpu2 map file -> This code is copied to the message ram before performing the "IPC Message Copy to RAM" sequence. I stick to the relevant parts of the map-file the rest is erased

    ******************************************************************************
                 TMS320C2000 Linker PC v20.2.5                     
    ******************************************************************************
    >> Linked Wed Dec  1 07:30:12 2021
    
    OUTPUT FILE NAME:   <dss-bw-msgram.cpu2.out>
    ENTRY POINT SYMBOL: "code_start"  address: 00000400
    
    
    MEMORY CONFIGURATION
    
             name            origin    length      used     unused   attr    fill
    ----------------------  --------  ---------  --------  --------  ----  --------
    PAGE 0:
    .................
    
    PAGE 1:
      ENTRY_POINT           00000400   00000002  00000002  00000000  RWIX
      MSGRAM_BOOT_RSVD      00000402   000003e4  000002a5  0000013f  RWIX
      RAM_DAT               00008000   00000600  0000006a  00000596  RWIX
      RAM_DAT_STACK         00008600   00000200  00000200  00000000  RWIX
      RAM_PROG1             0000c000   00001000  00000df0  00000210  RWIX
    
    
    SECTION ALLOCATION MAP
    
     output                                  attributes/
    section   page    origin      length       input sections
    --------  ----  ----------  ----------   ----------------
    codestart 
    *          1    00000400    00000002     
                      00000400    00000002     f2838x_codestartbranch.asm.obj (codestart)
    
    .cinit     1    00000678    00000030     
                      00000678    0000000d     (.cinit..data.load) [load image, compression = lzss]
                      00000685    0000000d     (.cinit.msgram_data.load) [load image, compression = lzss]
                      00000692    00000006     (__TI_handler_table)
                      00000698    00000004     (.cinit..bss.load) [load image, compression = zero_init]
                      0000069c    0000000c     (__TI_cinit_table)
    
    .init_array 
    *          0    00000402    00000000     UNINITIALIZED
    
    .const     1    00000402    00000038     
                      00000402    00000038     libflash.a : internal_flash.cpp.obj (.const:_ZN5flash10sectorInfoE)
    
    .reset     0    003fffc0    00000000     DSECT
    
    ........
    
    MSGRAM_CPU1_TO_CPU2 
    *          0    0003a000    00000800     UNINITIALIZED
                      0003a000    00000800     libcommunication_driver.a : ipc_driver.cpp.obj (MSGRAM_CPU1_TO_CPU2)
    
    MSGRAM_CPU2_TO_CPU1 
    *          0    0003b000    00000800     UNINITIALIZED
                      0003b000    00000800     libcommunication_driver.a : ipc_driver.cpp.obj (MSGRAM_CPU2_TO_CPU1)
    
    msgram_data 
    *          1    0000043a    00000012     UNINITIALIZED
                      0000043a    00000006     rts2800_fpu64_eabi.lib : exit.c.obj (.data)
                      00000440    00000002                            : _lock.c.obj (.data:_lock)
                      00000442    00000002                            : _lock.c.obj (.data:_unlock)
                      00000444    00000002     libcommon.a : system_control.cpp.obj (.data)
                      00000446    00000004     libcommunication_driver.a : ipc_program_load.cpp.obj (.data)
                      0000044a    00000002     main.cpp.obj (msgram_data)
    
    msgram_boot 
    *          1    0000044c    0000022b     
                      0000044c    00000008     f2838x_codestartbranch.asm.obj (.text)
                      00000454    00000031     rts2800_fpu64_eabi.lib : copy_decompress_lzss.c.obj (.text:decompress:lzss)
                      00000485    0000002b                            : autoinit.c.obj (.text:__TI_auto_init_nobinit_nopinit)
                      000004b0    00000029                            : exit.c.obj (.text)
                      000004d9    0000001d                            : memcpy.c.obj (.text)
                      000004f6    00000019                            : boot28.asm.obj (.text)
                      0000050f    00000019                            : prolog28.asm.obj (.text)
                      00000528    0000000d                            : copy_zero_init.c.obj (.text:decompress:ZI:__TI_zero_init_nomemset)
                      00000535    0000000c                            : args_main.c.obj (.text)
                      00000541    0000000c                            : epilog28.asm.obj (.text)
                      0000054d    00000009                            : _lock.c.obj (.text)
                      00000556    00000008                            : copy_decompress_none.c.obj (.text:decompress:none)
                      0000055e    00000002                            : pre_init.c.obj (.text)
                      00000560    00000001                            : startup.c.obj (.text)
                      00000561    00000078     libcommunication_driver.a : ipc_program_load.cpp.obj (.text:_ZN3ipc15loadDssBwMsgramEv)
                      000005d9    0000000b                               : ipc_program_load.cpp.obj (.text:_ZN3ipc9boot_initEv)
                      000005e4    00000078     libdriverlib.a : ipc.c.obj (.const:IPC_Instance)
                      0000065c    00000011     main.cpp.obj (msgram_boot:_Z15mainProgramLoadv)
                      0000066d    0000000a     main.cpp.obj (msgram_boot:main)
    
    MODULE SUMMARY
    
    ..............   
    
    
    LINKER GENERATED COPY TABLES
    
    __TI_cinit_table @ 0000069c records: 3, size/record: 4, table size: 12
    	.data: load addr=00000678, load size=0000000d bytes, run addr=00008000, run size=00000018 bytes, compression=lzss
    	msgram_data: load addr=00000685, load size=0000000d bytes, run addr=0000043a, run size=00000012 bytes, compression=lzss
    	.bss: load addr=00000698, load size=00000004 bytes, run addr=00008018, run size=00000052 bytes, compression=zero_init
    
    
    LINKER GENERATED HANDLER TABLE
    
    __TI_handler_table @ 00000692 records: 3, size/record: 2, table size: 6
    	index: 0, handler: __TI_zero_init
    	index: 1, handler: __TI_decompress_lzss
    	index: 2, handler: __TI_decompress_none
    
    
    GLOBAL DATA SYMBOLS: SORTED BY DATA PAGE
    
    address     data page           name
    --------    ----------------    ----
    00000402      10 (00000400)     _ZN5flash10sectorInfoE
    0000043a      10 (00000400)     __TI_enable_exit_profile_output
    0000043c      10 (00000400)     __TI_cleanup_ptr
    0000043e      10 (00000400)     __TI_dtors_ptr
    
    00000440      11 (00000440)     _lock
    00000442      11 (00000440)     _unlock
    00000444      11 (00000440)     _ZN6system9progStateE
    00000448      11 (00000440)     _ZN3ipc9ipcModuleE
    0000044a      11 (00000440)     mainHandler
    
    00008016     200 (00008000)     _ZN3ipc11ppIpcModuleE
    00008018     200 (00008000)     _ZN3ipc4taskE
    
    00008048     201 (00008040)     _ZN8sys_info16coreFirmwareInfoE
    00008060     201 (00008040)     Fapi_GlobalInit
    
    00008600     218 (00008600)     __stack
    
    0003a000     e80 (0003a000)     _ZN3ipc16rxMsgramFromCPU1E
    
    0003b000     ec0 (0003b000)     _ZN3ipc14txMsgramToCPU1E
    
    
    GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name
    
    ....................                                                                    
    
    
    GLOBAL SYMBOLS: SORTED BY Symbol Address 
    
    page  address   name                                                                           
    ----  -------   ----                                                                           
    0     0003a000  _ZN3ipc16rxMsgramFromCPU1E                                                     
    0     0003b000  _ZN3ipc14txMsgramToCPU1E                                                       
    1     00000400  code_start                                                                     
    1     00000402  _ZN5flash10sectorInfoE                                                         
    1     0000043a  __TI_enable_exit_profile_output                                                
    1     0000043c  __TI_cleanup_ptr                                                               
    1     0000043e  __TI_dtors_ptr                                                                 
    1     00000440  _lock                                                                          
    1     00000442  _unlock                                                                        
    1     00000444  _ZN6system9progStateE                                                          
    1     00000448  _ZN3ipc9ipcModuleE                                                             
    1     0000044a  mainHandler                                                                    
    1     00000454  __TI_decompress_lzss                                                           
    1     00000485  __TI_auto_init_nobinit_nopinit                                                 
    1     000004b0  C$$EXIT                                                                        
    1     000004b0  abort                                                                          
    1     000004b2  exit                                                                           
    1     000004d9  memcpy                                                                         
    1     000004f6  _c_int00                                                                       
    1     0000050f  _prolog_c28x_1                                                                 
    1     00000513  _prolog_c28x_2                                                                 
    1     0000051b  _prolog_c28x_3                                                                 
    1     00000528  __TI_zero_init_nomemset                                                        
    1     00000535  _args_main                                                                     
    1     00000541  _epilog_c28x_1                                                                 
    1     00000545  _epilog_c28x_2                                                                 
    1     0000054d  _register_unlock                                                               
    1     00000551  _register_lock                                                                 
    1     00000555  _nop                                                                           
    1     00000556  __TI_decompress_none                                                           
    1     0000055e  _system_pre_init                                                               
    1     00000560  _system_post_cinit                                                             
    1     00000561  _ZN3ipc15loadDssBwMsgramEv                                                     
    1     000005d9  _ZN3ipc9boot_initEv                                                            
    1     000005e4  IPC_Instance                                                                   
    1     0000065c  _Z15mainProgramLoadv                                                           
    1     0000066d  main                                                                           
    1     00000692  __TI_Handler_Table_Base                                                        
    1     00000698  __TI_Handler_Table_Limit                                                       
    1     0000069c  __TI_CINIT_Base                                                                
    1     000006a8  __TI_CINIT_Limit                                                               
    
    .......................
    
    abs   00000200  __TI_STACK_SIZE                                                                
    abs   ffffffff  __TI_pprof_out_hndl                                                            
    abs   ffffffff  __TI_prof_data_size                                                            
    abs   ffffffff  __TI_prof_data_start                                                           
    n/a   UNDEFED   __c_args__                                                                     
    
    [100 symbols]
    

    this is the content in the message ram before performing the message ram boot option for cpu2

    0x0003A000	ipc::txMsgramToCPU2
    0x0003A000	0040	044C	0000	0008
    0x0003A004	2000	0000	2000	0008
    0x0003A008	2000	0000	4000	0008
    0x0003A00C	2000	0000	6000	0008
    0x0003A010	2000	0000	8000	0008
    0x0003A014	8000	0000	0000	0009
    0x0003A018	8000	0000	8000	0009
    0x0003A01C	8000	0000	0000	000A
    0x0003A020	8000	0000	8000	000A
    0x0003A024	8000	0000	0000	000B
    0x0003A028	8000	0000	8000	000B
    0x0003A02C	2000	0000	A000	000B
    0x0003A030	2000	0000	C000	000B
    0x0003A034	2000	0000	E000	000B
    0x0003A038	2000	0000	0000	0000
    0x0003A03C	0000	0000	0000	0000
    0x0003A040	0000	0000	0000	0000
    0x0003A044	0000	0000	0000	0000
    0x0003A048	0000	0000	0000	0000
    0x0003A04C	561F	7622	B9C0	2829
    0x0003A050	0068	761A	0040	04F6
    0x0003A054	AABD	2F84	2BAB	6F18
    0x0003A058	A0A9	01A0	1901	1EA7
    0x0003A05C	DE81	5887	0200	DE81
    0x0003A060	1901	7885	0FA6	60FA
    0x0003A064	6F03	9284	9685	92AA
    0x0003A068	FFC0	2FA9	92AB	9C01
    0x0003A06C	27A9	5210	63E7	40AA
    0x0003A070	6DF5	9284	CDA9	000F
    0x0003A074	9D02	FFC3	88A8	58A9
    0x0003A078	5311	6004	06A6	0D84
    0x0003A07C	1EA6	5AA0	76C0	0FFF
    0x0003A080	06A7	0FA2	60D6	86BE
    0x0003A084	0006	B2BD	8F00	0698
    0x0003A088	AABD	A8A9	A2BD	8DC0
    0x0003A08C	0692	0FA3	611C	8F00
    0x0003A090	06A8	8D40	069C	A8A9
    0x0003A094	0FA1	6115	03A1	3B01
    0x0003A098	FF41	1901	86A9	8A81
    0x0003A09C	3B01	9284	5603	01A9
    0x0003A0A0	07A3	83A9	C5C5	8381
    0x0003A0A4	3E67	DA81	0200	1901
    0x0003A0A8	0FA2	60F2	7640	0560
    0x0003A0AC	82BE	86BE	8BBE	0006
    0x0003A0B0	7700	6F00	B2BD	761F
    0x0003A0B4	0010	59A9	923A	610D
    

    After a few moments the content of the message RAM has changed to this:

    0x0003A000	ipc::txMsgramToCPU2
    0x0003A000	FFFF	FFFF	FFFF	FFFF
    0x0003A004	FFFF	FFFF	FFFF	FFFF
    0x0003A008	FFFF	FFFF	FFFF	FFFF
    0x0003A00C	FFFF	FFFF	FFFF	FFFF
    0x0003A010	FFFF	FFFF	FFFF	FFFF
    0x0003A014	FFFF	FFFF	FFFF	FFFF
    0x0003A018	8000	0000	8000	0009
    0x0003A01C	8000	0000	0000	000A
    0x0003A020	8000	0000	8000	000A
    0x0003A024	8000	0000	0000	000B
    0x0003A028	8000	0000	8000	000B
    0x0003A02C	2000	0000	A000	000B
    0x0003A030	2000	0000	C000	000B
    0x0003A034	2000	0000	E000	000B
    0x0003A038	2000	0000	0000	0000
    0x0003A03C	0000	0000	0000	0000
    0x0003A040	0000	0000	0000	0000
    0x0003A044	0000	0000	0000	0000
    0x0003A048	0000	0000	0000	0000
    0x0003A04C	561F	7622	B9C0	2829
    0x0003A050	0068	761A	0040	04F6
    0x0003A054	AABD	2F84	2BAB	6F18
    0x0003A058	A0A9	01A0	1901	1EA7
    0x0003A05C	DE81	5887	0200	DE81
    0x0003A060	1901	7885	0FA6	60FA
    0x0003A064	6F03	9284	9685	92AA
    0x0003A068	FFC0	2FA9	92AB	9C01
    0x0003A06C	27A9	5210	63E7	40AA
    0x0003A070	6DF5	9284	CDA9	000F
    0x0003A074	9D02	FFC3	88A8	58A9
    0x0003A078	5311	6004	06A6	0D84
    0x0003A07C	1EA6	5AA0	76C0	0FFF
    0x0003A080	06A7	0FA2	60D6	86BE
    0x0003A084	0006	B2BD	8F00	0698
    0x0003A088	AABD	A8A9	A2BD	8DC0
    0x0003A08C	0692	0FA3	611C	8F00
    0x0003A090	06A8	8D40	069C	A8A9
    0x0003A094	0FA1	6115	03A1	3B01
    0x0003A098	FF41	1901	86A9	8A81
    0x0003A09C	3B01	9284	5603	01A9
    0x0003A0A0	07A3	83A9	C5C5	8381
    0x0003A0A4	3E67	DA81	0200	1901
    0x0003A0A8	0FA2	60F2	7640	0560
    0x0003A0AC	82BE	86BE	8BBE	0006
    0x0003A0B0	7700	6F00	B2BD	761F
    0x0003A0B4	0010	59A9	923A	610D
    

    I can provide the same information on cm core if needed. I hope this information helps you more to identify my problem.

    Regards

    Mr. Peters

  • Can someone of the TI-Experts help me with this problem?

    Who has experience with this Boot option?

    Is there a working example available?

    I think its only a small step till it would be successfully copied.

  • There are some examples regarding general IPC (not boot specific).

    \ti\c2000\C2000Ware_3_04_00_00\driverlib\f2838x\examples\c28x_dual\ipc

  • Since you are already connected to CPU2 the execution is in paused state. In this case you need to follow the below sequence,

    1. reset CPU2 via debugger

    2. configure IPC via CPU1

    3. run the cpu2 from debugger

    Is this the sequence you are following ?

  • I followed this sequence,

    still nothing is copied. How to perform a Reset of the CPU 2 with debugger? By clicking on the CPU-Reset Icon or pressing "ctrl + shift + R"? Or is there another RESET the debugger should perform?

    This is my sequence I have done:

    1. I was connected to the CPU 1 and CPU 2 Core
    2. CPU2 was on hold (chust did connect to it nothing eles
    3. I performed a CPU-RESET with "ctrl + shift + R" (clicking the CPU-RESET Icon) while the CPU2 Core was selected over the Debug view
    4. I did run the configuration on CPU 1 and let CPU 1 execution haltedafter the IPC_FLAG0 was set by CPU 1
    5. I select the CPU-Core 2 over the Debug view and let the CPU 2 run (Press F8) -> Still reading 0000 on 0x400 and other addresses.

    I still need help. Please please help me !!!!!!!!

    Maybe the problem can be identified, if someone who has experience with this boot option and this processor can take a look on my solution in an online session?

  • Thanks to Mr. and ,

    we could solve the problem. The Message RAM start adreses where wrong. I have to change the start addresses to there specific M1 RAMs as described in Tech. Ref. Guide.

    5.7.7.1.6 IPC Message Copy to RAM Boot
    IPC message copy to RAM involves copying application code from CPU1 IPC message RAM 1 to CPU2/CM
    destination RAM for execution. The maximum copy length size is 1000 words (2000 bytes) and the minimum is
    100 words (200 bytes). Refer to
    Table 5-45 for details regarding configuration and execution flow of this boot
    mode.

    CM to CPUx MSGRAM0 1K x 16 0x0003 8000 0x0003 83FF Yes Parity Yes Yes
    CM to CPUx MSGRAM1 1K x 16 0x0003 8400 0x0003 87FF Yes Parity Yes
    CPUx to CM MSGRAM0 1K x 16 0x0003 9000 0x0003 93FF Yes Parity Yes

    Yes

    CPUx to CM MSGRAM1 1K x 16 0x0003 9400 0x0003 97FF Yes Parity Yes
    CPU1 to CPU2 MSGRAM0 1K x 16 0x0003 A000 0x0003 A3FF Yes Parity Yes Yes
    CPU1 to CPU2 MSGRAM1 1K x 16 0x0003 A400 0x0003 A7FF Yes Parity Yes
    CPU2 to CPU1 MSGRAM0 1K x 16 0x0003 B000 0x0003 B3FF Yes Parity Yes Yes
    CPU2 to CPU1 MSGRAM1 1K x 16 0x0003 B400 0x0003 B7FF Yes Parity Yes

    The correct Message RAM start adresses are the following:

    • for CPU2 it is: CPU1_to_CPU2_MSGRAM1 at address 0x3A400
    • for CM it is: CPU1_to_CM_MSGRAM1 at address 0x39400

    Kind regards

    Christian Peters