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.

TMS320F28034: Serial programming with c2prog and security password

Part Number: TMS320F28034
Other Parts Discussed in Thread: UNIFLASH

Hi all,

I’ve a question about serial programming with C2prog and security password.

I’ve a board with a microcontroller TMS320F28034.

After programming the micro with Uniflash Software and locked the device with a password, if I want to reprogram it with C2prog in serial boot mode I must insert the correct password in the configuration, like the below picture:

if I check “Smart sector selection” box, C2prog erase the FlashA sector and also the password, so after reprogram it the microcontroller is not more protected by password.

To maintain the original password I select to erase all the Flash sectors except FlashA. But doing this I receive an error (see below picture):

 

and the programming procedure does not end. I must to click cancel button.

The microcontroller seems to be correctly programmed.

My question is:

Is this a correct way to proceed?

Thanks,

Massimo.

  • Hi Massimo,

    In the executable file that you provided to C2Prog, is there content mapped to Flash A sector as well?

    Thanks and regards,
    Vamsi

  • Hi Vamsi,

    Thanks for the response.

    I attached below my *.cmd file. As you can see I changed the allocation of FLASHA, because I needed more memory (So FlashA became the combination of FLASHH and FLASG). But in the real location of FLASHA (from 0X3F6000 to 0X3F7F80) there is nothing, theoretically.

    C2prog gives me an error at address 0x3F7FF0 of memory, that is a location where it is stored the security password I think “(CSM_RSVD    : origin = 0x3F7F80, length = 0x000076)”

    MEMORY
    {
    PAGE 0:    /* Program Memory */
               /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */
       RAML0       : origin = 0x008000, length = 0x000800     /* on-chip RAM block L0 */
       RAML1       : origin = 0x008800, length = 0x000400     /* on-chip RAM block L1 */
       OTP         : origin = 0x3D7800, length = 0x000400     /* on-chip OTP */
       //FLASHH      : origin = 0x3E8000, length = 0x002000     /* on-chip FLASH */
       //FLASHG      : origin = 0x3EA000, length = 0x002000     /* on-chip FLASH */
       FLASHF      : origin = 0x3EC000, length = 0x002000     /* on-chip FLASH */
       FLASHE      : origin = 0x3EE000, length = 0x002000     /* on-chip FLASH */
       FLASHD      : origin = 0x3F0000, length = 0x002000     /* on-chip FLASH */
       FLASHC      : origin = 0x3F2000, length = 0x002000     /* on-chip FLASH */
       //FLASHA      : origin = 0x3F6000, length = 0x001F80     /* on-chip FLASH */
       FLASHA      : origin = 0x3E8000, length = 0x004000     /* on-chip FLASH */
       CSM_RSVD    : origin = 0x3F7F80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */
       BEGIN       : origin = 0x3F7FF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */
       CSM_PWL_P0  : origin = 0x3F7FF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA */
    
       IQTABLES    : origin = 0x3FE000, length = 0x000B50     /* IQ Math Tables in Boot ROM */
       IQTABLES2   : origin = 0x3FEB50, length = 0x00008C     /* IQ Math Tables in Boot ROM */
       IQTABLES3   : origin = 0x3FEBDC, length = 0x0000AA	  /* IQ Math Tables in Boot ROM */
    
       ROM         : origin = 0x3FF27C, length = 0x000D44     /* Boot ROM */
       RESET       : origin = 0x3FFFC0, length = 0x000002     /* part of boot ROM  */
       VECTORS     : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM  */
    
    PAGE 1 :   /* Data Memory */
               /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */
               /* Registers remain on PAGE1                                                  */
    
       BOOT_RSVD   : origin = 0x000000, length = 0x000050     /* Part of M0, BOOT rom will use this for stack */
       RAMM0       : origin = 0x000050, length = 0x0003B0     /* on-chip RAM block M0 */
       RAMM1       : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
       RAML2       : origin = 0x008C00, length = 0x000400     /* on-chip RAM block L2 */
       RAML3       : origin = 0x009000, length = 0x001000     /* on-chip RAM block L3 */
       FLASHB      : origin = 0x3F4000, length = 0x002000     /* on-chip FLASH */
    
    }
    
    /* Allocate sections to memory blocks.
       Note:
             codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code
                       execution when booting to flash
             ramfuncs  user defined section to store functions that will be copied from Flash into RAM
    */
    
    SECTIONS
    {
    
       /* Allocate program areas: */
       .cinit              : > FLASHA      PAGE = 0
       .pinit              : > FLASHA,     PAGE = 0
       .text               : > FLASHA      PAGE = 0
       codestart           : > BEGIN       PAGE = 0
       ramfuncs            : LOAD = FLASHD,
                             RUN = RAML0,
                             LOAD_START(_RamfuncsLoadStart),
                             LOAD_SIZE(_RamfuncsLoadSize),
                             RUN_START(_RamfuncsRunStart),
                             PAGE = 0
    
       csmpasswds          : > CSM_PWL_P0  PAGE = 0
       csm_rsvd            : > CSM_RSVD    PAGE = 0
    
       /* Allocate uninitalized data sections: */
       .stack              : > RAMM0       PAGE = 1
       //.ebss               : > RAML2       PAGE = 1
       //.esysmem            : > RAML2       PAGE = 1
       .ebss               : > RAML3       PAGE = 1
       .esysmem            : > RAML3       PAGE = 1
    
       /* Initalized sections go in Flash */
       /* For SDFlash to program these, they must be allocated to page 0 */
       .econst             : > FLASHA      PAGE = 0
       .switch             : > FLASHA      PAGE = 0
    
       /* Allocate IQ math areas: */
       IQmath              : > FLASHA      PAGE = 0            /* Math Code */
       IQmathTables        : > IQTABLES,   PAGE = 0, TYPE = NOLOAD
    
      /* Uncomment the section below if calling the IQNexp() or IQexp()
          functions from the IQMath.lib library in order to utilize the
          relevant IQ Math table in Boot ROM (This saves space and Boot ROM
          is 1 wait-state). If this section is not uncommented, IQmathTables2
          will be loaded into other memory (SARAM, Flash, etc.) and will take
          up space, but 0 wait-state is possible.
       */
       /*
       IQmathTables2    : > IQTABLES2, PAGE = 0, TYPE = NOLOAD
       {
    
                  IQmath.lib<IQNexpTable.obj> (IQmathTablesRam)
    
       }
       */
        /* Uncomment the section below if calling the IQNasin() or IQasin()
           functions from the IQMath.lib library in order to utilize the
           relevant IQ Math table in Boot ROM (This saves space and Boot ROM
           is 1 wait-state). If this section is not uncommented, IQmathTables2
           will be loaded into other memory (SARAM, Flash, etc.) and will take
           up space, but 0 wait-state is possible.
        */
        /*
        IQmathTables3    : > IQTABLES3, PAGE = 0, TYPE = NOLOAD
        {
    
                   IQmath.lib<IQNasinTable.obj> (IQmathTablesRam)
    
        }
        */
    
       /* .reset is a standard section used by the compiler.  It contains the */
       /* the address of the start of _c_int00 for C Code.   /*
       /* When using the boot ROM this section and the CPU vector */
       /* table is not needed.  Thus the default type is set here to  */
       /* DSECT  */
       .reset              : > RESET,      PAGE = 0, TYPE = DSECT
       vectors             : > VECTORS     PAGE = 0, TYPE = DSECT
    
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */

     

    Best regards,

    Massimo.

  • Massimo,

    In your linker command file, you have  csmpasswds  : > CSM_PWL_P0  PAGE = 0.

    This means that it will try to reprogram the passwords as well.

    Thanks and regards,

    Vamsi

  • Vamsi,

    sorry but I think I still have something to understand about linker files. So to solve the problem I changed the lines for the password in the following way (adding DSECT):

    csmpasswds : > CSM_PWL_P0 PAGE = 0, TYPE = DSECT
    csm_rsvd : > CSM_RSVD PAGE = 0, TYPE = DSECT

    In C2prog I need always to deselect "Smart sector selection" box and to erase all the Flash sectors except Flash A.

    In this way all works fine.

    Is this corretct?

    Thanks and regards,

    Massimo.

  • Hi Massimo,

    If I remember correctly, the smart sector selection auto-selects the sectors that it has to erase based on the addresses present in the input flash image file.

    If you want to avoid erasing a given sector for any reason even though there is some content mapped to that sector in your flash image, then yes, you need to deselect that box.

    I can get back and confirm.

    Thanks and regards,
    Vamsi

  • Hi Vamsi,

    Thanks! If you can confirm it will be helpful.

    It would be enough for me not to just erase the password sectors if possible.

    Can there be problems if I don't erase the rest of Flash A before reprogramming?

    Regards,

    Massimo.

  • Massimo,

    The feature-wise explanation that I gave is correct.

    However, you need to concentrate on other things that are mapped to the same sector (A) that you are not planning to erase.  You can check the map file to see what other sections are mapped to that sector - and ensure that would not be a problem.  For example, at the flash entry point, you will have a branch to codestart.  If the codestart is mapped to a different location than your previous executable, then the control will branch to an incorrect location if you don't update it in Sector A.

    Why don't you reprogram the passwords as well?

    Thanks and regards,

    Vamsi

  • Hi Massimo, 

    Since I did not hear back from you, I am closing this post assuming that my last reply helped you to close the issue.

    If you still have further questions, you can open a new post as needed.

    Thanks and regards,

    Vamsi