; --------------------------------------------------------------------------------
; @Title:  Example script for programming of MPC5645S external QSPI FLASH.
; @Description: 
;
; internal ram : 0x40000000
; QuadSPI controller base : 0xFFFA0000
; QuadSPI mapped base : 0x80000000 , parallel mode Flash AB
; QuadSPI mapped base : 0x70000000 , serial mode Flash A
; QuadSPI mapped base : 0x78000000 , serial mode Flash B
;
; @Keywords: QSPI QuadSPI
; @Author: JIM
; @Chip: MPC560?S
; @Copyright: (C) 1989-2014 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: mpc5645-quadspi.cmm 5942 2018-08-14 14:54:59Z jjeong $

LOCAL &arg1
ENTRY &arg1
&arg1=STRing.UPpeR("&arg1")  // for example "PREPAREONLY"

LOCAL &Micron_Flash
&Micron_Flash=1 ;For Numonyx or Micron flash

LOCAL &QSPI_MAP_ADDRESS
;&QSPI_MAP_ADDRESS=0x80000000    ; Quad SPI parallel mode
&QSPI_MAP_ADDRESS=0x70000000   ; Quad SPI serial mode for Flash A. or 0x78000000 (Flash B)

  SYStem.RESet
  SYStem.CPU MPC5645S
  SYStem.Up

;initialize internal SRAM
  Data.Set EA:0x40000000--0x4000ffff %Quad 0

GOSUB board_cfg


IF &Micron_Flash==1
( //For  Numonyx or Micron flash
  PER.Set.simple ANC:0xFFFA0000 %Long 0x30f0020   ;numonyx select
  PER.Set.simple ANC:0xFFFA0004 %Long 0x0         ;dummy cycle 0
)

  FLASHFILE.RESet
 
; FLASHFILE.CONFIG  <QSPI Ctrl Base>  <flash mapped address>   <unused>    <unused>
  FLASHFILE.CONFIG  0xFFFA0000         &QSPI_MAP_ADDRESS         0x0         0x0

; FLASHFILE.TARGET <code range>            <data range>            <Algorithm file>
  FLASHFILE.TARGET EANC:0x40000000++0x1FFF EANC:0x40002000++0x27FF  ~~/demo/powerpc/flash/byte/spi64_mpc5645qspi.bin /KEEP  /dualport

IF &QSPI_MAP_ADDRESS==0x80000000
(
  FLASHFILE.BLOCKSIZE 0x20000   ; bcz two 64KB block flashes are parallel mode
)

  FLASHFILE.GETID

//End of the test prepareonly
IF "&arg1"=="PREPAREONLY"
ENDDO


; D 0x80000000  ; or FLASHFILE.DUMP 0x0
; FLASHFILE.ERASE 0x0--0xFFFFF
; FLASHFILE.LOAD * 0x0
; FLASHFILE.LOAD * 0x0 /ComPare

ENDDO


board_cfg:

  MMU.Set TLB1 0x0 0x40000C00 0x00000020 0x0000003F
  MMU.Set TLB1 0x1 0xC0000400 0x40000008 0x4000003F   
  MMU.Set TLB1 0x2 0xC0000A00 0x8FF00028 0x8FF0003F
  MMU.Set TLB1 0x3 0xC0000a00 0xC3F00028 0xC3F0003F
  MMU.Set TLB1 0x4 0xC0000A00 0xFFE00028 0xFFE0003F
  MMU.Set TLB1 0x5 0xC0000880 0x70000028 0x7000003F
  MMU.Set TLB1 0x6 0xC0000880 0x78000028 0x7800003F
  MMU.Set TLB1 0x7 0xC0000880 0x80000028 0x8000003F


//MC_ME
PER.Set.simple ANC:0xC3FDC008 %Long 0x25FF // Enable all modes
PER.Set.simple ANC:0xC3FDC080 %Long 0xFE  // Enable all peripherals in all run modes
PER.Set.simple ANC:0xC3FDC054 %Long 0x81000F  // FIRC disabled
PER.Set.simple ANC:0xC3FDC0A0 %Long 0x2000
PER.Set.simple ANC:0xC3FDC004 %Long 0x3000A5F0  // DRUN Mode & Key
PER.Set.simple ANC:0xC3FDC004 %Long 0x3000A50F // DRUN Mode & Key


PER.Set.simple ANC:0xC3FE0378 %Long 0x4000000
PER.Set.simple ANC:0xC3FE037C 0x83
PER.Set.simple ANC:0xC3FE037D 0x81
PER.Set.simple ANC:0xC3FE037E 0x81

PER.Set.simple ANC:0xC3F900D6 %Word 0x708  ; QSPI IO1_B
PER.Set.simple ANC:0xC3F900D8 %Word 0x708  ; QSPI IO0_B
PER.Set.simple ANC:0xC3F9012C %Word 0x708  ; QUADSPI_PCS_B
PER.Set.simple ANC:0xC3F9012E %Word 0x700  ; QUADSPI_CLK_B
PER.Set.simple ANC:0xC3F90130 %Word 0x708  ; QUADSPI_IO3_B
PER.Set.simple ANC:0xC3F90134 %Word 0x708  ; QUADSPI_IO3_B

PER.Set.simple ANC:0xC3F900E0 %Word 0x0708
PER.Set.simple ANC:0xC3F900E2 %Word 0x0708
PER.Set.simple ANC:0xC3F900E4 %Word 0x0708
PER.Set.simple ANC:0xC3F900E6 %Word 0x0708
PER.Set.simple ANC:0xC3F900E8 %Word 0x0708
PER.Set.simple ANC:0xC3F900EA %Word 0x0700
PER.Set.simple ANC:0xC3F900D6 %Word 0x0708
PER.Set.simple ANC:0xC3F900D8 %Word 0x0708
PER.Set.simple ANC:0xC3F9012C %Word 0x0708
PER.Set.simple ANC:0xC3F9012E %Word 0x0700
PER.Set.simple ANC:0xC3F90130 %Word 0x0708
PER.Set.simple ANC:0xC3F90134 %Word 0x0708
PER.Set.simple ANC:0xC3FE0398 %Long 0x0
PER.Set.simple ANC:0xC3FE039C 0x82

//For Spansion flash , default
PER.Set.simple ANC:0xFFFA0000 %Long 0x030F0010
PER.Set.simple ANC:0xFFFA0158 %Long 0x080EB

RETURN


FLASH_WRITE_EXT_ADDR_REG:
//For Micron Flash to access complete memory data
&add_cnt=0
rpt 16.
(
FLASHFILE.spicmd 0x06            ;write enable
FLASHFILE.spicmd 0xc5 &add_cnt   ;write ext address reg
FLASHFILE.spicmd 0xc8 /READ 4.   ;read  ext address reg
&add_cnt=&add_cnt+0x1
)

RETURN