#roloFlash 2, v03.*

! ***************************************************************************
! *
! *  Beispiel-Skript fuer Microchip/Atmel-PDI-Controller
! *   
! *  Aufgabe: Chip auslesen
! *
! *  Copyright (C) 2009-2019 by halec embedded solutions
! *
! ***************************************************************************


! Fuer alle Dateien auf der SD-Karte gilt:
!  - Dateiname muss im 8.3-Format sein
!  - Dateiname muss komplett in GROSSBUCHSTABEN sein
!  - (siehe Handbuch, Kapitel "Dateien")


! *** Bitte an eigene Beduerfnisse anpassen! ***


targetName      = "ATxmega256A3U" ! Exakter Namen aus Handbuch, Kapitel
                                  ! "Spezifikationen", uebernehmen
flashFile       = "FLASHRB.HEX"   ! "" angeben, wenn nicht benoetigt
eepromFile      = "EEPROMRB"      ! "" angeben, wenn nicht benoetigt
busSpeed        = 100000          ! Bus-Geschwindigkeit in Hertz. 100 kHz sind
                                  ! eine konservative Wahl, um eine sichere
                                  ! Funktion auch bei niedrigem Target-CPU-Takt
                                  ! oder niedrigem roloFlash-CPU-Takt zu
                                  ! gewaehrleisten. Bei bekanntermassen
                                  ! hoeherem Target-CPU-Takt kann die Bus-
                                  ! Geschwindigkeit entsprechend erhoeht werden.
roloFlashHiSpeedMode = 0          ! 0 (false): circa 20mA@3.3V, ist langsamer
                                  ! 1 (true):  circa 80mA@3.3V, ist schneller

! Gruenes Lauflicht von LED 4 zu LED 1 -> symbolisiert Skript-Abarbeitung
! (Datenübertragungs-Richtung: lesend)
! (LED 5 wird freigehalten fuer "Fertig"-Anzeige)
led_runningLight 4, 1, COLOR_GREEN, 200


! ---- Vorbereitungen ----
! Evtl. altes Log loeschen
f = "LOG.TXT"
if fs_fileExists(0,f)
  fs_remove 0, f
endif

! Software-Version des roloFlash und Skript-Namen in LOG.TXT schreiben
print "softwareVersion=", sys_softwareVersion, "\r\n"
print "Running script copied from scripts/Microchip_Atmel/AVR/PDI/read/ ...\r\n"

! Falls roloFlashHiSpeedMode gewaehlt wurde, dann CPU-Takt des roloFlash auf
! Maximum setzen
if roloFlashHiSpeedMode
  sys_setCpuClock CPU_CLOCKMAX
endif


! ---- Zugriff auf die im roloFlash befindliche Target-Datenbank  ----
dbHandle = DB_getHandle(targetName)

! ---- Atmel-PDI-Bus scannen ----
print "Scanning PDI ...\r\n"
busHandle = bus_open(PDI, 0, busSpeed)

! ---- Zugriff auf Target ----
print "Connecting to target ...\r\n"
family       = DB_get(dbHandle, DB_FAMILY)
targetHandle = target_open(busHandle, 0, family)
target_setMode targetHandle, PROGRAMMODE

  
! ---- Device-ID pruefen ----
print "Checking device-ID ...\r\n"
expectedDeviceID = DB_get(dbHandle, DB_DEVICEID)
deviceID = target_getDeviceId(targetHandle)
if deviceID <> expectedDeviceID
  print "ERROR: Wrong controller detected\r\n"
  ! Abbruch
  throw USEREXCEPTION + 1
endif  


! ---- Target-Speicher-Parameter aus Target-Datenbank holen und benutzen ----
print "Getting target memory parameters from database ...\r\n"
flashSize = DB_get(dbHandle, DB_FLASHSIZE)
flashPageSize = DB_get(dbHandle, DB_FLASHPAGESIZE)
eepromSize = DB_get(dbHandle, DB_EEPROMSIZE)
eepromPageSize = DB_get(dbHandle, DB_EEPROMPAGESIZE)
print "  Target flash  size     [bytes]: ", flashSize, "\r\n"
print "  Target flash  pageSize [bytes]: ", flashPageSize, "\r\n"
print "  Target EEPROM size     [bytes]: ", eepromSize, "\r\n"
print "  Target EEPROM pagesize [bytes]: ", eepromPageSize, "\r\n"
target_setMemoryMap targetHandle, FLASH, MEM_SIZE, flashSize
target_setMemoryMap targetHandle, FLASH, MEM_PAGESIZE, flashPageSize
target_setMemoryMap targetHandle, EEPROM, MEM_SIZE, eepromSize
target_setMemoryMap targetHandle, EEPROM, MEM_PAGESIZE, eepromPageSize


! ---- Target-Flash lesen ----
if flashFile <> ""
  print "Reading flash to file ", flashFile, " ...\r\n"
  target_readToFile targetHandle, 0, flashFile, HEX, FLASH, 0, flashSize
else
  print "Flash reading skipped (no flash file specified)\r\n"
endif  

! ---- Target-EEPROM lesen ----
if eepromFile <> ""
  print "Reading EEPROM to file ", eepromFile, " ...\r\n"
  target_readToFile targetHandle, 0, eepromFile, HEX, EEPROM, 0, eepromSize
else
  print "EEPROM reading skipped (no EEPROM file specified)\r\n"
endif  

! ---- Nachbereitungen ----
target_close targetHandle
bus_close busHandle


! ---- Nach eventuell aufgetretener Exception schauen,         ----
! ---- Auswertung ins Log schreiben und per LEDs signalisieren ----
catch exception
print "Duration [ms]: ", sys_getSystemTime(), "\r\n"
catch dummyException  ! Falls das letzte print eine Exception werfen sollte
if exception <> 0
  ! Es gab einen Fehler, diesen in LOG.TXT festhalten
  print "ERROR: Exception ", exception
  ! Nachdem die Exception mittels catch gefangen wurde, erneut setzen. Damit
  ! wird die Nummer der Exception ueber die LEDs durch Blinkcode angezeigt. Zu
  ! den Blinkcodes siehe Handbuch, Kapitel "Bedeutungen von LED-Codes",
  ! Unterkapitel "Exception aufgetreten".
  throw exception
else
  ! Fehlerfrei: ins Log schreiben und LED 5 auf gruen schalten
  print "Script ended successfully.\r\n"
  led_on 5, COLOR_GREEN
endif

