; --------------------------------------------------------------------------------
; @Title: Example script for programming of SPC58xN (Bernina) internal flash
; @Description:
; Configures debugger and processor to program the on-chip NOR flash
; Eiger cut 2 and newer has 128 bit ECC granularity in program and UTEST sectors
; @Author: rweiss
; @Chip: SPC58NN84 SPC58NN80 SPC58EN84 SPC58EN80
; @Keywords: SPC58NN SPC58EN BERNINA
; @Copyright: (C) 1989-2014 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: spc58nn.cmm 5335 2018-02-26 10:28:35Z rweiss $

; Check if script is called with parameters
; Valid parameters:
;   PREPAREONLY        : prepare flash programming without user interaction
;   SKIPCONFIG         : skip configuration part to allow script external configuration
;   PORTSHARING=ON|OFF : enable/disable port sharing for e.g. calibtration tools

LOCAL &parameters &param_prepareonly &param_skipconfig &param_portsharing
ENTRY %LINE &parameters
&param_prepareonly=(STRing.SCAN(STRing.UPpeR("&parameters"),"PREPAREONLY",0)!=-1)
&param_skipconfig=(STRing.SCAN(STRing.UPpeR("&parameters"),"SKIPCONFIG",0)!=-1)
&param_portsharing=STRing.SCANAndExtract(STRing.UPpeR("&parameters"),"PORTSHARING=","")

; ------------------------------------------------------------------------------
; CPU setup

IF !&param_skipconfig
(
  SYStem.RESet
  IF "&param_portsharing"!=""
    SYStem.CONFIG PortSHaring &param_portsharing
    
  SYStem.BdmClock 4.0MHz
  SYStem.DETECT.CPU
  SYStem.CONFIG.CORE 3. 1.
  SYStem.CONFIG.Slave OFF
  SYStem.Option.WATCHDOG OFF
  SYStem.MemAccess NEXUS
  SYStem.Up

  ; Initialize internal SRAM (only partially used)
  Data.Set EA:0x40070000--0x4007FFFF %Quad 0

  ;use direct memory access via XCP slave (after SRAM init)
  IF SYStem.CONFIG.DEBUGPORT()=="XCP0"
    SYStem.MemAccess XCP
)

; ------------------------------------------------------------------------------
; ECC granularity flag (passed to flash binary in extra parameter)
LOCAL &flag_ecc128bit
&flag_ecc128bit=0x02000000

LOCAL &algorithm
IF (Data.Long(DBG:0x601)&0x0FFFFFFF)==0x00212041
  &algorithm="~~/demo/powerpc/flash/quad/c28pcm58nn.bin"
ELSE
  &algorithm="~~/demo/powerpc/flash/quad/c40fm58eg.bin"

; ------------------------------------------------------------------------------
; Flash declaration

FLASH.RESet

; Low address space
FLASH.Create 1. 0x00404000--0x00407FFF NOP    Quad 0x0000|&flag_ecc128bit /INFO "BAF (read only)"
FLASH.Create 1. 0x00FC4000--0x00FC7FFF TARGET Quad 0x0001|&flag_ecc128bit
FLASH.Create 1. 0x00FCC000--0x00FCFFFF TARGET Quad 0x0002|&flag_ecc128bit
FLASH.Create 1. 0x00FC0000--0x00FC3FFF TARGET Quad 0x0003|&flag_ecc128bit
FLASH.Create 1. 0x00FC8000--0x00FCBFFF TARGET Quad 0x0004|&flag_ecc128bit
FLASH.Create 1. 0x0060C000--0x0060FFFF NOP    Quad 0x0005|&flag_ecc128bit /INFO "HSM code 16K"
FLASH.Create 1. 0x00FD0000--0x00FD7FFF TARGET Quad 0x0006|&flag_ecc128bit
FLASH.Create 1. 0x00FD8000--0x00FDFFFF TARGET Quad 0x0007|&flag_ecc128bit
FLASH.Create 1. 0x00FE0000--0x00FEFFFF TARGET Quad 0x0008|&flag_ecc128bit
FLASH.Create 1. 0x00FF0000--0x00FFFFFF TARGET Quad 0x0009|&flag_ecc128bit
FLASH.Create 1. 0x00610000--0x0061FFFF NOP    Quad 0x000a|&flag_ecc128bit /INFO "HSM code 64K"
FLASH.Create 1. 0x00620000--0x0062FFFF NOP    Quad 0x000b|&flag_ecc128bit /INFO "HSM code 64K"
; Mid address space
FLASH.Create 2. 0x00680000--0x00683FFF NOP    Quad 0x0100 /INFO "HSM data"
FLASH.Create 2. 0x00684000--0x00687FFF NOP    Quad 0x0101 /INFO "HSM data"
; High address space
FLASH.Create 3. 0x00800000--0x0080FFFF TARGET Quad 0x0200
FLASH.Create 3. 0x00810000--0x0081FFFF TARGET Quad 0x0201
FLASH.Create 3. 0x00820000--0x0082FFFF TARGET Quad 0x0202
FLASH.Create 3. 0x00830000--0x0083FFFF TARGET Quad 0x0203
; 128k/256k address space
FLASH.Create 4. 0x01000000--0x0101FFFF TARGET Quad 0x0300|&flag_ecc128bit
FLASH.Create 4. 0x01020000--0x0103FFFF TARGET Quad 0x0301|&flag_ecc128bit
FLASH.Create 4. 0x01040000--0x0107FFFF TARGET Quad 0x0302|&flag_ecc128bit
FLASH.Create 4. 0x01080000--0x010BFFFF TARGET Quad 0x0303|&flag_ecc128bit
FLASH.Create 4. 0x010C0000--0x010FFFFF TARGET Quad 0x0304|&flag_ecc128bit
FLASH.Create 4. 0x01100000--0x0113FFFF TARGET Quad 0x0305|&flag_ecc128bit
FLASH.Create 4. 0x01140000--0x0117FFFF TARGET Quad 0x0306|&flag_ecc128bit
FLASH.Create 4. 0x01180000--0x011BFFFF TARGET Quad 0x0307|&flag_ecc128bit
FLASH.Create 4. 0x011C0000--0x011FFFFF TARGET Quad 0x0308|&flag_ecc128bit
FLASH.Create 4. 0x01200000--0x0123FFFF TARGET Quad 0x0309|&flag_ecc128bit
FLASH.Create 4. 0x01240000--0x0127FFFF TARGET Quad 0x030a|&flag_ecc128bit
FLASH.Create 4. 0x01280000--0x012BFFFF TARGET Quad 0x030b|&flag_ecc128bit
FLASH.Create 4. 0x012C0000--0x012FFFFF TARGET Quad 0x030c|&flag_ecc128bit
FLASH.Create 4. 0x01300000--0x0133FFFF TARGET Quad 0x030d|&flag_ecc128bit
FLASH.Create 4. 0x01340000--0x0137FFFF TARGET Quad 0x030e|&flag_ecc128bit
FLASH.Create 4. 0x01380000--0x013BFFFF TARGET Quad 0x030f|&flag_ecc128bit
IF CPUIS(*N84)
(
  FLASH.Create 4. 0x013C0000--0x013FFFFF TARGET Quad 0x0310|&flag_ecc128bit
  FLASH.Create 4. 0x01400000--0x0143FFFF TARGET Quad 0x0311|&flag_ecc128bit
  FLASH.Create 4. 0x01440000--0x0147FFFF TARGET Quad 0x0312|&flag_ecc128bit
  FLASH.Create 4. 0x01480000--0x014BFFFF TARGET Quad 0x0313|&flag_ecc128bit
  FLASH.Create 4. 0x014C0000--0x014FFFFF TARGET Quad 0x0314|&flag_ecc128bit
  FLASH.Create 4. 0x01500000--0x0153FFFF TARGET Quad 0x0315|&flag_ecc128bit
  FLASH.Create 4. 0x01540000--0x0157FFFF TARGET Quad 0x0316|&flag_ecc128bit
  FLASH.Create 4. 0x01580000--0x015BFFFF TARGET Quad 0x0317|&flag_ecc128bit
)
; UTEST address space
FLASH.Create 6. 0x00400000--0x00403FFF TARGET Quad 0x0500|&flag_ecc128bit /OTP /INFO "UTEST"

; Overlay enabled mapping
FLASH.CreateALIAS 0x08A00000--0x08FFFFFF 0x00A00000   ; Small & medium flash blocks
FLASH.CreateALIAS 0x09000000--0x09FFFFFF 0x01000000   ; Large flash blocks

FLASH.TARGET E:0x40070000 E:0x40072000 0x1000 "&algorithm" /STACKSIZE 0x0200 /DualPort

; Flash script ends here if called with parameter PREPAREONLY
IF &param_prepareonly
  ENDDO

; ------------------------------------------------------------------------------
; Flash programming

DIALOG.YESNO "Flash programming prepared. Program flash memory now?"
LOCAL &progflash
ENTRY &progflash

IF &progflash 
(
  FLASH.ReProgram ALL /Erase
  Data.LOAD.auto *
  FLASH.ReProgram.off 
)
ELSE
(
  FLASH.List
)

ENDDO
