From 235facd545cb7c1dd4c1b2f894db791c82181f7f Mon Sep 17 00:00:00 2001 From: Bob Kuhn Date: Fri, 25 May 2018 20:26:48 -0500 Subject: [PATCH] install AVRDUDE 5.10, faster disk find for LPC1768 (#10849) --- .../HAL/HAL_LPC1768/upload_extra_script.py | 47 +- buildroot/share/atom/auto_build.py | 34 + buildroot/share/atom/avrdude.conf | 15478 ++++++++++++++++ buildroot/share/atom/avrdude_5.10_linux | Bin 0 -> 1159576 bytes buildroot/share/atom/avrdude_5.10_macOS | Bin 0 -> 346784 bytes buildroot/share/atom/avrdude_linux.conf | 15478 ++++++++++++++++ buildroot/share/atom/avrdude_macOS.conf | 15272 +++++++++++++++ .../atom/create_custom_upload_command_CDC.py | 166 +- .../atom/create_custom_upload_command_DFU.py | 31 +- 9 files changed, 46389 insertions(+), 117 deletions(-) create mode 100644 buildroot/share/atom/avrdude.conf create mode 100644 buildroot/share/atom/avrdude_5.10_linux create mode 100644 buildroot/share/atom/avrdude_5.10_macOS create mode 100644 buildroot/share/atom/avrdude_linux.conf create mode 100644 buildroot/share/atom/avrdude_macOS.conf diff --git a/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py b/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py index 1872652393..5842faa561 100644 --- a/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py +++ b/Marlin/src/HAL/HAL_LPC1768/upload_extra_script.py @@ -6,10 +6,10 @@ target_filename = "FIRMWARE.CUR" target_drive = "REARM" -upload_disk = "" import os -import subprocess +import platform +current_OS = platform.system() #env_vars = subprocess.check_output('platformio run -t envdump') #env_vars = env_vars.split('\n') @@ -21,10 +21,6 @@ build_type = os.environ.get("BUILD_TYPE", 'Not Set') if not(build_type == 'upload' or build_type == 'traceback' or build_type == 'Not Set') : exit(0) -print '\nSearching for upload disk' - -import platform -current_OS = platform.system() if current_OS == 'Windows': @@ -43,38 +39,22 @@ if current_OS == 'Windows': driveStr = driveStr.strip().lstrip('Drives: ') # typical result (string): 'C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\' drives = driveStr.split() # typical result (array of stings): ['C:\\', 'D:\\', 'E:\\', 'F:\\', 'G:\\', 'H:\\', 'I:\\', 'J:\\', 'K:\\', 'L:\\', 'M:\\', 'Y:\\', 'Z:\\'] - # - # scan top directory of each drive for FIRMWARE.CUR - # return first drive found - # - - import os upload_disk = 'Disk not found' target_file_found = False target_drive_found = False - - volume_info = subprocess.check_output('powershell -Command volume ') - volume_info = volume_info.split('\n') - for entry in volume_info: - if target_drive in entry and target_drive_found == False: # set upload if not found target file yet - target_drive_found = True - upload_disk = entry[ : entry.find(' ')] + ':' - for drive in drives: final_drive_name = drive.strip().rstrip('\\') # typical result (string): 'C:' - # modified version of walklevel() - level=0 - some_dir = "/" - some_dir = some_dir.rstrip(os.path.sep) - assert os.path.isdir(some_dir) - num_sep = some_dir.count(os.path.sep) - for root, dirs, files in os.walk(final_drive_name): - num_sep_this = root.count(os.path.sep) - if num_sep + level <= num_sep_this: - del dirs[:] - if target_filename in files: + try: + volume_info = subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT) + except Exception as e: + continue + else: + if target_drive in volume_info and target_file_found == False: # set upload if not found target file yet + target_drive_found = True + upload_disk = final_drive_name + if target_filename in volume_info: if target_file_found == False: - upload_disk = root + upload_disk = final_drive_name target_file_found = True # @@ -88,7 +68,7 @@ if current_OS == 'Windows': ) print 'upload disk: ' , upload_disk else: - print '\nUnable to find destination disk. File must be copied manually. \n' + print '\nUnable to find destination disk. File must be copied manually. \n' if current_OS == 'Linux': @@ -97,7 +77,6 @@ if current_OS == 'Linux': # platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive' # - import os upload_disk = 'Disk not found' target_file_found = False target_drive_found = False diff --git a/buildroot/share/atom/auto_build.py b/buildroot/share/atom/auto_build.py index 4dce045305..6268f27343 100644 --- a/buildroot/share/atom/auto_build.py +++ b/buildroot/share/atom/auto_build.py @@ -23,6 +23,8 @@ ####################################### # +# Revision: 2.0.1 +# # Description: script to automate PlatformIO builds # CLI: python auto_build.py build_option # build_option (required) @@ -103,6 +105,7 @@ current_OS = platform.system() target_env = '' board_name = '' + ######### # Python 2 error messages: # Can't find a usable init.tcl in the following directories ... @@ -208,6 +211,13 @@ def resolve_path(path): import os # turn the selection into a partial path + + if 0 <= path.find('"'): + path = path[ path.find('"') : ] + if 0 <= path.find(', line '): + path = path.replace(', line ', ':') + path = path.replace('"', '') + #get line and column numbers line_num = 1 column_num = 1 @@ -969,6 +979,7 @@ class output_window(Text): Text.__init__(self, self.frame, borderwidth=3, relief="sunken") self.config(tabs=(400,)) # configure Text widget tab stops self.config(background = 'black', foreground = 'white', font= ("consolas", 12), wrap = 'word', undo = 'True') +# self.config(background = 'black', foreground = 'white', font= ("consolas", 12), wrap = 'none', undo = 'True') self.config(height = 24, width = 100) self.config(insertbackground = 'pale green') # keyboard insertion point self.pack(side='left', fill='both', expand=True) @@ -991,6 +1002,25 @@ class output_window(Text): self.config(yscrollcommand=scrb.set) scrb.pack(side='right', fill='y') +# self.scrb_Y = tk.Scrollbar(self.frame, orient='vertical', command=self.yview) +# self.scrb_Y.config(yscrollcommand=self.scrb_Y.set) +# self.scrb_Y.pack(side='right', fill='y') +# +# self.scrb_X = tk.Scrollbar(self.frame, orient='horizontal', command=self.xview) +# self.scrb_X.config(xscrollcommand=self.scrb_X.set) +# self.scrb_X.pack(side='bottom', fill='x') + +# scrb_X = tk.Scrollbar(self, orient=tk.HORIZONTAL, command=self.xview) # tk.HORIZONTAL now have a horizsontal scroll bar BUT... shrinks it to a postage stamp and hides far right behind the vertical scroll bar +# self.config(xscrollcommand=scrb_X.set) +# scrb_X.pack(side='bottom', fill='x') +# +# scrb= tk.Scrollbar(self, orient='vertical', command=self.yview) +# self.config(yscrollcommand=scrb.set) +# scrb.pack(side='right', fill='y') + +# self.config(height = 240, width = 1000) # didn't get the size baCK TO NORMAL +# self.pack(side='left', fill='both', expand=True) # didn't get the size baCK TO NORMAL + # pop-up menu self.popup = tk.Menu(self, tearoff=0) @@ -1230,6 +1260,10 @@ def main(): target_env = get_env(board_name, Marlin_ver) + os.environ["BUILD_TYPE"] = build_type # let sub processes know what is happening + os.environ["TARGET_ENV"] = target_env + os.environ["BOARD_NAME"] = board_name + auto_build = output_window() if 0 <= target_env.find('USB1286'): copy_boards_dir() # copy custom boards over to PlatformIO if using custom board diff --git a/buildroot/share/atom/avrdude.conf b/buildroot/share/atom/avrdude.conf new file mode 100644 index 0000000000..1194847f77 --- /dev/null +++ b/buildroot/share/atom/avrdude.conf @@ -0,0 +1,15478 @@ +# $Id: avrdude.conf.in 916 2010-01-15 16:36:13Z joerg_wunsch $ +# +# AVRDUDE Configuration File +# +# This file contains configuration data used by AVRDUDE which describes +# the programming hardware pinouts and also provides part definitions. +# AVRDUDE's "-C" command line option specifies the location of the +# configuration file. The "-c" option names the programmer configuration +# which must match one of the entry's "id" parameter. The "-p" option +# identifies which part AVRDUDE is going to be programming and must match +# one of the parts' "id" parameter. +# +# Possible entry formats are: +# +# programmer +# id = [, [, ] ...] ; # are quoted strings +# desc = ; # quoted string +# type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic | +# stk600 | stk600pp | stk600hvsp | +# avr910 | butterfly | usbasp | +# jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw | +# jtagmkII_avr32 | jtagmkii_pdi | +# dragon_dw | dragon_jtag | dragon_isp | dragon_pp | +# dragon_hvsp | dragon_pdi | arduino; # programmer type +# baudrate = ; # baudrate for avr910-programmer +# vcc = [, ... ] ; # pin number(s) +# reset = ; # pin number +# sck = ; # pin number +# mosi = ; # pin number +# miso = ; # pin number +# errled = ; # pin number +# rdyled = ; # pin number +# pgmled = ; # pin number +# vfyled = ; # pin number +# ; +# +# part +# id = ; # quoted string +# desc = ; # quoted string +# has_jtag = ; # part has JTAG i/f +# has_debugwire = ; # part has debugWire i/f +# has_pdi = ; # part has PDI i/f +# has_tpi = ; # part has TPI i/f +# devicecode = ; # deprecated, use stk500_devcode +# stk500_devcode = ; # numeric +# avr910_devcode = ; # numeric +# signature = ; # signature bytes +# chip_erase_delay = ; # micro-seconds +# reset = dedicated | io; +# retry_pulse = reset | sck; +# pgm_enable = ; +# chip_erase = ; +# chip_erase_delay = ; # chip erase delay (us) +# # STK500 parameters (parallel programming IO lines) +# pagel = ; # pin name in hex, i.e., 0xD7 +# bs2 = ; # pin name in hex, i.e., 0xA0 +# serial = ; # can use serial downloading +# parallel = ; # can use par. programming +# # STK500v2 parameters, to be taken from Atmel's XML files +# timeout = ; +# stabdelay = ; +# cmdexedelay = ; +# synchloops = ; +# bytedelay = ; +# pollvalue = ; +# pollindex = ; +# predelay = ; +# postdelay = ; +# pollmethod = ; +# mode = ; +# delay = ; +# blocksize = ; +# readsize = ; +# hvspcmdexedelay = ; +# # STK500v2 HV programming parameters, from XML +# pp_controlstack = , , ...; # PP only +# hvsp_controlstack = , , ...; # HVSP only +# hventerstabdelay = ; +# progmodedelay = ; # PP only +# latchcycles = ; +# togglevtg = ; +# poweroffdelay = ; +# resetdelayms = ; +# resetdelayus = ; +# hvleavestabdelay = ; +# resetdelay = ; +# synchcycles = ; # HVSP only +# chiperasepulsewidth = ; # PP only +# chiperasepolltimeout = ; +# chiperasetime = ; # HVSP only +# programfusepulsewidth = ; # PP only +# programfusepolltimeout = ; +# programlockpulsewidth = ; # PP only +# programlockpolltimeout = ; +# # JTAG ICE mkII parameters, also from XML files +# allowfullpagebitstream = ; +# enablepageprogramming = ; +# idr = ; # IO addr of IDR (OCD) reg. +# rampz = ; # IO addr of RAMPZ reg. +# spmcr = ; # mem addr of SPMC[S]R reg. +# eecr = ; # mem addr of EECR reg. +# # (only when != 0x3c) +# is_avr32 = ; # AVR32 part +# +# memory +# paged = ; # yes / no +# size = ; # bytes +# page_size = ; # bytes +# num_pages = ; # numeric +# min_write_delay = ; # micro-seconds +# max_write_delay = ; # micro-seconds +# readback_p1 = ; # byte value +# readback_p2 = ; # byte value +# pwroff_after_write = ; # yes / no +# read = ; +# write = ; +# read_lo = ; +# read_hi = ; +# write_lo = ; +# write_hi = ; +# loadpage_lo = ; +# loadpage_hi = ; +# writepage = ; +# ; +# ; +# +# If any of the above parameters are not specified, the default value +# of 0 is used for numerics or the empty string ("") for string +# values. If a required parameter is left empty, AVRDUDE will +# complain. +# +# NOTES: +# * 'devicecode' is the device code used by the STK500 (see codes +# listed below) +# * Not all memory types will implement all instructions. +# * AVR Fuse bits and Lock bits are implemented as a type of memory. +# * Example memory types are: +# "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high +# fuse), "signature", "calibration", "lock" +# * The memory type specified on the avrdude command line must match +# one of the memory types defined for the specified chip. +# * The pwroff_after_write flag causes avrdude to attempt to +# power the device off and back on after an unsuccessful write to +# the affected memory area if VCC programmer pins are defined. If +# VCC pins are not defined for the programmer, a message +# indicating that the device needs a power-cycle is printed out. +# This flag was added to work around a problem with the +# at90s4433/2333's; see the at90s4433 errata at: +# +# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# +# INSTRUCTION FORMATS +# +# Instruction formats are specified as a comma seperated list of +# string values containing information (bit specifiers) about each +# of the 32 bits of the instruction. Bit specifiers may be one of +# the following formats: +# +# '1' = the bit is always set on input as well as output +# +# '0' = the bit is always clear on input as well as output +# +# 'x' = the bit is ignored on input and output +# +# 'a' = the bit is an address bit, the bit-number matches this bit +# specifier's position within the current instruction byte +# +# 'aN' = the bit is the Nth address bit, bit-number = N, i.e., a12 +# is address bit 12 on input, a0 is address bit 0. +# +# 'i' = the bit is an input data bit +# +# 'o' = the bit is an output data bit +# +# Each instruction must be composed of 32 bit specifiers. The +# instruction specification closely follows the instruction data +# provided in Atmel's data sheets for their parts. +# +# See below for some examples. +# +# +# The following are STK500 part device codes to use for the +# "devicecode" field of the part. These came from Atmel's software +# section avr061.zip which accompanies the application note +# AVR061 available from: +# +# http://www.atmel.com/atmel/acrobat/doc2525.pdf +# + +#define ATTINY10 0x10 /* the _old_ one that never existed! */ +#define ATTINY11 0x11 +#define ATTINY12 0x12 +#define ATTINY15 0x13 +#define ATTINY13 0x14 + +#define ATTINY22 0x20 +#define ATTINY26 0x21 +#define ATTINY28 0x22 +#define ATTINY2313 0x23 + +#define AT90S1200 0x33 + +#define AT90S2313 0x40 +#define AT90S2323 0x41 +#define AT90S2333 0x42 +#define AT90S2343 0x43 + +#define AT90S4414 0x50 +#define AT90S4433 0x51 +#define AT90S4434 0x52 +#define ATMEGA48 0x59 + +#define AT90S8515 0x60 +#define AT90S8535 0x61 +#define AT90C8534 0x62 +#define ATMEGA8515 0x63 +#define ATMEGA8535 0x64 + +#define ATMEGA8 0x70 +#define ATMEGA88 0x73 +#define ATMEGA168 0x86 + +#define ATMEGA161 0x80 +#define ATMEGA163 0x81 +#define ATMEGA16 0x82 +#define ATMEGA162 0x83 +#define ATMEGA169 0x84 + +#define ATMEGA323 0x90 +#define ATMEGA32 0x91 + +#define ATMEGA64 0xA0 + +#define ATMEGA103 0xB1 +#define ATMEGA128 0xB2 +#define AT90CAN128 0xB3 +#define AT90CAN64 0xB3 +#define AT90CAN32 0xB3 + +#define AT86RF401 0xD0 + +#define AT89START 0xE0 +#define AT89S51 0xE0 +#define AT89S52 0xE1 + +# The following table lists the devices in the original AVR910 +# appnote: +# |Device |Signature | Code | +# +-------+----------+------+ +# |tiny12 | 1E 90 05 | 0x55 | +# |tiny15 | 1E 90 06 | 0x56 | +# | | | | +# | S1200 | 1E 90 01 | 0x13 | +# | | | | +# | S2313 | 1E 91 01 | 0x20 | +# | S2323 | 1E 91 02 | 0x48 | +# | S2333 | 1E 91 05 | 0x34 | +# | S2343 | 1E 91 03 | 0x4C | +# | | | | +# | S4414 | 1E 92 01 | 0x28 | +# | S4433 | 1E 92 03 | 0x30 | +# | S4434 | 1E 92 02 | 0x6C | +# | | | | +# | S8515 | 1E 93 01 | 0x38 | +# | S8535 | 1E 93 03 | 0x68 | +# | | | | +# |mega32 | 1E 95 01 | 0x72 | +# |mega83 | 1E 93 05 | 0x65 | +# |mega103| 1E 97 01 | 0x41 | +# |mega161| 1E 94 01 | 0x60 | +# |mega163| 1E 94 02 | 0x64 | + +# Appnote AVR109 also has a table of AVR910 device codes, which +# lists: +# dev avr910 signature +# ATmega8 0x77 0x1E 0x93 0x07 +# ATmega8515 0x3B 0x1E 0x93 0x06 +# ATmega8535 0x6A 0x1E 0x93 0x08 +# ATmega16 0x75 0x1E 0x94 0x03 +# ATmega162 0x63 0x1E 0x94 0x04 +# ATmega163 0x66 0x1E 0x94 0x02 +# ATmega169 0x79 0x1E 0x94 0x05 +# ATmega32 0x7F 0x1E 0x95 0x02 +# ATmega323 0x73 0x1E 0x95 0x01 +# ATmega64 0x46 0x1E 0x96 0x02 +# ATmega128 0x44 0x1E 0x97 0x02 +# +# These codes refer to "BOOT" device codes which are apparently +# different than standard device codes, for whatever reasons +# (often one above the standard code). + +# There are several extended versions of AVR910 implementations around +# in the Internet. These add the following codes (only devices that +# actually exist are listed): + +# ATmega8515 0x3A +# ATmega128 0x43 +# ATmega64 0x45 +# ATtiny26 0x5E +# ATmega8535 0x69 +# ATmega32 0x72 +# ATmega16 0x74 +# ATmega8 0x76 +# ATmega169 0x78 + +# +# Overall avrdude defaults +# +default_parallel = "lpt1"; +default_serial = "com1"; + + +# +# PROGRAMMER DEFINITIONS +# + +programmer + id = "arduino"; + desc = "Arduino"; + type = arduino; +; + +programmer + id = "avrisp"; + desc = "Atmel AVR ISP"; + type = stk500; +; + +programmer + id = "avrispv2"; + desc = "Atmel AVR ISP V2"; + type = stk500v2; +; + +programmer + id = "avrispmkII"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "avrisp2"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "buspirate"; + desc = "The Bus Pirate"; + type = buspirate; +; + +# This is supposed to be the "default" STK500 entry. +# Attempts to select the correct firmware version +# by probing for it. Better use one of the entries +# below instead. +programmer + id = "stk500"; + desc = "Atmel STK500"; + type = stk500generic; +; + +programmer + id = "stk500v1"; + desc = "Atmel STK500 Version 1.x firmware"; + type = stk500; +; + +programmer + id = "mib510"; + desc = "Crossbow MIB510 programming board"; + type = stk500; +; + +programmer + id = "stk500v2"; + desc = "Atmel STK500 Version 2.x firmware"; + type = stk500v2; +; + +programmer + id = "stk500pp"; + desc = "Atmel STK500 V2 in parallel programming mode"; + type = stk500pp; +; + +programmer + id = "stk500hvsp"; + desc = "Atmel STK500 V2 in high-voltage serial programming mode"; + type = stk500hvsp; +; + +programmer + id = "stk600"; + desc = "Atmel STK600"; + type = stk600; +; + +programmer + id = "stk600pp"; + desc = "Atmel STK600 in parallel programming mode"; + type = stk600pp; +; + +programmer + id = "stk600hvsp"; + desc = "Atmel STK600 in high-voltage serial programming mode"; + type = stk600hvsp; +; + +programmer + id = "avr910"; + desc = "Atmel Low Cost Serial Programmer"; + type = avr910; +; + +programmer + id = "usbasp"; + desc = "USBasp, http://www.fischl.de/usbasp/"; + type = usbasp; +; + +programmer + id = "usbtiny"; + desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + type = usbtiny; +; + +programmer + id = "butterfly"; + desc = "Atmel Butterfly Development Board"; + type = butterfly; +; + +programmer + id = "avr109"; + desc = "Atmel AppNote AVR109 Boot Loader"; + type = butterfly; +; + +programmer + id = "avr911"; + desc = "Atmel AppNote AVR911 AVROSP"; + type = butterfly; +; + +programmer + id = "jtagmkI"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1slow"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 19200; + type = jtagmki; +; + +programmer + id = "jtagmkII"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# easier to type +programmer + id = "jtag2slow"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# JTAG ICE mkII @ 115200 Bd +programmer + id = "jtag2fast"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# make the fast one the default, people will love that +programmer + id = "jtag2"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# JTAG ICE mkII in ISP mode +programmer + id = "jtag2isp"; + desc = "Atmel JTAG ICE mkII in ISP mode"; + baudrate = 115200; + type = jtagmkii_isp; +; + +# JTAG ICE mkII in debugWire mode +programmer + id = "jtag2dw"; + desc = "Atmel JTAG ICE mkII in debugWire mode"; + baudrate = 115200; + type = jtagmkii_dw; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtagmkII_avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtag2avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in PDI mode +programmer + id = "jtag2pdi"; + desc = "Atmel JTAG ICE mkII PDI mode"; + baudrate = 115200; + type = jtagmkii_pdi; +; + +# AVR Dragon in JTAG mode +programmer + id = "dragon_jtag"; + desc = "Atmel AVR Dragon in JTAG mode"; + baudrate = 115200; + type = dragon_jtag; +; + +# AVR Dragon in ISP mode +programmer + id = "dragon_isp"; + desc = "Atmel AVR Dragon in ISP mode"; + baudrate = 115200; + type = dragon_isp; +; + +# AVR Dragon in PP mode +programmer + id = "dragon_pp"; + desc = "Atmel AVR Dragon in PP mode"; + baudrate = 115200; + type = dragon_pp; +; + +# AVR Dragon in HVSP mode +programmer + id = "dragon_hvsp"; + desc = "Atmel AVR Dragon in HVSP mode"; + baudrate = 115200; + type = dragon_hvsp; +; + +# AVR Dragon in debugWire mode +programmer + id = "dragon_dw"; + desc = "Atmel AVR Dragon in debugWire mode"; + baudrate = 115200; + type = dragon_dw; +; + +# AVR Dragon in PDI mode +programmer + id = "dragon_pdi"; + desc = "Atmel AVR Dragon in PDI mode"; + baudrate = 115200; + type = dragon_pdi; +; + +programmer + id = "pavr"; + desc = "Jason Kyle's pAVR Serial Programmer"; + type = avr910; +; + +# Parallel port programmers. + +programmer + id = "bsd"; + desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; + type = par; + vcc = 2, 3, 4, 5; + reset = 7; + sck = 8; + mosi = 9; + miso = 10; +; + +programmer + id = "stk200"; + desc = "STK200"; + type = par; + buff = 4, 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; +; + +# The programming dongle used by the popular Ponyprog +# utility. It is almost similar to the STK200 one, +# except that there is a LED indicating that the +# programming is currently in progress. + +programmer + id = "pony-stk200"; + desc = "Pony Prog STK200"; + type = par; + buff = 4, 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; + pgmled = 8; +; + +programmer + id = "dt006"; + desc = "Dontronics DT006"; + type = par; + reset = 4; + sck = 5; + mosi = 2; + miso = 11; +; + +programmer + id = "bascom"; + desc = "Bascom SAMPLE programming cable"; + type = par; + reset = 4; + sck = 5; + mosi = 2; + miso = 11; +; + +programmer + id = "alf"; + desc = "Nightshade ALF-PgmAVR, http://nightshade.homeip.net/"; + type = par; + vcc = 2, 3, 4, 5; + buff = 6; + reset = 7; + sck = 8; + mosi = 9; + miso = 10; + errled = 1; + rdyled = 14; + pgmled = 16; + vfyled = 17; +; + +programmer + id = "sp12"; + desc = "Steve Bolt's Programmer"; + type = par; + vcc = 4,5,6,7,8; + reset = 3; + sck = 2; + mosi = 9; + miso = 11; +; + +programmer + id = "picoweb"; + desc = "Picoweb Programming Cable, http://www.picoweb.net/"; + type = par; + reset = 2; + sck = 3; + mosi = 4; + miso = 13; +; + +programmer + id = "abcmini"; + desc = "ABCmini Board, aka Dick Smith HOTCHIP"; + type = par; + reset = 4; + sck = 3; + mosi = 2; + miso = 10; +; + +programmer + id = "futurlec"; + desc = "Futurlec.com programming cable."; + type = par; + reset = 3; + sck = 2; + mosi = 1; + miso = 10; +; + + +# From the contributor of the "xil" jtag cable: +# The "vcc" definition isn't really vcc (the cable gets its power from +# the programming circuit) but is necessary to switch one of the +# buffer lines (trying to add it to the "buff" lines doesn't work). +# With this, TMS connects to RESET, TDI to MOSI, TDO to MISO and TCK +# to SCK (plus vcc/gnd of course) +programmer + id = "xil"; + desc = "Xilinx JTAG cable"; + type = par; + mosi = 2; + sck = 3; + reset = 4; + buff = 5; + miso = 13; + vcc = 6; +; + + +programmer + id = "dapa"; + desc = "Direct AVR Parallel Access cable"; + type = par; + vcc = 3; + reset = 16; + sck = 1; + mosi = 2; + miso = 11; +; + +programmer + id = "atisp"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + type = par; + reset = ~6; + sck = ~8; + mosi = ~7; + miso = ~10; +; + +programmer + id = "ere-isp-avr"; + desc = "ERE ISP-AVR "; + type = par; + reset = ~4; + sck = 3; + mosi = 2; + miso = 10; +; + +programmer + id = "blaster"; + desc = "Altera ByteBlaster"; + type = par; + sck = 2; + miso = 11; + reset = 3; + mosi = 8; + buff = 14; +; + +# It is almost same as pony-stk200, except vcc on pin 5 to auto +# disconnect port (download on http://electropol.free.fr) +programmer + id = "frank-stk200"; + desc = "Frank STK200"; + type = par; + vcc = 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; + pgmled = 8; +; + +# The AT98ISP Cable is a simple parallel dongle for AT89 family. +# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 +programmer +id = "89isp"; +desc = "Atmel at89isp cable"; +type = par; +reset = 17; +sck = 1; +mosi = 2; +miso = 10; +; + + +# +# some ultra cheap programmers use bitbanging on the +# serialport. +# +# PC - DB9 - Pins for RS232: +# +# GND 5 -- |O +# | O| <- 9 RI +# DTR 4 <- |O | +# | O| <- 8 CTS +# TXD 3 <- |O | +# | O| -> 7 RTS +# RXD 2 -> |O | +# | O| <- 6 DSR +# DCD 1 -> |O +# +# Using RXD is currently not supported. +# Using RI is not supported under Win32 but is supported under Posix. + +# serial ponyprog design (dasa2 in uisp) +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "ponyser"; + desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts"; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# Same as above, different name +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "siprog"; + desc = "Lancos SI-Prog "; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# unknown (dasa in uisp) +# reset=rts sck=dtr mosi=txd miso=cts + +programmer + id = "dasa"; + desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts"; + type = serbb; + reset = 7; + sck = 4; + mosi = 3; + miso = 8; +; + +# unknown (dasa3 in uisp) +# reset=!dtr sck=rts mosi=txd miso=cts + +programmer + id = "dasa3"; + desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; + type = serbb; + reset = ~4; + sck = 7; + mosi = 3; + miso = 8; +; + +# C2N232i (jumper configuration "auto") +# reset=dtr sck=!rts mosi=!txd miso=!cts + +programmer + id = "c2n232i"; + desc = "serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts"; + type = serbb; + reset = 4; + sck = ~7; + mosi = ~3; + miso = ~8; +; + +# +# PART DEFINITIONS +# + +#------------------------------------------------------------ +# ATtiny11 +#------------------------------------------------------------ + +# This is an HVSP-only device. + +part + id = "t11"; + desc = "ATtiny11"; + stk500_devcode = 0x11; + signature = 0x1e 0x90 0x04; + chip_erase_delay = 20000; + + timeout = 200; + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + blocksize = 64; + readsize = 256; + delay = 5; + ; + + memory "flash" + size = 1024; + blocksize = 128; + readsize = 256; + delay = 3; + ; + + memory "signature" + size = 3; + ; + + memory "lock" + size = 1; + ; + + memory "calibration" + size = 1; + ; + + memory "fuse" + size = 1; + ; +; + +#------------------------------------------------------------ +# ATtiny12 +#------------------------------------------------------------ + +part + id = "t12"; + desc = "ATtiny12"; + stk500_devcode = 0x12; + avr910_devcode = 0x55; + signature = 0x1e 0x90 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 8; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4500; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# ATtiny13 +#------------------------------------------------------------ + +part + id = "t13"; + desc = "ATtiny13"; + has_debugwire = yes; + flash_instr = 0xB4, 0x0E, 0x1E; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; + signature = 0x1e 0x90 0x07; + chip_erase_delay = 4000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 90; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 1024; + page_size = 32; + num_pages = 32; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny15 +#------------------------------------------------------------ + +part + id = "t15"; + desc = "ATtiny15"; + stk500_devcode = 0x13; + avr910_devcode = 0x56; + signature = 0x1e 0x90 0x06; + chip_erase_delay = 8200; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 5; + synchcycles = 6; + latchcycles = 16; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 8200; + max_write_delay = 8200; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4100; + max_write_delay = 4100; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o x x o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i 1 1 i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# AT90s1200 +#------------------------------------------------------------ + +part + id = "1200"; + desc = "AT90S1200"; + stk500_devcode = 0x33; + avr910_devcode = 0x13; + signature = 0x1e 0x90 0x01; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 1; + bytedelay = 0; + pollindex = 0; + pollvalue = 0xFF; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 64; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 32; + readsize = 256; + ; + memory "flash" + size = 1024; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x02; + delay = 15; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4414 +#------------------------------------------------------------ + +part + id = "4414"; + desc = "AT90S4414"; + stk500_devcode = 0x50; + avr910_devcode = 0x28; + signature = 0x1e 0x92 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2313 +#------------------------------------------------------------ + +part + id = "2313"; + desc = "AT90S2313"; + stk500_devcode = 0x40; + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x i i x", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2333 +#------------------------------------------------------------ + +part + id = "2333"; +##### WARNING: No XML file for device 'AT90S2333'! ##### + desc = "AT90S2333"; + stk500_devcode = 0x42; + avr910_devcode = 0x34; + signature = 0x1e 0x91 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s2343 (also AT90s2323 and ATtiny22) +#------------------------------------------------------------ + +part + id = "2343"; + desc = "AT90S2343"; + stk500_devcode = 0x43; + avr910_devcode = 0x4c; + signature = 0x1e 0x91 0x03; + chip_erase_delay = 18000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 0; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 128; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s4433 +#------------------------------------------------------------ + +part + id = "4433"; + desc = "AT90S4433"; + stk500_devcode = 0x51; + avr910_devcode = 0x30; + signature = 0x1e 0x92 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4434 +#------------------------------------------------------------ + +part + id = "4434"; +##### WARNING: No XML file for device 'AT90S4434'! ##### + desc = "AT90S4434"; + stk500_devcode = 0x52; + avr910_devcode = 0x6c; + signature = 0x1e 0x92 0x02; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s8515 +#------------------------------------------------------------ + +part + id = "8515"; + desc = "AT90S8515"; + stk500_devcode = 0x60; + avr910_devcode = 0x38; + signature = 0x1e 0x93 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s8535 +#------------------------------------------------------------ + +part + id = "8535"; + desc = "AT90S8535"; + stk500_devcode = 0x61; + avr910_devcode = 0x68; + signature = 0x1e 0x93 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x x o"; + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o x x x x x x"; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# ATmega103 +#------------------------------------------------------------ + +part + id = "m103"; + desc = "ATMEGA103"; + stk500_devcode = 0xB1; + avr910_devcode = 0x41; + signature = 0x1e 0x97 0x01; + chip_erase_delay = 112000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x8E, 0x9E, 0x2E, 0x3E, 0xAE, 0xBE, + 0x4E, 0x5E, 0xCE, 0xDE, 0x6E, 0x7E, 0xEE, 0xDE, + 0x66, 0x76, 0xE6, 0xF6, 0x6A, 0x7A, 0xEA, 0x7A, + 0x7F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 10; + + memory "eeprom" + size = 4096; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 22000; + max_write_delay = 56000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 70; + blocksize = 256; + readsize = 256; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o x o 1 o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 i 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega64 +#------------------------------------------------------------ + +part + id = "m64"; + desc = "ATMEGA64"; + has_jtag = yes; + stk500_devcode = 0xA0; + avr910_devcode = 0x45; + signature = 0x1e 0x96 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega128 +#------------------------------------------------------------ + +part + id = "m128"; + desc = "ATMEGA128"; + has_jtag = yes; + stk500_devcode = 0xB2; + avr910_devcode = 0x43; + signature = 0x1e 0x97 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + rampz = 0x3b; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN128 +#------------------------------------------------------------ + +part + id = "c128"; + desc = "AT90CAN128"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x97 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN64 +#------------------------------------------------------------ + +part + id = "c64"; + desc = "AT90CAN64"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x96 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN32 +#------------------------------------------------------------ + +part + id = "c32"; + desc = "AT90CAN32"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x95 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 256; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega16 +#------------------------------------------------------------ + +part + id = "m16"; + desc = "ATMEGA16"; + has_jtag = yes; + stk500_devcode = 0x82; + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x03; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 100; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "calibration" + size = 4; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega164P +#------------------------------------------------------------ + +# close to ATmega16 + +part + id = "m164p"; + desc = "ATMEGA164P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega324P +#------------------------------------------------------------ + +# similar to ATmega164P + +part + id = "m324p"; + desc = "ATMEGA324P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x95 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega644 +#------------------------------------------------------------ + +# similar to ATmega164 + +part + id = "m644"; + desc = "ATMEGA644"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x09; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega644P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m644p"; + desc = "ATMEGA644P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega1284P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m1284p"; + desc = "ATMEGA1284P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x97 0x05; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega162 +#------------------------------------------------------------ + +part + id = "m162"; + desc = "ATMEGA162"; + has_jtag = yes; + stk500_devcode = 0x83; + avr910_devcode = 0x63; + signature = 0x1e 0x94 0x04; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + + idr = 0x04; + spmcr = 0x57; + allowfullpagebitstream = yes; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + + ; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; +; + + + +#------------------------------------------------------------ +# ATmega163 +#------------------------------------------------------------ + +part + id = "m163"; + desc = "ATMEGA163"; + stk500_devcode = 0x81; + avr910_devcode = 0x64; + signature = 0x1e 0x94 0x02; + chip_erase_delay = 32000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 16000; + max_write_delay = 16000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 20; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o x x o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i 1 1 i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x 1 o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x 0 x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega169 +#------------------------------------------------------------ + +part + id = "m169"; + desc = "ATMEGA169"; + has_jtag = yes; + stk500_devcode = 0x85; + avr910_devcode = 0x78; + signature = 0x1e 0x94 0x05; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329 +#------------------------------------------------------------ + +part + id = "m329"; + desc = "ATMEGA329"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329P +#------------------------------------------------------------ +# Identical to ATmega329 except of the signature + +part + id = "m329p"; + desc = "ATMEGA329P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0b; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290 +#------------------------------------------------------------ + +# identical to ATmega329 + +part + id = "m3290"; + desc = "ATMEGA3290"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290P +#------------------------------------------------------------ + +# identical to ATmega3290 except of the signature + +part + id = "m3290p"; + desc = "ATMEGA3290P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0c; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega649 +#------------------------------------------------------------ + +part + id = "m649"; + desc = "ATMEGA649"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6490 +#------------------------------------------------------------ + +# identical to ATmega649 + +part + id = "m6490"; + desc = "ATMEGA6490"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32 +#------------------------------------------------------------ + +part + id = "m32"; + desc = "ATMEGA32"; + has_jtag = yes; + stk500_devcode = 0x91; + avr910_devcode = 0x72; + signature = 0x1e 0x95 0x02; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega161 +#------------------------------------------------------------ + +part + id = "m161"; + desc = "ATMEGA161"; + stk500_devcode = 0x80; + avr910_devcode = 0x60; + signature = 0x1e 0x94 0x01; + chip_erase_delay = 28000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + memory "eeprom" + size = 512; + min_write_delay = 3400; + max_write_delay = 3400; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 14000; + max_write_delay = 14000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 16; + blocksize = 128; + readsize = 256; + ; + + memory "fuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x o x o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x 1 i 1 i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega8 +#------------------------------------------------------------ + +part + id = "m8"; + desc = "ATMEGA8"; + stk500_devcode = 0x70; + avr910_devcode = 0x76; + signature = 0x1e 0x93 0x07; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 10000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + page_size = 4; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega8515 +#------------------------------------------------------------ + +part + id = "m8515"; + desc = "ATMEGA8515"; + stk500_devcode = 0x63; + avr910_devcode = 0x3A; + signature = 0x1e 0x93 0x06; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega8535 +#------------------------------------------------------------ + +part + id = "m8535"; + desc = "ATMEGA8535"; + stk500_devcode = 0x64; + avr910_devcode = 0x69; + signature = 0x1e 0x93 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATtiny26 +#------------------------------------------------------------ + +part + id = "t26"; + desc = "ATTINY26"; + stk500_devcode = 0x21; + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x09; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 16; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x x x x i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny261 +#------------------------------------------------------------ +# Close to ATtiny26 + +part + id = "t261"; + desc = "ATTINY261"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0c; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 128; + page_size = 4; + num_pages = 32; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny461 +#------------------------------------------------------------ +# Close to ATtiny261 + +part + id = "t461"; + desc = "ATTINY461"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x92 0x08; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 256; + page_size = 4; + num_pages = 64; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny861 +#------------------------------------------------------------ +# Close to ATtiny461 + +part + id = "t861"; + desc = "ATTINY861"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x93 0x0d; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 512; + num_pages = 128; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATmega48 +#------------------------------------------------------------ + +part + id = "m48"; + desc = "ATMEGA48"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x59; +# avr910_devcode = 0x; + signature = 0x1e 0x92 0x05; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 45000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 256; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega88 +#------------------------------------------------------------ + +part + id = "m88"; + desc = "ATMEGA88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x0a; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega168 +#------------------------------------------------------------ + +part + id = "m168"; + desc = "ATMEGA168"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x94 0x06; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny88 +#------------------------------------------------------------ + +part + id = "t88"; + desc = "attiny88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x11; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 64; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 64; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega328P +#------------------------------------------------------------ + +part + id = "m328p"; + desc = "ATMEGA328P"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x95 0x0F; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 1024; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny2313 +#------------------------------------------------------------ + +part + id = "t2313"; + desc = "ATtiny2313"; + has_debugwire = yes; + flash_instr = 0xB2, 0x0F, 0x1F; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x23; +## Use the ATtiny26 devcode: + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0a; + pagel = 0xD4; + bs2 = 0xD6; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, + 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, + 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, + 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +# The Tiny2313 has calibration data for both 4 MHz and 8 MHz. +# The information in the data sheet of April/2004 is wrong, this works: + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2 +#------------------------------------------------------------ + +part + id = "pwm2"; + desc = "AT90PWM2"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3 +#------------------------------------------------------------ + +# Completely identical to AT90PWM2 (including the signature!) + +part + id = "pwm3"; + desc = "AT90PWM3"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2B +#------------------------------------------------------------ +# Same as AT90PWM2 but different signature. + +part + id = "pwm2b"; + desc = "AT90PWM2B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3B +#------------------------------------------------------------ + +# Completely identical to AT90PWM2B (including the signature!) + +part + id = "pwm3b"; + desc = "AT90PWM3B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny25 +#------------------------------------------------------------ + +part + id = "t25"; + desc = "ATtiny25"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x08; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny25 has Signature Bytes: 0x1E 0x91 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny45 +#------------------------------------------------------------ + +part + id = "t45"; + desc = "ATtiny45"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x06; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny45 has Signature Bytes: 0x1E 0x92 0x08. (Data sheet 2586C-AVR-06/05 (doc2586.pdf) indicates otherwise!) + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny85 +#------------------------------------------------------------ + +part + id = "t85"; + desc = "ATtiny85"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny85 has Signature Bytes: 0x1E 0x93 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega640 +#------------------------------------------------------------ +# Almost same as ATmega1280, except for different memory sizes + +part + id = "m640"; + desc = "ATMEGA640"; + signature = 0x1e 0x96 0x08; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1280 +#------------------------------------------------------------ + +part + id = "m1280"; + desc = "ATMEGA1280"; + signature = 0x1e 0x97 0x03; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1281 +#------------------------------------------------------------ +# Identical to ATmega1280 + +part + id = "m1281"; + desc = "ATMEGA1281"; + signature = 0x1e 0x97 0x04; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2560 +#------------------------------------------------------------ + +part + id = "m2560"; + desc = "ATMEGA2560"; + signature = 0x1e 0x98 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2561 +#------------------------------------------------------------ + +part + id = "m2561"; + desc = "ATMEGA2561"; + signature = 0x1e 0x98 0x02; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega128RFA1 +#------------------------------------------------------------ +# Identical to ATmega2561 but half the ROM + +part + id = "m128rfa1"; + desc = "ATMEGA128RFA1"; + signature = 0x1e 0xa7 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xE2; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny24 +#------------------------------------------------------------ + +part + id = "t24"; + desc = "ATtiny24"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny24 has Signature Bytes: 0x1E 0x91 0x0B. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny44 +#------------------------------------------------------------ + +part + id = "t44"; + desc = "ATtiny44"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x07; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny44 has Signature Bytes: 0x1E 0x92 0x07. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny84 +#------------------------------------------------------------ + +part + id = "t84"; + desc = "ATtiny84"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0c; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32u4 +#------------------------------------------------------------ + +part + id = "m32u4"; + desc = "ATmega32U4"; + signature = 0x1e 0x95 0x87; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB646 +#------------------------------------------------------------ + +part + id = "usb646"; + desc = "AT90USB646"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB647 +#------------------------------------------------------------ +# identical to AT90USB646 + +part + id = "usb647"; + desc = "AT90USB647"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1286 +#------------------------------------------------------------ + +part + id = "usb1286"; + desc = "AT90USB1286"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1287 +#------------------------------------------------------------ +# identical to AT90USB1286 + +part + id = "usb1287"; + desc = "AT90USB1287"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# AT90USB162 +#------------------------------------------------------------ + +part + id = "usb162"; + desc = "AT90USB162"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x94 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB82 +#------------------------------------------------------------ +# Changes against AT90USB162 (beside IDs) +# memory "flash" +# size = 8192; +# num_pages = 64; + +part + id = "usb82"; + desc = "AT90USB82"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x93 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 128; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega325 +#------------------------------------------------------------ + +part + id = "m325"; + desc = "ATMEGA325"; + signature = 0x1e 0x95 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega645 +#------------------------------------------------------------ + +part + id = "m645"; + desc = "ATMEGA645"; + signature = 0x1E 0x96 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3250 +#------------------------------------------------------------ + +part + id = "m3250"; + desc = "ATMEGA3250"; + signature = 0x1E 0x95 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6450 +#------------------------------------------------------------ + +part + id = "m6450"; + desc = "ATMEGA6450"; + signature = 0x1E 0x96 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATXMEGA64A1 +#------------------------------------------------------------ + +part + id = "x64a1"; + desc = "ATXMEGA64A1"; + signature = 0x1e 0x96 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1 +#------------------------------------------------------------ + +part + id = "x128a1"; + desc = "ATXMEGA128A1"; + signature = 0x1e 0x97 0x4c; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1REVD +#------------------------------------------------------------ + +part + id = "x128a1d"; + desc = "ATXMEGA128A1REVD"; + signature = 0x1e 0x97 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A1 +#------------------------------------------------------------ + +part + id = "x192a1"; + desc = "ATXMEGA192A1"; + signature = 0x1e 0x97 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A1 +#------------------------------------------------------------ + +part + id = "x256a1"; + desc = "ATXMEGA256A1"; + signature = 0x1e 0x98 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A3 +#------------------------------------------------------------ + +part + id = "x64a3"; + desc = "ATXMEGA64A3"; + signature = 0x1e 0x96 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A3 +#------------------------------------------------------------ + +part + id = "x128a3"; + desc = "ATXMEGA128A3"; + signature = 0x1e 0x97 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A3 +#------------------------------------------------------------ + +part + id = "x192a3"; + desc = "ATXMEGA192A3"; + signature = 0x1e 0x97 0x44; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3 +#------------------------------------------------------------ + +part + id = "x256a3"; + desc = "ATXMEGA256A3"; + signature = 0x1e 0x98 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3B +#------------------------------------------------------------ + +part + id = "x256a3b"; + desc = "ATXMEGA256A3B"; + signature = 0x1e 0x98 0x43; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA16A4 +#------------------------------------------------------------ + +part + id = "x16a4"; + desc = "ATXMEGA16A4"; + signature = 0x1e 0x94 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00004000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00803000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00804000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00005000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA32A4 +#------------------------------------------------------------ + +part + id = "x32a4"; + desc = "ATXMEGA32A4"; + signature = 0x1e 0x95 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00008000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00807000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00808000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00009000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A4 +#------------------------------------------------------------ + +part + id = "x64a4"; + desc = "ATXMEGA64A4"; + signature = 0x1e 0x96 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A4 +#------------------------------------------------------------ + +part + id = "x128a4"; + desc = "ATXMEGA128A4"; + signature = 0x1e 0x97 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + + +#------------------------------------------------------------ +# AVR32UC3A0512 +#------------------------------------------------------------ + +part + id = "ucr2"; + desc = "32UC3A0512"; + signature = 0xED 0xC0 0x3F; + has_jtag = yes; + is_avr32 = yes; + + memory "flash" + paged = yes; + page_size = 512; # bytes + readsize = 512; # bytes + num_pages = 1024; # could be set dynamicly + size = 0x00080000; # could be set dynamicly + offset = 0x80000000; + ; +; + +#------------------------------------------------------------ +# ATtiny4 +#------------------------------------------------------------ + +part + id = "t4"; + desc = "ATtiny4"; + signature = 0x1e 0x8f 0x0a; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny5 +#------------------------------------------------------------ + +part + id = "t5"; + desc = "ATtiny5"; + signature = 0x1e 0x8f 0x09; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny9 +#------------------------------------------------------------ + +part + id = "t8"; + desc = "ATtiny9"; + signature = 0x1e 0x90 0x08; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny10 +#------------------------------------------------------------ + +part + id = "t10"; + desc = "ATtiny10"; + signature = 0x1e 0x90 0x03; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + diff --git a/buildroot/share/atom/avrdude_5.10_linux b/buildroot/share/atom/avrdude_5.10_linux new file mode 100644 index 0000000000000000000000000000000000000000..0b7f3fda43501321935378999e219175e706ef87 GIT binary patch literal 1159576 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

+%f7Fmmh#`gxTtf6PxF{iJ$m@tFd~qw= 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%0D_66Ac*SxR_akZ1XwWrQ~bd6wTc2P0 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 ?KPCcS?c4#OLd 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%0A_VVvYPL{>LJ24syUp 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 literal 0 HcmV?d00001 diff --git a/buildroot/share/atom/avrdude_5.10_macOS b/buildroot/share/atom/avrdude_5.10_macOS new file mode 100644 index 0000000000000000000000000000000000000000..dbcfc997e4b38549229131c49f40811eaa561d00 GIT binary patch literal 346784 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

&@;gZ7-Z7~G`%wWNxP{dWNkzCee17xit&z2uV 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 [, [, ] ...] ; # are quoted strings +# desc = ; # quoted string +# type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic | +# stk600 | stk600pp | stk600hvsp | +# avr910 | butterfly | usbasp | +# jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw | +# jtagmkII_avr32 | jtagmkii_pdi | +# dragon_dw | dragon_jtag | dragon_isp | dragon_pp | +# dragon_hvsp | dragon_pdi | arduino; # programmer type +# baudrate = ; # baudrate for avr910-programmer +# vcc = [, ... ] ; # pin number(s) +# reset = ; # pin number +# sck = ; # pin number +# mosi = ; # pin number +# miso = ; # pin number +# errled = ; # pin number +# rdyled = ; # pin number +# pgmled = ; # pin number +# vfyled = ; # pin number +# ; +# +# part +# id = ; # quoted string +# desc = ; # quoted string +# has_jtag = ; # part has JTAG i/f +# has_debugwire = ; # part has debugWire i/f +# has_pdi = ; # part has PDI i/f +# has_tpi = ; # part has TPI i/f +# devicecode = ; # deprecated, use stk500_devcode +# stk500_devcode = ; # numeric +# avr910_devcode = ; # numeric +# signature = ; # signature bytes +# chip_erase_delay = ; # micro-seconds +# reset = dedicated | io; +# retry_pulse = reset | sck; +# pgm_enable = ; +# chip_erase = ; +# chip_erase_delay = ; # chip erase delay (us) +# # STK500 parameters (parallel programming IO lines) +# pagel = ; # pin name in hex, i.e., 0xD7 +# bs2 = ; # pin name in hex, i.e., 0xA0 +# serial = ; # can use serial downloading +# parallel = ; # can use par. programming +# # STK500v2 parameters, to be taken from Atmel's XML files +# timeout = ; +# stabdelay = ; +# cmdexedelay = ; +# synchloops = ; +# bytedelay = ; +# pollvalue = ; +# pollindex = ; +# predelay = ; +# postdelay = ; +# pollmethod = ; +# mode = ; +# delay = ; +# blocksize = ; +# readsize = ; +# hvspcmdexedelay = ; +# # STK500v2 HV programming parameters, from XML +# pp_controlstack = , , ...; # PP only +# hvsp_controlstack = , , ...; # HVSP only +# hventerstabdelay = ; +# progmodedelay = ; # PP only +# latchcycles = ; +# togglevtg = ; +# poweroffdelay = ; +# resetdelayms = ; +# resetdelayus = ; +# hvleavestabdelay = ; +# resetdelay = ; +# synchcycles = ; # HVSP only +# chiperasepulsewidth = ; # PP only +# chiperasepolltimeout = ; +# chiperasetime = ; # HVSP only +# programfusepulsewidth = ; # PP only +# programfusepolltimeout = ; +# programlockpulsewidth = ; # PP only +# programlockpolltimeout = ; +# # JTAG ICE mkII parameters, also from XML files +# allowfullpagebitstream = ; +# enablepageprogramming = ; +# idr = ; # IO addr of IDR (OCD) reg. +# rampz = ; # IO addr of RAMPZ reg. +# spmcr = ; # mem addr of SPMC[S]R reg. +# eecr = ; # mem addr of EECR reg. +# # (only when != 0x3c) +# is_avr32 = ; # AVR32 part +# +# memory +# paged = ; # yes / no +# size = ; # bytes +# page_size = ; # bytes +# num_pages = ; # numeric +# min_write_delay = ; # micro-seconds +# max_write_delay = ; # micro-seconds +# readback_p1 = ; # byte value +# readback_p2 = ; # byte value +# pwroff_after_write = ; # yes / no +# read = ; +# write = ; +# read_lo = ; +# read_hi = ; +# write_lo = ; +# write_hi = ; +# loadpage_lo = ; +# loadpage_hi = ; +# writepage = ; +# ; +# ; +# +# If any of the above parameters are not specified, the default value +# of 0 is used for numerics or the empty string ("") for string +# values. If a required parameter is left empty, AVRDUDE will +# complain. +# +# NOTES: +# * 'devicecode' is the device code used by the STK500 (see codes +# listed below) +# * Not all memory types will implement all instructions. +# * AVR Fuse bits and Lock bits are implemented as a type of memory. +# * Example memory types are: +# "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high +# fuse), "signature", "calibration", "lock" +# * The memory type specified on the avrdude command line must match +# one of the memory types defined for the specified chip. +# * The pwroff_after_write flag causes avrdude to attempt to +# power the device off and back on after an unsuccessful write to +# the affected memory area if VCC programmer pins are defined. If +# VCC pins are not defined for the programmer, a message +# indicating that the device needs a power-cycle is printed out. +# This flag was added to work around a problem with the +# at90s4433/2333's; see the at90s4433 errata at: +# +# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# +# INSTRUCTION FORMATS +# +# Instruction formats are specified as a comma seperated list of +# string values containing information (bit specifiers) about each +# of the 32 bits of the instruction. Bit specifiers may be one of +# the following formats: +# +# '1' = the bit is always set on input as well as output +# +# '0' = the bit is always clear on input as well as output +# +# 'x' = the bit is ignored on input and output +# +# 'a' = the bit is an address bit, the bit-number matches this bit +# specifier's position within the current instruction byte +# +# 'aN' = the bit is the Nth address bit, bit-number = N, i.e., a12 +# is address bit 12 on input, a0 is address bit 0. +# +# 'i' = the bit is an input data bit +# +# 'o' = the bit is an output data bit +# +# Each instruction must be composed of 32 bit specifiers. The +# instruction specification closely follows the instruction data +# provided in Atmel's data sheets for their parts. +# +# See below for some examples. +# +# +# The following are STK500 part device codes to use for the +# "devicecode" field of the part. These came from Atmel's software +# section avr061.zip which accompanies the application note +# AVR061 available from: +# +# http://www.atmel.com/atmel/acrobat/doc2525.pdf +# + +#define ATTINY10 0x10 /* the _old_ one that never existed! */ +#define ATTINY11 0x11 +#define ATTINY12 0x12 +#define ATTINY15 0x13 +#define ATTINY13 0x14 + +#define ATTINY22 0x20 +#define ATTINY26 0x21 +#define ATTINY28 0x22 +#define ATTINY2313 0x23 + +#define AT90S1200 0x33 + +#define AT90S2313 0x40 +#define AT90S2323 0x41 +#define AT90S2333 0x42 +#define AT90S2343 0x43 + +#define AT90S4414 0x50 +#define AT90S4433 0x51 +#define AT90S4434 0x52 +#define ATMEGA48 0x59 + +#define AT90S8515 0x60 +#define AT90S8535 0x61 +#define AT90C8534 0x62 +#define ATMEGA8515 0x63 +#define ATMEGA8535 0x64 + +#define ATMEGA8 0x70 +#define ATMEGA88 0x73 +#define ATMEGA168 0x86 + +#define ATMEGA161 0x80 +#define ATMEGA163 0x81 +#define ATMEGA16 0x82 +#define ATMEGA162 0x83 +#define ATMEGA169 0x84 + +#define ATMEGA323 0x90 +#define ATMEGA32 0x91 + +#define ATMEGA64 0xA0 + +#define ATMEGA103 0xB1 +#define ATMEGA128 0xB2 +#define AT90CAN128 0xB3 +#define AT90CAN64 0xB3 +#define AT90CAN32 0xB3 + +#define AT86RF401 0xD0 + +#define AT89START 0xE0 +#define AT89S51 0xE0 +#define AT89S52 0xE1 + +# The following table lists the devices in the original AVR910 +# appnote: +# |Device |Signature | Code | +# +-------+----------+------+ +# |tiny12 | 1E 90 05 | 0x55 | +# |tiny15 | 1E 90 06 | 0x56 | +# | | | | +# | S1200 | 1E 90 01 | 0x13 | +# | | | | +# | S2313 | 1E 91 01 | 0x20 | +# | S2323 | 1E 91 02 | 0x48 | +# | S2333 | 1E 91 05 | 0x34 | +# | S2343 | 1E 91 03 | 0x4C | +# | | | | +# | S4414 | 1E 92 01 | 0x28 | +# | S4433 | 1E 92 03 | 0x30 | +# | S4434 | 1E 92 02 | 0x6C | +# | | | | +# | S8515 | 1E 93 01 | 0x38 | +# | S8535 | 1E 93 03 | 0x68 | +# | | | | +# |mega32 | 1E 95 01 | 0x72 | +# |mega83 | 1E 93 05 | 0x65 | +# |mega103| 1E 97 01 | 0x41 | +# |mega161| 1E 94 01 | 0x60 | +# |mega163| 1E 94 02 | 0x64 | + +# Appnote AVR109 also has a table of AVR910 device codes, which +# lists: +# dev avr910 signature +# ATmega8 0x77 0x1E 0x93 0x07 +# ATmega8515 0x3B 0x1E 0x93 0x06 +# ATmega8535 0x6A 0x1E 0x93 0x08 +# ATmega16 0x75 0x1E 0x94 0x03 +# ATmega162 0x63 0x1E 0x94 0x04 +# ATmega163 0x66 0x1E 0x94 0x02 +# ATmega169 0x79 0x1E 0x94 0x05 +# ATmega32 0x7F 0x1E 0x95 0x02 +# ATmega323 0x73 0x1E 0x95 0x01 +# ATmega64 0x46 0x1E 0x96 0x02 +# ATmega128 0x44 0x1E 0x97 0x02 +# +# These codes refer to "BOOT" device codes which are apparently +# different than standard device codes, for whatever reasons +# (often one above the standard code). + +# There are several extended versions of AVR910 implementations around +# in the Internet. These add the following codes (only devices that +# actually exist are listed): + +# ATmega8515 0x3A +# ATmega128 0x43 +# ATmega64 0x45 +# ATtiny26 0x5E +# ATmega8535 0x69 +# ATmega32 0x72 +# ATmega16 0x74 +# ATmega8 0x76 +# ATmega169 0x78 + +# +# Overall avrdude defaults +# +default_parallel = "/dev/parport0"; +default_serial = "/dev/ttyS0"; + + +# +# PROGRAMMER DEFINITIONS +# + +programmer + id = "arduino"; + desc = "Arduino"; + type = arduino; +; + +programmer + id = "avrisp"; + desc = "Atmel AVR ISP"; + type = stk500; +; + +programmer + id = "avrispv2"; + desc = "Atmel AVR ISP V2"; + type = stk500v2; +; + +programmer + id = "avrispmkII"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "avrisp2"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "buspirate"; + desc = "The Bus Pirate"; + type = buspirate; +; + +# This is supposed to be the "default" STK500 entry. +# Attempts to select the correct firmware version +# by probing for it. Better use one of the entries +# below instead. +programmer + id = "stk500"; + desc = "Atmel STK500"; + type = stk500generic; +; + +programmer + id = "stk500v1"; + desc = "Atmel STK500 Version 1.x firmware"; + type = stk500; +; + +programmer + id = "mib510"; + desc = "Crossbow MIB510 programming board"; + type = stk500; +; + +programmer + id = "stk500v2"; + desc = "Atmel STK500 Version 2.x firmware"; + type = stk500v2; +; + +programmer + id = "stk500pp"; + desc = "Atmel STK500 V2 in parallel programming mode"; + type = stk500pp; +; + +programmer + id = "stk500hvsp"; + desc = "Atmel STK500 V2 in high-voltage serial programming mode"; + type = stk500hvsp; +; + +programmer + id = "stk600"; + desc = "Atmel STK600"; + type = stk600; +; + +programmer + id = "stk600pp"; + desc = "Atmel STK600 in parallel programming mode"; + type = stk600pp; +; + +programmer + id = "stk600hvsp"; + desc = "Atmel STK600 in high-voltage serial programming mode"; + type = stk600hvsp; +; + +programmer + id = "avr910"; + desc = "Atmel Low Cost Serial Programmer"; + type = avr910; +; + +programmer + id = "usbasp"; + desc = "USBasp, http://www.fischl.de/usbasp/"; + type = usbasp; +; + +programmer + id = "usbtiny"; + desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + type = usbtiny; +; + +programmer + id = "butterfly"; + desc = "Atmel Butterfly Development Board"; + type = butterfly; +; + +programmer + id = "avr109"; + desc = "Atmel AppNote AVR109 Boot Loader"; + type = butterfly; +; + +programmer + id = "avr911"; + desc = "Atmel AppNote AVR911 AVROSP"; + type = butterfly; +; + +programmer + id = "jtagmkI"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1slow"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 19200; + type = jtagmki; +; + +programmer + id = "jtagmkII"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# easier to type +programmer + id = "jtag2slow"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# JTAG ICE mkII @ 115200 Bd +programmer + id = "jtag2fast"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# make the fast one the default, people will love that +programmer + id = "jtag2"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# JTAG ICE mkII in ISP mode +programmer + id = "jtag2isp"; + desc = "Atmel JTAG ICE mkII in ISP mode"; + baudrate = 115200; + type = jtagmkii_isp; +; + +# JTAG ICE mkII in debugWire mode +programmer + id = "jtag2dw"; + desc = "Atmel JTAG ICE mkII in debugWire mode"; + baudrate = 115200; + type = jtagmkii_dw; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtagmkII_avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtag2avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in PDI mode +programmer + id = "jtag2pdi"; + desc = "Atmel JTAG ICE mkII PDI mode"; + baudrate = 115200; + type = jtagmkii_pdi; +; + +# AVR Dragon in JTAG mode +programmer + id = "dragon_jtag"; + desc = "Atmel AVR Dragon in JTAG mode"; + baudrate = 115200; + type = dragon_jtag; +; + +# AVR Dragon in ISP mode +programmer + id = "dragon_isp"; + desc = "Atmel AVR Dragon in ISP mode"; + baudrate = 115200; + type = dragon_isp; +; + +# AVR Dragon in PP mode +programmer + id = "dragon_pp"; + desc = "Atmel AVR Dragon in PP mode"; + baudrate = 115200; + type = dragon_pp; +; + +# AVR Dragon in HVSP mode +programmer + id = "dragon_hvsp"; + desc = "Atmel AVR Dragon in HVSP mode"; + baudrate = 115200; + type = dragon_hvsp; +; + +# AVR Dragon in debugWire mode +programmer + id = "dragon_dw"; + desc = "Atmel AVR Dragon in debugWire mode"; + baudrate = 115200; + type = dragon_dw; +; + +# AVR Dragon in PDI mode +programmer + id = "dragon_pdi"; + desc = "Atmel AVR Dragon in PDI mode"; + baudrate = 115200; + type = dragon_pdi; +; + +programmer + id = "pavr"; + desc = "Jason Kyle's pAVR Serial Programmer"; + type = avr910; +; + +# Parallel port programmers. + +programmer + id = "bsd"; + desc = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/"; + type = par; + vcc = 2, 3, 4, 5; + reset = 7; + sck = 8; + mosi = 9; + miso = 10; +; + +programmer + id = "stk200"; + desc = "STK200"; + type = par; + buff = 4, 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; +; + +# The programming dongle used by the popular Ponyprog +# utility. It is almost similar to the STK200 one, +# except that there is a LED indicating that the +# programming is currently in progress. + +programmer + id = "pony-stk200"; + desc = "Pony Prog STK200"; + type = par; + buff = 4, 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; + pgmled = 8; +; + +programmer + id = "dt006"; + desc = "Dontronics DT006"; + type = par; + reset = 4; + sck = 5; + mosi = 2; + miso = 11; +; + +programmer + id = "bascom"; + desc = "Bascom SAMPLE programming cable"; + type = par; + reset = 4; + sck = 5; + mosi = 2; + miso = 11; +; + +programmer + id = "alf"; + desc = "Nightshade ALF-PgmAVR, http://nightshade.homeip.net/"; + type = par; + vcc = 2, 3, 4, 5; + buff = 6; + reset = 7; + sck = 8; + mosi = 9; + miso = 10; + errled = 1; + rdyled = 14; + pgmled = 16; + vfyled = 17; +; + +programmer + id = "sp12"; + desc = "Steve Bolt's Programmer"; + type = par; + vcc = 4,5,6,7,8; + reset = 3; + sck = 2; + mosi = 9; + miso = 11; +; + +programmer + id = "picoweb"; + desc = "Picoweb Programming Cable, http://www.picoweb.net/"; + type = par; + reset = 2; + sck = 3; + mosi = 4; + miso = 13; +; + +programmer + id = "abcmini"; + desc = "ABCmini Board, aka Dick Smith HOTCHIP"; + type = par; + reset = 4; + sck = 3; + mosi = 2; + miso = 10; +; + +programmer + id = "futurlec"; + desc = "Futurlec.com programming cable."; + type = par; + reset = 3; + sck = 2; + mosi = 1; + miso = 10; +; + + +# From the contributor of the "xil" jtag cable: +# The "vcc" definition isn't really vcc (the cable gets its power from +# the programming circuit) but is necessary to switch one of the +# buffer lines (trying to add it to the "buff" lines doesn't work). +# With this, TMS connects to RESET, TDI to MOSI, TDO to MISO and TCK +# to SCK (plus vcc/gnd of course) +programmer + id = "xil"; + desc = "Xilinx JTAG cable"; + type = par; + mosi = 2; + sck = 3; + reset = 4; + buff = 5; + miso = 13; + vcc = 6; +; + + +programmer + id = "dapa"; + desc = "Direct AVR Parallel Access cable"; + type = par; + vcc = 3; + reset = 16; + sck = 1; + mosi = 2; + miso = 11; +; + +programmer + id = "atisp"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + type = par; + reset = ~6; + sck = ~8; + mosi = ~7; + miso = ~10; +; + +programmer + id = "ere-isp-avr"; + desc = "ERE ISP-AVR "; + type = par; + reset = ~4; + sck = 3; + mosi = 2; + miso = 10; +; + +programmer + id = "blaster"; + desc = "Altera ByteBlaster"; + type = par; + sck = 2; + miso = 11; + reset = 3; + mosi = 8; + buff = 14; +; + +# It is almost same as pony-stk200, except vcc on pin 5 to auto +# disconnect port (download on http://electropol.free.fr) +programmer + id = "frank-stk200"; + desc = "Frank STK200"; + type = par; + vcc = 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; + pgmled = 8; +; + +# The AT98ISP Cable is a simple parallel dongle for AT89 family. +# http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2877 +programmer +id = "89isp"; +desc = "Atmel at89isp cable"; +type = par; +reset = 17; +sck = 1; +mosi = 2; +miso = 10; +; + + +# +# some ultra cheap programmers use bitbanging on the +# serialport. +# +# PC - DB9 - Pins for RS232: +# +# GND 5 -- |O +# | O| <- 9 RI +# DTR 4 <- |O | +# | O| <- 8 CTS +# TXD 3 <- |O | +# | O| -> 7 RTS +# RXD 2 -> |O | +# | O| <- 6 DSR +# DCD 1 -> |O +# +# Using RXD is currently not supported. +# Using RI is not supported under Win32 but is supported under Posix. + +# serial ponyprog design (dasa2 in uisp) +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "ponyser"; + desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts"; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# Same as above, different name +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "siprog"; + desc = "Lancos SI-Prog "; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# unknown (dasa in uisp) +# reset=rts sck=dtr mosi=txd miso=cts + +programmer + id = "dasa"; + desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts"; + type = serbb; + reset = 7; + sck = 4; + mosi = 3; + miso = 8; +; + +# unknown (dasa3 in uisp) +# reset=!dtr sck=rts mosi=txd miso=cts + +programmer + id = "dasa3"; + desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; + type = serbb; + reset = ~4; + sck = 7; + mosi = 3; + miso = 8; +; + +# C2N232i (jumper configuration "auto") +# reset=dtr sck=!rts mosi=!txd miso=!cts + +programmer + id = "c2n232i"; + desc = "serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts"; + type = serbb; + reset = 4; + sck = ~7; + mosi = ~3; + miso = ~8; +; + +# +# PART DEFINITIONS +# + +#------------------------------------------------------------ +# ATtiny11 +#------------------------------------------------------------ + +# This is an HVSP-only device. + +part + id = "t11"; + desc = "ATtiny11"; + stk500_devcode = 0x11; + signature = 0x1e 0x90 0x04; + chip_erase_delay = 20000; + + timeout = 200; + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + blocksize = 64; + readsize = 256; + delay = 5; + ; + + memory "flash" + size = 1024; + blocksize = 128; + readsize = 256; + delay = 3; + ; + + memory "signature" + size = 3; + ; + + memory "lock" + size = 1; + ; + + memory "calibration" + size = 1; + ; + + memory "fuse" + size = 1; + ; +; + +#------------------------------------------------------------ +# ATtiny12 +#------------------------------------------------------------ + +part + id = "t12"; + desc = "ATtiny12"; + stk500_devcode = 0x12; + avr910_devcode = 0x55; + signature = 0x1e 0x90 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 8; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4500; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# ATtiny13 +#------------------------------------------------------------ + +part + id = "t13"; + desc = "ATtiny13"; + has_debugwire = yes; + flash_instr = 0xB4, 0x0E, 0x1E; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; + signature = 0x1e 0x90 0x07; + chip_erase_delay = 4000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 90; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 1024; + page_size = 32; + num_pages = 32; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny15 +#------------------------------------------------------------ + +part + id = "t15"; + desc = "ATtiny15"; + stk500_devcode = 0x13; + avr910_devcode = 0x56; + signature = 0x1e 0x90 0x06; + chip_erase_delay = 8200; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 5; + synchcycles = 6; + latchcycles = 16; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 8200; + max_write_delay = 8200; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4100; + max_write_delay = 4100; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o x x o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i 1 1 i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# AT90s1200 +#------------------------------------------------------------ + +part + id = "1200"; + desc = "AT90S1200"; + stk500_devcode = 0x33; + avr910_devcode = 0x13; + signature = 0x1e 0x90 0x01; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 1; + bytedelay = 0; + pollindex = 0; + pollvalue = 0xFF; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 64; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 32; + readsize = 256; + ; + memory "flash" + size = 1024; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x02; + delay = 15; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4414 +#------------------------------------------------------------ + +part + id = "4414"; + desc = "AT90S4414"; + stk500_devcode = 0x50; + avr910_devcode = 0x28; + signature = 0x1e 0x92 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2313 +#------------------------------------------------------------ + +part + id = "2313"; + desc = "AT90S2313"; + stk500_devcode = 0x40; + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x i i x", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2333 +#------------------------------------------------------------ + +part + id = "2333"; +##### WARNING: No XML file for device 'AT90S2333'! ##### + desc = "AT90S2333"; + stk500_devcode = 0x42; + avr910_devcode = 0x34; + signature = 0x1e 0x91 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s2343 (also AT90s2323 and ATtiny22) +#------------------------------------------------------------ + +part + id = "2343"; + desc = "AT90S2343"; + stk500_devcode = 0x43; + avr910_devcode = 0x4c; + signature = 0x1e 0x91 0x03; + chip_erase_delay = 18000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 0; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 128; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s4433 +#------------------------------------------------------------ + +part + id = "4433"; + desc = "AT90S4433"; + stk500_devcode = 0x51; + avr910_devcode = 0x30; + signature = 0x1e 0x92 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4434 +#------------------------------------------------------------ + +part + id = "4434"; +##### WARNING: No XML file for device 'AT90S4434'! ##### + desc = "AT90S4434"; + stk500_devcode = 0x52; + avr910_devcode = 0x6c; + signature = 0x1e 0x92 0x02; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s8515 +#------------------------------------------------------------ + +part + id = "8515"; + desc = "AT90S8515"; + stk500_devcode = 0x60; + avr910_devcode = 0x38; + signature = 0x1e 0x93 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s8535 +#------------------------------------------------------------ + +part + id = "8535"; + desc = "AT90S8535"; + stk500_devcode = 0x61; + avr910_devcode = 0x68; + signature = 0x1e 0x93 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x x o"; + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o x x x x x x"; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# ATmega103 +#------------------------------------------------------------ + +part + id = "m103"; + desc = "ATMEGA103"; + stk500_devcode = 0xB1; + avr910_devcode = 0x41; + signature = 0x1e 0x97 0x01; + chip_erase_delay = 112000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x8E, 0x9E, 0x2E, 0x3E, 0xAE, 0xBE, + 0x4E, 0x5E, 0xCE, 0xDE, 0x6E, 0x7E, 0xEE, 0xDE, + 0x66, 0x76, 0xE6, 0xF6, 0x6A, 0x7A, 0xEA, 0x7A, + 0x7F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 10; + + memory "eeprom" + size = 4096; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 22000; + max_write_delay = 56000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 70; + blocksize = 256; + readsize = 256; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o x o 1 o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 i 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega64 +#------------------------------------------------------------ + +part + id = "m64"; + desc = "ATMEGA64"; + has_jtag = yes; + stk500_devcode = 0xA0; + avr910_devcode = 0x45; + signature = 0x1e 0x96 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega128 +#------------------------------------------------------------ + +part + id = "m128"; + desc = "ATMEGA128"; + has_jtag = yes; + stk500_devcode = 0xB2; + avr910_devcode = 0x43; + signature = 0x1e 0x97 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + rampz = 0x3b; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN128 +#------------------------------------------------------------ + +part + id = "c128"; + desc = "AT90CAN128"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x97 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN64 +#------------------------------------------------------------ + +part + id = "c64"; + desc = "AT90CAN64"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x96 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN32 +#------------------------------------------------------------ + +part + id = "c32"; + desc = "AT90CAN32"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x95 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 256; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega16 +#------------------------------------------------------------ + +part + id = "m16"; + desc = "ATMEGA16"; + has_jtag = yes; + stk500_devcode = 0x82; + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x03; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 100; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "calibration" + size = 4; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega164P +#------------------------------------------------------------ + +# close to ATmega16 + +part + id = "m164p"; + desc = "ATMEGA164P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega324P +#------------------------------------------------------------ + +# similar to ATmega164P + +part + id = "m324p"; + desc = "ATMEGA324P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x95 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega644 +#------------------------------------------------------------ + +# similar to ATmega164 + +part + id = "m644"; + desc = "ATMEGA644"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x09; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega644P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m644p"; + desc = "ATMEGA644P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega1284P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m1284p"; + desc = "ATMEGA1284P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x97 0x05; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega162 +#------------------------------------------------------------ + +part + id = "m162"; + desc = "ATMEGA162"; + has_jtag = yes; + stk500_devcode = 0x83; + avr910_devcode = 0x63; + signature = 0x1e 0x94 0x04; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + + idr = 0x04; + spmcr = 0x57; + allowfullpagebitstream = yes; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + + ; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; +; + + + +#------------------------------------------------------------ +# ATmega163 +#------------------------------------------------------------ + +part + id = "m163"; + desc = "ATMEGA163"; + stk500_devcode = 0x81; + avr910_devcode = 0x64; + signature = 0x1e 0x94 0x02; + chip_erase_delay = 32000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 16000; + max_write_delay = 16000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 20; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o x x o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i 1 1 i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x 1 o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x 0 x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega169 +#------------------------------------------------------------ + +part + id = "m169"; + desc = "ATMEGA169"; + has_jtag = yes; + stk500_devcode = 0x85; + avr910_devcode = 0x78; + signature = 0x1e 0x94 0x05; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329 +#------------------------------------------------------------ + +part + id = "m329"; + desc = "ATMEGA329"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329P +#------------------------------------------------------------ +# Identical to ATmega329 except of the signature + +part + id = "m329p"; + desc = "ATMEGA329P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0b; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290 +#------------------------------------------------------------ + +# identical to ATmega329 + +part + id = "m3290"; + desc = "ATMEGA3290"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290P +#------------------------------------------------------------ + +# identical to ATmega3290 except of the signature + +part + id = "m3290p"; + desc = "ATMEGA3290P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0c; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega649 +#------------------------------------------------------------ + +part + id = "m649"; + desc = "ATMEGA649"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6490 +#------------------------------------------------------------ + +# identical to ATmega649 + +part + id = "m6490"; + desc = "ATMEGA6490"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32 +#------------------------------------------------------------ + +part + id = "m32"; + desc = "ATMEGA32"; + has_jtag = yes; + stk500_devcode = 0x91; + avr910_devcode = 0x72; + signature = 0x1e 0x95 0x02; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega161 +#------------------------------------------------------------ + +part + id = "m161"; + desc = "ATMEGA161"; + stk500_devcode = 0x80; + avr910_devcode = 0x60; + signature = 0x1e 0x94 0x01; + chip_erase_delay = 28000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + memory "eeprom" + size = 512; + min_write_delay = 3400; + max_write_delay = 3400; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 14000; + max_write_delay = 14000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 16; + blocksize = 128; + readsize = 256; + ; + + memory "fuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x o x o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x 1 i 1 i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega8 +#------------------------------------------------------------ + +part + id = "m8"; + desc = "ATMEGA8"; + stk500_devcode = 0x70; + avr910_devcode = 0x76; + signature = 0x1e 0x93 0x07; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 10000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + page_size = 4; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega8515 +#------------------------------------------------------------ + +part + id = "m8515"; + desc = "ATMEGA8515"; + stk500_devcode = 0x63; + avr910_devcode = 0x3A; + signature = 0x1e 0x93 0x06; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega8535 +#------------------------------------------------------------ + +part + id = "m8535"; + desc = "ATMEGA8535"; + stk500_devcode = 0x64; + avr910_devcode = 0x69; + signature = 0x1e 0x93 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATtiny26 +#------------------------------------------------------------ + +part + id = "t26"; + desc = "ATTINY26"; + stk500_devcode = 0x21; + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x09; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 16; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x x x x i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny261 +#------------------------------------------------------------ +# Close to ATtiny26 + +part + id = "t261"; + desc = "ATTINY261"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0c; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 128; + page_size = 4; + num_pages = 32; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny461 +#------------------------------------------------------------ +# Close to ATtiny261 + +part + id = "t461"; + desc = "ATTINY461"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x92 0x08; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 256; + page_size = 4; + num_pages = 64; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny861 +#------------------------------------------------------------ +# Close to ATtiny461 + +part + id = "t861"; + desc = "ATTINY861"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x93 0x0d; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 512; + num_pages = 128; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATmega48 +#------------------------------------------------------------ + +part + id = "m48"; + desc = "ATMEGA48"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x59; +# avr910_devcode = 0x; + signature = 0x1e 0x92 0x05; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 45000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 256; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega88 +#------------------------------------------------------------ + +part + id = "m88"; + desc = "ATMEGA88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x0a; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega168 +#------------------------------------------------------------ + +part + id = "m168"; + desc = "ATMEGA168"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x94 0x06; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny88 +#------------------------------------------------------------ + +part + id = "t88"; + desc = "attiny88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x11; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 64; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 64; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega328P +#------------------------------------------------------------ + +part + id = "m328p"; + desc = "ATMEGA328P"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x95 0x0F; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 1024; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny2313 +#------------------------------------------------------------ + +part + id = "t2313"; + desc = "ATtiny2313"; + has_debugwire = yes; + flash_instr = 0xB2, 0x0F, 0x1F; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x23; +## Use the ATtiny26 devcode: + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0a; + pagel = 0xD4; + bs2 = 0xD6; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, + 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, + 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, + 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +# The Tiny2313 has calibration data for both 4 MHz and 8 MHz. +# The information in the data sheet of April/2004 is wrong, this works: + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2 +#------------------------------------------------------------ + +part + id = "pwm2"; + desc = "AT90PWM2"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3 +#------------------------------------------------------------ + +# Completely identical to AT90PWM2 (including the signature!) + +part + id = "pwm3"; + desc = "AT90PWM3"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2B +#------------------------------------------------------------ +# Same as AT90PWM2 but different signature. + +part + id = "pwm2b"; + desc = "AT90PWM2B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3B +#------------------------------------------------------------ + +# Completely identical to AT90PWM2B (including the signature!) + +part + id = "pwm3b"; + desc = "AT90PWM3B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny25 +#------------------------------------------------------------ + +part + id = "t25"; + desc = "ATtiny25"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x08; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny25 has Signature Bytes: 0x1E 0x91 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny45 +#------------------------------------------------------------ + +part + id = "t45"; + desc = "ATtiny45"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x06; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny45 has Signature Bytes: 0x1E 0x92 0x08. (Data sheet 2586C-AVR-06/05 (doc2586.pdf) indicates otherwise!) + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny85 +#------------------------------------------------------------ + +part + id = "t85"; + desc = "ATtiny85"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny85 has Signature Bytes: 0x1E 0x93 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega640 +#------------------------------------------------------------ +# Almost same as ATmega1280, except for different memory sizes + +part + id = "m640"; + desc = "ATMEGA640"; + signature = 0x1e 0x96 0x08; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1280 +#------------------------------------------------------------ + +part + id = "m1280"; + desc = "ATMEGA1280"; + signature = 0x1e 0x97 0x03; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1281 +#------------------------------------------------------------ +# Identical to ATmega1280 + +part + id = "m1281"; + desc = "ATMEGA1281"; + signature = 0x1e 0x97 0x04; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2560 +#------------------------------------------------------------ + +part + id = "m2560"; + desc = "ATMEGA2560"; + signature = 0x1e 0x98 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2561 +#------------------------------------------------------------ + +part + id = "m2561"; + desc = "ATMEGA2561"; + signature = 0x1e 0x98 0x02; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega128RFA1 +#------------------------------------------------------------ +# Identical to ATmega2561 but half the ROM + +part + id = "m128rfa1"; + desc = "ATMEGA128RFA1"; + signature = 0x1e 0xa7 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xE2; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny24 +#------------------------------------------------------------ + +part + id = "t24"; + desc = "ATtiny24"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny24 has Signature Bytes: 0x1E 0x91 0x0B. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny44 +#------------------------------------------------------------ + +part + id = "t44"; + desc = "ATtiny44"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x07; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny44 has Signature Bytes: 0x1E 0x92 0x07. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny84 +#------------------------------------------------------------ + +part + id = "t84"; + desc = "ATtiny84"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0c; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32u4 +#------------------------------------------------------------ + +part + id = "m32u4"; + desc = "ATmega32U4"; + signature = 0x1e 0x95 0x87; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB646 +#------------------------------------------------------------ + +part + id = "usb646"; + desc = "AT90USB646"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB647 +#------------------------------------------------------------ +# identical to AT90USB646 + +part + id = "usb647"; + desc = "AT90USB647"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1286 +#------------------------------------------------------------ + +part + id = "usb1286"; + desc = "AT90USB1286"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1287 +#------------------------------------------------------------ +# identical to AT90USB1286 + +part + id = "usb1287"; + desc = "AT90USB1287"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# AT90USB162 +#------------------------------------------------------------ + +part + id = "usb162"; + desc = "AT90USB162"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x94 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB82 +#------------------------------------------------------------ +# Changes against AT90USB162 (beside IDs) +# memory "flash" +# size = 8192; +# num_pages = 64; + +part + id = "usb82"; + desc = "AT90USB82"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x93 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 128; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega325 +#------------------------------------------------------------ + +part + id = "m325"; + desc = "ATMEGA325"; + signature = 0x1e 0x95 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega645 +#------------------------------------------------------------ + +part + id = "m645"; + desc = "ATMEGA645"; + signature = 0x1E 0x96 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3250 +#------------------------------------------------------------ + +part + id = "m3250"; + desc = "ATMEGA3250"; + signature = 0x1E 0x95 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6450 +#------------------------------------------------------------ + +part + id = "m6450"; + desc = "ATMEGA6450"; + signature = 0x1E 0x96 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATXMEGA64A1 +#------------------------------------------------------------ + +part + id = "x64a1"; + desc = "ATXMEGA64A1"; + signature = 0x1e 0x96 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1 +#------------------------------------------------------------ + +part + id = "x128a1"; + desc = "ATXMEGA128A1"; + signature = 0x1e 0x97 0x4c; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1REVD +#------------------------------------------------------------ + +part + id = "x128a1d"; + desc = "ATXMEGA128A1REVD"; + signature = 0x1e 0x97 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A1 +#------------------------------------------------------------ + +part + id = "x192a1"; + desc = "ATXMEGA192A1"; + signature = 0x1e 0x97 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A1 +#------------------------------------------------------------ + +part + id = "x256a1"; + desc = "ATXMEGA256A1"; + signature = 0x1e 0x98 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A3 +#------------------------------------------------------------ + +part + id = "x64a3"; + desc = "ATXMEGA64A3"; + signature = 0x1e 0x96 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A3 +#------------------------------------------------------------ + +part + id = "x128a3"; + desc = "ATXMEGA128A3"; + signature = 0x1e 0x97 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A3 +#------------------------------------------------------------ + +part + id = "x192a3"; + desc = "ATXMEGA192A3"; + signature = 0x1e 0x97 0x44; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3 +#------------------------------------------------------------ + +part + id = "x256a3"; + desc = "ATXMEGA256A3"; + signature = 0x1e 0x98 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3B +#------------------------------------------------------------ + +part + id = "x256a3b"; + desc = "ATXMEGA256A3B"; + signature = 0x1e 0x98 0x43; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA16A4 +#------------------------------------------------------------ + +part + id = "x16a4"; + desc = "ATXMEGA16A4"; + signature = 0x1e 0x94 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00004000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00803000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00804000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00005000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA32A4 +#------------------------------------------------------------ + +part + id = "x32a4"; + desc = "ATXMEGA32A4"; + signature = 0x1e 0x95 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00008000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00807000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00808000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00009000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A4 +#------------------------------------------------------------ + +part + id = "x64a4"; + desc = "ATXMEGA64A4"; + signature = 0x1e 0x96 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A4 +#------------------------------------------------------------ + +part + id = "x128a4"; + desc = "ATXMEGA128A4"; + signature = 0x1e 0x97 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + + +#------------------------------------------------------------ +# AVR32UC3A0512 +#------------------------------------------------------------ + +part + id = "ucr2"; + desc = "32UC3A0512"; + signature = 0xED 0xC0 0x3F; + has_jtag = yes; + is_avr32 = yes; + + memory "flash" + paged = yes; + page_size = 512; # bytes + readsize = 512; # bytes + num_pages = 1024; # could be set dynamicly + size = 0x00080000; # could be set dynamicly + offset = 0x80000000; + ; +; + +#------------------------------------------------------------ +# ATtiny4 +#------------------------------------------------------------ + +part + id = "t4"; + desc = "ATtiny4"; + signature = 0x1e 0x8f 0x0a; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny5 +#------------------------------------------------------------ + +part + id = "t5"; + desc = "ATtiny5"; + signature = 0x1e 0x8f 0x09; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny9 +#------------------------------------------------------------ + +part + id = "t8"; + desc = "ATtiny9"; + signature = 0x1e 0x90 0x08; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny10 +#------------------------------------------------------------ + +part + id = "t10"; + desc = "ATtiny10"; + signature = 0x1e 0x90 0x03; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + diff --git a/buildroot/share/atom/avrdude_macOS.conf b/buildroot/share/atom/avrdude_macOS.conf new file mode 100644 index 0000000000..d933567452 --- /dev/null +++ b/buildroot/share/atom/avrdude_macOS.conf @@ -0,0 +1,15272 @@ +# $Id: avrdude.conf.in 916 2010-01-15 16:36:13Z joerg_wunsch $ +# +# AVRDUDE Configuration File +# +# This file contains configuration data used by AVRDUDE which describes +# the programming hardware pinouts and also provides part definitions. +# AVRDUDE's "-C" command line option specifies the location of the +# configuration file. The "-c" option names the programmer configuration +# which must match one of the entry's "id" parameter. The "-p" option +# identifies which part AVRDUDE is going to be programming and must match +# one of the parts' "id" parameter. +# +# Possible entry formats are: +# +# programmer +# id = [, [, ] ...] ; # are quoted strings +# desc = ; # quoted string +# type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic | +# stk600 | stk600pp | stk600hvsp | +# avr910 | butterfly | usbasp | +# jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw | +# jtagmkII_avr32 | jtagmkii_pdi | +# dragon_dw | dragon_jtag | dragon_isp | dragon_pp | +# dragon_hvsp | dragon_pdi | arduino; # programmer type +# baudrate = ; # baudrate for avr910-programmer +# vcc = [, ... ] ; # pin number(s) +# reset = ; # pin number +# sck = ; # pin number +# mosi = ; # pin number +# miso = ; # pin number +# errled = ; # pin number +# rdyled = ; # pin number +# pgmled = ; # pin number +# vfyled = ; # pin number +# ; +# +# part +# id = ; # quoted string +# desc = ; # quoted string +# has_jtag = ; # part has JTAG i/f +# has_debugwire = ; # part has debugWire i/f +# has_pdi = ; # part has PDI i/f +# has_tpi = ; # part has TPI i/f +# devicecode = ; # deprecated, use stk500_devcode +# stk500_devcode = ; # numeric +# avr910_devcode = ; # numeric +# signature = ; # signature bytes +# chip_erase_delay = ; # micro-seconds +# reset = dedicated | io; +# retry_pulse = reset | sck; +# pgm_enable = ; +# chip_erase = ; +# chip_erase_delay = ; # chip erase delay (us) +# # STK500 parameters (parallel programming IO lines) +# pagel = ; # pin name in hex, i.e., 0xD7 +# bs2 = ; # pin name in hex, i.e., 0xA0 +# serial = ; # can use serial downloading +# parallel = ; # can use par. programming +# # STK500v2 parameters, to be taken from Atmel's XML files +# timeout = ; +# stabdelay = ; +# cmdexedelay = ; +# synchloops = ; +# bytedelay = ; +# pollvalue = ; +# pollindex = ; +# predelay = ; +# postdelay = ; +# pollmethod = ; +# mode = ; +# delay = ; +# blocksize = ; +# readsize = ; +# hvspcmdexedelay = ; +# # STK500v2 HV programming parameters, from XML +# pp_controlstack = , , ...; # PP only +# hvsp_controlstack = , , ...; # HVSP only +# hventerstabdelay = ; +# progmodedelay = ; # PP only +# latchcycles = ; +# togglevtg = ; +# poweroffdelay = ; +# resetdelayms = ; +# resetdelayus = ; +# hvleavestabdelay = ; +# resetdelay = ; +# synchcycles = ; # HVSP only +# chiperasepulsewidth = ; # PP only +# chiperasepolltimeout = ; +# chiperasetime = ; # HVSP only +# programfusepulsewidth = ; # PP only +# programfusepolltimeout = ; +# programlockpulsewidth = ; # PP only +# programlockpolltimeout = ; +# # JTAG ICE mkII parameters, also from XML files +# allowfullpagebitstream = ; +# enablepageprogramming = ; +# idr = ; # IO addr of IDR (OCD) reg. +# rampz = ; # IO addr of RAMPZ reg. +# spmcr = ; # mem addr of SPMC[S]R reg. +# eecr = ; # mem addr of EECR reg. +# # (only when != 0x3c) +# is_avr32 = ; # AVR32 part +# +# memory +# paged = ; # yes / no +# size = ; # bytes +# page_size = ; # bytes +# num_pages = ; # numeric +# min_write_delay = ; # micro-seconds +# max_write_delay = ; # micro-seconds +# readback_p1 = ; # byte value +# readback_p2 = ; # byte value +# pwroff_after_write = ; # yes / no +# read = ; +# write = ; +# read_lo = ; +# read_hi = ; +# write_lo = ; +# write_hi = ; +# loadpage_lo = ; +# loadpage_hi = ; +# writepage = ; +# ; +# ; +# +# If any of the above parameters are not specified, the default value +# of 0 is used for numerics or the empty string ("") for string +# values. If a required parameter is left empty, AVRDUDE will +# complain. +# +# NOTES: +# * 'devicecode' is the device code used by the STK500 (see codes +# listed below) +# * Not all memory types will implement all instructions. +# * AVR Fuse bits and Lock bits are implemented as a type of memory. +# * Example memory types are: +# "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high +# fuse), "signature", "calibration", "lock" +# * The memory type specified on the avrdude command line must match +# one of the memory types defined for the specified chip. +# * The pwroff_after_write flag causes avrdude to attempt to +# power the device off and back on after an unsuccessful write to +# the affected memory area if VCC programmer pins are defined. If +# VCC pins are not defined for the programmer, a message +# indicating that the device needs a power-cycle is printed out. +# This flag was added to work around a problem with the +# at90s4433/2333's; see the at90s4433 errata at: +# +# http://www.atmel.com/atmel/acrobat/doc1280.pdf +# +# INSTRUCTION FORMATS +# +# Instruction formats are specified as a comma seperated list of +# string values containing information (bit specifiers) about each +# of the 32 bits of the instruction. Bit specifiers may be one of +# the following formats: +# +# '1' = the bit is always set on input as well as output +# +# '0' = the bit is always clear on input as well as output +# +# 'x' = the bit is ignored on input and output +# +# 'a' = the bit is an address bit, the bit-number matches this bit +# specifier's position within the current instruction byte +# +# 'aN' = the bit is the Nth address bit, bit-number = N, i.e., a12 +# is address bit 12 on input, a0 is address bit 0. +# +# 'i' = the bit is an input data bit +# +# 'o' = the bit is an output data bit +# +# Each instruction must be composed of 32 bit specifiers. The +# instruction specification closely follows the instruction data +# provided in Atmel's data sheets for their parts. +# +# See below for some examples. +# +# +# The following are STK500 part device codes to use for the +# "devicecode" field of the part. These came from Atmel's software +# section avr061.zip which accompanies the application note +# AVR061 available from: +# +# http://www.atmel.com/atmel/acrobat/doc2525.pdf +# + +#define ATTINY10 0x10 /* the _old_ one that never existed! */ +#define ATTINY11 0x11 +#define ATTINY12 0x12 +#define ATTINY15 0x13 +#define ATTINY13 0x14 + +#define ATTINY22 0x20 +#define ATTINY26 0x21 +#define ATTINY28 0x22 +#define ATTINY2313 0x23 + +#define AT90S1200 0x33 + +#define AT90S2313 0x40 +#define AT90S2323 0x41 +#define AT90S2333 0x42 +#define AT90S2343 0x43 + +#define AT90S4414 0x50 +#define AT90S4433 0x51 +#define AT90S4434 0x52 +#define ATMEGA48 0x59 + +#define AT90S8515 0x60 +#define AT90S8535 0x61 +#define AT90C8534 0x62 +#define ATMEGA8515 0x63 +#define ATMEGA8535 0x64 + +#define ATMEGA8 0x70 +#define ATMEGA88 0x73 +#define ATMEGA168 0x86 + +#define ATMEGA161 0x80 +#define ATMEGA163 0x81 +#define ATMEGA16 0x82 +#define ATMEGA162 0x83 +#define ATMEGA169 0x84 + +#define ATMEGA323 0x90 +#define ATMEGA32 0x91 + +#define ATMEGA64 0xA0 + +#define ATMEGA103 0xB1 +#define ATMEGA128 0xB2 +#define AT90CAN128 0xB3 +#define AT90CAN64 0xB3 +#define AT90CAN32 0xB3 + +#define AT86RF401 0xD0 + +#define AT89START 0xE0 +#define AT89S51 0xE0 +#define AT89S52 0xE1 + +# The following table lists the devices in the original AVR910 +# appnote: +# |Device |Signature | Code | +# +-------+----------+------+ +# |tiny12 | 1E 90 05 | 0x55 | +# |tiny15 | 1E 90 06 | 0x56 | +# | | | | +# | S1200 | 1E 90 01 | 0x13 | +# | | | | +# | S2313 | 1E 91 01 | 0x20 | +# | S2323 | 1E 91 02 | 0x48 | +# | S2333 | 1E 91 05 | 0x34 | +# | S2343 | 1E 91 03 | 0x4C | +# | | | | +# | S4414 | 1E 92 01 | 0x28 | +# | S4433 | 1E 92 03 | 0x30 | +# | S4434 | 1E 92 02 | 0x6C | +# | | | | +# | S8515 | 1E 93 01 | 0x38 | +# | S8535 | 1E 93 03 | 0x68 | +# | | | | +# |mega32 | 1E 95 01 | 0x72 | +# |mega83 | 1E 93 05 | 0x65 | +# |mega103| 1E 97 01 | 0x41 | +# |mega161| 1E 94 01 | 0x60 | +# |mega163| 1E 94 02 | 0x64 | + +# Appnote AVR109 also has a table of AVR910 device codes, which +# lists: +# dev avr910 signature +# ATmega8 0x77 0x1E 0x93 0x07 +# ATmega8515 0x3B 0x1E 0x93 0x06 +# ATmega8535 0x6A 0x1E 0x93 0x08 +# ATmega16 0x75 0x1E 0x94 0x03 +# ATmega162 0x63 0x1E 0x94 0x04 +# ATmega163 0x66 0x1E 0x94 0x02 +# ATmega169 0x79 0x1E 0x94 0x05 +# ATmega32 0x7F 0x1E 0x95 0x02 +# ATmega323 0x73 0x1E 0x95 0x01 +# ATmega64 0x46 0x1E 0x96 0x02 +# ATmega128 0x44 0x1E 0x97 0x02 +# +# These codes refer to "BOOT" device codes which are apparently +# different than standard device codes, for whatever reasons +# (often one above the standard code). + +# There are several extended versions of AVR910 implementations around +# in the Internet. These add the following codes (only devices that +# actually exist are listed): + +# ATmega8515 0x3A +# ATmega128 0x43 +# ATmega64 0x45 +# ATtiny26 0x5E +# ATmega8535 0x69 +# ATmega32 0x72 +# ATmega16 0x74 +# ATmega8 0x76 +# ATmega169 0x78 + +# +# Overall avrdude defaults +# +default_parallel = "unknown"; +default_serial = "unknown"; + + +# +# PROGRAMMER DEFINITIONS +# + +programmer + id = "arduino"; + desc = "Arduino"; + type = arduino; +; + +programmer + id = "avrisp"; + desc = "Atmel AVR ISP"; + type = stk500; +; + +programmer + id = "avrispv2"; + desc = "Atmel AVR ISP V2"; + type = stk500v2; +; + +programmer + id = "avrispmkII"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "avrisp2"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "buspirate"; + desc = "The Bus Pirate"; + type = buspirate; +; + +# This is supposed to be the "default" STK500 entry. +# Attempts to select the correct firmware version +# by probing for it. Better use one of the entries +# below instead. +programmer + id = "stk500"; + desc = "Atmel STK500"; + type = stk500generic; +; + +programmer + id = "stk500v1"; + desc = "Atmel STK500 Version 1.x firmware"; + type = stk500; +; + +programmer + id = "mib510"; + desc = "Crossbow MIB510 programming board"; + type = stk500; +; + +programmer + id = "stk500v2"; + desc = "Atmel STK500 Version 2.x firmware"; + type = stk500v2; +; + +programmer + id = "stk500pp"; + desc = "Atmel STK500 V2 in parallel programming mode"; + type = stk500pp; +; + +programmer + id = "stk500hvsp"; + desc = "Atmel STK500 V2 in high-voltage serial programming mode"; + type = stk500hvsp; +; + +programmer + id = "stk600"; + desc = "Atmel STK600"; + type = stk600; +; + +programmer + id = "stk600pp"; + desc = "Atmel STK600 in parallel programming mode"; + type = stk600pp; +; + +programmer + id = "stk600hvsp"; + desc = "Atmel STK600 in high-voltage serial programming mode"; + type = stk600hvsp; +; + +programmer + id = "avr910"; + desc = "Atmel Low Cost Serial Programmer"; + type = avr910; +; + +programmer + id = "usbasp"; + desc = "USBasp, http://www.fischl.de/usbasp/"; + type = usbasp; +; + +programmer + id = "usbtiny"; + desc = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/"; + type = usbtiny; +; + +programmer + id = "butterfly"; + desc = "Atmel Butterfly Development Board"; + type = butterfly; +; + +programmer + id = "avr109"; + desc = "Atmel AppNote AVR109 Boot Loader"; + type = butterfly; +; + +programmer + id = "avr911"; + desc = "Atmel AppNote AVR911 AVROSP"; + type = butterfly; +; + +programmer + id = "jtagmkI"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1slow"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 19200; + type = jtagmki; +; + +programmer + id = "jtagmkII"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# easier to type +programmer + id = "jtag2slow"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# JTAG ICE mkII @ 115200 Bd +programmer + id = "jtag2fast"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# make the fast one the default, people will love that +programmer + id = "jtag2"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# JTAG ICE mkII in ISP mode +programmer + id = "jtag2isp"; + desc = "Atmel JTAG ICE mkII in ISP mode"; + baudrate = 115200; + type = jtagmkii_isp; +; + +# JTAG ICE mkII in debugWire mode +programmer + id = "jtag2dw"; + desc = "Atmel JTAG ICE mkII in debugWire mode"; + baudrate = 115200; + type = jtagmkii_dw; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtagmkII_avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtag2avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in PDI mode +programmer + id = "jtag2pdi"; + desc = "Atmel JTAG ICE mkII PDI mode"; + baudrate = 115200; + type = jtagmkii_pdi; +; + +# AVR Dragon in JTAG mode +programmer + id = "dragon_jtag"; + desc = "Atmel AVR Dragon in JTAG mode"; + baudrate = 115200; + type = dragon_jtag; +; + +# AVR Dragon in ISP mode +programmer + id = "dragon_isp"; + desc = "Atmel AVR Dragon in ISP mode"; + baudrate = 115200; + type = dragon_isp; +; + +# AVR Dragon in PP mode +programmer + id = "dragon_pp"; + desc = "Atmel AVR Dragon in PP mode"; + baudrate = 115200; + type = dragon_pp; +; + +# AVR Dragon in HVSP mode +programmer + id = "dragon_hvsp"; + desc = "Atmel AVR Dragon in HVSP mode"; + baudrate = 115200; + type = dragon_hvsp; +; + +# AVR Dragon in debugWire mode +programmer + id = "dragon_dw"; + desc = "Atmel AVR Dragon in debugWire mode"; + baudrate = 115200; + type = dragon_dw; +; + +# AVR Dragon in PDI mode +programmer + id = "dragon_pdi"; + desc = "Atmel AVR Dragon in PDI mode"; + baudrate = 115200; + type = dragon_pdi; +; + +programmer + id = "pavr"; + desc = "Jason Kyle's pAVR Serial Programmer"; + type = avr910; +; + + +# +# some ultra cheap programmers use bitbanging on the +# serialport. +# +# PC - DB9 - Pins for RS232: +# +# GND 5 -- |O +# | O| <- 9 RI +# DTR 4 <- |O | +# | O| <- 8 CTS +# TXD 3 <- |O | +# | O| -> 7 RTS +# RXD 2 -> |O | +# | O| <- 6 DSR +# DCD 1 -> |O +# +# Using RXD is currently not supported. +# Using RI is not supported under Win32 but is supported under Posix. + +# serial ponyprog design (dasa2 in uisp) +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "ponyser"; + desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts"; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# Same as above, different name +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "siprog"; + desc = "Lancos SI-Prog "; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# unknown (dasa in uisp) +# reset=rts sck=dtr mosi=txd miso=cts + +programmer + id = "dasa"; + desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts"; + type = serbb; + reset = 7; + sck = 4; + mosi = 3; + miso = 8; +; + +# unknown (dasa3 in uisp) +# reset=!dtr sck=rts mosi=txd miso=cts + +programmer + id = "dasa3"; + desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; + type = serbb; + reset = ~4; + sck = 7; + mosi = 3; + miso = 8; +; + +# C2N232i (jumper configuration "auto") +# reset=dtr sck=!rts mosi=!txd miso=!cts + +programmer + id = "c2n232i"; + desc = "serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts"; + type = serbb; + reset = 4; + sck = ~7; + mosi = ~3; + miso = ~8; +; + +# +# PART DEFINITIONS +# + +#------------------------------------------------------------ +# ATtiny11 +#------------------------------------------------------------ + +# This is an HVSP-only device. + +part + id = "t11"; + desc = "ATtiny11"; + stk500_devcode = 0x11; + signature = 0x1e 0x90 0x04; + chip_erase_delay = 20000; + + timeout = 200; + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + blocksize = 64; + readsize = 256; + delay = 5; + ; + + memory "flash" + size = 1024; + blocksize = 128; + readsize = 256; + delay = 3; + ; + + memory "signature" + size = 3; + ; + + memory "lock" + size = 1; + ; + + memory "calibration" + size = 1; + ; + + memory "fuse" + size = 1; + ; +; + +#------------------------------------------------------------ +# ATtiny12 +#------------------------------------------------------------ + +part + id = "t12"; + desc = "ATtiny12"; + stk500_devcode = 0x12; + avr910_devcode = 0x55; + signature = 0x1e 0x90 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 8; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4500; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# ATtiny13 +#------------------------------------------------------------ + +part + id = "t13"; + desc = "ATtiny13"; + has_debugwire = yes; + flash_instr = 0xB4, 0x0E, 0x1E; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; + signature = 0x1e 0x90 0x07; + chip_erase_delay = 4000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 90; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 1024; + page_size = 32; + num_pages = 32; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny15 +#------------------------------------------------------------ + +part + id = "t15"; + desc = "ATtiny15"; + stk500_devcode = 0x13; + avr910_devcode = 0x56; + signature = 0x1e 0x90 0x06; + chip_erase_delay = 8200; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 5; + synchcycles = 6; + latchcycles = 16; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 8200; + max_write_delay = 8200; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4100; + max_write_delay = 4100; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o x x o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i 1 1 i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# AT90s1200 +#------------------------------------------------------------ + +part + id = "1200"; + desc = "AT90S1200"; + stk500_devcode = 0x33; + avr910_devcode = 0x13; + signature = 0x1e 0x90 0x01; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 1; + bytedelay = 0; + pollindex = 0; + pollvalue = 0xFF; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 64; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 32; + readsize = 256; + ; + memory "flash" + size = 1024; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x02; + delay = 15; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4414 +#------------------------------------------------------------ + +part + id = "4414"; + desc = "AT90S4414"; + stk500_devcode = 0x50; + avr910_devcode = 0x28; + signature = 0x1e 0x92 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2313 +#------------------------------------------------------------ + +part + id = "2313"; + desc = "AT90S2313"; + stk500_devcode = 0x40; + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x i i x", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2333 +#------------------------------------------------------------ + +part + id = "2333"; +##### WARNING: No XML file for device 'AT90S2333'! ##### + desc = "AT90S2333"; + stk500_devcode = 0x42; + avr910_devcode = 0x34; + signature = 0x1e 0x91 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s2343 (also AT90s2323 and ATtiny22) +#------------------------------------------------------------ + +part + id = "2343"; + desc = "AT90S2343"; + stk500_devcode = 0x43; + avr910_devcode = 0x4c; + signature = 0x1e 0x91 0x03; + chip_erase_delay = 18000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 0; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 128; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s4433 +#------------------------------------------------------------ + +part + id = "4433"; + desc = "AT90S4433"; + stk500_devcode = 0x51; + avr910_devcode = 0x30; + signature = 0x1e 0x92 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4434 +#------------------------------------------------------------ + +part + id = "4434"; +##### WARNING: No XML file for device 'AT90S4434'! ##### + desc = "AT90S4434"; + stk500_devcode = 0x52; + avr910_devcode = 0x6c; + signature = 0x1e 0x92 0x02; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s8515 +#------------------------------------------------------------ + +part + id = "8515"; + desc = "AT90S8515"; + stk500_devcode = 0x60; + avr910_devcode = 0x38; + signature = 0x1e 0x93 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s8535 +#------------------------------------------------------------ + +part + id = "8535"; + desc = "AT90S8535"; + stk500_devcode = 0x61; + avr910_devcode = 0x68; + signature = 0x1e 0x93 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x x o"; + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o x x x x x x"; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# ATmega103 +#------------------------------------------------------------ + +part + id = "m103"; + desc = "ATMEGA103"; + stk500_devcode = 0xB1; + avr910_devcode = 0x41; + signature = 0x1e 0x97 0x01; + chip_erase_delay = 112000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x8E, 0x9E, 0x2E, 0x3E, 0xAE, 0xBE, + 0x4E, 0x5E, 0xCE, 0xDE, 0x6E, 0x7E, 0xEE, 0xDE, + 0x66, 0x76, 0xE6, 0xF6, 0x6A, 0x7A, 0xEA, 0x7A, + 0x7F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 10; + + memory "eeprom" + size = 4096; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 22000; + max_write_delay = 56000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 70; + blocksize = 256; + readsize = 256; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o x o 1 o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 i 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega64 +#------------------------------------------------------------ + +part + id = "m64"; + desc = "ATMEGA64"; + has_jtag = yes; + stk500_devcode = 0xA0; + avr910_devcode = 0x45; + signature = 0x1e 0x96 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega128 +#------------------------------------------------------------ + +part + id = "m128"; + desc = "ATMEGA128"; + has_jtag = yes; + stk500_devcode = 0xB2; + avr910_devcode = 0x43; + signature = 0x1e 0x97 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + rampz = 0x3b; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN128 +#------------------------------------------------------------ + +part + id = "c128"; + desc = "AT90CAN128"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x97 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN64 +#------------------------------------------------------------ + +part + id = "c64"; + desc = "AT90CAN64"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x96 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN32 +#------------------------------------------------------------ + +part + id = "c32"; + desc = "AT90CAN32"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x95 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 256; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega16 +#------------------------------------------------------------ + +part + id = "m16"; + desc = "ATMEGA16"; + has_jtag = yes; + stk500_devcode = 0x82; + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x03; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 100; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "calibration" + size = 4; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega164P +#------------------------------------------------------------ + +# close to ATmega16 + +part + id = "m164p"; + desc = "ATMEGA164P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega324P +#------------------------------------------------------------ + +# similar to ATmega164P + +part + id = "m324p"; + desc = "ATMEGA324P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x95 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega644 +#------------------------------------------------------------ + +# similar to ATmega164 + +part + id = "m644"; + desc = "ATMEGA644"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x09; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega644P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m644p"; + desc = "ATMEGA644P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega1284P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m1284p"; + desc = "ATMEGA1284P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x97 0x05; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega162 +#------------------------------------------------------------ + +part + id = "m162"; + desc = "ATMEGA162"; + has_jtag = yes; + stk500_devcode = 0x83; + avr910_devcode = 0x63; + signature = 0x1e 0x94 0x04; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + + idr = 0x04; + spmcr = 0x57; + allowfullpagebitstream = yes; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + + ; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; +; + + + +#------------------------------------------------------------ +# ATmega163 +#------------------------------------------------------------ + +part + id = "m163"; + desc = "ATMEGA163"; + stk500_devcode = 0x81; + avr910_devcode = 0x64; + signature = 0x1e 0x94 0x02; + chip_erase_delay = 32000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 16000; + max_write_delay = 16000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 20; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o x x o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i 1 1 i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x 1 o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x 0 x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega169 +#------------------------------------------------------------ + +part + id = "m169"; + desc = "ATMEGA169"; + has_jtag = yes; + stk500_devcode = 0x85; + avr910_devcode = 0x78; + signature = 0x1e 0x94 0x05; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329 +#------------------------------------------------------------ + +part + id = "m329"; + desc = "ATMEGA329"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329P +#------------------------------------------------------------ +# Identical to ATmega329 except of the signature + +part + id = "m329p"; + desc = "ATMEGA329P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0b; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290 +#------------------------------------------------------------ + +# identical to ATmega329 + +part + id = "m3290"; + desc = "ATMEGA3290"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290P +#------------------------------------------------------------ + +# identical to ATmega3290 except of the signature + +part + id = "m3290p"; + desc = "ATMEGA3290P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0c; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega649 +#------------------------------------------------------------ + +part + id = "m649"; + desc = "ATMEGA649"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6490 +#------------------------------------------------------------ + +# identical to ATmega649 + +part + id = "m6490"; + desc = "ATMEGA6490"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32 +#------------------------------------------------------------ + +part + id = "m32"; + desc = "ATMEGA32"; + has_jtag = yes; + stk500_devcode = 0x91; + avr910_devcode = 0x72; + signature = 0x1e 0x95 0x02; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega161 +#------------------------------------------------------------ + +part + id = "m161"; + desc = "ATMEGA161"; + stk500_devcode = 0x80; + avr910_devcode = 0x60; + signature = 0x1e 0x94 0x01; + chip_erase_delay = 28000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + memory "eeprom" + size = 512; + min_write_delay = 3400; + max_write_delay = 3400; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 14000; + max_write_delay = 14000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 16; + blocksize = 128; + readsize = 256; + ; + + memory "fuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x o x o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x 1 i 1 i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega8 +#------------------------------------------------------------ + +part + id = "m8"; + desc = "ATMEGA8"; + stk500_devcode = 0x70; + avr910_devcode = 0x76; + signature = 0x1e 0x93 0x07; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 10000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + page_size = 4; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega8515 +#------------------------------------------------------------ + +part + id = "m8515"; + desc = "ATMEGA8515"; + stk500_devcode = 0x63; + avr910_devcode = 0x3A; + signature = 0x1e 0x93 0x06; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega8535 +#------------------------------------------------------------ + +part + id = "m8535"; + desc = "ATMEGA8535"; + stk500_devcode = 0x64; + avr910_devcode = 0x69; + signature = 0x1e 0x93 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATtiny26 +#------------------------------------------------------------ + +part + id = "t26"; + desc = "ATTINY26"; + stk500_devcode = 0x21; + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x09; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 16; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x x x x i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny261 +#------------------------------------------------------------ +# Close to ATtiny26 + +part + id = "t261"; + desc = "ATTINY261"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0c; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 128; + page_size = 4; + num_pages = 32; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny461 +#------------------------------------------------------------ +# Close to ATtiny261 + +part + id = "t461"; + desc = "ATTINY461"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x92 0x08; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 256; + page_size = 4; + num_pages = 64; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny861 +#------------------------------------------------------------ +# Close to ATtiny461 + +part + id = "t861"; + desc = "ATTINY861"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x93 0x0d; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 512; + num_pages = 128; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATmega48 +#------------------------------------------------------------ + +part + id = "m48"; + desc = "ATMEGA48"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x59; +# avr910_devcode = 0x; + signature = 0x1e 0x92 0x05; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 45000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 256; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega88 +#------------------------------------------------------------ + +part + id = "m88"; + desc = "ATMEGA88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x0a; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega168 +#------------------------------------------------------------ + +part + id = "m168"; + desc = "ATMEGA168"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x94 0x06; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny88 +#------------------------------------------------------------ + +part + id = "t88"; + desc = "attiny88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x11; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 64; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 64; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega328P +#------------------------------------------------------------ + +part + id = "m328p"; + desc = "ATMEGA328P"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x95 0x0F; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 1024; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny2313 +#------------------------------------------------------------ + +part + id = "t2313"; + desc = "ATtiny2313"; + has_debugwire = yes; + flash_instr = 0xB2, 0x0F, 0x1F; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x23; +## Use the ATtiny26 devcode: + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0a; + pagel = 0xD4; + bs2 = 0xD6; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, + 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, + 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, + 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +# The Tiny2313 has calibration data for both 4 MHz and 8 MHz. +# The information in the data sheet of April/2004 is wrong, this works: + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2 +#------------------------------------------------------------ + +part + id = "pwm2"; + desc = "AT90PWM2"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3 +#------------------------------------------------------------ + +# Completely identical to AT90PWM2 (including the signature!) + +part + id = "pwm3"; + desc = "AT90PWM3"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2B +#------------------------------------------------------------ +# Same as AT90PWM2 but different signature. + +part + id = "pwm2b"; + desc = "AT90PWM2B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3B +#------------------------------------------------------------ + +# Completely identical to AT90PWM2B (including the signature!) + +part + id = "pwm3b"; + desc = "AT90PWM3B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny25 +#------------------------------------------------------------ + +part + id = "t25"; + desc = "ATtiny25"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x08; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny25 has Signature Bytes: 0x1E 0x91 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny45 +#------------------------------------------------------------ + +part + id = "t45"; + desc = "ATtiny45"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x06; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny45 has Signature Bytes: 0x1E 0x92 0x08. (Data sheet 2586C-AVR-06/05 (doc2586.pdf) indicates otherwise!) + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny85 +#------------------------------------------------------------ + +part + id = "t85"; + desc = "ATtiny85"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny85 has Signature Bytes: 0x1E 0x93 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega640 +#------------------------------------------------------------ +# Almost same as ATmega1280, except for different memory sizes + +part + id = "m640"; + desc = "ATMEGA640"; + signature = 0x1e 0x96 0x08; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1280 +#------------------------------------------------------------ + +part + id = "m1280"; + desc = "ATMEGA1280"; + signature = 0x1e 0x97 0x03; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1281 +#------------------------------------------------------------ +# Identical to ATmega1280 + +part + id = "m1281"; + desc = "ATMEGA1281"; + signature = 0x1e 0x97 0x04; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2560 +#------------------------------------------------------------ + +part + id = "m2560"; + desc = "ATMEGA2560"; + signature = 0x1e 0x98 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2561 +#------------------------------------------------------------ + +part + id = "m2561"; + desc = "ATMEGA2561"; + signature = 0x1e 0x98 0x02; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega128RFA1 +#------------------------------------------------------------ +# Identical to ATmega2561 but half the ROM + +part + id = "m128rfa1"; + desc = "ATMEGA128RFA1"; + signature = 0x1e 0xa7 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xE2; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny24 +#------------------------------------------------------------ + +part + id = "t24"; + desc = "ATtiny24"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny24 has Signature Bytes: 0x1E 0x91 0x0B. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny44 +#------------------------------------------------------------ + +part + id = "t44"; + desc = "ATtiny44"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x07; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny44 has Signature Bytes: 0x1E 0x92 0x07. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny84 +#------------------------------------------------------------ + +part + id = "t84"; + desc = "ATtiny84"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0c; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32u4 +#------------------------------------------------------------ + +part + id = "m32u4"; + desc = "ATmega32U4"; + signature = 0x1e 0x95 0x87; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB646 +#------------------------------------------------------------ + +part + id = "usb646"; + desc = "AT90USB646"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB647 +#------------------------------------------------------------ +# identical to AT90USB646 + +part + id = "usb647"; + desc = "AT90USB647"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1286 +#------------------------------------------------------------ + +part + id = "usb1286"; + desc = "AT90USB1286"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1287 +#------------------------------------------------------------ +# identical to AT90USB1286 + +part + id = "usb1287"; + desc = "AT90USB1287"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# AT90USB162 +#------------------------------------------------------------ + +part + id = "usb162"; + desc = "AT90USB162"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x94 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB82 +#------------------------------------------------------------ +# Changes against AT90USB162 (beside IDs) +# memory "flash" +# size = 8192; +# num_pages = 64; + +part + id = "usb82"; + desc = "AT90USB82"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x93 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 128; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega325 +#------------------------------------------------------------ + +part + id = "m325"; + desc = "ATMEGA325"; + signature = 0x1e 0x95 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega645 +#------------------------------------------------------------ + +part + id = "m645"; + desc = "ATMEGA645"; + signature = 0x1E 0x96 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3250 +#------------------------------------------------------------ + +part + id = "m3250"; + desc = "ATMEGA3250"; + signature = 0x1E 0x95 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6450 +#------------------------------------------------------------ + +part + id = "m6450"; + desc = "ATMEGA6450"; + signature = 0x1E 0x96 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATXMEGA64A1 +#------------------------------------------------------------ + +part + id = "x64a1"; + desc = "ATXMEGA64A1"; + signature = 0x1e 0x96 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1 +#------------------------------------------------------------ + +part + id = "x128a1"; + desc = "ATXMEGA128A1"; + signature = 0x1e 0x97 0x4c; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1REVD +#------------------------------------------------------------ + +part + id = "x128a1d"; + desc = "ATXMEGA128A1REVD"; + signature = 0x1e 0x97 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A1 +#------------------------------------------------------------ + +part + id = "x192a1"; + desc = "ATXMEGA192A1"; + signature = 0x1e 0x97 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A1 +#------------------------------------------------------------ + +part + id = "x256a1"; + desc = "ATXMEGA256A1"; + signature = 0x1e 0x98 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A3 +#------------------------------------------------------------ + +part + id = "x64a3"; + desc = "ATXMEGA64A3"; + signature = 0x1e 0x96 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A3 +#------------------------------------------------------------ + +part + id = "x128a3"; + desc = "ATXMEGA128A3"; + signature = 0x1e 0x97 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A3 +#------------------------------------------------------------ + +part + id = "x192a3"; + desc = "ATXMEGA192A3"; + signature = 0x1e 0x97 0x44; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3 +#------------------------------------------------------------ + +part + id = "x256a3"; + desc = "ATXMEGA256A3"; + signature = 0x1e 0x98 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3B +#------------------------------------------------------------ + +part + id = "x256a3b"; + desc = "ATXMEGA256A3B"; + signature = 0x1e 0x98 0x43; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA16A4 +#------------------------------------------------------------ + +part + id = "x16a4"; + desc = "ATXMEGA16A4"; + signature = 0x1e 0x94 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00004000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00803000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00804000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00005000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA32A4 +#------------------------------------------------------------ + +part + id = "x32a4"; + desc = "ATXMEGA32A4"; + signature = 0x1e 0x95 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00008000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00807000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00808000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00009000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A4 +#------------------------------------------------------------ + +part + id = "x64a4"; + desc = "ATXMEGA64A4"; + signature = 0x1e 0x96 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A4 +#------------------------------------------------------------ + +part + id = "x128a4"; + desc = "ATXMEGA128A4"; + signature = 0x1e 0x97 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + + +#------------------------------------------------------------ +# AVR32UC3A0512 +#------------------------------------------------------------ + +part + id = "ucr2"; + desc = "32UC3A0512"; + signature = 0xED 0xC0 0x3F; + has_jtag = yes; + is_avr32 = yes; + + memory "flash" + paged = yes; + page_size = 512; # bytes + readsize = 512; # bytes + num_pages = 1024; # could be set dynamicly + size = 0x00080000; # could be set dynamicly + offset = 0x80000000; + ; +; + +#------------------------------------------------------------ +# ATtiny4 +#------------------------------------------------------------ + +part + id = "t4"; + desc = "ATtiny4"; + signature = 0x1e 0x8f 0x0a; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny5 +#------------------------------------------------------------ + +part + id = "t5"; + desc = "ATtiny5"; + signature = 0x1e 0x8f 0x09; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny9 +#------------------------------------------------------------ + +part + id = "t8"; + desc = "ATtiny9"; + signature = 0x1e 0x90 0x08; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny10 +#------------------------------------------------------------ + +part + id = "t10"; + desc = "ATtiny10"; + signature = 0x1e 0x90 0x03; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + diff --git a/buildroot/share/atom/create_custom_upload_command_CDC.py b/buildroot/share/atom/create_custom_upload_command_CDC.py index 7c32b24b48..2fea2d5b53 100644 --- a/buildroot/share/atom/create_custom_upload_command_CDC.py +++ b/buildroot/share/atom/create_custom_upload_command_CDC.py @@ -9,107 +9,133 @@ # Will continue on if a COM port isn't found so that the compilation can be done. # +import subprocess +import os import sys +from SCons.Script import DefaultEnvironment +import platform +current_OS = platform.system() -import subprocess +env = DefaultEnvironment() +build_type = os.environ.get("BUILD_TYPE", 'Not Set') -import platform -current_OS = platform.system() -from SCons.Script import DefaultEnvironment +if not(build_type == 'upload' or build_type == 'traceback' or build_type == 'Not Set') : + env.Replace(UPLOAD_PROTOCOL = 'teensy-gui') # run normal Teensy2 scripts +else: + com_first = '' + com_last = '' + com_CDC = '' + description_first = '' + description_last = '' + description_CDC = '' -env = DefaultEnvironment() + # + # grab the first com port that pops up unless we find one we know for sure + # is a CDC device + # + def get_com_port(com_search_text, descr_search_text, start): -com_first = '' -com_last = '' -com_CDC = '' -description_first = '' -description_last = '' -description_CDC = '' + global com_first + global com_last + global com_CDC + global description_first + global description_last + global description_CDC -# -# grab the first com port that pops up unless we find one we know for sure -# is a CDC device -# -def get_com_port(com_search_text, descr_search_text, start): - global com_first - global com_last - global com_CDC - global description_first - global description_last - global description_CDC + print '\nLooking for Serial Port\n' + + # stream output from subprocess and split it into lines + pio_subprocess = subprocess.Popen(['platformio', 'device', 'list'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + looking_for_description = False + for line in iter(pio_subprocess.stdout.readline, ''): + if 0 <= line.find(com_search_text): + looking_for_description = True + com_last = line.replace('\n', '') + if com_first == '': + com_first = com_last + if 0 <= line.find(descr_search_text) and looking_for_description: + looking_for_description = False + description_last = line[ start : ] + if description_first == '': + description_first = description_last + if 0 <= description_last.find('CDC'): + com_CDC = com_last + description_CDC = description_last + + if com_CDC == '' and not(com_first == ''): + com_CDC = com_first + description_CDC = description_first + elif com_CDC == '': + com_CDC = 'COM_PORT_NOT_FOUND' + + while 0 <= com_CDC.find('\n'): + com_CDC = com_CDC.replace('\n', '') + while 0 <= com_CDC.find('\r'): + com_CDC = com_CDC.replace('\r', '') + + if com_CDC == 'COM_PORT_NOT_FOUND': + print com_CDC, '\n' + else: + print 'FOUND: ' ,com_CDC + print 'DESCRIPTION: ', description_CDC , '\n' + if current_OS == 'Windows': - print '\nLooking for Serial Port\n' + get_com_port('COM', 'Hardware ID:', 13) - # stream output from subprocess and split it into lines - pio_subprocess = subprocess.Popen(['platformio', 'device', 'list'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + # avrdude_conf_path = env.get("PIOHOME_DIR") + '\\packages\\toolchain-atmelavr\\etc\\avrdude.conf' + avrdude_conf_path = 'buildroot\\share\\atom\\avrdude.conf' - looking_for_description = False - for line in iter(pio_subprocess.stdout.readline, ''): - if 0 <= line.find(com_search_text): - looking_for_description = True - com_last = line.replace('\n', '') - if com_first == '': - com_first = com_last - if 0 <= line.find(descr_search_text) and looking_for_description: - looking_for_description = False - description_last = line[ start : ] - if description_first == '': - description_first = description_last - if 0 <= description_last.find('CDC'): - com_CDC = com_last - description_CDC = description_last + avrdude_exe_path = 'buildroot\\share\\atom\\avrdude_5.10.exe' - if com_CDC == '' and not(com_first == ''): - com_CDC = com_first - description_CDC = description_first - elif com_CDC == '': - com_CDC = 'COM_PORT_NOT_FOUND' + # source_path = env.get("PROJECTBUILD_DIR") + '\\' + env.get("PIOENV") + '\\firmware.hex' + source_path = '.pioenvs\\' + env.get("PIOENV") + '\\firmware.hex' - if com_CDC == 'COM_PORT_NOT_FOUND': - print com_CDC, '\n' - else: - print 'FOUND: ' ,com_CDC - print 'DESCRIPTION: ', description_CDC , '\n' + upload_string = avrdude_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' -if current_OS == 'Windows': - get_com_port('COM', 'Hardware ID:', 13) + if current_OS == 'Darwin': # MAC - avrdude_conf_path = env.get("PIOHOME_DIR") + '\\packages\\toolchain-atmelavr\\etc\\avrdude.conf' + get_com_port('usbmodem', 'Description:', 13) - source_path = env.get("PROJECTBUILD_DIR") + '\\' + env.get("PIOENV") + '\\firmware.hex' +# avrdude_conf_path = env.get("PIOHOME_DIR") + '/packages/toolchain-atmelavr/etc/avrdude.conf' + avrdude_conf_path = 'buildroot/share/atom/avrdude_macOS.conf' - upload_string = 'avrdude -p usb1286 -c avr109 -P ' + com_CDC + ' -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' + avrdude_exe_path = 'buildroot/share/atom/avrdude_5.10_macOS' -if current_OS == 'Darwin': # MAC +# source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' + source_path = '.pioenvs/' + env.get("PIOENV") + '/firmware.hex' - get_com_port('usbmodem', 'Description:', 13) - avrdude_conf_path = env.get("PIOHOME_DIR") + '/packages/toolchain-atmelavr/etc/avrdude.conf' +# upload_string = 'avrdude -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' + upload_string = avrdude_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' + print 'upload_string: ', upload_string - source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' - upload_string = 'avrdude -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' + if current_OS == 'Linux': -if current_OS == 'Linux': + get_com_port('/dev/tty', 'Description:', 13) - get_com_port('/dev/tty', 'Description:', 13) +# avrdude_conf_path = env.get("PIOHOME_DIR") + '/packages/toolchain-atmelavr/etc/avrdude.conf' + avrdude_conf_path = 'buildroot/share/atom/avrdude_linux.conf' - avrdude_conf_path = env.get("PIOHOME_DIR") + '/packages/toolchain-atmelavr/etc/avrdude.conf' - source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' + avrdude_exe_path = 'buildroot/share/atom/avrdude_5.10_linux' +# source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' + source_path = '.pioenvs/' + env.get("PIOENV") + '/firmware.hex' - upload_string = 'avrdude -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' +# upload_string = 'avrdude -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' + upload_string = avrdude_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' -env.Replace( - UPLOADCMD = upload_string, - MAXIMUM_RAM_SIZE = 8192, - MAXIMUM_SIZE = 130048 -) + env.Replace( + UPLOADCMD = upload_string, + MAXIMUM_RAM_SIZE = 8192, + MAXIMUM_SIZE = 130048 + ) diff --git a/buildroot/share/atom/create_custom_upload_command_DFU.py b/buildroot/share/atom/create_custom_upload_command_DFU.py index 208ab2c4cc..9082699bf4 100644 --- a/buildroot/share/atom/create_custom_upload_command_DFU.py +++ b/buildroot/share/atom/create_custom_upload_command_DFU.py @@ -9,29 +9,34 @@ # Will continue on if a COM port isn't found so that the compilation can be done. # +import os import sys from SCons.Script import DefaultEnvironment - import platform current_OS = platform.system() env = DefaultEnvironment() -if current_OS == 'Windows': - avrdude_conf_path = env.get("PIOHOME_DIR") + '\\packages\\toolchain-atmelavr\\etc\\avrdude.conf' +build_type = os.environ.get("BUILD_TYPE", 'Not Set') +if not(build_type == 'upload' or build_type == 'traceback' or build_type == 'Not Set') : + env.Replace(UPLOAD_PROTOCOL = 'teensy-gui') # run normal Teensy2 scripts +else: + + if current_OS == 'Windows': + avrdude_conf_path = env.get("PIOHOME_DIR") + '\\packages\\toolchain-atmelavr\\etc\\avrdude.conf' - source_path = env.get("PROJECTBUILD_DIR") + '\\' + env.get("PIOENV") + '\\firmware.hex' + source_path = env.get("PROJECTBUILD_DIR") + '\\' + env.get("PIOENV") + '\\firmware.hex' - upload_string = 'avrdude -p usb1286 -c flip1 -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' + upload_string = 'avrdude -p usb1286 -c flip1 -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' -else: - source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' + else: + source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' - upload_string = 'avrdude -p usb1286 -c flip1 -U flash:w:' + source_path + ':i' + upload_string = 'avrdude -p usb1286 -c flip1 -U flash:w:' + source_path + ':i' -env.Replace( - UPLOADCMD = upload_string, - MAXIMUM_RAM_SIZE = 8192, - MAXIMUM_SIZE = 130048 -) + env.Replace( + UPLOADCMD = upload_string, + MAXIMUM_RAM_SIZE = 8192, + MAXIMUM_SIZE = 130048 + )