; ---------------------------------------------------------------------------
; prepare_clockPLL80.cmm
; ---------------------------------------------------------------------------
  PMACRO.EXPLICIT

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

  PRIVATE &OscMHz

  ENTRY &OscMHz

  ECHO %COLOR.GREEN "Prepare 80MHz PLL-Clock (Osc=" "&OscMHz" "MHz)"

  ; ---------------------------------------------------------------------------
  ; Enable SIRC (SlowIRC)
  ;
  ; SCG_SIRCCSR .SIRCEN=1, SlowIRC=enable
  Data.Set AD:0x40064200 %Long Data.Long(AD:0x40064200)|0x1

  SCREEN.WAIT (Data.Long(AD:0x40064200)&(1<<24.))!=0 1.s
  IF TIMEOUT()
  (
    ECHO %ERROR "Cannot start SIRC!"
    STOP
    ENDDO
  )
  ELSE
  (
    ECHO %COLOR.GREEN "SIRC started"
  )

  ; ---------------------------------------------------------------------------
  ; Switch to SIRC
  ;
  ; RCCR.SCS = SIRC
  Data.Set AD:0x40064014 %Long (Data.Long(AD:0x40064014)&~(0xf<<24.))|(0x2<<24.) ; SCG_RCCR.SCS = SIRC_CLK Slow IRC

  ; VCCR.SCS = SIRC
  Data.Set AD:0x40064018 %Long (Data.Long(AD:0x40064018)&~(0xf<<24.))|(0x2<<24.) ; SCG_VCCR.SCS = SIRC_CLK Slow IRC

  ; HCCR.SCS = SIRC
  Data.Set AD:0x4006401C %Long (Data.Long(AD:0x4006401C)&~(0xf<<24.))|(0x2<<24.) ; SCG_HCCR:SCS = reserved !!!!

  ; CLKOUTCNFG.CLOCKOUTSEL = SIRC
  Data.Set AD:0x40064020 %Long (Data.Long(AD:0x40064020)&~(0xf<<24.))|(0x2<<24.) ; SCG_CLKOUTCNFG = SIRC_CLK Slow IRC

  WAIT (Data.Long(AD:0x40064010)&(0xf<<24.))==(0x2<<24.) 1.s
  IF TIMEOUT()
  (
    ECHO %ERROR "Cannot switch to SIRC!"
    STOP
    ENDDO
  )
  ELSE
  (
    ECHO %COLOR.GREEN "SIRC active"
  )

  ; ---------------------------------------------------------------------------
  ; System OSC init (crystal)
  ; S32K148EVB crystal clock = 8 MHz
  ;
  ; SCG_SOSCCSR.SOSCEN = 0 System OSC disable
  Data.Set AD:0x40064100 %Long Data.Long(AD:0x40064100)&~0x1

  ; SOSCCFG.Range = 8-32MHz, ERREFS=Internal
  Data.Set AD:0x40064108 %Long 0x34 ;

  ; SCG_SOSCCSR.SOSCEN = 0 System OSC enable
  Data.Set AD:0x40064100 %Long Data.Long(AD:0x40064100)|0x1

  SCREEN.WAIT (Data.Long(AD:0x40064100)&(1<<24.))!=0 1.s
  IF TIMEOUT()
  (
    PRINT %ERROR "Cannot start SOSC!"
    STOP
    ENDDO
  )
  ELSE
  (
    ECHO %COLOR.GREEN "SOSC started"
  )

  ; ---------------------------------------------------------------------------
  ; System PLL and core divider init

  ; SCG_SPLLCSR.SPLLEN = 0  System PLL disable
  Data.Set AD:0x40064600 %Long Data.Long(AD:0x40064600)&~0x1

  IF &OscMHz==8.
  (
    ; SCG_SPLLCFG.MULT = 40-16 = 24 (PLL frequency = 320 MHz)
    Data.Set AD:0x40064608 %Long ((40.-16.)<<16.)
  )
  ELSE
  (
    ; SCG_SPLLCFG.MULT = 20-16 = 4 (PLL frequency = 320 MHz)
    Data.Set AD:0x40064608 %Long ((20.-16.)<<16.)
  )

  ; SCG_SPLLDIV.SPLLDIV2 = 4, .SPLLDIV1 = disable
  Data.Set AD:0x40064604 %Long 0x00000300

  ; SCG_SPLLCSR.SPLLEN = 1  System PLL enable
  Data.Set AD:0x40064600 %Long Data.Long(AD:0x40064600)|0x1

  ; wait until PLL is ready
  SCREEN.WAIT (Data.Long(AD:0x40064600)&(1<<24.))!=0 1.s
  IF TIMEOUT()
  (
    ECHO %ERROR "Cannot start PLL!"
    STOP
    ENDDO
  )
  ELSE
  (
    ECHO %COLOR.GREEN "PLL started"
  )

  ; ---------------------------------------------------------------------------
  ; Switch to System PLL
  ;
  ; SCG_RCCR .SCS=SPLL_CLK, DIVCORE=2, DIVBUS=2, DIVSLOW=3
  ;Data.Set AD:0x40064014 %Long (Data.Long(AD:0x40064014)&~(0xf<<24.))|(0x6<<24.)
  Data.Set AD:0x40064014 %Long 0x06010012

  ; SCG_HCCR .SCS=SPLL_CLK, DIVCORE=2, DIVBUS=2, DIVSLOW=3
  ;Data.Set AD:0x4006401C %Long (Data.Long(AD:0x4006401C)&~(0xf<<24.))|(0x6<<24.)
  Data.Set AD:0x4006401C %Long 0x06010012

  ; SCG_CLKOUTCNFG .CLOCKOUTSEL=PLL
  ;Data.Set AD:0x40064020 %Long (Data.Long(AD:0x40064020)&~(0xf<<24.))|(0x6<<24.)
  Data.Set AD:0x40064020 %Long 0x06000000

  WAIT (Data.Long(AD:0x40064010)&(0xf<<24.))==(0x6<<24.) 1.s
  IF TIMEOUT()
  (
    ECHO %ERROR "Cannot switch to PLL!"
    STOP
    ENDDO
  )
  ELSE
  (
    ECHO %COLOR.GREEN "PLL active"
  )

  ENDDO