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.

CC1352R: Customizing bootloader

Part Number: CC1352R

Hi,

A customer wanted to implement a customizing bootloader,which was used to update flash image. But if any interrupt was included,like UART/TIMER,the jumpToPrgEntry(0) function could not jump to the APP and device got crashed.  He put the bootloader in the last few pages in flash and app at 0x00, add #define SET_CCFG_IMAGE_VALID_CONF_IMAGE_VALID 0x50000 in bootloader.Please check the following configuration[icf of bootloader]:

////////////////////////////////////////////////////////////////////////////////
// Memory Sizes
////////////////////////////////////////////////////////////////////////////////
define symbol FLASH_BASE            = 0x00000000;
define symbol RAM_BASE              = 0x20000000;
define symbol ROM_BASE              = 0x10000000;
if ( isdefinedsymbol(CC2650) )
{
  define symbol RAM_SIZE            = 0x00005000; // 20K
  define symbol FLASH_SIZE          = 0x00020000; // 128K
  define symbol ROM_SIZE            = 0x0001C000; // 115K
}
else if ( isdefinedsymbol(CC2642) )
{
  define symbol RAM_SIZE            = 0x00014000; // 80K
  define symbol FLASH_SIZE          = 0x00058000; // 352K
  define symbol ROM_SIZE            = 0x00040000; // 256K
}
////////////////////////////////////////////////////////////////////////////////
// Memory Definitions
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// RAM
//
//define symbol RESERVED_RAM_SIZE = 0x00000EB3;
define symbol RESERVED_RAM_SIZE = 0x00000ED4;
define symbol RAM_START         = RAM_BASE + 0x0000012C + RESERVED_RAM_SIZE; // PG 2.0 & PG2.1 Agama RAM_START
define symbol RAM_END           = RAM_BASE+RAM_SIZE-1;
////////////////////////////////////////////////////////////////////////////////
// Flash
//
define symbol WORD_SIZE             = 4;
if ( isdefinedsymbol(CC2650) )
{
  define symbol PAGE_SIZE           = 0x1000;
}
else if ( isdefinedsymbol(CC2642) )
{
  define symbol PAGE_SIZE           = 0x2000;
}
export symbol PAGE_SIZE;
if (isdefinedsymbol(PAGE_ALIGN))
{
  define symbol FLASH_MEM_ALIGN     = PAGE_SIZE;
}
else
{
  define symbol FLASH_MEM_ALIGN     = WORD_SIZE;
}
define symbol FLASH_START           = FLASH_BASE;
if ( isdefinedsymbol(CC2650) )
{
  define symbol PAGE_MASK           = 0xFFFFF000;
}
else if ( isdefinedsymbol(CC2642) )
{
  define symbol PAGE_MASK           = 0xFFFFE000;
}
// BIM is allocated at flash sector.
if ( isdefinedsymbol(CC2650) )
{
define symbol FLASH_PAGE_BIMSTART   = 0x50000;//FLASH_BASE + FLASH_SIZE - PAGE_SIZE;
define symbol FLASH_PAGE_BIMEND     = FLASH_BASE + FLASH_SIZE; //0x0001FFFF;
}
else
{
  define symbol FLASH_PAGE_BIMSTART   = 0x50000;//FLASH_BASE + FLASH_SIZE - PAGE_SIZE;
  define symbol FLASH_PAGE_BIMEND     = FLASH_BASE + FLASH_SIZE; //0x0001FFFF;
}
// leaving 4 bytes of buffer between CCFG and veify function pointer
define symbol FLASH_FNPTR_START    = 0x00057fa0;
define symbol FLASH_FNPTR_END      = 0x00057fa3;
//storing cert element in fixed flash region,
//length of region is size of cert_element_t
define symbol CERT_END             = FLASH_FNPTR_START - 1;
define symbol CERT_SIZE            = 0x4C;        // For version 1 ECDSA-P256
define symbol CERT_START           = CERT_END - CERT_SIZE + 1;
////////////////////////////////////////////////////////////////////////////////
// Stack
//
define symbol STACK_SIZE           = 0x400;
define symbol STACK_START          = RAM_END;
define symbol STACK_END            = STACK_START - STACK_SIZE;
define block CSTACK with alignment = 8, size = STACK_SIZE { section .stack };
define symbol STACK_TOP            = RAM_END + 1;
export symbol STACK_TOP;
////////////////////////////////////////////////////////////////////////////////
// Flash Interrupt Vector Table
//
define symbol INTVEC_NUM_ENTRIES   = 50 + 1; // first entry is stack location
define symbol INTVEC_SIZE          = INTVEC_NUM_ENTRIES + 4;
////////////////////////////////////////////////////////////////////////////////
// Memory Regions
////////////////////////////////////////////////////////////////////////////////
define memory mem with size = 4G;
define region RAM                  = mem:[from RAM_START to RAM_END];
define region BIM                  = mem:[from FLASH_PAGE_BIMSTART
                                       to   FLASH_PAGE_BIMEND];
define region FLASH_FN_PTR         = mem:[from FLASH_FNPTR_START
                                       to   FLASH_FNPTR_END];
           
define region CERT_ELEMENT         = mem:[from CERT_START
                                          to CERT_END];
////////////////////////////////////////////////////////////////////////////////
// Memory Placement
////////////////////////////////////////////////////////////////////////////////
// Function pointer table address
place at start of FLASH_FN_PTR   { readonly section .fnPtr };
keep                             { readonly section .fnPtr };
define block CERT                { ro section .cert_element};
keep                             { ro section .cert_element};
place at start of CERT_ELEMENT   { block CERT};
// Interrupt Vector Table
place at address mem:FLASH_PAGE_BIMSTART { readonly section .intvec_boot };
//keep                                     { readonly section .intvec_boot };
// CCFG
place at end of BIM                    { readonly section .ccfg   };
keep                                   { section .ccfg            };
// RAM Vector Table
place at start of RAM                  { section .vtable_ram      };

define block RWDATA { rw };
define section .heap_start            { public heapStart: };
define section .heap_end              { public heapEnd: };
define block   HEAP_END with size = 1 { section .heap_end };
define block END_OF_RAM with fixed order {
                                        block HEAP_END,
                                        block CSTACK
                                      };
place at end of RAM { block END_OF_RAM };
place in RAM { block RWDATA,
               last section .heap_start};
// Stack
//place at end of RAM                    { block CSTACK             };
/* Primary Heap configuration */
//define symbol HEAPSIZE = 2048;
//define block HEAP with alignment = 8, size = HEAPSIZE { };
/* Place heap just before CSTACK */
//place in RAM { block HEAP };
//place in RAM                           { readwrite                };
place in BIM                           { readonly                 };

////////////////////////////////////////////////////////////////////////////////
// Initialization
////////////////////////////////////////////////////////////////////////////////
initialize by copy  { readwrite };
do not initialize
{
  section .noinit,
  section .stack,
};
在app的icf:

/* Intvec start */
define symbol FLASH_BASE__ = 0x00000000;
define symbol WORD_SIZE           = 4;
define symbol FLASH_MEM_ALIGN     = WORD_SIZE;
if (!isdefinedsymbol(NVOCMP_NVPAGES)) {
  define symbol NVOCMP_NVPAGES  = 2;
}
/* Memory Regions*/
//define symbol FLASH_SIZE          = 0x00058000; // 352K
//define symbol PAGE_SIZE           = 0x2000;
define symbol FLASH_LAST_base__     = 0x0004C000;//0x0004C000;//(FLASH_SIZE-(PAGE_SIZE*6));// boot
define symbol FLASH_LAST_size__    = 0x00002000;
define symbol FLASH_CCFG_BASE     = 0x00057FA8;
define symbol FLASH_CCFG_SIZE     = 0x00000058;
define symbol FLASH_NV_base__ = (0x4C000 - (NVOCMP_NVPAGES * 0x2000)); // NV Flash base
define symbol FLASH_NV_size__ = (NVOCMP_NVPAGES * 0x2000);
define symbol FLASH_SIZE__    = (0x4C000 - (NVOCMP_NVPAGES * 0x2000));

define symbol RAM_base__           = 0x20000000;
define symbol RAM_size__           = 0x14000;
/* Define a memory region that covers the entire 4 GB addressable space */
define memory mem with size = 4G;
/* Define a region for the on-chip flash */
define region FLASH_region = mem:[from FLASH_BASE__ size FLASH_SIZE__];
/* Define a region for the on-chip flash used for NV storage */
define region FLASH_NV_region = mem:[from FLASH_NV_base__ size FLASH_NV_size__];
/* Define a region for the last flash page */
define region FLASH_last_region__ = mem:[from FLASH_LAST_base__ size FLASH_LAST_size__];
//define a region for ccfg flash
define region FLASH_ccfg_region__ = mem:[from FLASH_CCFG_BASE size FLASH_CCFG_SIZE];
/* Internal RAM for data used by application */
define region RAM_region = mem:[from RAM_base__ size RAM_size__];
/* Place the interrupt vectors at the start of flash */
place at address mem:FLASH_BASE__ { readonly section .intvec };
keep { section .intvec};

/* Place the CCA area at the end of flash */
//place at end of FLASH_last_region__ { readonly section .ccfg };
//place at end of FLASH_ccfg_region__ { readonly section .ccfg };
//keep { section .ccfg };
"AGAMA_CCFG_AREA":
place noload in FLASH_ccfg_region__ { readonly section .ccfg };
place in FLASH_last_region__ { section .text object nvoctp.o  };
place in FLASH_last_region__ { section .text object macTask.o };
place in FLASH_last_region__ { section .text object api_mac.o };
place in FLASH_last_region__ { section .text object osal_port.o };
place in FLASH_last_region__ { section .text object saddr.o };
place in FLASH_region { section .text };
place in FLASH_region { readonly section .const object mac_user_config.o };
place in FLASH_region {
 section .const,
 section .constdata,
 section .rodata,
 section .cinit,
 section .pinit,
 section .init_array,
 section .emb_text
};
/* Place remaining 'read only' in Flash */
place in FLASH_region { readonly };
/* Mark the beginning of the NV Flash page */
place at start of FLASH_NV_region { readonly section .snvSectors };
/* Place .vtable_ram in start of RAM */
place at start of RAM_region { section .vtable_ram };
/*
place in RAM_region  {
 section .data,
 section .bss,
 section .vtable,
 section .vtable_ram,
 section .vtable_ram,
 section .sysmem,
 section .nonretenvar,
};
*/
/*
 * Define CSTACK block to contain .stack section. This enables the IAR IDE
 * to properly show the stack content during debug. Place stack at end of
 * retention RAM, do not initialize (initializing the stack will destroy the
 * return address from the initialization code, causing the processor to branch
 * to zero and fault)
 */
define symbol STACKSIZE = 1024;
define block CSTACK with alignment = 8, size = STACKSIZE { section .stack };
//place at end of RAM_region { block CSTACK };
if (isdefinedsymbol(ROM_TIMACDataAddr)) {
    place at address mem:ROM_TIMACDataAddr {section .data_RAM_BASE_ADDR };
}
/* Export stack top symbol. Used by startup file */
define exported symbol STACK_TOP = end(RAM_region) + 1;
define block RWDATA { rw };
define section .heap_start            { public heapStart: };
define section .heap_end              { public heapEnd: };
define block   HEAP_END with size = 1 { section .heap_end };
define block END_OF_RAM with fixed order {
                                        block HEAP_END,
                                        block CSTACK
                                      };
place at end of RAM_region { block END_OF_RAM };
place in RAM_region { block RWDATA,
               last section .heap_start};

initialize by copy { readwrite };
do not initialize { section .stack, section .noinit};
/*
 * The USE_TIRTOS_ROM symbol is defined internally in the build flow (using
 * --config_def USE_TIRTOS_ROM=1) for TI-RTOS applications whose app.cfg file
 * specifies to use the ROM.
 */
if (isdefinedsymbol(USE_TIRTOS_ROM)) {
    include "TIRTOS_ROM.icf";
}