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.

TMS320F28069: 28035 Custom bootloader

Part Number: TMS320F28069


Hi,

 I am developing custom bootloader for 28035. I have created two different projects, one for bootloader and another for the app. I am able to run both. The bootloader is in sector A, while other sectors are for Flash. Both the application are running from flash.

When I use the debugger, I noticed that bootloader is able to jump to the main app and the main app runs just fine after that. But when I reset the board, I noticed bootloader is executing but the app does not run.

I tried some other way and found that If I use the function pointer to jump to the main app, it works fine. But I don't think it is a right way to do it as it will not rest the stack and all other registers. 

For bootloader, I used the flash kernel example from the controlsuit.

/*******Bootloader Linker**********

PAGE 0:
progRAM : origin = 0x008000, length = 0x001000 /* on-chip RAM (L0-L2)*/
OTP : origin = 0x3D7800, length = 0x000400 /* on-chip OTP */
FLASHH : origin = 0x3E8000, length = 0x004000 /* 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 */
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 : origin = 0x3F7FF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */

SECTIONS
{
/* Allocate program areas: */
codestart : > BEGIN, PAGE = 0
ramfuncs : LOAD = FLASHA,
RUN = progRAM,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
.text : > FLASHA, PAGE = 0
.InitBoot : > FLASHA, PAGE = 0
.cinit : > FLASHA, PAGE = 0
.pinit : > FLASHA, PAGE = 0
.switch : > FLASHA, PAGE = 0
.reset : > FLASHA, PAGE = 0, TYPE = DSECT /* not used, */

csmpasswds : > CSM_PWL PAGE = 0
csm_rsvd : > CSM_RSVD PAGE = 0

/* Allocate uninitalized data sections: */
.stack : > RAMM0, PAGE = 1
.ebss : > dataRAM, PAGE = 1
.esysmem : > dataRAM, PAGE = 1

/*****Main app Linker*************

PAGE 0:
progRAM : origin = 0x008000, length = 0x001000 /* on-chip RAM (L0-L2)*/
OTP : origin = 0x3D7800, length = 0x000400 /* on-chip OTP */
FLASHH : origin = 0x3E8002, length = (0x006000 - 0x2) /* 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 */
CSM_RSVD : origin = 0x3F7F80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */
BEGIN : origin = 0x3E8000, length = 0x000002 /* Part of FLASHA. Used for "boot to Flash" bootloader mode. */
CSM_PWL : 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 */

BOOTROM : 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 :
BOOT_RSVD : origin = 0x000000, length = 0x000050 /* Part of M0, BOOT rom will use this for stack */
RAMM0 : origin = 0x000050, length = 0x0007B0 /* on-chip RAM block M0 */
// RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
dataRAM : origin = 0x009000, length = 0x001000 /* data RAM (L3) */
FLASHB : origin = 0x3F4000, length = 0x002000 /* on-chip FLASH */

CLA_CPU_MSGRAM : origin = 0x001480, length = 0x000080 /* CLA-R/W, CPU-R message RAM */
CPU_CLA_MSGRAM : origin = 0x001500, length = 0x000080 /* CPU-R/W, CLA-R message RAM */
}


SECTIONS
{
/* Allocate program areas: */
.cinit : > FLASHH, PAGE = 0
.pinit : > FLASHH, PAGE = 0
.text : > FLASHH, PAGE = 0

codestart : > BEGIN PAGE = 0
ramfuncs : LOAD = FLASHD,
RUN = progRAM,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0

csmpasswds : > CSM_PWL PAGE = 0
csm_rsvd : > CSM_RSVD PAGE = 0

/* Allocate uninitalized data sections: */
.stack : > RAMM0, PAGE = 1
.ebss : > dataRAM, PAGE = 1
.esysmem : > dataRAM, PAGE = 1

/**************************

In the bootlaoder code,

return SCI_Boot(); does not work wihtout JTAG. 

But  (*((void(*)(void))AppEntryAddr))();  works. 

  • Hello

    When debugging, you see the correct address get put into the RPC when you step through the exitboot routine in exit_boot.asm?
    Function pointer jump is an acceptable method, make sure it is calling into the c_int00 location so the RTS library can get everything initialized.

    Best regards
    Chris
  • Yes , it was stepping through exitboot.asm and it was able jump to the main app but It was not working after power cycle.
    What could be the issue.I am not happy with function pointer as i won't know it would reset the stack call frame after that.

    In my main app, .cinit is in FLASHH and codestart is also defined for FLASHH.

    .cinit : > FLASHH, PAGE = 0
    .pinit : > FLASHH, PAGE = 0
    .text : > FLASHH, PAGE = 0

    BEGIN       : origin = 0x3E8000, length = 0x000002 

    codestart : > BEGIN PAGE = 0

    Does this guaranty that it will go through codestart.asm?

    And I was not able to step through DSP2803x_CodeStartBranch.asm. Is there any way to make sure it goes through DSP2803x_CodeStartBranch.asm?

     

  • Your codestart for your app isn't at the flash entry point (0x3F7FF6) unlike your bootloader.
    So it will go through codestart if you boot to flash which then goes to bootloader and then your bootloader jumps to 0x3E8000 to start your app.
    If you set your app to always start there, you can change the function pointer in bootloader to always use the hard coded address of 0x3E8000 to jump to app.

    Best regards
    Chris
  • Thanks. That's what I have. My main app's codestart is _c_int00 defined by compiler. I am not able to step through _c_int00. So I am worried that will it do proper init?
    I also checked that when my bootloader code is executing , if I return the start address of my app, RPC has correct add in in.Still this method does not work as expected.
  • The source for c_int00 is within the compiler installation directory within CCS. Try (if not already) disabling watchdog before running c_int00
    When the device doesn't boot, is the device resetting? Have you determined where it is ending up?

    Best regards
    Chris
  • Hello

    I haven’t heard from you for 2 weeks, so I’m assuming you were able to resolve your issue. If this isn’t the case, please reject this resolution and reply to this thread. If this thread locks, please click the "Ask a related question" button and in the new thread describe the current status of your issue and any additional details you may have to assist us in helping to solve your issues.

    Best regards
    Chris