; --------------------------------------------------------------------------------
; @Title: Example script for programming of Bolero3M internal flash.
;
; @Description:
; Supported Processors:
; MPC5644B, SPC564B64, MPC5644C, SPC56EC64: 1.5MB
; MPC5645B, SPC564B70, MPC5645C, SPC56EC70: 2.0MB
; MPC5646B, SPC564B74, MPC5646C, SPC56EC74: 3.0MB
;
; Internal Flash Memory:
;   Flash Bank 0 low address range   512 kByte 
;                                    (32, 16, 16, 32, 32, 128, 128, 128 kByte)
;                                    0x00000000--0x0007ffff
;   Flash Bank 0 mid address range   512 kByte (4 * 128 kByte)
;                                    0x00080000--0x000fffff
;   Flash Bank 0 high address range  512 kByte (4 * 128 kByte)
;                                    0x00100000--0x0017ffff
;   Flash Bank 2 mid address range   512 kByte (4 * 128 kByte)
;                                    0x00180000--0x001fffff
;   Flash Bank 2 high address range  512 kByte (4 * 128 kByte)
;                                    0x00200000--0x0027ffff
;   Flash Bank 2 low address range   512 kByte 
;                                    (32, 16, 16, 32, 32, 128, 128, 128 kByte)
;                                    0x00280000--0x002fffff
;
;   Shadow row (Flash Bank 0)        16 kByte
;                                    0x00ffc000--0x00ffffff
;
;   User OTP area (Flash Bank 1)     8 kByte
;                                    0x00e08000--0x00e09fff
;
;   Data Flash (Bank 1)              64 kByte (4 * 16 kByte)
;                                    0x00800000--0x0080ffff
; 
; Internal SRAM                      128..256 kByte
;                                    starting at 0x40000000
;
; Flash register base addresses are
;   Flash Bank 0 (CFLASH 0)          0xC3F88000
;   Flash Bank 2 (CFLASH 0)          0xC3FB0000
;   Data Flash Bank 1 (DFLASH 0)     0xC3F8C000
;
; NOTES:
; 
;   Flash register base addresses cannot be remapped, because target
;   program does currently not support another base address.
;
; @Author: rweiss
; @Chip: Bolero3M
; @Copyright: (C) 1989-2017 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Rev: 4131 $
; $Id: jpc564xbc.cmm 4131 2017-02-09 13:33:05Z 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
&flashsize="tbd"

LOCAL &DualPort
IF VERSION.BUILD.BASE()>=45520.
  &DualPort="/DualPort"

; --------------------------------------------------------------------------------
; CPU setup

IF !&param_skipconfig
(
  SYStem.RESet
  SYStem.BdmClock 4.0MHz
  SYStem.CPU MPC55XX
  SYStem.Option.WATCHDOG OFF
  SYStem.DETECT.CPU
  SYStem.Up
)

IF (CPU()=="MPC5644B")||(CPU()=="SPC564B64")||(CPU()=="MPC5644C")||(CPU()=="SPC56EC64")
(
  &flashsize=0x00180000
)
ELSE IF (CPU()=="MPC5645B")||(CPU()=="SPC564B70")||(CPU()=="MPC5645C")||(CPU()=="SPC56EC70")
(
  &flashsize=0x00200000
)
ELSE IF (CPU()=="MPC5646B")||(CPU()=="SPC564B74")||(CPU()=="MPC5646C")||(CPU()=="SPC56EC74")
(
  &flashsize=0x00300000
)
ELSE
(
  PRINT %ERROR "Error: " CPU() " not supported by this script."
  ENDDO
)

; initialize internal SRAM
Data.Set EA:0x40000000--0x40007fff %Quad 0

; setup MMU for flash, RAM and register access
MMU.Set TLB1 0x0 0x00000000 0x00000000 0x00000000
MMU.Set TLB1 0x1 0xC0000500 0xFFF0000A 0xFFF0003F
MMU.Set TLB1 0x2 0xC0000700 0x20000000 0x2000003F
MMU.Set TLB1 0x3 0xC0000400 0x40000008 0x4000003F
MMU.Set TLB1 0x4 0xC0000500 0xC3F00008 0xC3F0003F
MMU.Set TLB1 0x5 0xC0000700 0x00000000 0x0000003F

; --------------------------------------------------------------------------------
; Flash declaration

FLASH.RESet

FLASH.Create 1. 0x00000000++0x07fff TARGET Quad 0.  ; CFLASH_0-Module_0 L0 
FLASH.Create 1. 0x00008000++0x03fff TARGET Quad 1.  ; CFLASH_0-Module_0 L1
FLASH.Create 1. 0x0000c000++0x03fff TARGET Quad 2.  ; CFLASH_0-Module_0 L2
FLASH.Create 1. 0x00010000++0x07fff TARGET Quad 3.  ; CFLASH_0-Module_0 L3
FLASH.Create 1. 0x00018000++0x07fff TARGET Quad 4.  ; CFLASH_0-Module_0 L4
FLASH.Create 1. 0x00020000++0x1ffff TARGET Quad 5.  ; CFLASH_0-Module_0 L5

FLASH.Create 2. 0x00040000++0x1ffff TARGET Quad 0.  ; CFLASH_0-Module_0 M0
FLASH.Create 2. 0x00060000++0x1ffff TARGET Quad 1.  ; CFLASH_0-Module_0 M1

FLASH.Create 3. 0x00080000++0x1ffff TARGET Quad 0.  ; CFLASH_0-Module_1 H0
FLASH.Create 3. 0x000a0000++0x1ffff TARGET Quad 1.  ; CFLASH_0-Module_1 H1
FLASH.Create 3. 0x000c0000++0x1ffff TARGET Quad 2.  ; CFLASH_0-Module_1 H2
FLASH.Create 3. 0x000e0000++0x1ffff TARGET Quad 3.  ; CFLASH_0-Module_1 H3
FLASH.Create 3. 0x00100000++0x1ffff TARGET Quad 4.  ; CFLASH_0-Module_2 H4
FLASH.Create 3. 0x00120000++0x1ffff TARGET Quad 5.  ; CFLASH_0-Module_2 H5
FLASH.Create 3. 0x00140000++0x1ffff TARGET Quad 6.  ; CFLASH_0-Module_2 H6
FLASH.Create 3. 0x00160000++0x1ffff TARGET Quad 7.  ; CFLASH_0-Module_2 H7

IF &flashsize>0x00180000
(
  ; Array_D
  FLASH.Create 4. 0x00180000++0x1ffff TARGET Quad 0.  ; CFLASH_1-Module_1 H0
  FLASH.Create 4. 0x001a0000++0x1ffff TARGET Quad 1.  ; CFLASH_1-Module_1 H1
  FLASH.Create 4. 0x001c0000++0x1ffff TARGET Quad 2.  ; CFLASH_1-Module_1 H2
  FLASH.Create 4. 0x001e0000++0x1ffff TARGET Quad 3.  ; CFLASH_1-Module_1 H3
)  
IF &flashsize>0x00200000
(
  ; Array_E
  FLASH.Create 4. 0x00200000++0x1ffff TARGET Quad 4.  ; CFLASH_1-Module_2 H4
  FLASH.Create 4. 0x00220000++0x1ffff TARGET Quad 5.  ; CFLASH_1-Module_2 H5
  FLASH.Create 4. 0x00240000++0x1ffff TARGET Quad 6.  ; CFLASH_1-Module_2 H6
  FLASH.Create 4. 0x00260000++0x1ffff TARGET Quad 7.  ; CFLASH_1-Module_2 H7
)
IF &flashsize>0x00280000
(
  ; Array_F
  FLASH.Create 5. 0x00280000++0x07fff TARGET Quad 0.  ; CFLASH_1-Module_0 L0
  FLASH.Create 5. 0x00288000++0x03fff TARGET Quad 1.  ; CFLASH_1-Module_0 L1
  FLASH.Create 5. 0x0028c000++0x03fff TARGET Quad 2.  ; CFLASH_1-Module_0 L2
  FLASH.Create 5. 0x00290000++0x07fff TARGET Quad 3.  ; CFLASH_1-Module_0 L3
  FLASH.Create 5. 0x00298000++0x07fff TARGET Quad 4.  ; CFLASH_1-Module_0 L4
  FLASH.Create 5. 0x002a0000++0x1ffff TARGET Quad 5.  ; CFLASH_1-Module_0 L5
  
  FLASH.Create 6. 0x002c0000++0x1ffff TARGET Quad 0.  ; CFLASH_1-Module_0 M0
  FLASH.Create 6. 0x002e0000++0x1ffff TARGET Quad 1.  ; CFLASH_1-Module_0 M1
)
; Shadow row
FLASH.Create 7. 0x00ffc000++0x3fff NOP Quad /CENSORSHIP 0x00fffdd8--0x00fffde7 /INFO "Shadow Row"

;User OTP area
FLASH.Create 8. 0x00e08000++0x1fff  NOP Quad /OTP /INFO "UTEST"

; Data flash
FLASH.Create 9. 0x00800000++0x3fff TARGET Quad 0.
FLASH.Create 9. 0x00804000++0x3fff TARGET Quad 1.
FLASH.Create 9. 0x00808000++0x3fff TARGET Quad 2.
FLASH.Create 9. 0x0080c000++0x3fff TARGET Quad 3.

FLASH.TARGET E:0x40000000 E:0x40002800 0x1000 ~~/demo/powerpc/flash/quad/c90fl564xb.bin /STACKSIZE 0x0200 &DualPort

;flash script ends here if called with parameter PREPAREONLY
IF &param_prepareonly
  ENDDO

; --------------------------------------------------------------------------------
; 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
