; ---------------------------------------------------------------------------
; prepare_s32k.cmm
; ---------------------------------------------------------------------------
  PMACRO.EXPLICIT

  ; show path and name of this script (present practice file)
  ECHO ""
  ECHO %COLOR.BLUE "### " OS.PPF() " ###"

; ---------------------------------------------------------------------------
  ; Reset the target
  SYStem.Down
  SYStem.Up

  ; S32K device specific setup
  IF FILE.EXIST("prepare_&cpu.cmm")
  (
    DO prepare_&cpu.cmm
  )
  
  ; disable BootROM
  GOSUB DisableBootrom

  ; disable Watchdog
  GOSUB DisableWatchdog

  ECHO %COLOR.GREEN "CMx Core ready!"

  ENDDO


DisableBootrom:
(
  Data.Set SD:0x4007F010 %LE %Long 0x6
  Data.Set SD:0x4007F014 %LE %Long 0x0
  RETURN
)

DisableWatchdog:
(
  LOCAL &tmp1 &tmp2
  &tmp1=Data.Long(ST:0x20000000)
  &tmp2=Data.Long(ST:0x20000004)
  Register.SWAP
  ; The watchdog has a restrictive timing. It has to be configured and unlocked within a peripod
  ; of 128 cycles. Therefor the unlock sequence need to be done by a small target program.
  Data.Assemble ST:0x20000000  str  r1,[r0]  ;SD:0x40052004 = 0xD928C520   (Key)
  Data.Assemble ,              str  r3,[r2]  ;SD:0x40052000 = 0x00002120   (Control register)
  Data.Assemble ,              str  r5,[r4]  ;SD:0x40052008 = 0x0000FFFF   (Timeout value)
  Data.Assemble ,              bkpt #0
  Register.Set PC 0x20000000
  Register.Set SP 0x20001000
  Register.Set R0 0x40052004
  Register.Set R1 0xD928C520
  Register.Set R2 0x40052000
  Register.Set R3 0x00002120
  Register.Set R4 0x40052008
  Register.Set R5 0x0000FFFF
  Go.direct
  WAIT !STATE.RUN()

  Data.Set ST:0x20000000 %Long &tmp1
  Data.Set ST:0x20000004 %Long &tmp2
  Register.SWAP

  RETURN
)


