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.
Hello,
I'm trying to load ECC results from CCS with using linker command file. I updated linker command file, closed the autoECCCalculation from properties and enabled ECC calculation in linker with "--ecc=on" directive.
The problem is, every ECC result area is correctly calculated except program memory sectors(which are combination of 6 sectors). I have read the Linker->ECC part of the "spru513x_TMS320C28x_AssemblyLanguageTools_v21.12.0.STS" document and a post from"e2e.ti.com/.../faq-faq-for-flash-ecc-usage-in-c2000-devices---includes-ecc-test-mode-linker-ecc-options" . Apart from these, I also researched many topics in E2E but I couldn't find a solution.
I am attaching the linker command file that I use. Waiting for your help.
#include "t122_cnm_v1r0_00.h" #define ECC_TEST_DISABLE 1//ECC test konfigürasyonu için bu değeri 0 yapın. MEMORY { PAGE 0 : RAMM0 : origin = 0x0000F3, length = 0x00030D RAMLS01 : origin = 0x008000, length = 0x001000 //not modified - CLA PROGRAM //RAMLS1 : origin = 0x008800, length = 0x000800 //not modified - CLA PROGRAM //Asagidaki alanlar birlestirildi. RAMLS2 : origin = 0x009000, length = 0x000800 RAMLS3 : origin = 0x009800, length = 0x000800 //Birlesik taným //Page1'den alindi ve birlestirildi //Page1'den alindi, DAC degerlerini tutan ram blogu //RAMGS0 : origin = 0x00C000, length = 0x002000 //RAMGS23 : origin = 0x010000, length = 0x003FF8 RAMGS123 : origin = 0x00E000, length = 0x005FF8 //RAMGS3 : origin = 0x012000, length = 0x001FF8 RESET : origin = 0x3FFFC0, length = 0x000002 /* BEGIN is used for the "boot to Flash" bootloader mode */ BEGIN : origin = 0x080000, length = 0x1000, fill = 0xFFFF BEGIN_ECC : origin = 0x1080000, length = 0x200, ECC = { /*ECC Specifier*/ input_range = BEGIN, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK0_SEC123456 : origin = 0x081000, length = 0x006000, vfill = 0xFFFF FLASH_BANK0_SEC123456_ECC : origin = 0x1080200, length = 0x0C00, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK0_SEC123456, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK0_SEC78 : origin = 0x087000, length = 0x002000, vfill = 0xFFFF FLASH_BANK0_SEC78_ECC : origin = 0x1080E00, length = 0x400, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK0_SEC78, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK0_SEC9 : origin = 0x089000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK0_SEC9_ECC : origin = 0x1081200, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK0_SEC9, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK0_SEC10 : origin = 0x08A000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK0_SEC10_ECC : origin = 0x1081400, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK0_SEC10, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK0_SEC11 : origin = 0x08B000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK0_SEC11_ECC : origin = 0x1081600, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK0_SEC11, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK0_SEC12 : origin = 0x08C000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK0_SEC12_ECC : origin = 0x1081800, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK0_SEC12, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK0_SEC13 : origin = 0x08D000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK0_SEC13_ECC : origin = 0x1081A00, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK0_SEC13, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK0_SEC14 : origin = 0x08E000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK0_SEC14_ECC : origin = 0x1081C00, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK0_SEC14, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK0_SEC15 : origin = 0x08F000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK0_SEC15_ECC : origin = 0x1081E00, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK0_SEC15, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ /* BANK 1 */ FLASH_BANK1_SEC0 : origin = 0x090000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK1_SEC0_ECC : origin = 0x1082000, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK1_SEC0, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK1_SEC1 : origin = 0x091000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK1_SEC1_ECC : origin = 0x1082200, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK1_SEC1, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK1_SEC2 : origin = 0x092000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK1_SEC2_ECC : origin = 0x1082400, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK1_SEC2, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK1_SEC3 : origin = 0x093000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK1_SEC3_ECC : origin = 0x1082600, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK1_SEC3, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK1_SEC4 : origin = 0x094000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK1_SEC4_ECC : origin = 0x1082800, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK1_SEC4, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK1_SEC5 : origin = 0x095000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK1_SEC5_ECC : origin = 0x1082A00, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK1_SEC5, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK1_SEC6 : origin = 0x096000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK1_SEC6_ECC : origin = 0x1082C00, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK1_SEC6, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK1_SEC7 : origin = 0x097000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK1_SEC7_ECC : origin = 0x1082E00, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK1_SEC7, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK1_SEC8 : origin = 0x098000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK1_SEC8_ECC : origin = 0x1083000, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK1_SEC8, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK1_SEC9 : origin = 0x099000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK1_SEC9_ECC : origin = 0x1083200, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK1_SEC9, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK1_SEC10 : origin = 0x09A000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK1_SEC10_ECC : origin = 0x1083400, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK1_SEC10, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK1_SEC11 : origin = 0x09B000, length = 0x001000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK1_SEC11_ECC : origin = 0x1083600, length = 0x200, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK1_SEC11, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ FLASH_BANK1_SEC12131415 : origin = 0x09C000, length = 0x004000, vfill = 0xFFFF /* on-chip Flash */ FLASH_BANK1_SEC12131415_ECC : origin = 0x1083800, length = 0x800, ECC = { /*ECC Specifier*/ input_range = FLASH_BANK1_SEC12131415, input_page = 0, algorithm = C2000_Algo, fill = true } /* End of ECC specifier*/ // FLASH_BANK1_SEC15_RSVD : origin = 0x09FFF0, length = 0x000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ PAGE 1 : BOOT_RSVD : origin = 0x000002, length = 0x0000F1 /* Part of M0, BOOT rom will use this for stack */ RAMM1 : origin = 0x000400, length = 0x0003F8 /* on-chip RAM block M1 */ RAMGS0 : origin = 0x00C000, length = 0x002000 RAMLS7 : origin = 0x00B800, length = 0x000800 //CPU ve CLA arasindaki mesajlasma alani CLA1_MSGRAMLOW : origin = 0x001480, length = 0x000080 CLA1_MSGRAMHIGH : origin = 0x001500, length = 0x000080 } SECTIONS { codestart : > BEGIN, PAGE = 0, ALIGN(8) wddisable : > FLASH_BANK0_SEC9, PAGE = 0, ALIGN(8) /* Used by file CodeStartBranch.asm */ copysections : > FLASH_BANK0_SEC9, PAGE = 0, ALIGN(8) /* Used by file SectionCopy.asm */ .text : //Bu kisim degistirildi. LOAD = FLASH_BANK0_SEC123456, // Load burada tutulur RUN = RAMGS123, // Program bu ramden kosar LOAD_START(_text_LoadStart), LOAD_SIZE(_text_LoadSize), LOAD_END(_text_LoadEnd), RUN_START(_text_RunStart), RUN_SIZE(_text_RunSize), RUN_END(_text_RunEnd), PAGE = 0, ALIGN(8) .cinit : > FLASH_BANK0_SEC78, PAGE = 0, ALIGN(8) .switch : > FLASH_BANK0_SEC9, PAGE = 0, ALIGN(8) .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */ .stack : > RAMM1, PAGE = 1 #if defined(__TI_EABI__) .init_array : > FLASH_BANK0_SEC1, PAGE = 0, ALIGN(8) .bss : > RAMLS5, PAGE = 1 .bss:output : > RAMLS3, PAGE = 0 .bss:cio : > RAMLS0, PAGE = 0 .data : > RAMLS5, PAGE = 1 .sysmem : > RAMLS5, PAGE = 1 /* Initalized sections go in Flash */ .const : > FLASH_BANK0_SEC4, PAGE = 0, ALIGN(8) #else .pinit : > FLASH_BANK0_SEC9, PAGE = 0, ALIGN(8) .ebss : > RAMGS123, PAGE = 0 //ramls5 kullanildigi icin ramls6 getirildi .esysmem : > RAMGS123, PAGE = 0 .cio : > RAMGS123, PAGE = 0 //ramls0 cla tarafindan kullanildigi icin degistirildi .econst : > FLASH_BANK0_SEC10, PAGE = 0, ALIGN(8) //sec4 birlestirildigi icin sec5 kullanildi #endif adcBufferSection : > RAMGS0, PAGE = 1 dacData : > RAMGS0, PAGE = 1 //EABI is not used /* CLA specific sections */ Cla1Prog : LOAD = FLASH_BANK0_SEC9, RUN = RAMLS01, LOAD_START(_Cla1ProgLoadStart), RUN_START(_Cla1ProgRunStart), LOAD_SIZE(_Cla1ProgLoadSize), PAGE = 0, ALIGN(8) .const_cla : LOAD = FLASH_BANK0_SEC10, RUN = RAMLS2, RUN_START(_Cla1ConstRunStart), LOAD_START(_Cla1ConstLoadStart), LOAD_SIZE(_Cla1ConstLoadSize), PAGE = 0, ALIGN(8) .scratchpad : > RAMLS3, PAGE = 0 .bss_cla : > RAMLS3, PAGE = 0 Cla1DataRam : > RAMLS3, PAGE = 0 cla_shared : > RAMLS3, PAGE = 0 Cla1ToCpuMsgRAM : > CLA1_MSGRAMLOW, PAGE = 1 CpuToCla1MsgRAM : > CLA1_MSGRAMHIGH, PAGE = 1 ///END OF CLA CONFIG .TI.ramfunc : LOAD = FLASH_BANK0_SEC123456, RUN = RAMGS123, LOAD_START(_RamfuncsLoadStart), LOAD_SIZE(_RamfuncsLoadSize), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), RUN_SIZE(_RamfuncsRunSize), RUN_END(_RamfuncsRunEnd), PAGE = 0, ALIGN(8) FFT_buffer_1 : > RAMLS7, PAGE = 1 FFT_buffer_2 : > RAMLS7, PAGE = 1 FFT_buffer_3 : > RAMLS7, PAGE = 1 CONFIG_PARAMETERS_SECTIONS } ECC { C2000_Algo: address_mask = 0x1FFFFC // 1 1111 1111 1111 1111 1100 - 1FFFFC //hamming_mask = R4 // This may be default mask parity_mask = 0xFC mirroring = F021 } /* End of ECC Directive */ /* //=========================================================================== // End of file. //=========================================================================== */
Thanks,
Hi Fahri,
If I understand correctly, you are saying that ECC is not generated correctly for FLASH_BANK0_SEC123456 and FLASH_BANK1_SEC12131415. Correct?
Please provide more details on how you confirmed that the generated ECC is incorrect -> Did you notice ECC errors during memcpy()?
Thanks and regards,
Vamsi
Hi Vamsi,
First of all, thank you for your quick reply.
What I said is I observed ECC error for FLASH_BANK0_SEC123456 only. Other combined sectors have no problem.
I used UNIFLASH program to compare methods. First, I used autoGenerateECC option and saved the correct ECC results. Then I used Linker Command File generated method and look at the ECC Storage which starts at 0x1080200 for FLASH_BANK0_SEC123456. I also checked the start and end addresses of other sectors' ECC results and they were fine.
I didnt notice the error during memcopy actually I didnt look to it. What are the steps I should follow..
Also I created another example project to test sector combination. I combined the sectors which are used by .text section. Also I used combined sector at _TI_RAM_FUNC section but no error occured.
Fahri
Hi Fahri,
Thank you for the info. I will get back to you Tuesday next week (2/8).
Thanks and regards,
Vamsi
Fahri,
Linker generates ECC assuming 0xFFFF (VFILL value given in the linker cmd) for all the locations in the input range that don't have any data mapped to them. Hence, UniFlash's AutoEcc may not match for each 64-bit aligned data.
Can you enable ECC-evaluation (ECC_ENABLE register in section 3.14.14 FLASH_ECC_REGS of the TRM) and read the entire flash space? If there are single bit errors, they will be logged in the ECC error registers (you can also configure for an interrupt). If there is an uncorrectable error, an NMI will be generated (also gets logged in the ECC error registers). This will help understand whether the ECC is generated correctly or not.
Thanks and regards,
Vamsi
Vamsi,
Firstly, I am writing the following parafraph just to re-inform.
I used CCS for all loading/programming, not Uniflash. I just used uniflash for reading memory. I loaded same code with two options which are autoECC or LinkerGenerated ECC. So I am prety sure about that ECC calculation is wrong or missing. You now Linker generated ECC results are not 0xFF for non-calculated/empty areas so I am not sure about ECC calculation is done for program memory( FLASH_BANK0_SEC123456)
I will follow your suggestions and rewrite here.
Thanks and regards,
Fahri
Vamsi,
If I understood what you said correctly, I did your suggestion. I read some programMemory locations. I am attaching the screenshots of my results.
Hi Fahri,
Thank you for the update. I will review and get back to you in a day or two (February 14th).
Best regards,
Vamsi
Hi Fahri,
Thank you for loading the linker generated ECC and then read the flash with ECC-evaluation enabled.
Can you send a sample project so that our compiler team can reproduce?
Thanks and regards,
Vamsi
Hi Vamsi,
Project codes cannot be shared due to policy of company. But I will try to create a new project by simplifying the project and keeping the error. I will get back to you in a two day because I'm very busy these days. I'm grateful for you assistance.
Fahri
Hi Fahri,
Sure, that is fine. I will keep this open.
Thanks and regards,
Vamsi
Hi Fahri,
Did you get a chance to create a project for us to reproduce it?
Please let me know if I can close this post.
Thanks and regards,
Vamsi