Other Parts Discussed in Thread: C2000WARE
Deleted this original post. It did not show up right away and Firefox or E2E burped so I recreated it below...
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.
Deleted this original post. It did not show up right away and Firefox or E2E burped so I recreated it below...
Part Number: TMS320F28386S
Because our hardware was not designed with the correct pin pairs for SCIA boot firmware updating with the serial flash programmer we must have a modified design.
I experimented with building the CPU1 kernel as a RAM project and ran it, and this seemed to work OK. However, I did not look far enough ahead. It is much more complicated to use the serial flash programmer to update the CM. There is a 2nd kernel which must be loaded in CPU1 and another one for the CM. After the CPU1 kernel loads the CM kernel then the original CPU kernel must be reloaded to update the CM app. In threads and conversations with a TI E2E engineer it seems it would help if I put the kernels in flash in a location that would not be affected by updates. The location would be controlled by the linker cmd file. So 3 questions arise.
1) Should these kernels (2 for CPU1 and 1 in the CM) run from flash or should they be RAM based as they originally operate and copied into RAM to run? I think operating from flash is OK if the kernel's region specified by the linker cmd file is not erased or overwritten.
2) This forum may not be the right place for this question but I would appreciate some redirection if I should look elsewhere. Would these kernels be called as functions from my regular main app or would a branch be used?
3) Again maybe the wrong forum. How would these functions or images be isolated in the linker cmd file?
Thanks,
John
Hi John,
1) Parts of the kernel can be made to run from Flash, but other processes like the stack are required to run from RAM.
2) For your usage the kernels should be called by a branch. Do you anticipate the application running and then calling the kernels as functions?
3) Both CPU1 and CM kernels can be run from from flash by using the 2838x_FLASH_lnk_cpu1.cmd or 2838x_FLASH_lnk_shared_cm.cmd found in C2000Ware_4_02_00_00\device_support\f2838x\common\cmd. The functions are naturally isolated as they use different flash banks.
Thanks,
Charles
Hi Charles and thanks for the quick response.
1) Yes, of course. I should have specified the stack and variables.
2) I assumed I would need to call them as functions. I do not know another way as the goal is to be able to upgrade the app without using JTAG.But any ideas are welcome.
3) Thanks for this. I will study it, which means more questions later but I wanted to respond to 1 and 2 as quickly.
John
Hi John,
On 2) You can call them as a function, doing so it will send you to the SCI bootloader to download the kernel via SCI. As long as it is not connected to your JTAG default pins (for your situation).
Thanks,
Charles
I see, right. You can modify the sciGetFunction so that you won't have to rely on that pin 28/29 pin pair combination.
A) There is a problem using 2838x_FLASH_lnk_cpu1.cmd and there may be a similar problem with the CM. This link file puts the kernel is the same place as my original app. I need for both of them to be in flash at the same time so my app can call the kernel. So I need to know how to specify an address for a specific piece of flash code. Since the app is about to be overwritten in lower flash this code could be called via a jump or branch.
B) Also the kernel will need space for initialized variables, etc. So .text, .cinit, and .switch? From what I understand this could be contiguous with the app initialized variable space. Hopefully uninitialized variables can share space.
C) Looking at my app map file it seems there is plenty of empty flash space.
D) When a firmware update is performed I need to find a way to do it so that kernel in flash is not part of the update. This leads me to conclude that it may be better for the kernel to be copied from flash and executed in RAM.
JH
Hi John,
Thanks for the questions.
A) Understood, so both the kernel and your application will reside in flash. In order to specify an address for the kernel, it needs to just not overlap with the application file's address.
B/C) Initialized variables for .text, .cinit, and .switch can be stored in flash if needed.
For D, I do think it would be better for the kernel to be copied from flash and executed in RAM.
Charles
John, I would reference the flashapi_ex1_programming project and the assembly language tools guide (https://www.ti.com/lit/ug/sprui03e/sprui03e.pdf) for the linker command file.
I'll have to continue looking into this a bit later today.
Thanks,
Charles
Thanks for the tip.
I built a cmd file but I don't know what ram section to use, LS or GS. Is there a general preference.
The cmd file:
MEMORY { /* BEGIN is used for the "boot to SARAM" bootloader mode */ //BEGIN : origin = 0x000000, length = 0x000002 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 = 0x0003F8 /* on-chip RAM block M1 */ // RAMM1_RSVD : origin = 0x0007F8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ RAMD0 : origin = 0x00C000, length = 0x000800 RAMD1 : origin = 0x00C800, length = 0x000800 RAMLS0 : origin = 0x008000, length = 0x000800 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 RAMGS0 : origin = 0x00D000, length = 0x001000 RAMGS1 : origin = 0x00E000, length = 0x001000 RAMGS2 : origin = 0x00F000, length = 0x001000 RAMGS3 : origin = 0x010000, length = 0x001000 RAMGS4 : origin = 0x011000, length = 0x001000 RAMGS5 : origin = 0x012000, length = 0x001000 RAMGS6 : origin = 0x013000, length = 0x001000 RAMGS7 : origin = 0x014000, length = 0x001000 RAMGS8 : origin = 0x015000, length = 0x001000 RAMGS9 : origin = 0x016000, length = 0x001000 RAMGS10 : origin = 0x017000, length = 0x001000 RAMGS11 : origin = 0x018000, length = 0x001000 RAMGS12 : origin = 0x019000, length = 0x001000 RAMGS13 : origin = 0x01A000, length = 0x001000 RAMGS14 : origin = 0x01B000, length = 0x001000 RAMGS15 : origin = 0x01C000, length = 0x000FF8 // RAMGS15_RSVD : origin = 0x01CFF8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ /* BEGIN is used for the "boot to Flash" bootloader mode */ BEGIN : origin = 0x080000, length = 0x000002 /* Flash sectors */ FLASH0 : origin = 0x080002, length = 0x001FFE /* on-chip Flash */ FLASH1 : origin = 0x082000, length = 0x002000 /* on-chip Flash */ FLASH2 : origin = 0x084000, length = 0x002000 /* on-chip Flash */ FLASH3 : origin = 0x086000, length = 0x002000 /* on-chip Flash */ FLASH4 : origin = 0x088000, length = 0x008000 /* on-chip Flash */ FLASH5 : origin = 0x090000, length = 0x008000 /* on-chip Flash */ FLASH6 : origin = 0x098000, length = 0x008000 /* on-chip Flash */ FLASH7 : origin = 0x0A0000, length = 0x008000 /* on-chip Flash */ FLASH8 : origin = 0x0A8000, length = 0x008000 /* on-chip Flash */ FLASH9 : origin = 0x0B0000, length = 0x008000 /* on-chip Flash */ FLASH10 : origin = 0x0B8000, length = 0x002000 /* on-chip Flash */ FLASH11 : origin = 0x0BA000, length = 0x002000 /* on-chip Flash */ FLASH12 : origin = 0x0BC000, length = 0x002000 /* on-chip Flash */ FLASH13 : origin = 0x0BE000, length = 0x001FF0 /* on-chip Flash */ /* #ifdef __TI_COMPILER_VERSION__ #if __TI_COMPILER_VERSION__ >= 20012000 } crc(_table_name, algorithm=C28_CHECKSUM_16) #endif #endif */ CPU1TOCPU2RAM_0 : origin = 0x03A000, length = 0x000400 CPU1TOCPU2RAM_1 : origin = 0x03A400, length = 0x000400 CPU2TOCPU1RAM : origin = 0x03B000, length = 0x000800 CPUTOCMRAM : origin = 0x039000, length = 0x000800 CMTOCPURAM : origin = 0x038000, length = 0x000800 CANA_MSG_RAM : origin = 0x049000, length = 0x000800 CANB_MSG_RAM : origin = 0x04B000, length = 0x000800 RESET : origin = 0x3FFFC0, length = 0x000002 } SECTIONS { codestart : > BEGIN kernel_section : { flash_kernel_c28x_dual_ex1_boot_cpu1.obj(.text) flash_kernel_c28x_dual_ex1_erase_cpu1.obj(.text) flash_kernel_c28x_dual_ex1_sci_boot_cpu1.obj(.text) flash_kernel_c28x_dual_ex1_sci_flash_kernel_cpu1.obj(.text) flash_kernel_c28x_dual_ex1_sci_get_function_cpu1.obj(.text) flash_kernel_c28x_dual_ex1_verify_cpu1.obj(.text) } LOAD >> FLASH5, // | FLASH6 | FLASH7 | FLASH8 | FLASH9 | FLASH11 | FLASH12, RUN >> RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3, LOAD_START(RamfuncsLoadStart), LOAD_SIZE(RamfuncsLoadSize), LOAD_END(RamfuncsLoadEnd), RUN_START(RamfuncsRunStart), RUN_SIZE(RamfuncsRunSize), RUN_END(RamfuncsRunEnd), ALIGN(4) .text : >>RAMGS1 | RAMGS2 | RAMGS3 | RAMGS4 .cinit : > RAMM0 .switch : > RAMM0 .reset : > RESET, TYPE = DSECT /* not used, */ .stack : > RAMM1 #if defined(__TI_EABI__) .bss : > RAMGS5 .data : > RAMGS5 .const : > RAMGS5 .init_arry : > RAMM0 .sysmem : > RAMGS5 #else .pinit : > RAMM0 .ebss : > RAMGS5 .econst : > RAMGS5 .esysmem : > RAMGS5 #endif Filter_RegsFile : > RAMGS5 #ifdef __TI_COMPILER_VERSION__ #if __TI_COMPILER_VERSION__ >= 15009000 .TI.ramfunc : > RAMGS5 #else ramfuncs : > RAMGS5 #endif #endif MSGRAM_CPU1_TO_CPU2 > CPU1TOCPU2RAM_0, type=NOINIT MSGRAM_CPU1_TO_CPU2_COPY_TO_M1_RAM > CPU1TOCPU2RAM_1, type=NOINIT MSGRAM_CPU2_TO_CPU1 > CPU2TOCPU1RAM, type=NOINIT MSGRAM_CPU_TO_CM > CPUTOCMRAM, type=NOINIT MSGRAM_CM_TO_CPU > CMTOCPURAM, type=NOINIT /* The following section definition are for SDFM examples */ Filter1_RegsFile : > RAMGS10, fill=0x1111 Filter2_RegsFile : > RAMGS11, fill=0x2222 Filter3_RegsFile : > RAMGS12, fill=0x3333 Filter4_RegsFile : > RAMGS13, fill=0x4444 Difference_RegsFile : >RAMGS14, fill=0x3333 } /* //=========================================================================== // End of file. //=========================================================================== */
Thanks,
John
Hi John,
Either LS or GS would be fine to use, but I would lean towards GS since you have more sectors available. LS RAM is shared between C28x CPU and CLA, GS RAM shared between CPU, CPU2, DMA accesses.
Thanks,
Charles