#roloFlash 2

! ***************************************************************************
! *
! *  Beispiel-Skript fuer Microchip/Atmel-ISP-Controller
! *   
! *  Aufgabe: Chip auslesen
! *
! *  Copyright (C) 2009-2018 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      = "ATMEGA328P"   ! Exakter Namen aus Handbuch, Kapitel
                                 ! "Spezifikation", uebernehmen
flashFile       = "FLASHRB.HEX"  ! "" angeben, wenn nicht benoetigt
eepromFile      = "EEPROMRB.HEX" ! "" 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)
ledRunningLight 4, 1, COLOR_GREEN, 200


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

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

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


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

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

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

  
! ---- Signature pruefen ----
print "Checking signature ...\r\n"
expectedSignature = DB_get(dbHandle, DB_SIGNATURE)
signature = getSignature(targetHandle)
if signature <> expectedSignature
  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)
eepromSize = DB_get(dbHandle, DB_EEPROMSIZE)
pageSize   = DB_get(dbHandle, DB_FLASHPAGESIZE)
print "  Target flashSize  [bytes]: ", flashSize, "\r\n", "  Target pageSize   [bytes]: ", pageSize, "\r\n", "  Target eepromSize [bytes]: ", eepromSize, "\r\n"
setMemoryMap targetHandle, FLASH, MEM_SIZE,     flashSize
setMemoryMap targetHandle, FLASH, MEM_PAGESIZE, pageSize


! ---- Target-Flash lesen ----
if flashFile <> ""
  print "Reading flash to file ", flashFile, " ...\r\n"
  readFileFromTarget 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"
  readFileFromTarget targetHandle, 0, eepromFile, HEX, EEPROM, 0, eepromSize
else
  print "EEPROM reading skipped (no EEPROM file specified)\r\n"
endif  

! ---- Nachbereitungen ----
closeTarget targetHandle
closeBus busHandle


! ---- Nach eventuell aufgetretener Exception schauen,         ----
! ---- Auswertung ins Log schreiben und per LEDs signalisieren ----
catch exception
print "Duration [ms]: ", 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"
  ledOn 5, COLOR_GREEN
endif

