; --------------------------------------------------------------------------------
; @Title: Serial FLASH Programming script for AMCC 460EX Evaluation Kit 
; @Description: 
;
;   FLASH type: Serial FLASH(Spansion,S25FL064) connected to SPI controller
;   Serial FLASH CS is connected to the GPIO41 
;
;   S(D)RAM: 0x40000
;
;   SPI Tx Register : 0xEF600902       
;   SPI Rx Register : 0xEF600901      
;   SPI CS Register : 0xEF600C00  ;GPIO Data Out register
;
; @Keywords: SPI Spansion S25FL064
; @Author: JIM
; @Chip: PPC460EX
; @Copyright: (C) 1989-2014 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: ppc460-spi.cmm 4745 2017-09-19 14:44:24Z jjeong $
 
LOCAL &arg1
ENTRY &arg1
&arg1=STRing.UPpeR("&arg1")  // for example "PREPAREONLY"


  SYStem.Down
  SYStem.CPU.PPC460EX
  SYStem.CpuAccess Enable 
  SYStem.Up

  GOSUB Init_BUS

//Set GPIO41 for the SPI Chip selection
  PER.Set.simple AD:0x4:0xEF600C04 %Long 0yxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxxx
  PER.Set.simple AD:0x4:0xEF600C08 %Long 0yxxxxxxxxxxxxxxxxxx00xxxxxxxxxxxx
  PER.Set.simple AD:0x4:0xEF600C10 %Long 0yxxxxxxxxxxxxxxxxxx00xxxxxxxxxxxx
  PER.Set.simple AD:0x4:0xEF600C00 %Long 0yxxxxxxxxx1xxxxxxxxxxxxxxxxxxxxxx

//Set SPI Mode 
  PER.Set.simple AD:0x4:0xEF600900 0x0A  //Active low

 Break.RESet
 FLASHFILE.RESet
 
//FLASHFILE.CONFIG  <tx_reg>    <rx_reg>      <cs_reg>     <cs bits number>
  FLASHFILE.CONFIG  0xEF600902  0xEF600901    0xEF600C00    22.   

// FLASHFILE.TARGET <code range>      <data range>        <Algorithm file>
  FLASHFILE.TARGET 0x40000++0x1FFF    0x42000++0x1FFF    ~~/demo/powerpc/flash/byte/spi64_ppc460.bin

//Read FLASH Manufacture and Device ID
  FLASHFILE.GETID

//End of the test prepareonly
IF "&arg1"=="PREPAREONLY"
ENDDO


//Dump window for Serial FLASH
  ;FLASHFILE.DUMP 0x0

  DIALOG.YESNO "Program flash memory?"
  ENTRY &progflash
  IF &progflash 
  (
    //Erase Serial FLASH 8MB
    &addr=0x0 
    RePeaT 8.
    (
    PRINT "Erasing 1MB from 0x" &addr
    FLASHFILE.Erase &addr++0xFFFFF
    &addr=&addr+0x100000
    )

    //Write Serial FLASH
    FLASHFILE.LOAD.binary  * 0x0
  
  //Save Serial FLASH 
    ;FLASHFILE.SAVE dump.bin 0x0--0x7FFFFF
  )

ENDDO 

Init_BUS:
 
 IF Register(IP)!=0xfffffffc
 STOP "Unconditional reset vector! ...stoped"

Data.Set spr:0x000003b3 %Long 0x00300000 	 		;CCR0

; Setup TLB
MMU.TLBSET 0. 0xff00027000 0xcf000004 0x0000053f 	;Boot Space 16MB
MMU.TLBSET 1. 0xfe00027000 0xce000004 0x0000053f 	;Boot Space 16MB
MMU.TLBSET 2. 0xfd00027000 0xcd000004 0x0000053f 	;Boot Space 16MB
MMU.TLBSET 3. 0xfc00027000 0xcc000004 0x0000053f 	;Boot Space 16MB
MMU.TLBSET 4. 0x0000029000 0x00000000 0x0000043f 	;SDRAM 256MB @ 0x00000000
MMU.TLBSET 5. 0x8000025000 0x00000004 0x0000053f 	;SRAM, On-chip memory
MMU.TLBSET 6. 0xef00027000 0xef000004 0x0000053f 	;Peripherals 16MB
MMU.TLBSET 7. 0xe100020000 0xe1000004 0x0000053f 	;BSCR 1KB

; Peripheral Bus (0x12 - 0x13   EBC_CFGADDR - EBC_CFGDATA
Data.Set dcr:0x00000012 %Long 0x00000023	;CFG:
Data.Set dcr:0x00000013 %Long 0xb8400000
Data.Set dcr:0x00000012 %Long 0x00000010	;B0AP: Boot Flash
Data.Set dcr:0x00000013 %Long 0x10055e00
Data.Set dcr:0x00000012 %Long 0x00000000	;B0CR: 64MB at 0xFC000000, r/w, 16-bit
Data.Set dcr:0x00000013 %Long 0xcc0da000
Data.Set dcr:0x00000012 %Long 0x00000012	;B2AP: BSCR
Data.Set dcr:0x00000013 %Long 0x00804240
Data.Set dcr:0x00000012 %Long 0x00000002	;B2CR:  1MB at 0xE1000000, r/w,  8-bit
Data.Set dcr:0x00000013 %Long 0xe1018000

Data.Set a:4:0xef600b08 %Long 0xaaaaaaaa 	 ;GPIO0_OSRL :
Data.Set a:4:0xef600b0c %Long 0xaaa00000 	 ;GPIO0_OSRH :
Data.Set a:4:0xef600b10 %Long 0xaaaaaaaa 	 ;GPIO0_TSRL :
Data.Set a:4:0xef600b14 %Long 0xaaa00000 	 ;GPIO0_TSRH :

Data.Set a:4:0xef600c08 %Long 0x0c281505 	 ;GPIO1_OSRL :
Data.Set a:4:0xef600c0c %Long 0x40000000 	 ;GPIO1_OSRH :
Data.Set a:4:0xef600c10 %Long 0x00201505 	 ;GPIO1_TSRL :
Data.Set a:4:0xef600c14 %Long 0x40000000 	 ;GPIO1_TSRH :

; SDRAM Controller
Data.Set dcr:0x00000040 %Long 0x0000f800 	 ;MQ0_B0BAS
Data.Set dcr:0x00000041 %Long 0x00000000 	 ;MQ0_B1BAS
Data.Set dcr:0x00000042 %Long 0x00000000 	 ;MQ0_B2BAS
Data.Set dcr:0x00000043 %Long 0x00000000 	 ;MQ0_B3BAS
Data.Set dcr:0x0000004a %Long 0x00000000 	 ;MQ0_BAUL
Data.Set dcr:0x00000050 %Long 0x00000008 	 ;MQ0_BAUH
Data.Set dcr:0x0000004b %Long 0x00001080 	 ;MQ0_CF1L
Data.Set dcr:0x00000045 %Long 0x00001080 	 ;MQ0_CF1H
Data.Set dcr:0x0000004f %Long 0x10a68000 	 ;MQ0_CFBHL

;(0x10 - 0x11  SDRAM_CFGADDR - SDRAM_CFGDATA)
Data.Set dcr:0x00000010 %Long 0x00000022	;MCIF0_MODT0
Data.Set dcr:0x00000011 %Long 0x01000000
Data.Set dcr:0x00000010 %Long 0x00000023	;MCIF0_MODT1
Data.Set dcr:0x00000011 %Long 0x00000000
Data.Set dcr:0x00000010 %Long 0x00000024	;MCIF0_MODT2
Data.Set dcr:0x00000011 %Long 0x00000000
Data.Set dcr:0x00000010 %Long 0x00000025	;MCIF0_MODT3
Data.Set dcr:0x00000011 %Long 0x00000000
Data.Set dcr:0x00000010 %Long 0x00000026	;MCIF0_CODT
Data.Set dcr:0x00000011 %Long 0x00800021
Data.Set dcr:0x00000010 %Long 0x00000030	;MCIF0_RTR:
Data.Set dcr:0x00000011 %Long 0x06180000
Data.Set dcr:0x00000010 %Long 0x00000040	;MCIF0_MB0CF
Data.Set dcr:0x00000011 %Long 0x00000201
Data.Set dcr:0x00000010 %Long 0x00000044	;MCIF0_MB1CF
Data.Set dcr:0x00000011 %Long 0x00000000
Data.Set dcr:0x00000010 %Long 0x00000048	;MCIF0_MB2CF
Data.Set dcr:0x00000011 %Long 0x00000000
Data.Set dcr:0x00000010 %Long 0x0000004c	;MCIF0_MB3CF
Data.Set dcr:0x00000011 %Long 0x00000000
Data.Set dcr:0x00000010 %Long 0x00000080	;MCIF0_CLKTR
Data.Set dcr:0x00000011 %Long 0x40000000
Data.Set dcr:0x00000010 %Long 0x00000081	;MCIF0_WRDTR
Data.Set dcr:0x00000011 %Long 0x82000823
Data.Set dcr:0x00000010 %Long 0x00000085	;MCIF0_SDTR1
Data.Set dcr:0x00000011 %Long 0x80201000
Data.Set dcr:0x00000010 %Long 0x00000086	;MCIF0_SDTR2
Data.Set dcr:0x00000011 %Long 0x42103243
Data.Set dcr:0x00000010 %Long 0x00000087	;MCIF0_SDTR3
Data.Set dcr:0x00000011 %Long 0x0a0d0d16
Data.Set dcr:0x00000010 %Long 0x00000088	;MCIF0_MMODE
Data.Set dcr:0x00000011 %Long 0x00000632
Data.Set dcr:0x00000010 %Long 0x00000089	;MCIF0_MEMODE
Data.Set dcr:0x00000011 %Long 0x00000040
;
Data.Set dcr:0x00000010 %Long 0x00000050	;MCIF0_PLR0
Data.Set dcr:0x00000011 %Long 0xb5380000
Data.Set dcr:0x00000010 %Long 0x00000051	;MCIF0_PLR1
Data.Set dcr:0x00000011 %Long 0x82100400
Data.Set dcr:0x00000010 %Long 0x00000052	;MCIF0_PLR2
Data.Set dcr:0x00000011 %Long 0x80820000
Data.Set dcr:0x00000010 %Long 0x00000053	;MCIF0_PLR3
Data.Set dcr:0x00000011 %Long 0x80830000
Data.Set dcr:0x00000010 %Long 0x00000054	;MCIF0_PLR4
Data.Set dcr:0x00000011 %Long 0x80810040
Data.Set dcr:0x00000010 %Long 0x00000055	;MCIF0_PLR5
Data.Set dcr:0x00000011 %Long 0x80800532
Data.Set dcr:0x00000010 %Long 0x00000056	;MCIF0_PLR6
Data.Set dcr:0x00000011 %Long 0x82100400
Data.Set dcr:0x00000010 %Long 0x00000057	;MCIF0_PLR7
Data.Set dcr:0x00000011 %Long 0x8a080000
Data.Set dcr:0x00000010 %Long 0x00000058	;MCIF0_PLR8
Data.Set dcr:0x00000011 %Long 0x8a080000
Data.Set dcr:0x00000010 %Long 0x00000059	;MCIF0_PLR9
Data.Set dcr:0x00000011 %Long 0x8a080000
Data.Set dcr:0x00000010 %Long 0x0000005a	;MCIF0_PLR10
Data.Set dcr:0x00000011 %Long 0x8a080000
Data.Set dcr:0x00000010 %Long 0x0000005b	;MCIF0_PLR11
Data.Set dcr:0x00000011 %Long 0x80000432
Data.Set dcr:0x00000010 %Long 0x0000005c	;MCIF0_PLR12
Data.Set dcr:0x00000011 %Long 0x808103c0
Data.Set dcr:0x00000010 %Long 0x0000005d	;MCIF0_PLR13
Data.Set dcr:0x00000011 %Long 0x80810040
Data.Set dcr:0x00000010 %Long 0x0000005e	;MCIF0_PLR14
Data.Set dcr:0x00000011 %Long 0x00000000
Data.Set dcr:0x00000010 %Long 0x0000005f	;MCIF0_PLR15
Data.Set dcr:0x00000011 %Long 0x00000000

Data.Set dcr:0x00000010 %Long 0x00000020	;MCIF0_MCOPT1
Data.Set dcr:0x00000011 %Long 0x05122000
Data.Set dcr:0x00000010 %Long 0x00000021	;MCIF0_MCOPT2: Start initialization
Data.Set dcr:0x00000011 %Long 0x20000000
WAIT 500.ms

Data.Set dcr:0x00000010 %Long 0x00000070	;MCIF0_RQDC
Data.Set dcr:0x00000011 %Long 0x80000038
Data.Set dcr:0x00000010 %Long 0x00000074	;MCIF0_RFDC
Data.Set dcr:0x00000011 %Long 0x00000253
Data.Set dcr:0x00000010 %Long 0x00000078	;MCIF0_RDCC
Data.Set dcr:0x00000011 %Long 0xc0000000
Data.Set dcr:0x00000010 %Long 0x0000007a	;MCIF0_DLCR
Data.Set dcr:0x00000011 %Long 0x03000076

Data.Set dcr:0x00000010 %Long 0x00000021	;MCIF0_MCOPT2: Enable memory controller
Data.Set dcr:0x00000011 %Long 0x08000000
WAIT 200.ms

RETURN
