Part Number: TMS320F28P650DK
Other Parts Discussed in Thread: TMS320F28377S
Hi TI Team,
Currently, I am developing a bootloader for TMS320F28P650DK9 following the flow outlined below (which is alredy there for TMS320F228P77s). During boot main initialization when it entering to Flash_initModule, the process enters an illegal trap and does not recover from it. I need support to unblock this situation belw added code start branch file and linker command files ,
Also addind the linker command file and code start branch file below :
Linker command file :
MEMORY
{
BEGIN : origin = 0x080000, length = 0x000002 // Update the codestart location as needed
BOOT_RSVD : origin = 0x000002, length = 0x0001AF /* Part of M0, BOOT rom will use this for stack */
RAMM0 : origin = 0x0001B1, length = 0x00024F
RAMM1 : origin = 0x000400, length = 0x000400
RAMD0 : origin = 0x00C000, length = 0x002000
RAMD1 : origin = 0x00E000, length = 0x002000
RAMD2 : origin = 0x01A000, length = 0x002000 // Can be mapped to either CPU1 or CPU2. When configured to CPU2, use the address 0x8000. User should comment/uncomment based on core selection
RAMD3 : origin = 0x01C000, length = 0x002000 // Can be mapped to either CPU1 or CPU2. When configured to CPU2, use the address 0xA000. User should comment/uncomment based on core selection
RAMD4 : origin = 0x01E000, length = 0x002000 // Can be mapped to either CPU1 or CPU2. When configured to CPU2, use the address 0xC000. User should comment/uncomment based on core selection
RAMD5 : origin = 0x020000, length = 0x002000 // Can be mapped to either CPU1 or CPU2. When configured to CPU2, use the address 0xE000. User should comment/uncomment based on core selection
RAMLS01234 : origin = 0x008000, length = 0x002800
//RAMLS1 : origin = 0x008800, length = 0x000800
//RAMLS2 : origin = 0x009000, length = 0x000800
//RAMLS3 : origin = 0x009800, length = 0x000800
//RAMLS4 : origin = 0x00A000, length = 0x000800
RAMLS5 : origin = 0x00A800, length = 0x000800
RAMLS6 : origin = 0x00B000, length = 0x000800
RAMLS7 : origin = 0x00B800, length = 0x000800
RAMLS8 : origin = 0x022000, length = 0x002000 // When configured as CLA program use the address 0x4000
RAMLS9 : origin = 0x024000, length = 0x002000 // When configured as CLA program use the address 0x6000
// RAMLS8_CLA : origin = 0x004000, length = 0x002000 // Use only if configured as CLA program memory
// RAMLS9_CLA : origin = 0x006000, length = 0x002000 // Use only if configured as CLA program memory
RAMGS0 : origin = 0x010000, length = 0x002000
RAMGS1 : origin = 0x012000, length = 0x002000
RAMGS2 : origin = 0x014000, length = 0x002000
RAMGS3_4 : origin = 0x016000, length = 0x004000
//RAMGS4 : origin = 0x018000, length = 0x002000
/* Flash Banks (128 sectors each) */
//FLASH_BANK0 : origin = 0x080002, length = 0x007FFE // Can be mapped to either CPU1 or CPU2. User should comment/uncomment based on core selection
//BOOT_FLASH : origin = 0x080002, length = 0x007FFE
BOOT_FLASH : origin = 0x080002, length = 0x007FFE /* on-chip Flash */
APP_FLASH : origin = 0x088000, length = 0x018000 /* on-chip Flash */
FLASH_BANK1 : origin = 0x0A0000, length = 0x20000 // Can be mapped to either CPU1 or CPU2. User should comment/uncomment based on core selection
FLASH_BANK2 : origin = 0x0C0000, length = 0x20000 // Can be mapped to either CPU1 or CPU2. User should comment/uncomment based on core selection
// FLASH_BANK3 : origin = 0x0E0000, length = 0x20000 // Can be mapped to either CPU1 or CPU2. User should comment/uncomment based on core selection
// FLASH_BANK4 : origin = 0x100000, length = 0x20000 // Can be mapped to either CPU1 or CPU2. User should comment/uncomment based on core selection
CPU1TOCPU2RAM : origin = 0x03A000, length = 0x000400
CPU2TOCPU1RAM : origin = 0x03B000, length = 0x000400
CLATOCPURAM : origin = 0x001480, length = 0x000080
CPUTOCLARAM : origin = 0x001500, length = 0x000080
CLATODMARAM : origin = 0x001680, length = 0x000080
DMATOCLARAM : origin = 0x001700, length = 0x000080
CANA_MSG_RAM : origin = 0x049000, length = 0x000800
CANB_MSG_RAM : origin = 0x04B000, length = 0x000800
RESET : origin = 0x3FFFC0, length = 0x000002
}
SECTIONS
{
codestart : > BEGIN
.text : >> APP_FLASH, ALIGN(8)
.cinit : > APP_FLASH, ALIGN(8)
.switch : > APP_FLASH, ALIGN(8)
.reset : > RESET, TYPE = DSECT /* not used, */
.stack : > RAMM1
#if defined(__TI_EABI__)
.bss : > RAMLS9
.bss:output : > RAMLS9
.init_array : > APP_FLASH, ALIGN(8)
.const : > APP_FLASH, ALIGN(8)
.data : > RAMLS7 | RAMLS8
.sysmem : > RAMLS5
#else
.pinit : > APP_FLASH, ALIGN(8)
.ebss : >> RAMLS5 | RAMLS6
START(_start_ebss)
END(_end_ebss)
.econst : > APP_FLASH, ALIGN(8)
.esysmem : > RAMLS5
#endif
ramgs0 : > RAMGS0, type=NOINIT
ramgs1 : > RAMGS1, type=NOINIT
ramgs2 : > RAMGS2, type=NOINIT
MSGRAM_CPU1_TO_CPU2 > CPU1TOCPU2RAM, type=NOINIT
MSGRAM_CPU2_TO_CPU1 > CPU2TOCPU1RAM, type=NOINIT
/*boot memory allocation */
boot_cinit
{
-l FAPI_F28P65x_EABI_v3.00.02.lib (.cinit)
boot_main.obj(.cinit)
boot_hwinit.obj(.cinit)
boot_flash.obj(.cinit)
boot_flash.obj(.econst)
} > BOOT_FLASH
boot_start
{
entry.obj (.text)
boot_main.obj(.text)
boot_hwinit.obj(.text)
boot_flash.obj(.text)
} > BOOT_FLASH
boot_flash_lib :
{
-l FAPI_F28P65x_EABI_v3.00.02.lib (.econst)
-l FAPI_F28P65x_EABI_v3.00.02.lib (.text)
} LOAD = BOOT_FLASH,
RUN = RAMLS01234,
LOAD_START(_boot_flash_code_load_start),
LOAD_SIZE(_boot_flash_code_size),
RUN_START(_boot_flash_code_run_start)
.data_boot
{
entry.obj (.data)
boot_main.obj (.data)
boot_hwinit.obj (.data)
boot_flash.obj(.data)
-l FAPI_F28P65x_EABI_v3.00.02.lib (.data)
} > RAMM1
.ebss_boot
{
entry.obj (.ebss)
boot_main.obj (.ebss)
boot_hwinit.obj (.ebss)
boot_flash.obj(.ebss)
-l FAPI_F28P65x_EABI_v3.00.02.lib (.ebss)
} > RAMM1
/* Allocate program areas: */
// bootstrap
// {
// entry.obj (.text)
// // - l FAPI_F28P65x_EABI_v3.00.02.lib (.cinit)
//
// } > APP_FLASH //0x088000
#if defined(__TI_EABI__)
.TI.ramfunc : {} LOAD = APP_FLASH,
RUN = RAMGS3_4,//RAMLS01234,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
ALIGN(8)
#else
.TI.ramfunc : {} LOAD = APP_FLASH,
RUN = RAMGS3_4,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
ALIGN(8)
#endif
}
/*
//===========================================================================
// End of file.
//===========================================================================
*/
Code Start branch file :
***********************************************************************
.global boot_main
.global _entry
.global __stack_boot
.global _bootstrap_main
.global _exit
.global _start_ebss
.global _end_ebss
****************************************************************************
****************************************************************************
* Declare the stack. Size is determined by the linker option -stack. The *
* default value is 1K words. *
****************************************************************************
__stack_boot: .usect ".stack",0
****************************************************************************
* INITIALIZE RESET VECTOR TO POINT AT _c_int00 *
****************************************************************************
.sect .reset
.long _entry
.text
****************************************************************************
* FUNCTION DEF : _bootstrap_main *
* *
****************************************************************************
_bootstrap_main: .asmfunc
****************************************************************************
* CALL USER'S PROGRAM *
****************************************************************************
LB _c_int00 ; execute TI init routines
;LCR _exit
LB ExitBoot
.endasmfunc
****************************************************************************
****************************************************************************
* FUNCTION DEF : _entry *
* *
****************************************************************************
_entry: .asmfunc
****************************************************************************
* INITIALIZE STACK POINTER. *
****************************************************************************
MOV SP,#__stack_boot ; set to beginning of stack space
****************************************************************************
* INITIALIZE STATUS BIT FIELDS *NOT* INITIALIZED AT RESET *
****************************************************************************
SPM 0 ; set product shift to 0
****************************************************************************
* SETTING THESE STATUS BITS/REGISTER TO RESET VALUES. IF YOU RUN *
* _c_int00 FROM RESET, YOU CAN REMOVE THIS CODE *
****************************************************************************
CLRC PAGE0 ; use stack addressing mode
MOVW DP,#0 ; initialize DP to point at low 64K
CLRC OVM ; turn off overflow mode
ASP ; ensure SP is aligned
****************************************************************************
* CALL USER'S PROGRAM *
****************************************************************************
LCR boot_main ; execute boot_main()
LB _bootstrap_main
.endasmfunc
****************************************************************************
WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0
.ref _c_int00
.ref main
.global code_start
.global ExitBoot
***********************************************************************
* Function: codestart section
*
* Description: Branch to code starting point
***********************************************************************
.sect "codestart"
.retain
code_start:
.if WD_DISABLE == 1
LB wd_disable ;Branch to watchdog disable code
.else
LB _c_int00 ;Branch to start of boot._asm in RTS library
.endif
;end codestart section
***********************************************************************
* Function: wd_disable
*
* Description: Disables the watchdog timer
***********************************************************************
.if WD_DISABLE == 1
.text
wd_disable:
SETC OBJMODE ;Set OBJMODE for 28x object code
EALLOW ;Enable EALLOW protected register access
MOVZ DP, #7029h>>6 ;Set data page for WDCR register
MOV @7029h, #0068h ;Set WDDIS bit in WDCR to disable WD
EDIS ;Disable EALLOW protected register access
;LB _c_int00 ;Branch to start of boot._asm in RTS library
LCR _entry ;main in main file here main is there previously
; Cleanup and exit. At this point the EntryAddr
; is located in the ACC register
LB ExitBoot
.endif
;end wd_disable
;-----------------------------------------------
; ExitBoot
;-----------------------------------------------
;-----------------------------------------------
;This module cleans up after the boot loader
;
; 1) Make sure the stack is deallocated.
; SP = 0x400 after exiting the boot
; loader
; 2) Push 0 onto the stack so RPC will be
; 0 after using LRETR to jump to the
; entry point
; 2) Load RPC with the entry point
; 3) Clear all XARn registers
; 4) Clear ACC, P and XT registers
; 5) LRETR - this will also clear the RPC
; register since 0 was on the stack
;-----------------------------------------------
ExitBoot:
__stack: .usect ".stack",0
;-----------------------------------------------
; Insure that the stack is deallocated
;-----------------------------------------------
MOV SP,#__stack
;-----------------------------------------------
; Clear the bottom of the stack. This will endup
; in RPC when we are finished
;-----------------------------------------------
MOV *SP++,#0
MOV *SP++,#0
;-----------------------------------------------
; Load RPC with the entry point as determined
; by the boot mode. This address will be returned
; in the ACC register.
;-----------------------------------------------
PUSH ACC
POP RPC
;-----------------------------------------------
; Put registers back in their reset state.
;
; Clear all the XARn, ACC, XT, and P and DP
; registers
;
; NOTE: Leave the device in C28x operating mode
; (OBJMODE = 1, AMODE = 0)
;-----------------------------------------------
ZAPA
MOVL XT,ACC
MOVZ AR0,AL
MOVZ AR1,AL
MOVZ AR2,AL
MOVZ AR3,AL
MOVZ AR4,AL
MOVZ AR5,AL
MOVZ AR6,AL
MOVZ AR7,AL
MOVW DP, #0
;------------------------------------------------
; Restore ST0 and ST1. Note OBJMODE is
; the only bit not restored to its reset state.
; OBJMODE is left set for C28x object operating
; mode.
;
; ST0 = 0x0000 ST1 = 0x0A0B
; 15:10 OVC = 0 15:13 ARP = 0
; 9: 7 PM = 0 12 XF = 0
; 6 V = 0 11 M0M1MAP = 1
; 5 N = 0 10 reserved
; 4 Z = 0 9 OBJMODE = 1
; 3 C = 0 8 AMODE = 0
; 2 TC = 0 7 IDLESTAT = 0
; 1 OVM = 0 6 EALLOW = 0
; 0 SXM = 0 5 LOOP = 0
; 4 SPA = 0
; 3 VMAP = 1
; 2 PAGE0 = 0
; 1 DBGM = 1
; 0 INTM = 1
;-----------------------------------------------
MOV *SP++,#0
MOV *SP++,#0x0A0B
POP ST1
POP ST0
;------------------------------------------------
; Jump to the EntryAddr as defined by the
; boot mode selected and continue execution
;-----------------------------------------------
LRETR
;eof ----------
.end
;//
;// End of file.
;//










