; --------------------------------------------------------------------------------
; @Title: Program boot sequencer I2C EEPROM on the MPC8569MDS evaluation board
; @Description:
;   This example programs the boot sequencer to initialize
;    DDR memory and use it as boot page.
; @Keywords: III, PowerQuicc
; @Author: REI
; @Board: MPC8569MDS
; @Chip: MPC8569E
; @Copyright: (C) 1989-2014 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: program_bootsequencer.cmm 12111 2018-02-09 14:15:07Z rweiss $


  LOCAL &memptr
  &memptr=0
  
  WinPAGE.RESet
  SYStem.RESet

  AREA.Create I2CBOOTS
  AREA.CLEAR  I2CBOOTS
  WinPOS 89.0 0.5 47. 14. 0. 0. W000
  AREA.view   I2CBOOTS

  PRINT "Programming I2C boot sequencer EEPROM"
  PRINT "  Preparing Data..."

;prepare VM for intermediate data
  Data.Set VM:0--0x7FFF 0xFF

;Preamble
  GOSUB SETBYTE aa
  GOSUB SETBYTE 55
  GOSUB SETBYTE aa
  
;Configuration Preload Commands
; GOSUB SETCMD <space> <address> <value>   <access width>
  GOSUB SETCMD  0       00000     00040000  4             ;CCSRBASE -> 0x40000000
  GOSUB SETCMD  0       00008     00000000  4             ;ALTCBAR  -> 0x00000000
  GOSUB SETCMD  0       00010     80F00000  4             ;ALTCAR   -> enable, TRGT=local memory
  GOSUB SETCMD  0       00020     80000000  4             ;BPTR     -> map 0x00000000 to boot page
  
  GOSUB SETCMD  0       02000     0000003F  4             ;DDR chip select configuration
  GOSUB SETCMD  0       02080     80014202  4
  GOSUB SETCMD  0       02110     07000000  4             ;DDR controller configuration
  GOSUB SETCMD  0       02100     00020000  4
  GOSUB SETCMD  0       02104     00330004  4
  GOSUB SETCMD  0       02108     6F6B4644  4
  GOSUB SETCMD  0       0210C     002888D0  4
  GOSUB SETCMD  0       02114     04401040  4
  GOSUB SETCMD  0       02118     40401521  4
  GOSUB SETCMD  0       0211C     8000C000  4
  GOSUB SETCMD  0       02124     03E00000  4
  GOSUB SETCMD  0       02130     01000000  4
  GOSUB SETCMD  0       02160     00220001  4
  GOSUB SETCMD  0       02164     03402400  4
  GOSUB SETCMD  0       02170     89080600  4
  GOSUB SETCMD  0       02174     0655A604  4
  GOSUB SETCMD  0       02B28     80040000  4
  GOSUB SETCMD  0       02110     C7000000  4             ;enable DDR memory
  
  GOSUB SETCMD  1       00FD0     38400000  4 ; li r2, 0        - code for boot page
  GOSUB SETCMD  1       00FD4     38420001  4 ; addi r2, r2, 1
  GOSUB SETCMD  1       00FD8     38420001  4 ; addi r2, r2, 1
  GOSUB SETCMD  1       00FDC     38420001  4 ; addi r2, r2, 1
  GOSUB SETCMD  1       00FE0     38420001  4 ; addi r2, r2, 1
  GOSUB SETCMD  1       00FE4     4BFFFFF0  4 ; b 0xffffffd4
  GOSUB SETCMD  1       00FE8     60000000  4 ; nop
  GOSUB SETCMD  1       00FEC     60000000  4 ; nop
  GOSUB SETCMD  1       00FF0     60000000  4 ; nop
  GOSUB SETCMD  1       00FF4     60000000  4 ; nop
  GOSUB SETCMD  1       00FF8     60000000  4 ; nop
  GOSUB SETCMD  1       00FFC     4BFFFFD4  4 ; b 0xffffffd0
  
  GOSUB SETCMD  0       01010     01000002  4             ;EEBPCR   -> enable CPU0, highest port priority
  
;End Command
  GOSUB SETBYTE 00
  GOSUB SETBYTE 00
  GOSUB SETBYTE 00
  
;Cyclic Redundancy Check  
  PRINT "  Calculating Checksum..."
  GOSUB SETCHKSUM

; --------------------------------------------------------------------------------
;program to I2C EEPROM 
  PRINT "  Set Up I2C EEPROM programming..."
  DO ~~/demo/powerpc/hardware/mpc85xx/all_boards/i2c_eeprom_program.cmm PREPAREonly ;CONTROLLERID=I2C1 DEVICESEL=0x50 ADDRESSBYTES=2. WRITEPAGESIZE=64.

; --------------------------------------------------------------------------------
;program VM contents to I2C EEPROM
  PRINT "  Programming boot sequencer data..."
  FLASHFILE.COPY VM:0x0000--0x7FFF 0x0000

  PRINT "  Verifying boot sequencer data..."
  FLASHFILE.COPY VM:0x0000--0x7FFF 0x0000 /ComPare

;show programmed I2C EEPROM contents  
  WinPOS 0.28571 0.16667 83. 33. 17. 1. W001
  FLASHFILE.DUMP 0

  PRINT "Boot sequencer programming completed."
  
ENDDO




; --------------------------------------------------------------------------------
;subroutibes
; --------------------------------------------------------------------------------
SETBYTE:
  ENTRY &byteval
  Data.Set VM:&memptr 0x&byteval
  &memptr=&memptr+1.
  RETURN
  
SETCMD:
  ENTRY &ACS &ADDR &VALUE &WIDTH
  &BYTE_EN=0
  
  IF &WIDTH==4
    &BYTE_EN=0x0f
  ELSE IF &WIDTH==2
    &BYTE_EN=(0x22<<(0x&ADDR&0x03))&0x0f
  ELSE IF &WIDTH==1
    &BYTE_EN=0x1<<(0x&ADDR&0x03)
  ELSE
  ( 
    PRINT %ERROR "Error: Unsupported access width"
    STOP
  )
    
  &PREAMPLE=(&ACS<<7.)|(&BYTE_EN<<3.)|(1<<2.)|(0x&ADDR>>18.)
  &BYTE0=(0x&ADDR>>10.)&0xFF
  &BYTE1=(0x&ADDR>>2.)&0xFF
  &BYTE2=(0x&VALUE>>24.)&0xFF
  &BYTE3=(0x&VALUE>>16.)&0xFF
  &BYTE4=(0x&VALUE>>8.)&0xFF
  &BYTE5=(0x&VALUE>>0.)&0xFF
  Data.Set VM:&memptr &PREAMPLE &BYTE0 &BYTE1 &BYTE2 &BYTE3 &BYTE4 &BYTE5
  &memptr=&memptr+7.
  RETURN
  
SETCHKSUM:
  Data.SUM VM:0--(&memptr-1) /Byte /CRC 32. 0x04C11DB7 0 0 0xFFFFFFFF 0x00000000
  Data.Set VM:&memptr %Long Data.SUM()
  &memptr=&memptr+4.
  RETURN 

