; --------------------------------------------------------------------------------
; @Title: Example script for programming of MPC5645S (Rainbow) internal flash.
;
; @Description:
;
; Script arguments:
;
;   DO mpc564xs [PREPAREONLY] [SKIPCONFIG]
;
;     PREPAREONLY only declares flash but does not execute flash programming
;     SKIPCONFIG  skip configuration part to allow script external configuration
;
; Example:
;
;   DO ~~/demo/powerpc/flash/mpc564xs PREPAREONLY SKIPCONFIG
;
; Internal Flash Memory 2.0 MByte:
;   Flash A low address range   256 kByte (8*16kByte + 2*64 kByte)
;                               0x00000000--0x0003ffff
;   Flash A Mid address range   256 kByte (2 * 128 kByte)
;                               0x00040000--0x0007ffff
;   High address range          1.5 MByte (2 * 256 kByte)
;                               0x00080000--0x000fffff
;   Shadow row 0                16 kByte
;                               0x00ffc000--0x00ffffff
; 
; Internal SRAM                 64 kByte
;                               0x40000000--0x4000ffff 
;
; Flash register base address is 
;   Flash A                     0xffff8000
;
; NOTES:
; 
;   Flash register base addresses cannot be remapped, because target
;   program does currently not support another base address.
;
; @Author: rweiss
; @Chip: MPC5645S
; @Copyright: (C) 1989-2017 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Rev: 5830 $
; $Id: mpc564xs.cmm 5830 2018-07-16 15:25:52Z rweiss $
;


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=0x00200000

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
)

; initialize internal SRAM (only partially used)
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++0x03fff TARGET Quad 0. ; L0
FLASH.Create 1. 0x00004000++0x03fff TARGET Quad 1. ; L1 
FLASH.Create 1. 0x00008000++0x03fff TARGET Quad 2. ; L2 
FLASH.Create 1. 0x0000C000++0x03fff TARGET Quad 3. ; L3 
FLASH.Create 1. 0x00010000++0x03fff TARGET Quad 4. ; L4 
FLASH.Create 1. 0x00014000++0x03fff TARGET Quad 5. ; L5 
FLASH.Create 1. 0x00018000++0x03fff TARGET Quad 6. ; L6 
FLASH.Create 1. 0x0001c000++0x03fff TARGET Quad 7. ; L7 
FLASH.Create 1. 0x00020000++0x0ffff TARGET Quad 8. ; L8 
FLASH.Create 1. 0x00030000++0x0ffff TARGET Quad 9. ; L9

FLASH.Create 2. 0x00040000++0x1ffff TARGET Quad 0. ; M0
FLASH.Create 2. 0x00060000++0x1ffff TARGET Quad 1. ; M1

LOCAL &flashaddr &Hx
&flashaddr=0x00080000
&Hx=0.
WHILE &flashaddr<&flashsize
(
  FLASH.Create 3. &flashaddr++0x3ffff TARGET Quad &Hx ; H0..H1
  &flashaddr=&flashaddr+0x40000
  &Hx=&Hx+1.
)

; Shadow row
FLASH.Create 4. 0x00ffc000++0x3fff NOP Quad /CENSORSHIP 0x00FFFDD8--0x00FFFDE7

FLASH.TARGET E:0x40000000 E:0x40002000 0x4000 ~~/demo/powerpc/flash/quad/c90fl564xl.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
)

;set JTAG clock back to default
SYStem.BdmClock 4MHz

ENDDO


