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.

TMS320F377D F2837xD_Ipc_Driver_Util.c is buggy

Other Parts Discussed in Thread: CONTROLSUITE

Hello

The code in F2837xD_Ipc_Driver_Util.c 

do
{
bootStatus = IPCGetBootStatus() & 0x0000000F;
} while ((bootStatus != C2_BOOTROM_BOOTSTS_SYSTEM_READY) ||
(bootStatus != C2_BOOTROM_BOOTSTS_C2TOC1_BOOT_CMD_ACK));

it must be  

do
{
bootStatus = IPCGetBootStatus() & 0x0000000F; 
} while ((bootStatus != C2_BOOTROM_BOOTSTS_SYSTEM_READY) &&
(bootStatus != C2_BOOTROM_BOOTSTS_C2TOC1_BOOT_CMD_ACK));

when i change || to && than successufly boot from flash both cores. otherwise CPU1 Stucks in this code.

Regards...

  • Hi Emrah,

    Thanks for pointing out the bug. Please use the attached file to define IPCBootCPU2 function. THe issue will be fixed in the next controlSUITE release.

    Thanks

    Noah

    IPCBootCPU2.txt
    uint16_t 
    IPCBootCPU2(uint32_t ulBootMode)
    {
    	uint32_t bootStatus;
        uint16_t pin;
        uint16_t returnStatus = STATUS_PASS;
        
    	// If CPU2 has already booted, return a fail to let the application 
        // know that something is out of the ordinary.
    
        bootStatus = IPCGetBootStatus() & 0x0000000F;
    
    	if(bootStatus == C2_BOOTROM_BOOTSTS_C2TOC1_BOOT_CMD_ACK)
        {
            returnStatus = STATUS_FAIL;
    		
    		return returnStatus;
        }
    
        // Wait until CPU02 control system boot ROM is ready to receive 
        // CPU01 to CPU02 INT1 interrupts. 
        do
        {
            bootStatus = IPCGetBootStatus() & 0x0000000F;    
        } while ((bootStatus != C2_BOOTROM_BOOTSTS_SYSTEM_READY));
                 
    
        
        // Loop until CPU02 control system IPC flags 1 and 32 are available
        while ((IPCLtoRFlagBusy(IPC_FLAG0) == 1) || 
               (IPCLtoRFlagBusy(IPC_FLAG31) == 1))
        {
    
        }
    
        if (ulBootMode >= C1C2_BROM_BOOTMODE_BOOT_COMMAND_MAX_SUPPORT_VALUE)
        {
            returnStatus = STATUS_FAIL;
        }
        else
        {
            // Based on boot mode, enable pull-ups on peripheral pins and 
            // give GPIO pin control to CPU02 control system.
            switch (ulBootMode)
            {
                case C1C2_BROM_BOOTMODE_BOOT_FROM_SCI:
    
                     EALLOW;
                     //SCIA connected to CPU02
                     DevCfgRegs.CPUSEL5.bit.SCI_A = 1;	
                     //Allows CPU02 bootrom to take control of clock 
                     //configuration registers
                     ClkCfgRegs.CLKSEM.all = 0xA5A50000;	
    
                     ClkCfgRegs.LOSPCP.all = 0x0002;
                     EDIS;
                     
                     GPIO_SetupPinOptions(29, GPIO_OUTPUT, GPIO_ASYNC);
                     GPIO_SetupPinMux(29,GPIO_MUX_CPU2,1);
                     
                     GPIO_SetupPinOptions(28, GPIO_INPUT, GPIO_ASYNC);
                     GPIO_SetupPinMux(28,GPIO_MUX_CPU2,1);
                     
                    break;
    
                case C1C2_BROM_BOOTMODE_BOOT_FROM_SPI:
                     EALLOW;
                     //SPI-A connected to CPU02
                     DevCfgRegs.CPUSEL6.bit.SPI_A = 1;	
                     //Allows CPU02 bootrom to take control of clock configuration registers
                     ClkCfgRegs.CLKSEM.all = 0xA5A50000;
                     EDIS;
                     
                     GPIO_SetupPinOptions(16, GPIO_INPUT, GPIO_ASYNC);
                     GPIO_SetupPinMux(16,GPIO_MUX_CPU2,1);
                     
                     GPIO_SetupPinOptions(17, GPIO_INPUT, GPIO_ASYNC);
                     GPIO_SetupPinMux(17,GPIO_MUX_CPU2,1);
                     
                     GPIO_SetupPinOptions(18, GPIO_INPUT, GPIO_ASYNC);
                     GPIO_SetupPinMux(18,GPIO_MUX_CPU2,1);
                     
                     GPIO_SetupPinOptions(19, GPIO_OUTPUT, GPIO_ASYNC);
                     GPIO_SetupPinMux(19,GPIO_MUX_CPU2,0);          
                     
                    break;
                    
                case C1C2_BROM_BOOTMODE_BOOT_FROM_I2C:
                     EALLOW;
                     //I2CA connected to CPU02
                     DevCfgRegs.CPUSEL7.bit.I2C_A = 1;	
                     //Allows CPU2 bootrom to take control of clock 
                     //configuration registers
                     ClkCfgRegs.CLKSEM.all = 0xA5A50000;	
                     ClkCfgRegs.LOSPCP.all = 0x0002;
                     EDIS;
                     GPIO_SetupPinOptions(32, GPIO_INPUT, GPIO_ASYNC);
                     GPIO_SetupPinMux(32,GPIO_MUX_CPU2,1);
                     
                     GPIO_SetupPinOptions(33, GPIO_INPUT, GPIO_ASYNC);
                     GPIO_SetupPinMux(33,GPIO_MUX_CPU2,1);
                     
                    break;
                case C1C2_BROM_BOOTMODE_BOOT_FROM_PARALLEL:
                     
                     
                     for(pin=58;pin<=65;pin++)
                     {
                        GPIO_SetupPinOptions(pin, GPIO_INPUT, GPIO_ASYNC);
                        GPIO_SetupPinMux(pin,GPIO_MUX_CPU2,0);
                     }
                     
                     GPIO_SetupPinOptions(69, GPIO_OUTPUT, GPIO_ASYNC);
                     GPIO_SetupPinMux(69,GPIO_MUX_CPU2,0);
                     
                     GPIO_SetupPinOptions(70, GPIO_INPUT, GPIO_ASYNC);
                     GPIO_SetupPinMux(70,GPIO_MUX_CPU2,0);             
                     break;
                   
                   
                case C1C2_BROM_BOOTMODE_BOOT_FROM_CAN:
                     //Set up the GPIO mux to bring out CANATX on GPIO71 
                     //and CANARX on GPIO70
                     EALLOW;
                     GpioCtrlRegs.GPCLOCK.all = 0x00000000;	//Unlock GPIOs 64-95
                     GpioCtrlRegs.GPCCSEL1.bit.GPIO71 = GPIO_MUX_CPU2;	//Give CPU2 control just in case
                     GpioCtrlRegs.GPCGMUX1.bit.GPIO71 = 0x1;	//Set the extended mux to 0x5
                     GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 0x1;
                     GpioCtrlRegs.GPCQSEL1.bit.GPIO71 = 0x3;	//Set qualification to async just in case
                     
                     GpioCtrlRegs.GPCLOCK.all = 0x00000000;	//Unlock GPIOs 64-95
                     GpioCtrlRegs.GPCCSEL1.bit.GPIO70 = GPIO_MUX_CPU2;	//Give CPU2 control just in case
                     GpioCtrlRegs.GPCGMUX1.bit.GPIO70 = 0x1;	//Set the extended mux to bring out CANATX
                     GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 0x1;
                     GpioCtrlRegs.GPCQSEL1.bit.GPIO70 = 0x3;	//Set qualification to async just in case
                     GpioCtrlRegs.GPCLOCK.all = 0xFFFFFFFF;	//Lock GPIOs 64-95
                     ClkCfgRegs.CLKSRCCTL2.bit.CANABCLKSEL = 0x0;
                     CpuSysRegs.PCLKCR10.bit.CAN_A = 1;
                     EDIS;   
                   
                   break;
                   
             }
           
            //CPU01 to CPU02 IPC Boot Mode Register
            IpcRegs.IPCBOOTMODE = ulBootMode;
            // CPU01 To CPU02 IPC Command Register
            IpcRegs.IPCSENDCOM  = BROM_IPC_EXECUTE_BOOTMODE_CMD;
            // CPU01 to CPU02 IPC flag register
            IpcRegs.IPCSET.all = 0x80000001;
                   
        }
      
    
    
        return returnStatus;
    }