; --------------------------------------------------------------------------------
; @Title: Tricore TC37x Serial SPI flash program
; @Description:
;   Example script for flash declaration and programming of Infineon
;   TriCore TC3x7 Evaluation board, Serial SPI Flash N25Q00
;   The SPI flash is connected to QSPI3
;
;  pin connection
;  symbol       port          spi_memory
;  QSPI3_SLSO5  P02.4(ALT3)   SPI_CS_Flash0, not mount
;  QSPI3_SLSO3  P00.5(ALT3)   SPI_CS_Flash1
;  QSPI3_MRSTB  P02.5(IN)     SPI_MISO
;  QSPI3_SCLK   P02.7(ALT3)   SPI_CLK
;  QSPI3_MTSR   P02.6(ALT3)   SPI_MOSI
;
;  S(D)RAM: 0x70100000
;  Quad SPI Controller Base Addr: 0xF0001F00 (QSPI3)
;
; @Keywords: Flash, Infineon, TriCore
; @Author: JIM
; @Chip: TC37x
; @Copyright: (C) 1989-2019 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: tc37x-spi.cmm 11290 2022-09-13 08:01:02Z skrausse $
; $Rev: 11290 $

LOCAL &arg1
ENTRY &arg1
&arg1=STRing.UPpeR("&arg1")  // for example "PREPAREONLY"

&QSPI_BASE=0xF0001F00
&QSPI_ExtFlsh_CS=0x3        // external flash 1 CS selection
&QSPI_ExtFlsh_MISO=0x0      // QSPI3 MISO selection

////////////////////
// SYSTEM UP setting
////////////////////
  SYStem.CPU TC377TP
  SYStem.Up

////////////////////
// QSPI CLK enable
////////////////////
  Data.Set A:0xF0036034 %Long (Data.Long(A:0xF0036034)|0x01000000)  ;SCU_CCUCON1.B.QSPIDIV = 1, fQSPI = fSOURCEQSPI

////////////////////
// pin mux setting (alternative function setting)
// port2 base address F003A200 IOCR4 for port2 4/5/6/7
////////////////////
&PORT02_BASE=0xF003A200
&PORT00_BASE=0xF003A000
;   P00.5  SPI_CS_Flash1    (10011 000), output-pushpull ALT3
  Data.Set A:&PORT00_BASE+0x14 %Long Data.Long(A:&PORT00_BASE+0x14)|0x00009800  ;IOCR4
  Data.Set A:&PORT00_BASE+0x40 %Long 0x0  ; set drive strength to speed grade 1; PDR0

;   P02.4  SPI_CS_Flash0    (10011 000), output-pushpull ALT3, not mount
;   P02.5  QSPI_MISO        (00011 000), input no pull connection)
;   P02.6  QSPI_MOSI        (10011 000), output-pushpull ALT3
;   P02.7  QSPI_CLK         (10011 000), output-pushpull ALT3
  Data.Set A:&PORT02_BASE+0x14 %Long 0x98981898  ;IOCR4

  Data.Set A:&PORT02_BASE+0x40 %Long 0x0  ; set drive strength to speed grade 1; PDR0, P02.4

////////////////////
// Quad SPI controller setting
////////////////////

  Data.Set A:&QSPI_BASE+0x000 %Long 0x8                 ;QSPI_CLC
  Data.Set A:&QSPI_BASE+0x010 %Long 0x20003C00          ;QSPI_GLOBALCON.TQ, TQ=2, clock = 8.33Mhz, TQ=1, clock = 12.5Mhz, TQ=0, clock = 25Mhz
  Data.Set A:&QSPI_BASE+0x004 %Long &QSPI_ExtFlsh_MISO  ;QSPI_PISEL, QSPI3 MISO input line selection
  Data.Set A:&QSPI_BASE+0x014 %Long 0x16800000          ;GLOBALCON1
  Data.Set A:&QSPI_BASE+0x048 %Long ((0x1<<3.)<<16.)    ;QSPI3_SSOC = ((0x1<<5.)<< 16) , SLSO3

  Data.Set A:&QSPI_BASE+0x20+&QSPI_ExtFlsh_CS*4 %Long 0x00001840; ECONz, z=CS, Q=1,A=2,B=0,C=2, 50% duty

  Data.Set A:&QSPI_BASE+0x10 %LE %Long Data.Long(A:&QSPI_BASE+0x10)|(0x1<<24.)  ; /* RUN requested */

////////////////////
// READ ID TEST
////////////////////
  GOSUB READ_ID_TEST

////////////////////
// FLASHFILE setting
////////////////////
  Break.RESet

  FLASHFILE.RESet

//FLASFILE.CONFIG <Base Reg>  0x0 0x0 <SLSO#=CS#>
  FLASHFILE.CONFIG &QSPI_BASE 0x0 0x0 &QSPI_ExtFlsh_CS

//FLASHFILE.TARGET <Code Range>       <Data Range>         <Algorithm File>
  FLASHFILE.TARGET 0x70100000++0x1FFF 0x70102000++0x1FFF   ~~~~/spi4b64_tcqspi.bin  /KEEP

  FLASHFILE.GETID

//End of the test prepareonly
IF "&arg1"=="PREPAREONLY"
ENDDO

; end of SPI setup, flash driver deployment and  essential flash chip test
ENDDO

  ;FLASHFILE.DUMP 0x0

//Erase Serial FLASH
  ;FLASHFILE.ERASE 0x0--0xFFFFF

//Write
  ;FLASHFILE.LOAD   * 0x0
  ;FLASHFILE.LOAD   * 0x0  /ComPare   ;verify

ENDDO


READ_ID_TEST:

  LOCAL &temp


  &temp=Data.Long(A:&QSPI_BASE+0x040)
  PRINT "Read status(0x40) 0x" &temp

  ;QSPI1_BACONENTRY = 0x1 |(0x1 << 16) | (0x1 << 21 /*MSB first*/) | (0 << 22) | (0x1F << 23) | (0xXX << 28);
  &baconent=0x1|(0x1<<16.)|(0x1<<21.)|(0<<22.)|(0x1f<<23.)|(&QSPI_ExtFlsh_CS<<28.)  ; 32bit transfer last fram. ;0x33B430C2; 0x3FA10001
  Data.Set A:&QSPI_BASE+0x60 %Long &baconent

  &temp=0x9f000000
  Data.Set A:&QSPI_BASE+0x64 %Long &temp

  &temp=Data.Long(A:&QSPI_BASE+0x090)

  PRINT "Read 1st 0x" (&temp>>24.)&0xFF
  PRINT "Read 2nd 0x" (&temp>>16.)&0xFF " (Manufacture)"
  PRINT "Read 3rd 0x" (&temp>>8.)&0xFF  " (Device ID)"
  PRINT "Read 4th 0x" &temp&0xFF

  Data.Set A:&QSPI_BASE+0x54 %Long Data.Long(A:&QSPI_BASE+0x54)|(0x3<<9.)

RETURN

