; -------------------------------------------------------------------------------- ; @Title: Example Script for programming of TI F28M35 Cortex-M3 internal flash ; ; @Description: ; Script arguments: ; ; DO f28m35 [PREPAREONLY] [AUTOECC=0|1] [DUALPORT=0|1] ; ; AUTOECC default value is 1 ; ; PREPAREONLY only declares flash but does not execute flash programming example ; ; DUALPORT default value is 0 (disabled). If DualPort mode is enabled ; flash algorithm stays running until flash programming is ; finished. Data is tranferred via dual port memory access. ; ; Example: ; ; DO ~~/demo/arm/flash/f28m35 DUALPORT=1 AUTOECC=0 PREPAREONLY ; ; List of F28M35 derivatives and their configuration: ; ; Cortex-M3 C28x ; CPU-Type Flash size Flash size ; [kByte] [kByte] ; -------------------------------------------------------------------------------- ; F28M35H20B1 256. 256. ; F28M35H20C1 256. 256. ; F28M35H22B1 256. 256. ; F28M35H22C1 256. 256. ; F28M35H32B1 256. 512. ; F28M35H32C1 512. 256. ; F28M35H50B1 512. 512. ; F28M35H50C1 512. 512. ; F28M35H52B1 512. 512. ; F28M35H52C1 512. 512. ; ; F28M35x Cortex-M3 memory configuration: ; ; 64 kByte Boot ROM at 0x00000000--0x0000ffff dual mapped to ; 0x01000000--0x0100ffff ; 512 kByte internal Flash at 0x00200000--0x0027ffff or ; 256 kByte internal Flash at 0x00200000--0x0021ffff and ; 0x00260000--0x0027ffff ; 64 kByte Flash ECC bits at 0x00600000--0x0060ffff ; 16 kByte internal ECC RAM at 0x20000000--0x20003fff ; 16 kByte internal Parity RAM at 0x20004000--0x20007fff ; 64 kByte shared Parity RAM at 0x20008000--0x20017fff ; ; @Author: WRD ; @Copyright: (C) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only ; @Chip: TMS320F28035* ; -------------------------------------------------------------------------------- ; $Rev: 12049 $ ; $Id: f28m35.cmm 12049 2023-04-20 12:32:16Z bschroefel $ LOCAL ¶meters ENTRY %LINE ¶meters LOCAL ¶m_prepareonly ¶m_prepareonly=(STRing.SCAN(STRing.UPpeR("¶meters"),"PREPAREONLY",0)!=-1) LOCAL &AutoECCGeneration &AutoECCGeneration=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"AUTOECC=","1") LOCAL ¶m_dualport ¶m_dualport=0 IF VERSION.BUILD.BASE()>=43441. ¶m_dualport=STRing.SCANAndExtract(STRing.UPpeR("¶meters"),"DUALPORT=","0") ; ------------------------------------------------------------------------------ ; CPU setup IF SYStem.MODE()<5 ( SYStem.RESet IF !CPUIS(F28M35*) SYStem.CPU F28M35* SYStem.CONFIG.DEBUGPORTTYPE JTAG SYStem.JtagClock 2MHz SYStem.Option.DUALPORT ON SYStem.MemAccess DAP SYStem.Up ; Setup target GOSUB UnlockInternalSRAM GOSUB readOTPSECLOCK GOSUB unlockCSMZ1 GOSUB unlockCSMZ2 GOSUB unlockECSLZ1 GOSUB unlockECSLZ2 GOSUB readFlashEXEZ1 GOSUB readFlashEXEZ2 GOSUB grabSectors GOSUB DeviceConfig GOSUB initRAM ) ; ------------------------------------------------------------------------------ ; Flash declaration FLASH.RESet GOSUB FlashDeclaration ¶m_dualport GOSUB initSYSCLK GOSUB initRWAIT GOSUB disableFlashECC ; Flash script ends here if called with parameter PREPAREONLY IF ¶m_prepareonly ENDDO PREPAREDONE ; ------------------------------------------------------------------------------ ; Flash programming example DIALOG.YESNO "Program flash memory?" LOCAL &progflash ENTRY &progflash IF &progflash ( FLASH.ReProgram.ALL /Erase Data.LOAD.auto * FLASH.ReProgram.off ) ENDDO ; -------------------------------------------------------------------------------- ; Flash declaration depending on CPU configuration FlashDeclaration: LOCAL &DualPort ENTRY &DualPort LOCAL &FlashSize IF CPUIS(F28M35H2*)||CPUIS(F28M35H32B1) &FlashSize=0x40000 ; [Byte] ELSE &FlashSize=0x80000 ; [Byte] IF &AutoECCGeneration!=0 ( FLASH.Create 1. 0x00200000--0x0020ffff 0x4000 TARGET Byte FLASH.Create 1. 0x00210000--0x0021ffff 0x10000 TARGET Byte IF &FlashSize>=0x80000 ( FLASH.Create 1. 0x00220000--0x0025ffff 0x10000 TARGET Byte ) FLASH.Create 1. 0x00260000--0x0026ffff 0x10000 TARGET Byte FLASH.Create 1. 0x00270000--0x0027ffff 0x4000 TARGET Byte ; OTP flash FLASH.Create 2. 0x00680820--0x00680FFF 0x7e0 TARGET Byte /OTP IF &DualPort==0 FLASH.TARGET 0x20000000 0x20002000 0x1000 ~~/demo/arm/flash/byte/f021m3.bin ELSE FLASH.TARGET 0x20000000 EAHB:0x20002000 0x1000 ~~/demo/arm/flash/byte/f021m3.bin /DualPort /STACKSIZE 0x120 ) ELSE ( ; Flash FLASH.Create 1. 0x00200000--0x0020ffff 0x4000 TARGET Byte /EraseALIAS 0x00600000--0x00601fff FLASH.Create 1. 0x00210000--0x0021ffff 0x10000 TARGET Byte /EraseALIAS 0x00602000--0x00603fff ; Flash ECC bits FLASH.Create 1. 0x00600000--0x00601fff 0x800 TARGET Byte /EraseALIAS 0x00200000--0x0020ffff FLASH.Create 1. 0x00602000--0x00603fff 0x2000 TARGET Byte /EraseALIAS 0x00210000--0x0021ffff IF &FlashSize>=0x80000 ( ; Flash FLASH.Create 1. 0x00220000--0x0025ffff 0x10000 TARGET Byte /EraseALIAS 0x00604000--0x0060bfff ; Flash ECC bits FLASH.Create 1. 0x00604000--0x0060bfff 0x2000 TARGET Byte /EraseALIAS 0x00220000--0x0025ffff ) ; Flash FLASH.Create 1. 0x00260000--0x0026ffff 0x10000 TARGET Byte /EraseALIAS 0x0060c000--0x0060dfff FLASH.Create 1. 0x00270000--0x0027ffff 0x4000 TARGET Byte /EraseALIAS 0x0060e000--0x0060ffff ; Flash ECC bits FLASH.Create 1. 0x0060c000--0x0060dfff 0x2000 TARGET Byte /EraseALIAS 0x00260000--0x0026ffff FLASH.Create 1. 0x0060e000--0x0060ffff 0x800 TARGET Byte /EraseALIAS 0x00270000--0x0027ffff IF &DualPort==0 FLASH.TARGET 0x20000000 0x20002000 0x1000 ~~/demo/arm/flash/byte/f021m3noecc.bin ELSE FLASH.TARGET 0x20000000 EAHB:0x20002000 0x1000 ~~/demo/arm/flash/byte/f021m3noecc.bin /DualPort /STACKSIZE 0x120 ) FLASH.CLocK.AUTO ; Flash ECC bit access MAP.BUS16 0x00600000--0x0060ffff RETURN ; -------------------------------------------------------------------------------- ; Preliminary to unlock empty device UnlockInternalSRAM: LOCAL &tmp &addr &tmp=Data.Long(SD:0x00680800) &addr=0x00200000 RePeaT 9. ( &tmp=Data.Long(SD:&addr) &addr=&addr+4 ) &addr=0x0027FFDC RePeaT 9. ( &tmp=Data.Long(SD:&addr) &addr=&addr+4 ) RETURN ; -------------------------------------------------------------------------------- ; Initialize ECC/parity RAM initRAM: Data.Set SD:0x400FB240 %Long Data.Long(SD:0x400FB240)|0x00000055 ; Initialize C0, C1, C2, C3 RAM's Data.Set SD:0x400FB260 %Long Data.Long(SD:0x400FB260)|0x00000001 ; Initialize MtoC MSG RAM's WAIT Data.Long(SD:0x400FB270)==0x55 WAIT Data.Long(SD:0x400FB288)==0x01 RETURN ; -------------------------------------------------------------------------------- ; Initialize System Clock for the case of empty device initSYSCLK: ON.ERROR GOSUB ( ON.ERROR NOTHING IF STATE.RUN() Break.direct Data.Set SD:0x400FB80C %Long 0x0 Data.Set SD:0x400FB810 %Long 0x0 PRINT "DSLPCLKCFG:DSDIVOVRIDE and M3SSDIVSEL changed to /1 to increase FCLK" FLASH.Program.ALL RETURN ) FLASH.Program.ALL ON.ERROR FLASH.Program.off IF FLASH.CLocK.Frequency()<1000000. ( Data.Set SD:0x400FB80C %Long 0x0 Data.Set SD:0x400FB810 %Long 0x0 PRINT "DSLPCLKCFG:DSDIVOVRIDE and M3SSDIVSEL changed to /1 to increase FCLK" ) RETURN ; -------------------------------------------------------------------------------- ; Initialize RWAIT for flash read waitstate initRWAIT: LOCAL &rwait FLASH.Program.ALL FLASH.Program.off &rwait=FLASH.CLocK.Frequency()/40000000. Data.Set SD:0x400FA000 %Long &rwait<<8. RETURN ; -------------------------------------------------------------------------------- ; Disable flash ECC disableFlashECC: Data.Set 0x400FA600 %Long 0x00 RETURN ; -------------------------------------------------------------------------------- ; Enable flash ECC enableFlashECC: Data.Set 0x400FA600 %Long 0x0A RETURN ; -------------------------------------------------------------------------------- ; Unlock CSM Zone 1 unlockCSMZ1: ; Perform dummy reads of the password locations Data.In SD:0x00200000 /Long Data.In SD:0x00200004 /Long Data.In SD:0x00200008 /Long Data.In SD:0x0020000C /Long ; Write passwords to the KEY registers. 0xFFFFFFFF's are dummy passwords. ; User should replace them with the correct password Data.Set SD:0x400FB400 %Long 0xFFFFFFFF Data.Set SD:0x400FB404 %Long 0xFFFFFFFF Data.Set SD:0x400FB408 %Long 0xFFFFFFFF Data.Set SD:0x400FB40C %Long 0xFFFFFFFF RETURN ; -------------------------------------------------------------------------------- ; Unlock CSM Zone 2 unlockCSMZ2: ; Perform dummy reads of the password locations Data.In SD:0x0027FFF0 /Long Data.In SD:0x0027FFF4 /Long Data.In SD:0x0027FFF8 /Long Data.In SD:0x0027FFFC /Long ; Write passwords to the KEY registers. 0xFFFFFFFF's are dummy passwords. ; User should replace them with the correct password Data.Set SD:0x400FB418 %Long 0xFFFFFFFF Data.Set SD:0x400FB41C %Long 0xFFFFFFFF Data.Set SD:0x400FB420 %Long 0xFFFFFFFF Data.Set SD:0x400FB424 %Long 0xFFFFFFFF RETURN ; -------------------------------------------------------------------------------- ; Unlock ECSL Zone 1 unlockECSLZ1: ; Perform dummy reads of the password locations Data.In SD:0x00200010 /Long Data.In SD:0x00200014 /Long ; Write passwords to the KEY registers. 0xFFFFFFFF's are dummy passwords. ; User should replace them with the correct password Data.Set SD:0x400FB410 %Long 0xFFFFFFFF Data.Set SD:0x400FB414 %Long 0xFFFFFFFF RETURN ; -------------------------------------------------------------------------------- ; Unlock ECSL Zone 2 unlockECSLZ2: ; Perform dummy reads of the password locations Data.In SD:0x0027FFE8 /Long Data.In SD:0x0027FFEC /Long ; Write passwords to the KEY registers. 0xFFFFFFFF's are dummy passwords. ; User should replace them with the correct password Data.Set SD:0x400FB428 %Long 0xFFFFFFFF Data.Set SD:0x400FB42C %Long 0xFFFFFFFF RETURN ; -------------------------------------------------------------------------------- ; Read OTP sector lock in OTP readOTPSECLOCK: ; Perform dummy read Data.In SD:0x00680800 /Long ; Read OTPSECLOCK RETURN ; -------------------------------------------------------------------------------- ; Zone select settings grabSectors: ; Perform dummy read Data.In SD:0x00200018 /Long ; Read Z1_grabSect Data.In SD:0x0020001C /Long ; Read Z1_GRABRAM Data.In SD:0x0027FFE4 /Long ; Read Z2_grabSect Data.In SD:0x0027FFE0 /Long ; Read Z2_GRABRAM RETURN ; -------------------------------------------------------------------------------- ; Read of flash execute-only location Zone 1 readFlashEXEZ1: ; Perform dummy read Data.In SD:0x00200020 /Long RETURN ; -------------------------------------------------------------------------------- ; Read of flash execute-only location Zone 2 readFlashEXEZ2: ; Perform dummy read Data.In SD:0x0027FFDC /Long RETURN ; -------------------------------------------------------------------------------- ; The below is usually performed in the boot ROM, but if during debug, ; Boot ROM execution is bypassed, then the following must be executed DeviceConfig: Data.Set SD:0x400FE004 %Long Data.Long(SD:0x00680430) Data.Set SD:0x400FB900 %Long Data.Long(SD:0x00680410) Data.Set SD:0x400FB904 %Long Data.Long(SD:0x00680414) Data.Set SD:0x400FB930 %Long Data.Long(SD:0x0068042C) Data.Set SD:0x400FE014 %Long Data.Long(SD:0x00680400) Data.Set SD:0x400FE01C %Long Data.Long(SD:0x00680404) Data.Set SD:0x400FE024 %Long Data.Long(SD:0x00680408) Data.Set SD:0x400FE194 %Long Data.Long(SD:0x0068040C) Data.Set SD:0x400FB910 %Long Data.Long(SD:0x00680418) Data.Set SD:0x400FB914 %Long Data.Long(SD:0x0068041C) Data.Set SD:0x400FB918 %Long Data.Long(SD:0x00680420) Data.Set SD:0x400FB91C %Long Data.Long(SD:0x00680424) Data.Set SD:0x400FB920 %Long Data.Long(SD:0x00680428) Data.Set SD:0x400FB8C0 %Long Data.Long(SD:0x400FB8C0)|0x00030001 ; Release C28 from Reset RETURN