; --------------------------------------------------------------------------------
; @Title: Example script for programming internal flash of JPC560x derivatives
;
; @Description:
; Example script for programming internal flash of JPC560x derivatives:
; - SPC560Bxx
; - MPC560xB
; - SPC560Pxx
; - MPC560xP
; - SPC560Sxx
; - MPC560xS
;
; Internal Program Flash Memory Bank 0 with 512 kByte:
;   Low address range   256 kByte (32, 16, 16, 32, 32, 128 kByte)
;                       0x00000000--0x0003ffff
;   Mid address range   256 kByte (2 * 128 kByte)
;                       0x00040000--0x0007ffff
;   Shadow row          32 kByte
;                       0x00200000--0x00203fff
;
; Internal Program Flash Memory Bank 1 with 512 kByte:
;   Low address range   256 kByte (32, 16, 16, 32, 32, 128 kByte)
;                       0x00080000--0x000bffff
;   Mid address range   256 kByte (2 * 128 kByte)
;                       0x000c0000--0x000fffff
;
; Internal Data Flash Memory with 64 kByte:
;   Low address range   64 kByte (4 * 16 kByte)
;                       0x00800000--0x0080ffff
;
; Internal SRAM         40 kByte
;                       0x40000000--0x40009fff
;
; Flash register base address is:
;   Flash Bank 0:       0xc3f88000
;   Flash Bank 1:       0xc3fb0000
;   Data Bank:          0xc3f8c000
;
; @Author: WRD
; @Chip: MPC560* SPC560*
; @Copyright: (C) 1989-2017 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Rev: 5865 $
; $Id: jpc560x.cmm 5865 2018-07-25 09:52:06Z 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
LOCAL &parameters &param_prepareonly &param_skipconfig
ENTRY %LINE &parameters
&param_prepareonly=(STRing.SCAN(STRing.UPpeR("&parameters"),"PREPAREONLY",0)!=-1)
&param_skipconfig=(STRing.SCAN(STRing.UPpeR("&parameters"),"SKIPCONFIG",0)!=-1)

LOCAL &flashsize &flashdriver &multiflashbanks &newflashconfig
&flashsize=0x000000000
&flashdriver="tbd.bin"
&multiflashbanks=0
&newflashconfig=0

LOCAL &DualPort
IF VERSION.BUILD.BASE()>=45520.
  &DualPort="/DualPort"

; --------------------------------------------------------------------------------
; CPU setup

IF !&param_skipconfig
(
  SYStem.RESet
  SYStem.BdmClock 4.0MHz
  SYStem.CPU MPC55XX

  SYStem.DETECT.CPU
  SYStem.Option.WATCHDOG OFF
  SYStem.Up

; repeat CPU detection to ensure that the debugger
; can read from MIDR register for detection
  SYStem.DETECT.CPU
  SYStem.Up
)

; protect from accessing unimplemented memory (open Data.List/Dump windows)
MAP.DenyAccess 0x20000000--0x3FFFFFFF

; --------------------------------------------------------------------------------
; Flash declaration

IF (CPU()=="SPC560D30"||CPU()=="MPC5601D")        ; Bolero128k (type Bolero256k)
(
  &flashsize=0x00020000
  &flashdriver="c90fl560x256k.bin"
  SYStem.MemAccess.Denied
  &DualPort=""
)
ELSE IF (CPU()=="SPC560D40"||CPU()=="MPC5602D")   ; Bolero256k
(
  &flashsize=0x00040000
  &flashdriver="c90fl560x256k.bin"
  SYStem.MemAccess.Denied
  &DualPort=""
)
ELSE IF (CPU()=="SPC560B40")||(CPU()=="MPC5602B")||(CPU()=="SPC560C40")||(CPU()=="MPC5602C") ; Bolero256k (type Bolero512k)
(
  &flashsize=0x00040000
  &flashdriver="c90lc560x.bin"
)
ELSE IF (CPU()=="SPC560B44")||(CPU()=="MPC5603B")||(CPU()=="SPC560C44")||(CPU()=="MPC5603C") ; Bolero384k (type Bolero512k)
(
  &flashsize=0x00060000
  &flashdriver="c90lc560x.bin"
)
ELSE IF (CPU()=="SPC560B50")||(CPU()=="MPC5604B")||(CPU()=="SPC560C50")||(CPU()=="MPC5604C") ; Bolero512k
(
  &flashsize=0x00080000
  &multiflashbanks=1
  &flashdriver="c90lc560x.bin"
)
ELSE IF (CPU()=="SPC560B54")||(CPU()=="MPC5605B") ; Bolero768K (type Bolero1.5M)
(
  &flashsize=0x000C0000
  &flashdriver="c90fl5607b.bin"
)
ELSE IF (CPU()=="SPC560B60")||(CPU()=="MPC5606B") ; Bolero1M (type Bolero1.5M)
(
  &flashsize=0x00100000
  &flashdriver="c90fl5607b.bin"
)
ELSE IF (CPU()=="SPC560B64")||(CPU()=="MPC5607B") ; Bolero1.5M
(
  &flashsize=0x00180000
  &flashdriver="c90fl5607b.bin"
)
ELSE IF (CPU()=="SPC560P34")||(CPU()=="MPC5601P") ; Pictus192k (type Pictus256k)
(
  &flashsize=0x00030000
  &flashdriver="c90fl560x256k.bin"
  SYStem.MemAccess.Denied
  &DualPort=""
)
ELSE IF (CPU()=="SPC560P40")||(CPU()=="MPC5602P") ; Pictus256k
(
  LOCAL &NPC_DID
  &NPC_DID=Data.Long(DBG:0x80)
  IF ((&NPC_DID&0x0FFFF000)==0x0AE20000)||((&NPC_DID&0x0FFFF000)==0x0AE21000) ; Pictus256k (type Pictus512k)
  (
    &flashsize=0x00040000
    &flashdriver="c90lc560x.bin"
  )
  ELSE                                            ; Pictus256k
  (
    &flashsize=0x00040000
    &flashdriver="c90fl560x256k.bin"
    SYStem.MemAccess.Denied
    &DualPort=""
  )
)
ELSE IF (CPU()=="SPC560P44")||(CPU()=="MPC5603P") ; Pictus384k (type Pictus512k)
(
  &flashsize=0x00060000
  &flashdriver="c90lc560x.bin"
)
ELSE IF (CPU()=="SPC560P50")||(CPU()=="MPC5604P") ; Pictus512k
(
  &flashsize=0x00080000
  &multiflashbanks=1
  &flashdriver="c90lc560x.bin"
)
ELSE IF (CPU()=="SPC560S")||(CPU()=="MPC5606S")   ; Spectrum1M
(
  &flashsize=0x00100000
  &multiflashbanks=1
  &flashdriver="c90lc560x.bin"

  LOCAL &NPC_DID
  &NPC_DID=Data.Long(DBG:0x80)
  IF (&NPC_DID&0x0FFFF000)!=0x0AE60000
  (
    ;Spectrum cut2 or newer
    &newflashconfig=1
  )
)
ELSE
(
  IF SIMULATOR()
    PRINT %ERROR "Flash script can not run in Simulator."
  ELSE
    PRINT %ERROR "CPU " CPU() " not supported by this script."
  ENDDO
)

; initialize internal SRAM
Data.Set EA:0x40000000--0x40002fff %Quad 0

FLASH.RESet

; Flash bank 0
FLASH.Create 1. 0x00000000++0x07fff TARGET Quad 0. ; L0
FLASH.Create 1. 0x00008000++0x03fff TARGET Quad 1. ; L1
FLASH.Create 1. 0x0000c000++0x03fff TARGET Quad 2. ; L2
FLASH.Create 1. 0x00010000++0x07fff TARGET Quad 3. ; L3
FLASH.Create 1. 0x00018000++0x07fff TARGET Quad 4. ; L4
IF &flashsize>0x00020000
(
  FLASH.Create 1. 0x00020000++0x1ffff TARGET Quad 5. ; L5
)

IF &flashsize>0x00040000
(
  FLASH.Create 2. 0x00040000++0x1ffff TARGET Quad 0. ; M0
)
IF &flashsize>0x00060000
(
  FLASH.Create 2. 0x00060000++0x1ffff TARGET Quad 1. ; M1
)

IF &flashsize>0x00080000
(
  IF &multiflashbanks==1
  (
    IF &newflashconfig==1
    (
      FLASH.Create 3. (0x00080000+0x00000000)++0x1ffff TARGET Quad 0. ; L0
      FLASH.Create 3. (0x00080000+0x00020000)++0x1ffff TARGET Quad 1. ; L1
    )
    ELSE
    (
      ; Flash bank 1
      FLASH.Create 3. (0x00080000+0x00000000)++0x07fff TARGET Quad 0. ; L0
      FLASH.Create 3. (0x00080000+0x00008000)++0x03fff TARGET Quad 1. ; L1
      FLASH.Create 3. (0x00080000+0x0000c000)++0x03fff TARGET Quad 2. ; L2
      FLASH.Create 3. (0x00080000+0x00010000)++0x07fff TARGET Quad 3. ; L3
      FLASH.Create 3. (0x00080000+0x00018000)++0x07fff TARGET Quad 4. ; L4
      FLASH.Create 3. (0x00080000+0x00020000)++0x1ffff TARGET Quad 5. ; L5
    )
    FLASH.Create 4. (0x00080000+0x00040000)++0x1ffff TARGET Quad 0. ; M0
    FLASH.Create 4. (0x00080000+0x00060000)++0x1ffff TARGET Quad 1. ; M1
  )
  ELSE
  (
    LOCAL &flashaddr &Hx
    &flashaddr=0x00080000
    &Hx=0.
    WHILE &flashaddr<&flashsize
    (
      FLASH.Create 3. &flashaddr++0x1ffff TARGET Quad &Hx ; H0..H11
      &flashaddr=&flashaddr+0x20000
      &Hx=&Hx+1.
    )
  )
)

; Shadow row
FLASH.Create 9. 0x00200000++0x3fff NOP Quad /CENSORSHIP 0x00203DD8--0x00203DE7 /INFO "Shadow Row"

; Data flash
FLASH.Create 10. 0x00800000++0x3fff TARGET Quad 0.
FLASH.Create 10. 0x00804000++0x3fff TARGET Quad 1.
FLASH.Create 10. 0x00808000++0x3fff TARGET Quad 2.
FLASH.Create 10. 0x0080c000++0x3fff TARGET Quad 3.

; CFLASH UTEST sector (OTP)
FLASH.Create 11. 0x00400000++0x1fff TARGET Quad 0. /OTP /INFO "C UTEST - User OTP area"
FLASH.Create 11. 0x00402000++0x1cff NOP    Quad 0. /OTP /INFO "C UTEST - Reserved"
FLASH.Create 11. 0x00403d00++0x00e7 TARGET Quad 0. /OTP /INFO "C UTEST - User OTP area"
FLASH.Create 11. 0x00403de8++0x0007 TARGET Quad 0. /OTP /INFO "C UTEST - NV Low/Mid Space Block Locking"
FLASH.Create 11. 0x00403df0++0x0007 NOP    Quad 0. /OTP /INFO "C UTEST - Reserved"
FLASH.Create 11. 0x00403df8++0x0007 TARGET Quad 0. /OTP /INFO "C UTEST - NV Secondary Low/Mid Space Block Locking"
FLASH.Create 11. 0x00403e00++0x00ff TARGET Quad 0. /OTP /INFO "C UTEST - User OTP area"
FLASH.Create 11. 0x00403f00++0x00ff NOP    Quad 0. /OTP /INFO "C UTEST - Reserved"

; DFLASH UTEST sector (OTP)
FLASH.Create 12. 0x00c00000++0x1fff TARGET Quad 0. /OTP /INFO "D UTEST - User OTP area"
FLASH.Create 12. 0x00c02000++0x1cff NOP    Quad 0. /OTP /INFO "D UTEST - Reserved"
FLASH.Create 12. 0x00c03d00++0x00e7 TARGET Quad 0. /OTP /INFO "D UTEST - User OTP area"
FLASH.Create 12. 0x00c03de8++0x0007 TARGET Quad 0. /OTP /INFO "D UTEST - NV Low/Mid Address Block Locking"
FLASH.Create 12. 0x00c03df0++0x0007 NOP    Quad 0. /OTP /INFO "D UTEST - Reserved"
FLASH.Create 12. 0x00c03df8++0x0007 TARGET Quad 0. /OTP /INFO "D UTEST - NV Secondary Low/Mid Address Block Locking"
FLASH.Create 12. 0x00c03e00++0x00ff TARGET Quad 0. /OTP /INFO "D UTEST - User OTP area"
FLASH.Create 12. 0x00c03f00++0x00ff NOP    Quad 0. /OTP /INFO "D UTEST - Reserved"

FLASH.TARGET E:0x40000000 E:0x40001400 0x1000 ~~/demo/powerpc/flash/quad/&flashdriver /STACKSIZE 0x0200 &DualPort

; flash script ends here if called with parameter PREPAREONLY
IF &param_prepareonly
  ENDDO PREPAREDONE

; --------------------------------------------------------------------------------
; Flash programming example
;
; Flash programming speed is about three times faster when memory class E:
; is used for data buffer (DUALPORT memory access). For DUALPORT access it
; is required to setup MemAccess NEXUS for both, NEXUS and JTAG debugger.

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