From 71b02e6e9c189ffba942cc46f713ebd729f3cb61 Mon Sep 17 00:00:00 2001 From: David Ramiro Date: Thu, 31 Jan 2019 14:52:18 +0100 Subject: [PATCH] Fix compile error --- Marlin/HAL.h | 337 - Marlin/delay.h | 77 - Marlin/drivers.h | 73 - Marlin/emergency_parser.cpp | 40 - Marlin/emergency_parser.h | 144 - Marlin/fwretract.cpp | 199 - Marlin/fwretract.h | 71 - Marlin/language_es_utf8.h | 275 - Marlin/malyanlcd.cpp | 496 - Marlin/parser.cpp | 302 - Marlin/parser.h | 341 - Marlin/pins_EINSY_RAMBO.h | 179 - Marlin/pins_EINSY_RETRO.h | 193 - Marlin/pins_MELZI_MALYAN.h | 54 - Marlin/pins_MELZI_TRONXY.h | 61 - Marlin/pins_MKS_BASE_15.h | 41 - Marlin/pins_MKS_BASE_HEROIC.h | 35 - Marlin/pins_MKS_GEN_13.h | 144 - Marlin/pins_RAMPS_ENDER_4.h | 29 - Marlin/pins_TRIGORILLA_13.h | 41 - Marlin/pins_TRIGORILLA_14.h | 232 - Marlin/power.cpp | 117 - Marlin/power.h | 44 - Marlin/power_loss_recovery.cpp | 284 - Marlin/power_loss_recovery.h | 99 - Marlin/runout.cpp | 61 - Marlin/runout.h | 85 - Marlin/status_screen_DOGM.h | 493 - Marlin/status_screen_lite_ST7920.h | 972 - Marlin/status_screen_lite_ST7920_class.h | 111 - Marlin/status_screen_lite_ST7920_spi.h | 39 - Marlin/thermistortable_15.h | 64 - Marlin/thermistortable_501.h | 57 - Marlin/tmc_util.cpp | 631 - Marlin/tmc_util.h | 107 - buildroot/bin/travis_at_home | 47 - .../share/PlatformIO/boards/at90usb1286.json | 20 - buildroot/share/atom/auto_build.py | 1455 -- buildroot/share/atom/avrdude.conf | 15478 ---------------- buildroot/share/atom/avrdude_5.10_linux | Bin 1159576 -> 0 bytes buildroot/share/atom/avrdude_5.10_macOS | Bin 346784 -> 0 bytes buildroot/share/atom/avrdude_linux.conf | 15478 ---------------- buildroot/share/atom/avrdude_macOS.conf | 15272 --------------- .../atom/create_custom_upload_command_CDC.py | 141 - .../atom/create_custom_upload_command_DFU.py | 42 - buildroot/share/git/mffp | 27 - .../sublime/MarlinFirmware.sublime-project | 25 - .../auto_build_sublime_menu/000_read_me.txt | 40 - .../auto_build_sublime_menu/Main.sublime-menu | 66 - .../share/vscode/AutoBuildMarlin/.gitignore | 2 - .../vscode/AutoBuildMarlin/.vscodeignore | 9 - .../share/vscode/AutoBuildMarlin/README.md | 52 - .../share/vscode/AutoBuildMarlin/extension.js | 37 - .../share/vscode/AutoBuildMarlin/media/AB.svg | 12 - .../vscode/AutoBuildMarlin/package-lock.json | 3323 ---- .../share/vscode/AutoBuildMarlin/package.json | 96 - .../AutoBuildMarlin/resources/AB_menu.png | Bin 23890 -> 0 bytes .../resources/Activity_bar.png | Bin 38031 -> 0 bytes .../resources/B24x24_white.svg | 1 - .../resources/B32x32_white.svg | 1 - .../AutoBuildMarlin/resources/B_small.svg | 1 - .../AutoBuildMarlin/resources/Build.png | Bin 12348 -> 0 bytes .../resources/C32x32_white.svg | 1 - .../AutoBuildMarlin/resources/C_small.svg | 1 - .../AutoBuildMarlin/resources/Clean.png | Bin 3592 -> 0 bytes .../AutoBuildMarlin/resources/Open_Folder.png | Bin 16455 -> 0 bytes .../AutoBuildMarlin/resources/Open_Marlin.png | Bin 56824 -> 0 bytes .../resources/T32x32_white.svg | 1 - .../AutoBuildMarlin/resources/Traceback.png | Bin 8485 -> 0 bytes .../resources/U32x32_white.svg | 1 - .../AutoBuildMarlin/resources/U_small.svg | 1 - .../AutoBuildMarlin/resources/Upload.png | Bin 4297 -> 0 bytes .../resources/Ut32x32_white.svg | 1 - .../AutoBuildMarlin/resources/Ut_small.svg | 1 - .../resources/install_extensions.png | Bin 3341 -> 0 bytes .../resources/platformio_install.png | Bin 25656 -> 0 bytes .../resources/view_command_palette.png | Bin 10602 -> 0 bytes .../vscode/AutoBuildMarlin/tsconfig.json | 12 - process-palette.json | 357 - 79 files changed, 58529 deletions(-) delete mode 100644 Marlin/HAL.h delete mode 100644 Marlin/delay.h delete mode 100644 Marlin/drivers.h delete mode 100644 Marlin/emergency_parser.cpp delete mode 100644 Marlin/emergency_parser.h delete mode 100644 Marlin/fwretract.cpp delete mode 100644 Marlin/fwretract.h delete mode 100644 Marlin/language_es_utf8.h delete mode 100644 Marlin/malyanlcd.cpp delete mode 100644 Marlin/parser.cpp delete mode 100644 Marlin/parser.h delete mode 100644 Marlin/pins_EINSY_RAMBO.h delete mode 100644 Marlin/pins_EINSY_RETRO.h delete mode 100644 Marlin/pins_MELZI_MALYAN.h delete mode 100644 Marlin/pins_MELZI_TRONXY.h delete mode 100644 Marlin/pins_MKS_BASE_15.h delete mode 100644 Marlin/pins_MKS_BASE_HEROIC.h delete mode 100644 Marlin/pins_MKS_GEN_13.h delete mode 100644 Marlin/pins_RAMPS_ENDER_4.h delete mode 100644 Marlin/pins_TRIGORILLA_13.h delete mode 100644 Marlin/pins_TRIGORILLA_14.h delete mode 100644 Marlin/power.cpp delete mode 100644 Marlin/power.h delete mode 100644 Marlin/power_loss_recovery.cpp delete mode 100644 Marlin/power_loss_recovery.h delete mode 100644 Marlin/runout.cpp delete mode 100644 Marlin/runout.h delete mode 100644 Marlin/status_screen_DOGM.h delete mode 100644 Marlin/status_screen_lite_ST7920.h delete mode 100644 Marlin/status_screen_lite_ST7920_class.h delete mode 100644 Marlin/status_screen_lite_ST7920_spi.h delete mode 100644 Marlin/thermistortable_15.h delete mode 100644 Marlin/thermistortable_501.h delete mode 100644 Marlin/tmc_util.cpp delete mode 100644 Marlin/tmc_util.h delete mode 100644 buildroot/bin/travis_at_home delete mode 100644 buildroot/share/PlatformIO/boards/at90usb1286.json delete mode 100644 buildroot/share/atom/auto_build.py delete mode 100644 buildroot/share/atom/avrdude.conf delete mode 100644 buildroot/share/atom/avrdude_5.10_linux delete mode 100644 buildroot/share/atom/avrdude_5.10_macOS delete mode 100644 buildroot/share/atom/avrdude_linux.conf delete mode 100644 buildroot/share/atom/avrdude_macOS.conf delete mode 100644 buildroot/share/atom/create_custom_upload_command_CDC.py delete mode 100644 buildroot/share/atom/create_custom_upload_command_DFU.py delete mode 100644 buildroot/share/git/mffp delete mode 100644 buildroot/share/sublime/MarlinFirmware.sublime-project delete mode 100644 buildroot/share/sublime/auto_build_sublime_menu/000_read_me.txt delete mode 100644 buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/.gitignore delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/.vscodeignore delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/README.md delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/extension.js delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/media/AB.svg delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/package-lock.json delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/package.json delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/AB_menu.png delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/Activity_bar.png delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/B24x24_white.svg delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/B32x32_white.svg delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/B_small.svg delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/Build.png delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/C32x32_white.svg delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/C_small.svg delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/Clean.png delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/Open_Folder.png delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/Open_Marlin.png delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/T32x32_white.svg delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/Traceback.png delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/U32x32_white.svg delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/U_small.svg delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/Upload.png delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/Ut32x32_white.svg delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/Ut_small.svg delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/install_extensions.png delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/platformio_install.png delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/resources/view_command_palette.png delete mode 100644 buildroot/share/vscode/AutoBuildMarlin/tsconfig.json delete mode 100644 process-palette.json diff --git a/Marlin/HAL.h b/Marlin/HAL.h deleted file mode 100644 index d5f79cd..0000000 --- a/Marlin/HAL.h +++ /dev/null @@ -1,337 +0,0 @@ -/* ************************************************************************** - - Marlin 3D Printer Firmware - Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - - Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -****************************************************************************/ - -/** - * Description: HAL for __AVR__ - */ - -#ifndef _HAL_AVR_H_ -#define _HAL_AVR_H_ - -// -------------------------------------------------------------------------- -// Includes -// -------------------------------------------------------------------------- - -#include "fastio.h" - -#include -#include -#include -#include -#include -#include -#include - -// -------------------------------------------------------------------------- -// Defines -// -------------------------------------------------------------------------- - -//#define analogInputToDigitalPin(IO) IO - -// Bracket code that shouldn't be interrupted -#ifndef CRITICAL_SECTION_START - #define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli() - #define CRITICAL_SECTION_END SREG = _sreg -#endif - -#define ISRS_ENABLED() TEST(SREG, SREG_I) -#define ENABLE_ISRS() sei() -#define DISABLE_ISRS() cli() - -// -------------------------------------------------------------------------- -// Types -// -------------------------------------------------------------------------- - -typedef uint16_t hal_timer_t; -#define HAL_TIMER_TYPE_MAX 0xFFFF - -typedef int8_t pin_t; - -#define HAL_SERVO_LIB Servo - -// -------------------------------------------------------------------------- -// Public Variables -// -------------------------------------------------------------------------- - -//extern uint8_t MCUSR; - -// -------------------------------------------------------------------------- -// Public functions -// -------------------------------------------------------------------------- - -//void cli(void); - -//void _delay_ms(const int delay); - -inline void HAL_clear_reset_source(void) { MCUSR = 0; } -inline uint8_t HAL_get_reset_source(void) { return MCUSR; } - -// eeprom -//void eeprom_write_byte(unsigned char *pos, unsigned char value); -//unsigned char eeprom_read_byte(unsigned char *pos); - -// timers -#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz - -#define STEP_TIMER_NUM 1 -#define TEMP_TIMER_NUM 0 -#define PULSE_TIMER_NUM STEP_TIMER_NUM - -#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0) - -#define STEPPER_TIMER_RATE HAL_TIMER_RATE -#define STEPPER_TIMER_PRESCALE 8 -#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double - -#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer -#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE -#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A) -#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A) -#define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A) - -#define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0B) -#define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B) -#define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B) - -FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { - UNUSED(frequency); - switch (timer_num) { - case STEP_TIMER_NUM: - // waveform generation = 0100 = CTC - SET_WGM(1, CTC_OCRnA); - - // output mode = 00 (disconnected) - SET_COMA(1, NORMAL); - - // Set the timer pre-scaler - // Generally we use a divider of 8, resulting in a 2MHz timer - // frequency on a 16MHz MCU. If you are going to change this, be - // sure to regenerate speed_lookuptable.h with - // create_speed_lookuptable.py - SET_CS(1, PRESCALER_8); // CS 2 = 1/8 prescaler - - // Init Stepper ISR to 122 Hz for quick starting - // (F_CPU) / (STEPPER_TIMER_PRESCALE) / frequency - OCR1A = 0x4000; - TCNT1 = 0; - break; - - case TEMP_TIMER_NUM: - // Use timer0 for temperature measurement - // Interleave temperature interrupt with millies interrupt - OCR0B = 128; - break; - } -} - -#define TIMER_OCR_1 OCR1A -#define TIMER_COUNTER_1 TCNT1 - -#define TIMER_OCR_0 OCR0A -#define TIMER_COUNTER_0 TCNT0 - -#define _CAT(a, ...) a ## __VA_ARGS__ -#define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare) -#define HAL_timer_get_compare(timer) _CAT(TIMER_OCR_, timer) -#define HAL_timer_get_count(timer) _CAT(TIMER_COUNTER_, timer) - -/** - * On AVR there is no hardware prioritization and preemption of - * interrupts, so this emulates it. The UART has first priority - * (otherwise, characters will be lost due to UART overflow). - * Then: Stepper, Endstops, Temperature, and -finally- all others. - */ -#define HAL_timer_isr_prologue(TIMER_NUM) -#define HAL_timer_isr_epilogue(TIMER_NUM) - -/* 18 cycles maximum latency */ -#define HAL_STEP_TIMER_ISR \ -extern "C" void TIMER1_COMPA_vect (void) __attribute__ ((signal, naked, used, externally_visible)); \ -extern "C" void TIMER1_COMPA_vect_bottom (void) asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \ -void TIMER1_COMPA_vect (void) { \ - __asm__ __volatile__ ( \ - A("push r16") /* 2 Save R16 */ \ - A("in r16, __SREG__") /* 1 Get SREG */ \ - A("push r16") /* 2 Save SREG into stack */ \ - A("lds r16, %[timsk0]") /* 2 Load into R0 the Temperature timer Interrupt mask register */ \ - A("push r16") /* 2 Save TIMSK0 into the stack */ \ - A("andi r16,~%[msk0]") /* 1 Disable the temperature ISR */ \ - A("sts %[timsk0], r16") /* 2 And set the new value */ \ - A("lds r16, %[timsk1]") /* 2 Load into R0 the stepper timer Interrupt mask register [TIMSK1] */ \ - A("andi r16,~%[msk1]") /* 1 Disable the stepper ISR */ \ - A("sts %[timsk1], r16") /* 2 And set the new value */ \ - A("push r16") /* 2 Save TIMSK1 into stack */ \ - A("in r16, 0x3B") /* 1 Get RAMPZ register */ \ - A("push r16") /* 2 Save RAMPZ into stack */ \ - A("in r16, 0x3C") /* 1 Get EIND register */ \ - A("push r0") /* C runtime can modify all the following registers without restoring them */ \ - A("push r1") \ - A("push r18") \ - A("push r19") \ - A("push r20") \ - A("push r21") \ - A("push r22") \ - A("push r23") \ - A("push r24") \ - A("push r25") \ - A("push r26") \ - A("push r27") \ - A("push r30") \ - A("push r31") \ - A("clr r1") /* C runtime expects this register to be 0 */ \ - A("call TIMER1_COMPA_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \ - A("pop r31") \ - A("pop r30") \ - A("pop r27") \ - A("pop r26") \ - A("pop r25") \ - A("pop r24") \ - A("pop r23") \ - A("pop r22") \ - A("pop r21") \ - A("pop r20") \ - A("pop r19") \ - A("pop r18") \ - A("pop r1") \ - A("pop r0") \ - A("out 0x3C, r16") /* 1 Restore EIND register */ \ - A("pop r16") /* 2 Get the original RAMPZ register value */ \ - A("out 0x3B, r16") /* 1 Restore RAMPZ register to its original value */ \ - A("pop r16") /* 2 Get the original TIMSK1 value but with stepper ISR disabled */ \ - A("ori r16,%[msk1]") /* 1 Reenable the stepper ISR */ \ - A("cli") /* 1 Disable global interrupts - Reenabling Stepper ISR can reenter amd temperature can reenter, and we want that, if it happens, after this ISR has ended */ \ - A("sts %[timsk1], r16") /* 2 And restore the old value - This reenables the stepper ISR */ \ - A("pop r16") /* 2 Get the temperature timer Interrupt mask register [TIMSK0] */ \ - A("sts %[timsk0], r16") /* 2 And restore the old value - This reenables the temperature ISR */ \ - A("pop r16") /* 2 Get the old SREG value */ \ - A("out __SREG__, r16") /* 1 And restore the SREG value */ \ - A("pop r16") /* 2 Restore R16 value */ \ - A("reti") /* 4 Return from interrupt */ \ - : \ - : [timsk0] "i" ((uint16_t)&TIMSK0), \ - [timsk1] "i" ((uint16_t)&TIMSK1), \ - [msk0] "M" ((uint8_t)(1< 7) ADCSRB = _BV(MUX5); else ADCSRB = 0; SET_ADMUX_ADCSRA(pin) -#else - #define HAL_START_ADC(pin) ADCSRB = 0; SET_ADMUX_ADCSRA(pin) -#endif - -#define HAL_READ_ADC() ADC -#define HAL_ADC_READY() !TEST(ADCSRA, ADSC) - -#define GET_PIN_MAP_PIN(index) index -#define GET_PIN_MAP_INDEX(pin) pin -#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) - -#define HAL_SENSITIVE_PINS 0, 1 - -#endif // _HAL_AVR_H_ diff --git a/Marlin/delay.h b/Marlin/delay.h deleted file mode 100644 index 5689b2b..0000000 --- a/Marlin/delay.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * AVR busy wait delay Cycles routines: - * - * DELAY_CYCLES(count): Delay execution in cycles - * DELAY_NS(count): Delay execution in nanoseconds - * DELAY_US(count): Delay execution in microseconds - */ - -#ifndef MARLIN_DELAY_H -#define MARLIN_DELAY_H - -#define nop() __asm__ __volatile__("nop;\n\t":::) - -FORCE_INLINE static void __delay_4cycles(uint8_t cy) { - __asm__ __volatile__( - L("1") - A("dec %[cnt]") - A("nop") - A("brne 1b") - : [cnt] "+r"(cy) // output: +r means input+output - : // input: - : "cc" // clobbers: - ); -} - -/* ---------------- Delay in cycles */ -FORCE_INLINE static void DELAY_CYCLES(uint16_t x) { - - if (__builtin_constant_p(x)) { - #define MAXNOPS 4 - - if (x <= (MAXNOPS)) { - switch (x) { case 4: nop(); case 3: nop(); case 2: nop(); case 1: nop(); } - } - else { - const uint32_t rem = (x) % (MAXNOPS); - switch (rem) { case 3: nop(); case 2: nop(); case 1: nop(); } - if ((x = (x) / (MAXNOPS))) - __delay_4cycles(x); // if need more then 4 nop loop is more optimal - } - - #undef MAXNOPS - } - else - __delay_4cycles(x / 4); -} -#undef nop - -/* ---------------- Delay in nanoseconds */ -#define DELAY_NS(x) DELAY_CYCLES( (x) * (F_CPU/1000000L) / 1000L ) - -/* ---------------- Delay in microseconds */ -#define DELAY_US(x) DELAY_CYCLES( (x) * (F_CPU/1000000L) ) - -#endif // MARLIN_DELAY_H diff --git a/Marlin/drivers.h b/Marlin/drivers.h deleted file mode 100644 index 3a8ff4a..0000000 --- a/Marlin/drivers.h +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -#ifndef _DRIVERS_H_ -#define _DRIVERS_H_ - -#include "MarlinConfig.h" - -#define A4988 0x001 -#define DRV8825 0x002 -#define LV8729 0x003 -#define L6470 0x104 -#define TB6560 0x005 -#define TB6600 0x006 -#define TMC2100 0x007 -#define TMC2130 0x108 -#define TMC2130_STANDALONE 0x008 -#define TMC2208 0x109 -#define TMC2208_STANDALONE 0x009 -#define TMC26X 0x10A -#define TMC26X_STANDALONE 0x00A -#define TMC2660 0x10B -#define TMC2660_STANDALONE 0x00B - -#define _AXIS_DRIVER_TYPE(A,T) ( defined(A##_DRIVER_TYPE) && (A##_DRIVER_TYPE == T) ) - -#define AXIS_DRIVER_TYPE_X(T) _AXIS_DRIVER_TYPE(X,T) -#define AXIS_DRIVER_TYPE_Y(T) _AXIS_DRIVER_TYPE(Y,T) -#define AXIS_DRIVER_TYPE_Z(T) _AXIS_DRIVER_TYPE(Z,T) -#define AXIS_DRIVER_TYPE_X2(T) (ENABLED(X_DUAL_STEPPER_DRIVERS) || ENABLED(DUAL_X_CARRIAGE)) && _AXIS_DRIVER_TYPE(X2,T) -#define AXIS_DRIVER_TYPE_Y2(T) (ENABLED(Y_DUAL_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Y2,T)) -#define AXIS_DRIVER_TYPE_Z2(T) (ENABLED(Z_DUAL_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Z2,T)) -#define AXIS_DRIVER_TYPE_E0(T) (E_STEPPERS > 0 && _AXIS_DRIVER_TYPE(E0,T)) -#define AXIS_DRIVER_TYPE_E1(T) (E_STEPPERS > 1 && _AXIS_DRIVER_TYPE(E1,T)) -#define AXIS_DRIVER_TYPE_E2(T) (E_STEPPERS > 2 && _AXIS_DRIVER_TYPE(E2,T)) -#define AXIS_DRIVER_TYPE_E3(T) (E_STEPPERS > 3 && _AXIS_DRIVER_TYPE(E3,T)) -#define AXIS_DRIVER_TYPE_E4(T) (E_STEPPERS > 4 && _AXIS_DRIVER_TYPE(E4,T)) - -#define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T) - -#define HAS_DRIVER(T) (AXIS_DRIVER_TYPE_X(T) || AXIS_DRIVER_TYPE_X2(T) || \ - AXIS_DRIVER_TYPE_Y(T) || AXIS_DRIVER_TYPE_Y2(T) || \ - AXIS_DRIVER_TYPE_Z(T) || AXIS_DRIVER_TYPE_Z2(T) || \ - AXIS_DRIVER_TYPE_E0(T) || AXIS_DRIVER_TYPE_E1(T) || \ - AXIS_DRIVER_TYPE_E2(T) || AXIS_DRIVER_TYPE_E3(T) || \ - AXIS_DRIVER_TYPE_E4(T) ) - -// Test for supported TMC drivers that require advanced configuration -// Does not match standalone configurations -#define HAS_TRINAMIC (HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2208)) - -#define AXIS_IS_TMC(A) ( AXIS_DRIVER_TYPE_##A(TMC2130) || \ - AXIS_DRIVER_TYPE_##A(TMC2208) ) - -#endif // _DRIVERS_H_ diff --git a/Marlin/emergency_parser.cpp b/Marlin/emergency_parser.cpp deleted file mode 100644 index c1cab3a..0000000 --- a/Marlin/emergency_parser.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * emergency_parser.cpp - Intercept special commands directly in the serial stream - */ - -#include "MarlinConfig.h" - -#if ENABLED(EMERGENCY_PARSER) - -#include "emergency_parser.h" - -// Static data members -bool EmergencyParser::killed_by_M112; // = false -EmergencyParser::State EmergencyParser::state; // = EP_RESET - -// Global instance -EmergencyParser emergency_parser; - -#endif // EMERGENCY_PARSER diff --git a/Marlin/emergency_parser.h b/Marlin/emergency_parser.h deleted file mode 100644 index 73981cc..0000000 --- a/Marlin/emergency_parser.h +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * emergency_parser.h - Intercept special commands directly in the serial stream - */ - -#ifndef _EMERGENCY_PARSER_H_ -#define _EMERGENCY_PARSER_H_ - -// External references -extern volatile bool wait_for_user, wait_for_heatup; -void quickstop_stepper(); - -class EmergencyParser { - -public: - - // Currently looking for: M108, M112, M410 - enum State : char { - EP_RESET, - EP_N, - EP_M, - EP_M1, - EP_M10, - EP_M108, - EP_M11, - EP_M112, - EP_M4, - EP_M41, - EP_M410, - EP_IGNORE // to '\n' - }; - - static bool killed_by_M112; - static State state; - - EmergencyParser() {} - - __attribute__((always_inline)) inline - static void update(const uint8_t c) { - - switch (state) { - case EP_RESET: - switch (c) { - case ' ': break; - case 'N': state = EP_N; break; - case 'M': state = EP_M; break; - default: state = EP_IGNORE; - } - break; - - case EP_N: - switch (c) { - case '0': case '1': case '2': - case '3': case '4': case '5': - case '6': case '7': case '8': - case '9': case '-': case ' ': break; - case 'M': state = EP_M; break; - default: state = EP_IGNORE; - } - break; - - case EP_M: - switch (c) { - case ' ': break; - case '1': state = EP_M1; break; - case '4': state = EP_M4; break; - default: state = EP_IGNORE; - } - break; - - case EP_M1: - switch (c) { - case '0': state = EP_M10; break; - case '1': state = EP_M11; break; - default: state = EP_IGNORE; - } - break; - - case EP_M10: - state = (c == '8') ? EP_M108 : EP_IGNORE; - break; - - case EP_M11: - state = (c == '2') ? EP_M112 : EP_IGNORE; - break; - - case EP_M4: - state = (c == '1') ? EP_M41 : EP_IGNORE; - break; - - case EP_M41: - state = (c == '0') ? EP_M410 : EP_IGNORE; - break; - - case EP_IGNORE: - if (c == '\n') state = EP_RESET; - break; - - default: - if (c == '\n') { - switch (state) { - case EP_M108: - wait_for_user = wait_for_heatup = false; - break; - case EP_M112: - killed_by_M112 = true; - break; - case EP_M410: - quickstop_stepper(); - break; - default: - break; - } - state = EP_RESET; - } - } - } - -}; - -extern EmergencyParser emergency_parser; - -#endif // _EMERGENCY_PARSER_H_ diff --git a/Marlin/fwretract.cpp b/Marlin/fwretract.cpp deleted file mode 100644 index 7723fcd..0000000 --- a/Marlin/fwretract.cpp +++ /dev/null @@ -1,199 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * fwretract.cpp - Implement firmware-based retraction - */ - -#include "MarlinConfig.h" - -#if ENABLED(FWRETRACT) - -#include "fwretract.h" -#include "Marlin.h" -#include "planner.h" -#include "stepper.h" - -FWRetract fwretract; // Single instance - this calls the constructor - -// private: - -#if EXTRUDERS > 1 - bool FWRetract::retracted_swap[EXTRUDERS]; // Which extruders are swap-retracted -#endif - -// public: - -bool FWRetract::autoretract_enabled, // M209 S - Autoretract switch - FWRetract::retracted[EXTRUDERS]; // Which extruders are currently retracted -float FWRetract::retract_length, // M207 S - G10 Retract length - FWRetract::retract_feedrate_mm_s, // M207 F - G10 Retract feedrate - FWRetract::retract_zlift, // M207 Z - G10 Retract hop size - FWRetract::retract_recover_length, // M208 S - G11 Recover length - FWRetract::retract_recover_feedrate_mm_s, // M208 F - G11 Recover feedrate - FWRetract::swap_retract_length, // M207 W - G10 Swap Retract length - FWRetract::swap_retract_recover_length, // M208 W - G11 Swap Recover length - FWRetract::swap_retract_recover_feedrate_mm_s, // M208 R - G11 Swap Recover feedrate - FWRetract::hop_amount; - -void FWRetract::reset() { - autoretract_enabled = false; - retract_length = RETRACT_LENGTH; - retract_feedrate_mm_s = RETRACT_FEEDRATE; - retract_zlift = RETRACT_ZLIFT; - retract_recover_length = RETRACT_RECOVER_LENGTH; - retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE; - swap_retract_length = RETRACT_LENGTH_SWAP; - swap_retract_recover_length = RETRACT_RECOVER_LENGTH_SWAP; - swap_retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE_SWAP; - hop_amount = 0.0; - - for (uint8_t i = 0; i < EXTRUDERS; ++i) { - retracted[i] = false; - #if EXTRUDERS > 1 - retracted_swap[i] = false; - #endif - } -} - -/** - * Retract or recover according to firmware settings - * - * This function handles retract/recover moves for G10 and G11, - * plus auto-retract moves sent from G0/G1 when E-only moves are done. - * - * To simplify the logic, doubled retract/recover moves are ignored. - * - * Note: Z lift is done transparently to the planner. Aborting - * a print between G10 and G11 may corrupt the Z position. - * - * Note: Auto-retract will apply the set Z hop in addition to any Z hop - * included in the G-code. Use M207 Z0 to to prevent double hop. - */ -void FWRetract::retract(const bool retracting - #if EXTRUDERS > 1 - , bool swapping /* =false */ - #endif -) { - - static float hop_amount = 0.0; // Total amount lifted, for use in recover - - // Prevent two retracts or recovers in a row - if (retracted[active_extruder] == retracting) return; - - // Prevent two swap-retract or recovers in a row - #if EXTRUDERS > 1 - // Allow G10 S1 only after G10 - if (swapping && retracted_swap[active_extruder] == retracting) return; - // G11 priority to recover the long retract if activated - if (!retracting) swapping = retracted_swap[active_extruder]; - #else - constexpr bool swapping = false; - #endif - - /* // debugging - SERIAL_ECHOLNPAIR("retracting ", retracting); - SERIAL_ECHOLNPAIR("swapping ", swapping); - SERIAL_ECHOLNPAIR("active extruder ", active_extruder); - for (uint8_t i = 0; i < EXTRUDERS; ++i) { - SERIAL_ECHOPAIR("retracted[", i); - SERIAL_ECHOLNPAIR("] ", retracted[i]); - #if EXTRUDERS > 1 - SERIAL_ECHOPAIR("retracted_swap[", i); - SERIAL_ECHOLNPAIR("] ", retracted_swap[i]); - #endif - } - SERIAL_ECHOLNPAIR("current_position[z] ", current_position[Z_AXIS]); - SERIAL_ECHOLNPAIR("current_position[e] ", current_position[E_CART]); - SERIAL_ECHOLNPAIR("hop_amount ", hop_amount); - //*/ - - const float old_feedrate_mm_s = feedrate_mm_s, - renormalize = RECIPROCAL(planner.e_factor[active_extruder]), - base_retract = swapping ? swap_retract_length : retract_length, - old_z = current_position[Z_AXIS], - old_e = current_position[E_CART]; - - // The current position will be the destination for E and Z moves - set_destination_from_current(); - - if (retracting) { - // Retract by moving from a faux E position back to the current E position - feedrate_mm_s = retract_feedrate_mm_s; - destination[E_CART] -= base_retract * renormalize; - prepare_move_to_destination(); // set_current_to_destination - - // Is a Z hop set, and has the hop not yet been done? - if (retract_zlift > 0.01 && !hop_amount) { // Apply hop only once - hop_amount += retract_zlift; // Add to the hop total (again, only once) - destination[Z_AXIS] += retract_zlift; // Raise Z by the zlift (M207 Z) amount - feedrate_mm_s = planner.max_feedrate_mm_s[Z_AXIS]; // Maximum Z feedrate - prepare_move_to_destination(); // Raise up, set_current_to_destination - } - } - else { - // If a hop was done and Z hasn't changed, undo the Z hop - if (hop_amount) { - current_position[Z_AXIS] += hop_amount; // Restore the actual Z position - SYNC_PLAN_POSITION_KINEMATIC(); // Unspoof the position planner - feedrate_mm_s = planner.max_feedrate_mm_s[Z_AXIS]; // Z feedrate to max - prepare_move_to_destination(); // Lower Z, set_current_to_destination - hop_amount = 0.0; // Clear the hop amount - } - - destination[E_CART] += (base_retract + (swapping ? swap_retract_recover_length : retract_recover_length)) * renormalize; - feedrate_mm_s = swapping ? swap_retract_recover_feedrate_mm_s : retract_recover_feedrate_mm_s; - prepare_move_to_destination(); // Recover E, set_current_to_destination - } - - feedrate_mm_s = old_feedrate_mm_s; // Restore original feedrate - current_position[Z_AXIS] = old_z; // Restore Z and E positions - current_position[E_CART] = old_e; - SYNC_PLAN_POSITION_KINEMATIC(); // As if the move never took place - - retracted[active_extruder] = retracting; // Active extruder now retracted / recovered - - // If swap retract/recover update the retracted_swap flag too - #if EXTRUDERS > 1 - if (swapping) retracted_swap[active_extruder] = retracting; - #endif - - /* // debugging - SERIAL_ECHOLNPAIR("retracting ", retracting); - SERIAL_ECHOLNPAIR("swapping ", swapping); - SERIAL_ECHOLNPAIR("active_extruder ", active_extruder); - for (uint8_t i = 0; i < EXTRUDERS; ++i) { - SERIAL_ECHOPAIR("retracted[", i); - SERIAL_ECHOLNPAIR("] ", retracted[i]); - #if EXTRUDERS > 1 - SERIAL_ECHOPAIR("retracted_swap[", i); - SERIAL_ECHOLNPAIR("] ", retracted_swap[i]); - #endif - } - SERIAL_ECHOLNPAIR("current_position[z] ", current_position[Z_AXIS]); - SERIAL_ECHOLNPAIR("current_position[e] ", current_position[E_CART]); - SERIAL_ECHOLNPAIR("hop_amount ", hop_amount); - //*/ - -} - -#endif // FWRETRACT diff --git a/Marlin/fwretract.h b/Marlin/fwretract.h deleted file mode 100644 index d72f193..0000000 --- a/Marlin/fwretract.h +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * fwretract.h - Define firmware-based retraction interface - */ - -#ifndef FWRETRACT_H -#define FWRETRACT_H - -#include "MarlinConfig.h" - -class FWRetract { -public: - static bool autoretract_enabled, // M209 S - Autoretract switch - retracted[EXTRUDERS]; // Which extruders are currently retracted - #if EXTRUDERS > 1 - static bool retracted_swap[EXTRUDERS]; // Which extruders are swap-retracted - #endif - static float retract_length, // M207 S - G10 Retract length - retract_feedrate_mm_s, // M207 F - G10 Retract feedrate - retract_zlift, // M207 Z - G10 Retract hop size - retract_recover_length, // M208 S - G11 Recover length - retract_recover_feedrate_mm_s, // M208 F - G11 Recover feedrate - swap_retract_length, // M207 W - G10 Swap Retract length - swap_retract_recover_length, // M208 W - G11 Swap Recover length - swap_retract_recover_feedrate_mm_s, // M208 R - G11 Swap Recover feedrate - hop_amount; - - FWRetract() { reset(); } - - static void reset(); - - static void refresh_autoretract() { - for (uint8_t i = 0; i < EXTRUDERS; i++) retracted[i] = false; - } - - static void enable_autoretract(const bool enable) { - autoretract_enabled = enable; - refresh_autoretract(); - } - - static void retract(const bool retracting - #if EXTRUDERS > 1 - , bool swapping = false - #endif - ); -}; - -extern FWRetract fwretract; - -#endif // FWRETRACT_H diff --git a/Marlin/language_es_utf8.h b/Marlin/language_es_utf8.h deleted file mode 100644 index a0c8745..0000000 --- a/Marlin/language_es_utf8.h +++ /dev/null @@ -1,275 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Spanish - * - * LCD Menu Messages - * See also http://marlinfw.org/docs/development/lcd_language.html - * - */ -#ifndef LANGUAGE_ES_UTF_H -#define LANGUAGE_ES_UTF_H - -#define MAPPER_C2C3 -#define DISPLAY_CHARSET_ISO10646_1 -#define CHARSIZE 2 - -#define WELCOME_MSG MACHINE_NAME _UxGT(" lista.") -#define MSG_BACK _UxGT("Atrás") -#define MSG_SD_INSERTED _UxGT("Tarjeta colocada") -#define MSG_SD_REMOVED _UxGT("Tarjeta retirada") -#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters -#define MSG_MAIN _UxGT("Menú principal") -#define MSG_AUTOSTART _UxGT("Inicio automático") -#define MSG_DISABLE_STEPPERS _UxGT("Apagar motores") -#define MSG_DEBUG_MENU _UxGT("Menú depurar") -#define MSG_PROGRESS_BAR_TEST _UxGT("Prueba barra avance") -#define MSG_AUTO_HOME _UxGT("Llevar al origen") -#define MSG_AUTO_HOME_X _UxGT("Origen X") -#define MSG_AUTO_HOME_Y _UxGT("Origen Y") -#define MSG_AUTO_HOME_Z _UxGT("Origen Z") -#define MSG_TMC_Z_CALIBRATION _UxGT("Calibrar Z") -#define MSG_LEVEL_BED_HOMING _UxGT("Origen XYZ") -#define MSG_LEVEL_BED_WAITING _UxGT("Iniciar (Presione)") -#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Siguiente punto") -#define MSG_LEVEL_BED_DONE _UxGT("Nivelación lista!") -#define MSG_SET_HOME_OFFSETS _UxGT("Ajustar desfases") -#define MSG_HOME_OFFSETS_APPLIED _UxGT("Desfase aplicado") -#define MSG_SET_ORIGIN _UxGT("Establecer origen") -#define MSG_PREHEAT_1 _UxGT("Precalentar PLA") -#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") -#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" Todo") -#define MSG_PREHEAT_1_END MSG_PREHEAT_1 _UxGT(" End") -#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" Cama") -#define MSG_PREHEAT_1_SETTINGS MSG_PREHEAT_1 _UxGT(" Config") -#define MSG_PREHEAT_2 _UxGT("Precalentar ABS") -#define MSG_PREHEAT_2_N MSG_PREHEAT_2 _UxGT(" ") -#define MSG_PREHEAT_2_ALL MSG_PREHEAT_2 _UxGT(" Todo") -#define MSG_PREHEAT_2_END MSG_PREHEAT_2 _UxGT(" End") -#define MSG_PREHEAT_2_BEDONLY MSG_PREHEAT_2 _UxGT(" Cama") -#define MSG_PREHEAT_2_SETTINGS MSG_PREHEAT_2 _UxGT(" Config") -#define MSG_COOLDOWN _UxGT("Enfriar") -#define MSG_SWITCH_PS_ON _UxGT("Encender") -#define MSG_SWITCH_PS_OFF _UxGT("Apagar") -#define MSG_EXTRUDE _UxGT("Extruir") -#define MSG_RETRACT _UxGT("Retraer") -#define MSG_MOVE_AXIS _UxGT("Mover ejes") -#define MSG_BED_LEVELING _UxGT("Nivelar cama") -#define MSG_LEVEL_BED _UxGT("Nivelar cama") -#define MSG_MOVING _UxGT("Moviendo...") -#define MSG_FREE_XY _UxGT("Libre XY") -#define MSG_MOVE_X _UxGT("Mover X") -#define MSG_MOVE_Y _UxGT("Mover Y") -#define MSG_MOVE_Z _UxGT("Mover Z") -#define MSG_MOVE_E _UxGT("Extrusor") -#define MSG_MOVE_01MM _UxGT("Mover 0.1mm") -#define MSG_MOVE_1MM _UxGT("Mover 1mm") -#define MSG_MOVE_10MM _UxGT("Mover 10mm") -#define MSG_SPEED _UxGT("Velocidad") -#define MSG_BED_Z _UxGT("Cama Z") -#define MSG_NOZZLE _UxGT("Boquilla") -#define MSG_BED _UxGT("Cama") -#define MSG_FAN_SPEED _UxGT("Ventilador") -#define MSG_FLOW _UxGT("Flujo") -#define MSG_CONTROL _UxGT("Control") -#define MSG_MIN _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Min") -#define MSG_MAX _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Max") -#define MSG_FACTOR _UxGT(" ") LCD_STR_THERMOMETER _UxGT(" Fact") -#define MSG_AUTOTEMP _UxGT("Temperatura Auto.") -#define MSG_ON _UxGT("Encender") -#define MSG_OFF _UxGT("Apagar") -#define MSG_PID_P _UxGT("PID-P") -#define MSG_PID_I _UxGT("PID-I") -#define MSG_PID_D _UxGT("PID-D") -#define MSG_PID_C _UxGT("PID-C") -#define MSG_SELECT _UxGT("Seleccionar") -#define MSG_ACC _UxGT("Aceleración") -#define MSG_JERK _UxGT("Jerk") -#define MSG_VX_JERK _UxGT("Vx-jerk") -#define MSG_VY_JERK _UxGT("Vy-jerk") -#define MSG_VZ_JERK _UxGT("Vz-jerk") -#define MSG_VE_JERK _UxGT("Ve-jerk") -#define MSG_VMAX _UxGT("Vmax") -#define MSG_VMIN _UxGT("Vmin") -#define MSG_VTRAV_MIN _UxGT("Vel. viaje min") -#define MSG_ACCELERATION MSG_ACC -#define MSG_AMAX _UxGT("Acel. max") -#define MSG_A_RETRACT _UxGT("Acel. retrac.") -#define MSG_A_TRAVEL _UxGT("Acel. Viaje") -#define MSG_STEPS_PER_MM _UxGT("Pasos/mm") -#if IS_SCARA - #define MSG_ASTEPS _UxGT("A pasos/mm") - #define MSG_BSTEPS _UxGT("B pasos/mm") - #define MSG_CSTEPS _UxGT("Z pasos/mm") -#elif IS_DELTA - #define MSG_ASTEPS _UxGT("A pasos/mm") - #define MSG_BSTEPS _UxGT("B pasos/mm") - #define MSG_CSTEPS _UxGT("C pasos/mm") -#else - #define MSG_ASTEPS _UxGT("X pasos/mm") - #define MSG_BSTEPS _UxGT("Y pasos/mm") - #define MSG_CSTEPS _UxGT("Z pasos/mm") -#endif -#define MSG_ESTEPS _UxGT("E pasos/mm") -#define MSG_E1STEPS _UxGT("E1 pasos/mm") -#define MSG_E2STEPS _UxGT("E2 pasos/mm") -#define MSG_E3STEPS _UxGT("E3 pasos/mm") -#define MSG_E4STEPS _UxGT("E4 pasos/mm") -#define MSG_E5STEPS _UxGT("E5 pasos/mm") -#define MSG_TEMPERATURE _UxGT("Temperatura") -#define MSG_MOTION _UxGT("Movimiento") -#define MSG_FILAMENT _UxGT("Filamento") -#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm3") -#define MSG_FILAMENT_DIAM _UxGT("Fil. Dia.") -#define MSG_ADVANCE_K _UxGT("Avance K") -#define MSG_CONTRAST _UxGT("Contraste") -#define MSG_STORE_EEPROM _UxGT("Guardar memoria") -#define MSG_LOAD_EEPROM _UxGT("Cargar memoria") -#define MSG_RESTORE_FAILSAFE _UxGT("Restaurar memoria") -#define MSG_REFRESH _UxGT("Volver a cargar") -#define MSG_WATCH _UxGT("Información") -#define MSG_PREPARE _UxGT("Preparar") -#define MSG_TUNE _UxGT("Ajustar") -#define MSG_PAUSE_PRINT _UxGT("Pausar impresión") -#define MSG_RESUME_PRINT _UxGT("Reanudar impresión") -#define MSG_STOP_PRINT _UxGT("Detener impresión") -#define MSG_CARD_MENU _UxGT("Menú de SD") -#define MSG_NO_CARD _UxGT("No hay tarjeta SD") -#define MSG_DWELL _UxGT("Reposo...") -#define MSG_USERWAIT _UxGT("Esperando órdenes") -#define MSG_PRINT_ABORTED _UxGT("Impresión cancelada") -#define MSG_NO_MOVE _UxGT("Sin movimiento") -#define MSG_KILLED _UxGT("Parada de emergencia") -#define MSG_STOPPED _UxGT("Detenida") -#define MSG_CONTROL_RETRACT _UxGT("Retraer mm") -#define MSG_CONTROL_RETRACT_SWAP _UxGT("Interc. Retraer mm") -#define MSG_CONTROL_RETRACTF _UxGT("Retraer V") -#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Levantar mm") -#define MSG_CONTROL_RETRACT_RECOVER _UxGT("DesRet mm") -#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Interc. DesRet mm") -#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("DesRet V") -#define MSG_AUTORETRACT _UxGT("Retracción Auto.") -#define MSG_FILAMENTCHANGE _UxGT("Cambiar filamento") -#define MSG_INIT_SDCARD _UxGT("Iniciando tarjeta") -#define MSG_CNG_SDCARD _UxGT("Cambiar tarjeta") -#define MSG_ZPROBE_OUT _UxGT("Sonda Z fuera") -#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Auto-Prueba") -#define MSG_BLTOUCH_RESET _UxGT("Reiniciar BLTouch") -#define MSG_HOME _UxGT("Home") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST -#define MSG_FIRST _UxGT("primero") -#define MSG_ZPROBE_ZOFFSET _UxGT("Desfase Z") -#define MSG_BABYSTEP_X _UxGT("Micropaso X") -#define MSG_BABYSTEP_Y _UxGT("Micropaso Y") -#define MSG_BABYSTEP_Z _UxGT("Micropaso Z") -#define MSG_ENDSTOP_ABORT _UxGT("Cancelado - Endstop") -#define MSG_HEATING_FAILED_LCD _UxGT("Error: al calentar") -#define MSG_ERR_REDUNDANT_TEMP _UxGT("Error: temperatura") -#define MSG_THERMAL_RUNAWAY _UxGT("Error: temperatura") -#define MSG_ERR_MAXTEMP _UxGT("Error: Temp Máxima") -#define MSG_ERR_MINTEMP _UxGT("Error: Temp Mínima") -#define MSG_ERR_MAXTEMP_BED _UxGT("Error: Temp Max Cama") -#define MSG_ERR_MINTEMP_BED _UxGT("Error: Temp Min Cama") -#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST -#define MSG_HALTED _UxGT("IMPRESORA PARADA") -#define MSG_PLEASE_RESET _UxGT("Por favor, reinicie") -#define MSG_SHORT_DAY _UxGT("d") // One character only -#define MSG_SHORT_HOUR _UxGT("h") // One character only -#define MSG_SHORT_MINUTE _UxGT("m") // One character only -#define MSG_HEATING _UxGT("Calentando...") -#define MSG_BED_HEATING _UxGT("Calentando Cama...") -#define MSG_DELTA_CALIBRATE _UxGT("Calibración Delta") -#define MSG_DELTA_CALIBRATE_X _UxGT("Calibrar X") -#define MSG_DELTA_CALIBRATE_Y _UxGT("Calibrar Y") -#define MSG_DELTA_CALIBRATE_Z _UxGT("Calibrar Z") -#define MSG_DELTA_CALIBRATE_CENTER _UxGT("Calibrar Centro") -#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Auto Calibración") -#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Est. Altura Delta") -#define MSG_INFO_MENU _UxGT("Inf. Impresora") -#define MSG_INFO_PRINTER_MENU _UxGT("Inf. Impresora") -#define MSG_INFO_STATS_MENU _UxGT("Estadísticas Imp.") -#define MSG_INFO_BOARD_MENU _UxGT("Inf. Controlador") -#define MSG_INFO_THERMISTOR_MENU _UxGT("Termistores") -#define MSG_INFO_EXTRUDERS _UxGT("Extrusores") -#define MSG_INFO_BAUDRATE _UxGT("Baudios") -#define MSG_INFO_PROTOCOL _UxGT("Protocolo") -#define MSG_CASE_LIGHT _UxGT("Luz cabina") - -#if LCD_WIDTH > 19 - #define MSG_INFO_PRINT_COUNT _UxGT("Conteo de impresión") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") - #define MSG_INFO_PRINT_TIME _UxGT("Tiempo total de imp.") - #define MSG_INFO_PRINT_LONGEST _UxGT("Impresión más larga") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Total de Extrusión") -#else - #define MSG_INFO_PRINT_COUNT _UxGT("Impresiones") - #define MSG_INFO_COMPLETED_PRINTS _UxGT("Completadas") - #define MSG_INFO_PRINT_TIME _UxGT("Total") - #define MSG_INFO_PRINT_LONGEST _UxGT("Más larga") - #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrusión") -#endif - -#define MSG_INFO_MIN_TEMP _UxGT("Temperatura mínima") -#define MSG_INFO_MAX_TEMP _UxGT("Temperatura máxima") -#define MSG_INFO_PSU _UxGT("Fuente de poder") -#define MSG_DRIVE_STRENGTH _UxGT("Potencia driver") -#define MSG_DAC_PERCENT _UxGT("Driver %") -#define MSG_DAC_EEPROM_WRITE _UxGT("Escribe DAC EEPROM") - -#define MSG_FILAMENT_CHANGE_HEADER _UxGT("IMPR. PAUSADA") -#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("OPC. REINICIO:") -#define MSG_FILAMENT_CHANGE_OPTION_EXTRUDE _UxGT("Extruir más") -#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Resumir imp.") - -#define MSG_FILAMENT_CHANGE_MINTEMP _UxGT("Temp Mínima es ") -#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Boquilla: ") - -#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperando iniciar") - -#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserte filamento") -#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("y presione el botón") - -#if LCD_HEIGHT >= 4 - // Up to 3 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("del filamento") - #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("cambiar") - #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("para continuar...") -#else // LCD_HEIGHT < 4 - // Up to 2 lines allowed - #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("del fil. cambiar") - #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserte filamento") -#endif // LCD_HEIGHT < 4 - -#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Esperado por") -#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filamento expulsado") -#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Esperado por") -#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("Cargar filamento") -#define MSG_FILAMENT_CHANGE_EXTRUDE_1 _UxGT("Esperado por") -#define MSG_FILAMENT_CHANGE_EXTRUDE_2 _UxGT("Extruir filamento") -#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando imp.") -#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("para resumir") -#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Oprima botón para") -#define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("Calentar la boquilla") -#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Calentando boquilla") -#define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Espere por favor") - -#endif // LANGUAGE_ES_UTF_H diff --git a/Marlin/malyanlcd.cpp b/Marlin/malyanlcd.cpp deleted file mode 100644 index 74a5b61..0000000 --- a/Marlin/malyanlcd.cpp +++ /dev/null @@ -1,496 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * malyanlcd.cpp - * - * LCD implementation for Malyan's LCD, a separate ESP8266 MCU running - * on Serial1 for the M200 board. This module outputs a pseudo-gcode - * wrapped in curly braces which the LCD implementation translates into - * actual G-code commands. - * - * Added to Marlin for Mini/Malyan M200 - * Unknown commands as of Jan 2018: {H:} - * Not currently implemented: - * {E:} when sent by LCD. Meaning unknown. - * - * Notes for connecting to boards that are not Malyan: - * The LCD is 3.3v, so if powering from a RAMPS 1.4 board or - * other 5v/12v board, use a buck converter to power the LCD and - * the 3.3v side of a logic level shifter. Aux1 on the RAMPS board - * has Serial1 and 12v, making it perfect for this. - * Copyright (c) 2017 Jason Nelson (xC0000005) - */ - -#include "MarlinConfig.h" - -#if ENABLED(MALYAN_LCD) - -#if ENABLED(SDSUPPORT) - #include "cardreader.h" - #include "SdFatConfig.h" -#else - #define LONG_FILENAME_LENGTH 0 -#endif - -#include "temperature.h" -#include "planner.h" -#include "stepper.h" -#include "duration_t.h" -#include "printcounter.h" -#include "parser.h" -#include "configuration_store.h" - -#include "Marlin.h" - -#if USE_MARLINSERIAL - // Make an exception to use HardwareSerial too - #undef HardwareSerial_h - #include - #define USB_STATUS true -#else - #define USB_STATUS Serial -#endif - -// On the Malyan M200, this will be Serial1. On a RAMPS board, -// it might not be. -#define LCD_SERIAL Serial1 - -// This is based on longest sys command + a filename, plus some buffer -// in case we encounter some data we don't recognize -// There is no evidence a line will ever be this long, but better safe than sorry -#define MAX_CURLY_COMMAND (32 + LONG_FILENAME_LENGTH) * 2 - -// Track incoming command bytes from the LCD -int inbound_count; - -// For sending print completion messages -bool last_printing_status = false; - -// Everything written needs the high bit set. -void write_to_lcd_P(const char * const message) { - char encoded_message[MAX_CURLY_COMMAND]; - uint8_t message_length = MIN(strlen_P(message), sizeof(encoded_message)); - - for (uint8_t i = 0; i < message_length; i++) - encoded_message[i] = pgm_read_byte(&message[i]) | 0x80; - - LCD_SERIAL.Print::write(encoded_message, message_length); -} - -void write_to_lcd(const char * const message) { - char encoded_message[MAX_CURLY_COMMAND]; - const uint8_t message_length = MIN(strlen(message), sizeof(encoded_message)); - - for (uint8_t i = 0; i < message_length; i++) - encoded_message[i] = message[i] | 0x80; - - LCD_SERIAL.Print::write(encoded_message, message_length); -} - -/** - * Process an LCD 'C' command. - * These are currently all temperature commands - * {C:T0190} - * Set temp for hotend to 190 - * {C:P050} - * Set temp for bed to 50 - * - * {C:S09} set feedrate to 90 %. - * {C:S12} set feedrate to 120 %. - * - * the command portion begins after the : - */ -void process_lcd_c_command(const char* command) { - switch (command[0]) { - case 'C': { - int raw_feedrate = atoi(command + 1); - feedrate_percentage = raw_feedrate * 10; - feedrate_percentage = constrain(feedrate_percentage, 10, 999); - } break; - case 'T': { - thermalManager.setTargetHotend(atoi(command + 1), 0); - } break; - case 'P': { - thermalManager.setTargetBed(atoi(command + 1)); - } break; - - default: - SERIAL_ECHOLNPAIR("UNKNOWN C COMMAND", command); - return; - } -} - -/** - * Process an LCD 'B' command. - * {B:0} results in: {T0:008/195}{T1:000/000}{TP:000/000}{TQ:000C}{TT:000000} - * T0/T1 are hot end temperatures, TP is bed, TQ is percent, and TT is probably - * time remaining (HH:MM:SS). The UI can't handle displaying a second hotend, - * but the stock firmware always sends it, and it's always zero. - */ -void process_lcd_eb_command(const char* command) { - char elapsed_buffer[10]; - duration_t elapsed; - switch (command[0]) { - case '0': { - elapsed = print_job_timer.duration(); - sprintf_P(elapsed_buffer, PSTR("%02u%02u%02u"), uint16_t(elapsed.hour()), uint16_t(elapsed.minute()) % 60UL, elapsed.second()); - - char message_buffer[MAX_CURLY_COMMAND]; - sprintf_P(message_buffer, - PSTR("{T0:%03.0f/%03i}{T1:000/000}{TP:%03.0f/%03i}{TQ:%03i}{TT:%s}"), - thermalManager.degHotend(0), - thermalManager.degTargetHotend(0), - #if HAS_HEATED_BED - thermalManager.degBed(), - thermalManager.degTargetBed(), - #else - 0, 0, - #endif - #if ENABLED(SDSUPPORT) - card.percentDone(), - #else - 0, - #endif - elapsed_buffer); - write_to_lcd(message_buffer); - } break; - - default: - SERIAL_ECHOLNPAIR("UNKNOWN E/B COMMAND", command); - return; - } -} - -/** - * Process an LCD 'J' command. - * These are currently all movement commands. - * The command portion begins after the : - * Move X Axis - * - * {J:E}{J:X-200}{J:E} - * {J:E}{J:X+200}{J:E} - * X, Y, Z, A (extruder) - */ -void process_lcd_j_command(const char* command) { - static bool steppers_enabled = false; - char axis = command[0]; - - switch (axis) { - case 'E': - // enable or disable steppers - // switch to relative - enqueue_and_echo_commands_now_P(PSTR("G91")); - enqueue_and_echo_commands_now_P(steppers_enabled ? PSTR("M18") : PSTR("M17")); - steppers_enabled = !steppers_enabled; - break; - case 'A': - axis = 'E'; - // fallthru - case 'Y': - case 'Z': - case 'X': { - // G0 - // The M200 class UI seems to send movement in .1mm values. - char cmd[20]; - sprintf_P(cmd, PSTR("G1 %c%03.1f"), axis, atof(command + 1) / 10.0); - enqueue_and_echo_command_now(cmd); - } break; - default: - SERIAL_ECHOLNPAIR("UNKNOWN J COMMAND", command); - return; - } -} - -/** - * Process an LCD 'P' command, related to homing and printing. - * Cancel: - * {P:X} - * - * Home all axes: - * {P:H} - * - * Print a file: - * {P:000} - * The File number is specified as a three digit value. - * Printer responds with: - * {PRINTFILE:Mini_SNES_Bottom.gcode} - * {SYS:BUILD}echo:Now fresh file: Mini_SNES_Bottom.gcode - * File opened: Mini_SNES_Bottom.gcode Size: 5805813 - * File selected - * {SYS:BUILD} - * T:-2526.8 E:0 - * T:-2533.0 E:0 - * T:-2537.4 E:0 - * Note only the curly brace stuff matters. - */ -void process_lcd_p_command(const char* command) { - - switch (command[0]) { - case 'X': - #if ENABLED(SDSUPPORT) - // cancel print - write_to_lcd_P(PSTR("{SYS:CANCELING}")); - last_printing_status = false; - card.stopSDPrint( - #if SD_RESORT - true - #endif - ); - clear_command_queue(); - quickstop_stepper(); - print_job_timer.stop(); - thermalManager.disable_all_heaters(); - #if FAN_COUNT > 0 - for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; - #endif - wait_for_heatup = false; - write_to_lcd_P(PSTR("{SYS:STARTED}")); - #endif - break; - case 'H': - // Home all axis - enqueue_and_echo_commands_now_P(PSTR("G28")); - break; - default: { - #if ENABLED(SDSUPPORT) - // Print file 000 - a three digit number indicating which - // file to print in the SD card. If it's a directory, - // then switch to the directory. - - // Find the name of the file to print. - // It's needed to echo the PRINTFILE option. - // The {S:L} command should've ensured the SD card was mounted. - card.getfilename(atoi(command)); - - // There may be a difference in how V1 and V2 LCDs handle subdirectory - // prints. Investigate more. This matches the V1 motion controller actions - // but the V2 LCD switches to "print" mode on {SYS:DIR} response. - if (card.filenameIsDir) { - card.chdir(card.filename); - write_to_lcd_P(PSTR("{SYS:DIR}")); - } - else { - char message_buffer[MAX_CURLY_COMMAND]; - sprintf_P(message_buffer, PSTR("{PRINTFILE:%s}"), card.longest_filename()); - write_to_lcd(message_buffer); - write_to_lcd_P(PSTR("{SYS:BUILD}")); - card.openAndPrintFile(card.filename); - } - #endif - } break; // default - } // switch -} - -/** - * Handle an lcd 'S' command - * {S:I} - Temperature request - * {T0:999/000}{T1:000/000}{TP:004/000} - * - * {S:L} - File Listing request - * Printer Response: - * {FILE:buttons.gcode} - * {FILE:update.bin} - * {FILE:nupdate.bin} - * {FILE:fcupdate.flg} - * {SYS:OK} - */ -void process_lcd_s_command(const char* command) { - switch (command[0]) { - case 'I': { - // temperature information - char message_buffer[MAX_CURLY_COMMAND]; - sprintf_P(message_buffer, PSTR("{T0:%03.0f/%03i}{T1:000/000}{TP:%03.0f/%03i}"), - thermalManager.degHotend(0), thermalManager.degTargetHotend(0), - #if HAS_HEATED_BED - thermalManager.degBed(), thermalManager.degTargetBed() - #else - 0, 0 - #endif - ); - write_to_lcd(message_buffer); - } break; - - case 'H': - // Home all axis - enqueue_and_echo_command("G28"); - break; - - case 'L': { - #if ENABLED(SDSUPPORT) - if (!card.cardOK) card.initsd(); - - // A more efficient way to do this would be to - // implement a callback in the ls_SerialPrint code, but - // that requires changes to the core cardreader class that - // would not benefit the majority of users. Since one can't - // select a file for printing during a print, there's - // little reason not to do it this way. - char message_buffer[MAX_CURLY_COMMAND]; - uint16_t file_count = card.get_num_Files(); - for (uint16_t i = 0; i < file_count; i++) { - card.getfilename(i); - sprintf_P(message_buffer, card.filenameIsDir ? PSTR("{DIR:%s}") : PSTR("{FILE:%s}"), card.longest_filename()); - write_to_lcd(message_buffer); - } - - write_to_lcd_P(PSTR("{SYS:OK}")); - #endif - } break; - - default: - SERIAL_ECHOLNPAIR("UNKNOWN S COMMAND", command); - return; - } -} - -/** - * Receive a curly brace command and translate to G-code. - * Currently {E:0} is not handled. Its function is unknown, - * but it occurs during the temp window after a sys build. - */ -void process_lcd_command(const char* command) { - const char *current = command; - - current++; // skip the leading {. The trailing one is already gone. - byte command_code = *current++; - if (*current != ':') { - SERIAL_ECHOLNPAIR("UNKNOWN COMMAND FORMAT", command); - return; - } - - current++; // skip the : - - switch (command_code) { - case 'S': - process_lcd_s_command(current); - break; - case 'J': - process_lcd_j_command(current); - break; - case 'P': - process_lcd_p_command(current); - break; - case 'C': - process_lcd_c_command(current); - break; - case 'B': - case 'E': - process_lcd_eb_command(current); - break; - default: - SERIAL_ECHOLNPAIR("UNKNOWN COMMAND", command); - return; - } -} - -/** - * UC means connected. - * UD means disconnected - * The stock firmware considers USB initialized as "connected." - */ -void update_usb_status(const bool forceUpdate) { - static bool last_usb_connected_status = false; - // This is mildly different than stock, which - // appears to use the usb discovery status. - // This is more logical. - if (last_usb_connected_status != USB_STATUS || forceUpdate) { - last_usb_connected_status = USB_STATUS; - write_to_lcd_P(last_usb_connected_status ? PSTR("{R:UC}\r\n") : PSTR("{R:UD}\r\n")); - } -} - -/** - * - from printer on startup: - * {SYS:STARTED}{VER:29}{SYS:STARTED}{R:UD} - * The optimize attribute fixes a register Compile - * error for amtel. - */ -void _O2 lcd_update() { - static char inbound_buffer[MAX_CURLY_COMMAND]; - - // First report USB status. - update_usb_status(false); - - // now drain commands... - while (LCD_SERIAL.available()) { - const byte b = (byte)LCD_SERIAL.read() & 0x7F; - inbound_buffer[inbound_count++] = b; - if (b == '}' || inbound_count == sizeof(inbound_buffer) - 1) { - inbound_buffer[inbound_count - 1] = '\0'; - process_lcd_command(inbound_buffer); - inbound_count = 0; - inbound_buffer[0] = 0; - } - } - - #if ENABLED(SDSUPPORT) - // The way last printing status works is simple: - // The UI needs to see at least one TQ which is not 100% - // and then when the print is complete, one which is. - static uint8_t last_percent_done = 100; - - // If there was a print in progress, we need to emit the final - // print status as {TQ:100}. Reset last percent done so a new print will - // issue a percent of 0. - const uint8_t percent_done = card.sdprinting ? card.percentDone() : last_printing_status ? 100 : 0; - if (percent_done != last_percent_done) { - char message_buffer[10]; - sprintf_P(message_buffer, PSTR("{TQ:%03i}"), percent_done); - write_to_lcd(message_buffer); - last_percent_done = percent_done; - last_printing_status = card.sdprinting; - } - #endif -} - -/** - * The Malyan LCD actually runs as a separate MCU on Serial 1. - * This code's job is to siphon the weird curly-brace commands from - * it and translate into gcode, which then gets injected into - * the command queue where possible. - */ -void lcd_init() { - inbound_count = 0; - LCD_SERIAL.begin(500000); - - // Signal init - write_to_lcd_P(PSTR("{SYS:STARTED}\r\n")); - - // send a version that says "unsupported" - write_to_lcd_P(PSTR("{VER:99}\r\n")); - - // No idea why it does this twice. - write_to_lcd_P(PSTR("{SYS:STARTED}\r\n")); - update_usb_status(true); -} - -/** - * Set an alert. - */ -void lcd_setalertstatusPGM(const char* message) { - char message_buffer[MAX_CURLY_COMMAND]; - sprintf_P(message_buffer, PSTR("{E:%s}"), message); - write_to_lcd(message_buffer); -} - -#endif // MALYAN_LCD diff --git a/Marlin/parser.cpp b/Marlin/parser.cpp deleted file mode 100644 index 178583c..0000000 --- a/Marlin/parser.cpp +++ /dev/null @@ -1,302 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * parser.cpp - Parser for a GCode line, providing a parameter interface. - */ - -#include "parser.h" - -#include "Marlin.h" -#include "language.h" - -// Must be declared for allocation and to satisfy the linker -// Zero values need no initialization. - -bool GCodeParser::volumetric_enabled; - -#if ENABLED(INCH_MODE_SUPPORT) - float GCodeParser::linear_unit_factor, GCodeParser::volumetric_unit_factor; -#endif - -#if ENABLED(TEMPERATURE_UNITS_SUPPORT) - TempUnit GCodeParser::input_temp_units; -#endif - -char *GCodeParser::command_ptr, - *GCodeParser::string_arg, - *GCodeParser::value_ptr; -char GCodeParser::command_letter; -int GCodeParser::codenum; -#if USE_GCODE_SUBCODES - uint8_t GCodeParser::subcode; -#endif - -#if ENABLED(FASTER_GCODE_PARSER) - // Optimized Parameters - uint32_t GCodeParser::codebits; // found bits - uint8_t GCodeParser::param[26]; // parameter offsets from command_ptr -#else - char *GCodeParser::command_args; // start of parameters -#endif - -// Create a global instance of the GCode parser singleton -GCodeParser parser; - -/** - * Clear all code-seen (and value pointers) - * - * Since each param is set/cleared on seen codes, - * this may be optimized by commenting out ZERO(param) - */ -void GCodeParser::reset() { - string_arg = NULL; // No whole line argument - command_letter = '?'; // No command letter - codenum = 0; // No command code - #if USE_GCODE_SUBCODES - subcode = 0; // No command sub-code - #endif - #if ENABLED(FASTER_GCODE_PARSER) - codebits = 0; // No codes yet - //ZERO(param); // No parameters (should be safe to comment out this line) - #endif -} - -// Populate all fields by parsing a single line of GCode -// 58 bytes of SRAM are used to speed up seen/value -void GCodeParser::parse(char *p) { - - reset(); // No codes to report - - // Skip spaces - while (*p == ' ') ++p; - - // Skip N[-0-9] if included in the command line - if (*p == 'N' && NUMERIC_SIGNED(p[1])) { - #if ENABLED(FASTER_GCODE_PARSER) - //set('N', p + 1); // (optional) Set the 'N' parameter value - #endif - p += 2; // skip N[-0-9] - while (NUMERIC(*p)) ++p; // skip [0-9]* - while (*p == ' ') ++p; // skip [ ]* - } - - // *p now points to the current command, which should be G, M, or T - command_ptr = p; - - // Get the command letter, which must be G, M, or T - const char letter = *p++; - - // Nullify asterisk and trailing whitespace - char *starpos = strchr(p, '*'); - if (starpos) { - --starpos; // * - while (*starpos == ' ') --starpos; // spaces... - starpos[1] = '\0'; - } - - // Bail if the letter is not G, M, or T - switch (letter) { case 'G': case 'M': case 'T': break; default: return; } - - // Skip spaces to get the numeric part - while (*p == ' ') p++; - - // Bail if there's no command code number - if (!NUMERIC(*p)) return; - - // Save the command letter at this point - // A '?' signifies an unknown command - command_letter = letter; - - // Get the code number - integer digits only - codenum = 0; - do { - codenum *= 10, codenum += *p++ - '0'; - } while (NUMERIC(*p)); - - // Allow for decimal point in command - #if USE_GCODE_SUBCODES - if (*p == '.') { - p++; - while (NUMERIC(*p)) - subcode *= 10, subcode += *p++ - '0'; - } - #endif - - // Skip all spaces to get to the first argument, or nul - while (*p == ' ') p++; - - // The command parameters (if any) start here, for sure! - - #if DISABLED(FASTER_GCODE_PARSER) - command_args = p; // Scan for parameters in seen() - #endif - - // Only use string_arg for these M codes - if (letter == 'M') switch (codenum) { case 23: case 28: case 30: case 117: case 118: case 928: string_arg = p; return; default: break; } - - #if ENABLED(DEBUG_GCODE_PARSER) - const bool debug = codenum == 800; - #endif - - /** - * Find all parameters, set flags and pointers for fast parsing - * - * Most codes ignore 'string_arg', but those that want a string will get the right pointer. - * The following loop assigns the first "parameter" having no numeric value to 'string_arg'. - * This allows M0/M1 with expire time to work: "M0 S5 You Win!" - * For 'M118' you must use 'E1' and 'A1' rather than just 'E' or 'A' - */ - string_arg = NULL; - while (const char code = *p++) { // Get the next parameter. A NUL ends the loop - - // Special handling for M32 [P] !/path/to/file.g# - // The path must be the last parameter - if (code == '!' && letter == 'M' && codenum == 32) { - string_arg = p; // Name starts after '!' - char * const lb = strchr(p, '#'); // Already seen '#' as SD char (to pause buffering) - if (lb) *lb = '\0'; // Safe to mark the end of the filename - return; - } - - // Arguments MUST be uppercase for fast GCode parsing - #if ENABLED(FASTER_GCODE_PARSER) - #define PARAM_TEST WITHIN(code, 'A', 'Z') - #else - #define PARAM_TEST true - #endif - - if (PARAM_TEST) { - - while (*p == ' ') p++; // Skip spaces between parameters & values - - const bool has_num = valid_float(p); - - #if ENABLED(DEBUG_GCODE_PARSER) - if (debug) { - SERIAL_ECHOPAIR("Got letter ", code); - SERIAL_ECHOPAIR(" at index ", (int)(p - command_ptr - 1)); - if (has_num) SERIAL_ECHOPGM(" (has_num)"); - } - #endif - - if (!has_num && !string_arg) { // No value? First time, keep as string_arg - string_arg = p - 1; - #if ENABLED(DEBUG_GCODE_PARSER) - if (debug) SERIAL_ECHOPAIR(" string_arg: ", hex_address((void*)string_arg)); // DEBUG - #endif - } - - #if ENABLED(DEBUG_GCODE_PARSER) - if (debug) SERIAL_EOL(); - #endif - - #if ENABLED(FASTER_GCODE_PARSER) - set(code, has_num ? p : NULL); // Set parameter exists and pointer (NULL for no number) - #endif - } - else if (!string_arg) { // Not A-Z? First time, keep as the string_arg - string_arg = p - 1; - #if ENABLED(DEBUG_GCODE_PARSER) - if (debug) SERIAL_ECHOPAIR(" string_arg: ", hex_address((void*)string_arg)); // DEBUG - #endif - } - - if (!WITHIN(*p, 'A', 'Z')) { // Another parameter right away? - while (*p && DECIMAL_SIGNED(*p)) p++; // Skip over the value section of a parameter - while (*p == ' ') p++; // Skip over all spaces - } - } -} - -#if ENABLED(CNC_COORDINATE_SYSTEMS) - - // Parse the next parameter as a new command - bool GCodeParser::chain() { - #if ENABLED(FASTER_GCODE_PARSER) - char *next_command = command_ptr; - if (next_command) { - while (*next_command && *next_command != ' ') ++next_command; - while (*next_command == ' ') ++next_command; - if (!*next_command) next_command = NULL; - } - #else - const char *next_command = command_args; - #endif - if (next_command) parse(next_command); - return !!next_command; - } - -#endif // CNC_COORDINATE_SYSTEMS - -void GCodeParser::unknown_command_error() { - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(MSG_UNKNOWN_COMMAND, command_ptr); - SERIAL_CHAR('"'); - SERIAL_EOL(); -} - -#if ENABLED(DEBUG_GCODE_PARSER) - - void GCodeParser::debug() { - SERIAL_ECHOPAIR("Command: ", command_ptr); - SERIAL_ECHOPAIR(" (", command_letter); - SERIAL_ECHO(codenum); - SERIAL_ECHOLNPGM(")"); - #if ENABLED(FASTER_GCODE_PARSER) - SERIAL_ECHOPGM(" args: \""); - for (char c = 'A'; c <= 'Z'; ++c) - if (seen(c)) { SERIAL_CHAR(c); SERIAL_CHAR(' '); } - #else - SERIAL_ECHOPAIR(" args: \"", command_args); - #endif - SERIAL_CHAR('"'); - if (string_arg) { - SERIAL_ECHOPGM(" string: \""); - SERIAL_ECHO(string_arg); - SERIAL_CHAR('"'); - } - SERIAL_ECHOPGM("\n\n"); - for (char c = 'A'; c <= 'Z'; ++c) { - if (seen(c)) { - SERIAL_ECHOPAIR("Code '", c); SERIAL_ECHOPGM("':"); - if (has_value()) { - SERIAL_ECHOPAIR("\n float: ", value_float()); - SERIAL_ECHOPAIR("\n long: ", value_long()); - SERIAL_ECHOPAIR("\n ulong: ", value_ulong()); - SERIAL_ECHOPAIR("\n millis: ", value_millis()); - SERIAL_ECHOPAIR("\n sec-ms: ", value_millis_from_seconds()); - SERIAL_ECHOPAIR("\n int: ", value_int()); - SERIAL_ECHOPAIR("\n ushort: ", value_ushort()); - SERIAL_ECHOPAIR("\n byte: ", (int)value_byte()); - SERIAL_ECHOPAIR("\n bool: ", (int)value_bool()); - SERIAL_ECHOPAIR("\n linear: ", value_linear_units()); - SERIAL_ECHOPAIR("\n celsius: ", value_celsius()); - } - else - SERIAL_ECHOPGM(" (no value)"); - SERIAL_ECHOPGM("\n\n"); - } - } - } - -#endif // DEBUG_GCODE_PARSER diff --git a/Marlin/parser.h b/Marlin/parser.h deleted file mode 100644 index 6a86ad3..0000000 --- a/Marlin/parser.h +++ /dev/null @@ -1,341 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * parser.h - Parser for a GCode line, providing a parameter interface. - * Codes like M149 control the way the GCode parser behaves, - * so settings for these codes are located in this class. - */ - -#ifndef _PARSER_H_ -#define _PARSER_H_ - -#include "enum.h" -#include "types.h" -#include "MarlinConfig.h" - -//#define DEBUG_GCODE_PARSER -#if ENABLED(DEBUG_GCODE_PARSER) - #include "hex_print_routines.h" - #include "serial.h" -#endif - -#define strtof strtod - -/** - * GCode parser - * - * - Parse a single gcode line for its letter, code, subcode, and parameters - * - FASTER_GCODE_PARSER: - * - Flags existing params (1 bit each) - * - Stores value offsets (1 byte each) - * - Provide accessors for parameters: - * - Parameter exists - * - Parameter has value - * - Parameter value in different units and types - */ -class GCodeParser { - -private: - static char *value_ptr; // Set by seen, used to fetch the value - - #if ENABLED(FASTER_GCODE_PARSER) - static uint32_t codebits; // Parameters pre-scanned - static uint8_t param[26]; // For A-Z, offsets into command args - #else - static char *command_args; // Args start here, for slow scan - #endif - -public: - - // Global states for GCode-level units features - - static bool volumetric_enabled; - - #if ENABLED(INCH_MODE_SUPPORT) - static float linear_unit_factor, volumetric_unit_factor; - #endif - - #if ENABLED(TEMPERATURE_UNITS_SUPPORT) - static TempUnit input_temp_units; - #endif - - // Command line state - static char *command_ptr, // The command, so it can be echoed - *string_arg; // string of command line - - static char command_letter; // G, M, or T - static int codenum; // 123 - #if USE_GCODE_SUBCODES - static uint8_t subcode; // .1 - #endif - - #if ENABLED(DEBUG_GCODE_PARSER) - static void debug(); - #endif - - GCodeParser() { - #if ENABLED(INCH_MODE_SUPPORT) - set_input_linear_units(LINEARUNIT_MM); - #endif - } - - // Reset is done before parsing - static void reset(); - - #define LETTER_BIT(N) ((N) - 'A') - - FORCE_INLINE static bool valid_signless(const char * const p) { - return NUMERIC(p[0]) || (p[0] == '.' && NUMERIC(p[1])); // .?[0-9] - } - - FORCE_INLINE static bool valid_float(const char * const p) { - return valid_signless(p) || ((p[0] == '-' || p[0] == '+') && valid_signless(&p[1])); // [-+]?.?[0-9] - } - - #if ENABLED(FASTER_GCODE_PARSER) - - FORCE_INLINE static bool valid_int(const char * const p) { - return NUMERIC(p[0]) || ((p[0] == '-' || p[0] == '+') && NUMERIC(p[1])); // [-+]?[0-9] - } - - // Set the flag and pointer for a parameter - static void set(const char c, char * const ptr) { - const uint8_t ind = LETTER_BIT(c); - if (ind >= COUNT(param)) return; // Only A-Z - SBI32(codebits, ind); // parameter exists - param[ind] = ptr ? ptr - command_ptr : 0; // parameter offset or 0 - #if ENABLED(DEBUG_GCODE_PARSER) - if (codenum == 800) { - SERIAL_ECHOPAIR("Set bit ", (int)ind); - SERIAL_ECHOPAIR(" of codebits (", hex_address((void*)(codebits >> 16))); - print_hex_word((uint16_t)(codebits & 0xFFFF)); - SERIAL_ECHOLNPAIR(") | param = ", (int)param[ind]); - } - #endif - } - - // Code seen bit was set. If not found, value_ptr is unchanged. - // This allows "if (seen('A')||seen('B'))" to use the last-found value. - static bool seen(const char c) { - const uint8_t ind = LETTER_BIT(c); - if (ind >= COUNT(param)) return false; // Only A-Z - const bool b = TEST32(codebits, ind); - if (b) { - #if ENABLED(DEBUG_GCODE_PARSER) - if (codenum == 800) { - SERIAL_CHAR('\''); SERIAL_CHAR(c); SERIAL_ECHOLNPGM("' is seen"); - } - #endif - char * const ptr = command_ptr + param[ind]; - value_ptr = param[ind] && valid_float(ptr) ? ptr : (char*)NULL; - } - return b; - } - - static bool seen_any() { return !!codebits; } - - #define SEEN_TEST(L) TEST32(codebits, LETTER_BIT(L)) - - #else // !FASTER_GCODE_PARSER - - // Code is found in the string. If not found, value_ptr is unchanged. - // This allows "if (seen('A')||seen('B'))" to use the last-found value. - static bool seen(const char c) { - char *p = strchr(command_args, c); - const bool b = !!p; - if (b) value_ptr = valid_float(&p[1]) ? &p[1] : (char*)NULL; - return b; - } - - static bool seen_any() { return *command_args == '\0'; } - - #define SEEN_TEST(L) !!strchr(command_args, L) - - #endif // !FASTER_GCODE_PARSER - - // Seen any axis parameter - static bool seen_axis() { - return SEEN_TEST('X') || SEEN_TEST('Y') || SEEN_TEST('Z') || SEEN_TEST('E'); - } - - // Populate all fields by parsing a single line of GCode - // This uses 54 bytes of SRAM to speed up seen/value - static void parse(char * p); - - #if ENABLED(CNC_COORDINATE_SYSTEMS) - // Parse the next parameter as a new command - static bool chain(); - #endif - - // The code value pointer was set - FORCE_INLINE static bool has_value() { return value_ptr != NULL; } - - // Seen a parameter with a value - inline static bool seenval(const char c) { return seen(c) && has_value(); } - - // Float removes 'E' to prevent scientific notation interpretation - inline static float value_float() { - if (value_ptr) { - char *e = value_ptr; - for (;;) { - const char c = *e; - if (c == '\0' || c == ' ') break; - if (c == 'E' || c == 'e') { - *e = '\0'; - const float ret = strtof(value_ptr, NULL); - *e = c; - return ret; - } - ++e; - } - return strtof(value_ptr, NULL); - } - return 0; - } - - // Code value as a long or ulong - inline static int32_t value_long() { return value_ptr ? strtol(value_ptr, NULL, 10) : 0L; } - inline static uint32_t value_ulong() { return value_ptr ? strtoul(value_ptr, NULL, 10) : 0UL; } - - // Code value for use as time - FORCE_INLINE static millis_t value_millis() { return value_ulong(); } - FORCE_INLINE static millis_t value_millis_from_seconds() { return value_float() * 1000UL; } - - // Reduce to fewer bits - FORCE_INLINE static int16_t value_int() { return (int16_t)value_long(); } - FORCE_INLINE static uint16_t value_ushort() { return (uint16_t)value_long(); } - inline static uint8_t value_byte() { return (uint8_t)constrain(value_long(), 0, 255); } - - // Bool is true with no value or non-zero - inline static bool value_bool() { return !has_value() || !!value_byte(); } - - // Units modes: Inches, Fahrenheit, Kelvin - - #if ENABLED(INCH_MODE_SUPPORT) - - inline static void set_input_linear_units(const LinearUnit units) { - switch (units) { - case LINEARUNIT_INCH: - linear_unit_factor = 25.4; - break; - case LINEARUNIT_MM: - default: - linear_unit_factor = 1.0; - break; - } - volumetric_unit_factor = POW(linear_unit_factor, 3.0); - } - - inline static float axis_unit_factor(const AxisEnum axis) { - return (axis >= E_AXIS && volumetric_enabled ? volumetric_unit_factor : linear_unit_factor); - } - - inline static float value_linear_units() { return value_float() * linear_unit_factor; } - inline static float value_axis_units(const AxisEnum axis) { return value_float() * axis_unit_factor(axis); } - inline static float value_per_axis_unit(const AxisEnum axis) { return value_float() / axis_unit_factor(axis); } - - #else - - FORCE_INLINE static float value_linear_units() { return value_float(); } - FORCE_INLINE static float value_axis_units(const AxisEnum a) { UNUSED(a); return value_float(); } - FORCE_INLINE static float value_per_axis_unit(const AxisEnum a) { UNUSED(a); return value_float(); } - - #endif - - #if ENABLED(TEMPERATURE_UNITS_SUPPORT) - - inline static void set_input_temp_units(TempUnit units) { input_temp_units = units; } - - #if ENABLED(ULTIPANEL) && DISABLED(DISABLE_M503) - - FORCE_INLINE static char temp_units_code() { - return input_temp_units == TEMPUNIT_K ? 'K' : input_temp_units == TEMPUNIT_F ? 'F' : 'C'; - } - FORCE_INLINE static const char* temp_units_name() { - return input_temp_units == TEMPUNIT_K ? PSTR("Kelvin") : input_temp_units == TEMPUNIT_F ? PSTR("Fahrenheit") : PSTR("Celsius"); - } - inline static float to_temp_units(const float &f) { - switch (input_temp_units) { - case TEMPUNIT_F: - return f * 0.5555555556 + 32.0; - case TEMPUNIT_K: - return f + 273.15; - case TEMPUNIT_C: - default: - return f; - } - } - - #endif // ULTIPANEL && !DISABLE_M503 - - inline static float value_celsius() { - const float f = value_float(); - switch (input_temp_units) { - case TEMPUNIT_F: - return (f - 32.0) * 0.5555555556; - case TEMPUNIT_K: - return f - 273.15; - case TEMPUNIT_C: - default: - return f; - } - } - - inline static float value_celsius_diff() { - switch (input_temp_units) { - case TEMPUNIT_F: - return value_float() * 0.5555555556; - case TEMPUNIT_C: - case TEMPUNIT_K: - default: - return value_float(); - } - } - - #else // !TEMPERATURE_UNITS_SUPPORT - - FORCE_INLINE static float value_celsius() { return value_float(); } - FORCE_INLINE static float value_celsius_diff() { return value_float(); } - - #endif // !TEMPERATURE_UNITS_SUPPORT - - FORCE_INLINE static float value_feedrate() { return value_linear_units(); } - - void unknown_command_error(); - - // Provide simple value accessors with default option - FORCE_INLINE static float floatval(const char c, const float dval=0.0) { return seenval(c) ? value_float() : dval; } - FORCE_INLINE static bool boolval(const char c, const bool dval=false) { return seenval(c) ? value_bool() : (seen(c) ? true : dval); } - FORCE_INLINE static uint8_t byteval(const char c, const uint8_t dval=0) { return seenval(c) ? value_byte() : dval; } - FORCE_INLINE static int16_t intval(const char c, const int16_t dval=0) { return seenval(c) ? value_int() : dval; } - FORCE_INLINE static uint16_t ushortval(const char c, const uint16_t dval=0) { return seenval(c) ? value_ushort() : dval; } - FORCE_INLINE static int32_t longval(const char c, const int32_t dval=0) { return seenval(c) ? value_long() : dval; } - FORCE_INLINE static uint32_t ulongval(const char c, const uint32_t dval=0) { return seenval(c) ? value_ulong() : dval; } - FORCE_INLINE static float linearval(const char c, const float dval=0.0) { return seenval(c) ? value_linear_units() : dval; } - FORCE_INLINE static float celsiusval(const char c, const float dval=0.0) { return seenval(c) ? value_celsius() : dval; } - -}; - -extern GCodeParser parser; - -#endif // _PARSER_H_ diff --git a/Marlin/pins_EINSY_RAMBO.h b/Marlin/pins_EINSY_RAMBO.h deleted file mode 100644 index e3f6705..0000000 --- a/Marlin/pins_EINSY_RAMBO.h +++ /dev/null @@ -1,179 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Einsy-Rambo pin assignments - */ - -#ifndef __AVR_ATmega2560__ - #error "Oops! Make sure you have 'Arduino Mega 2560 or Rambo' selected from the 'Tools -> Boards' menu." -#endif - -#define BOARD_NAME "Einsy Rambo" - -// -// TMC2130 Configuration_adv defaults for EinsyRambo -// -#if !AXIS_DRIVER_TYPE(X, TMC2130) || !AXIS_DRIVER_TYPE(Y, TMC2130) || !AXIS_DRIVER_TYPE(Z, TMC2130) || !AXIS_DRIVER_TYPE(E0, TMC2130) - #error "You must set ([XYZ]|E0)_DRIVER_TYPE to TMC2130 in Configuration.h for EinsyRambo." -#endif - -// TMC2130 Diag Pins (currently just for reference) -#define X_DIAG_PIN 64 -#define Y_DIAG_PIN 69 -#define Z_DIAG_PIN 68 -#define E0_DIAG_PIN 65 - -// -// Limit Switches -// -// Only use Diag Pins when SENSORLESS_HOMING is enabled for the TMC2130 drivers. -// Otherwise use a physical endstop based configuration. -// -// SERVO0_PIN and Z_MIN_PIN configuration for BLTOUCH sensor when combined with SENSORLESS_HOMING. -// - -#if DISABLED(SENSORLESS_HOMING) - - #define X_STOP_PIN 12 - #define Y_STOP_PIN 11 - #define Z_STOP_PIN 10 - -#else - - #define X_STOP_PIN X_DIAG_PIN - #define Y_STOP_PIN Y_DIAG_PIN - - #if ENABLED(BLTOUCH) - #define Z_STOP_PIN 11 // Y-MIN - #define SERVO0_PIN 10 // Z-MIN - #else - #define Z_STOP_PIN 10 - #endif - -#endif - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 10 -#endif - -// -// Steppers -// -#define X_STEP_PIN 37 -#define X_DIR_PIN 49 -#define X_ENABLE_PIN 29 -#define X_CS_PIN 41 - -#define Y_STEP_PIN 36 -#define Y_DIR_PIN 48 -#define Y_ENABLE_PIN 28 -#define Y_CS_PIN 39 - -#define Z_STEP_PIN 35 -#define Z_DIR_PIN 47 -#define Z_ENABLE_PIN 27 -#define Z_CS_PIN 67 - -#define E0_STEP_PIN 34 -#define E0_DIR_PIN 43 -#define E0_ENABLE_PIN 26 -#define E0_CS_PIN 66 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_1_PIN 1 // Analog Input -#define TEMP_BED_PIN 2 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 3 -#define HEATER_BED_PIN 4 - -#ifndef FAN_PIN - #define FAN_PIN 8 -#endif - -#ifndef FAN1_PIN - #define FAN1_PIN 6 -#endif - -// -// Misc. Functions -// -#define SDSS 77 -#define LED_PIN 13 -#define CASE_LIGHT_PIN 9 - -// -// M3/M4/M5 - Spindle/Laser Control -// -// use P1 connector for spindle pins -#define SPINDLE_LASER_PWM_PIN 9 // MUST BE HARDWARE PWM -#define SPINDLE_LASER_ENABLE_PIN 18 // Pin should have a pullup! -#define SPINDLE_DIR_PIN 19 - -// -// Průša i3 MK2 Multiplexer Support -// -#define E_MUX0_PIN 17 -#define E_MUX1_PIN 16 -#define E_MUX2_PIN 78 // 84 in MK2 Firmware, with BEEPER as 78 - -// -// LCD / Controller -// -#if ENABLED(ULTRA_LCD) - - #define KILL_PIN 32 - - #if ENABLED(NEWPANEL) - - #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS 85 - #define LCD_PINS_ENABLE 71 - #define LCD_PINS_D4 70 - #define BTN_EN1 61 - #define BTN_EN2 59 - #else - #define LCD_PINS_RS 82 - #define LCD_PINS_ENABLE 61 - #define LCD_PINS_D4 59 - #define LCD_PINS_D5 70 - #define LCD_PINS_D6 85 - #define LCD_PINS_D7 71 - #define BTN_EN1 14 - #define BTN_EN2 72 - #endif - - #define BTN_ENC 9 // AUX-2 - #define BEEPER_PIN 84 // AUX-4 - #define SD_DETECT_PIN 15 - - #endif // NEWPANEL -#endif // ULTRA_LCD diff --git a/Marlin/pins_EINSY_RETRO.h b/Marlin/pins_EINSY_RETRO.h deleted file mode 100644 index a100d93..0000000 --- a/Marlin/pins_EINSY_RETRO.h +++ /dev/null @@ -1,193 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Einsy-Retro pin assignments - */ - -#ifndef __AVR_ATmega2560__ - #error "Oops! Make sure you have 'Arduino Mega 2560 or Rambo' selected from the 'Tools -> Boards' menu." -#endif - -#define BOARD_NAME "Einsy Retro" - -// -// TMC2130 Configuration_adv defaults for EinsyRetro -// -#if !AXIS_DRIVER_TYPE(X, TMC2130) || !AXIS_DRIVER_TYPE(Y, TMC2130) || !AXIS_DRIVER_TYPE(Z, TMC2130) || !AXIS_DRIVER_TYPE(E0, TMC2130) - #error "You must set ([XYZ]|E0)_DRIVER_TYPE to TMC2130 in Configuration.h for EinsyRetro." -#endif - -// TMC2130 Diag Pins (currently just for reference) -#define X_DIAG_PIN 64 -#define Y_DIAG_PIN 69 -#define Z_DIAG_PIN 68 -#define E0_DIAG_PIN 65 - -// -// Limit Switches -// -// Only use Diag Pins when SENSORLESS_HOMING is enabled for the TMC2130 drivers. -// Otherwise use a physical endstop based configuration. -// -// SERVO0_PIN and Z_MIN_PIN configuration for BLTOUCH sensor when combined with SENSORLESS_HOMING. -// - -#if DISABLED(SENSORLESS_HOMING) - - #define X_MIN_PIN 12 - #define Y_MIN_PIN 11 - #define Z_MIN_PIN 10 - #define X_MAX_PIN 81 - #define Y_MAX_PIN 57 - -#else - - #if X_HOME_DIR == -1 - #define X_MIN_PIN X_DIAG_PIN - #define X_MAX_PIN 81 - #else - #define X_MIN_PIN 12 - #define X_MAX_PIN X_DIAG_PIN - #endif - - #if Y_HOME_DIR == -1 - #define Y_MIN_PIN Y_DIAG_PIN - #define Y_MAX_PIN 57 - #else - #define Y_MIN_PIN 11 - #define Y_MAX_PIN Y_DIAG_PIN - #endif - - #if ENABLED(BLTOUCH) - #define Z_MIN_PIN 11 // Y-MIN - #define SERVO0_PIN 10 // Z-MIN - #else - #define Z_MIN_PIN 10 - #endif - -#endif - -#define Z_MAX_PIN 7 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN 10 -#endif - -// -// Steppers -// -#define X_STEP_PIN 37 -#define X_DIR_PIN 49 -#define X_ENABLE_PIN 29 -#define X_CS_PIN 41 - -#define Y_STEP_PIN 36 -#define Y_DIR_PIN 48 -#define Y_ENABLE_PIN 28 -#define Y_CS_PIN 39 - -#define Z_STEP_PIN 35 -#define Z_DIR_PIN 47 -#define Z_ENABLE_PIN 27 -#define Z_CS_PIN 67 - -#define E0_STEP_PIN 34 -#define E0_DIR_PIN 43 -#define E0_ENABLE_PIN 26 -#define E0_CS_PIN 66 - -// -// Temperature Sensors -// -#define TEMP_0_PIN 0 // Analog Input -#define TEMP_1_PIN 1 // Analog Input -#define TEMP_BED_PIN 2 // Analog Input - -// -// Heaters / Fans -// -#define HEATER_0_PIN 3 -#define HEATER_BED_PIN 4 - -#ifndef FAN_PIN - #define FAN_PIN 8 -#endif -#define FAN1_PIN 6 - -// -// Misc. Functions -// -#define SDSS 53 -#define LED_PIN 13 -#define CASE_LIGHT_PIN 9 - -// -// M3/M4/M5 - Spindle/Laser Control -// -// use P1 connector for spindle pins -#define SPINDLE_LASER_PWM_PIN 9 // MUST BE HARDWARE PWM -#define SPINDLE_LASER_ENABLE_PIN 18 // Pin should have a pullup! -#define SPINDLE_DIR_PIN 19 - -// -// Průša i3 MK2 Multiplexer Support -// -#define E_MUX0_PIN 17 -#define E_MUX1_PIN 16 -#define E_MUX2_PIN 78 // 84 in MK2 Firmware, with BEEPER as 78 - -// -// LCD / Controller -// -#if ENABLED(ULTRA_LCD) - - #define KILL_PIN 32 - - #if ENABLED(NEWPANEL) - - #if ENABLED(CR10_STOCKDISPLAY) - #define LCD_PINS_RS 85 - #define LCD_PINS_ENABLE 71 - #define LCD_PINS_D4 70 - #define BTN_EN1 18 - #define BTN_EN2 19 - #else - #define LCD_PINS_RS 82 - #define LCD_PINS_ENABLE 18 - #define LCD_PINS_D4 19 - #define LCD_PINS_D5 70 - #define LCD_PINS_D6 85 - #define LCD_PINS_D7 71 - #define BTN_EN1 14 - #define BTN_EN2 72 - #endif - - #define BTN_ENC 9 // AUX-2 - #define BEEPER_PIN 84 // AUX-4 - #define SD_DETECT_PIN 15 - - #endif // NEWPANEL -#endif // ULTRA_LCD diff --git a/Marlin/pins_MELZI_MALYAN.h b/Marlin/pins_MELZI_MALYAN.h deleted file mode 100644 index a81526f..0000000 --- a/Marlin/pins_MELZI_MALYAN.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Melzi (Malyan M150) pin assignments - */ - -#define BOARD_NAME "Melzi (Malyan)" -#include "pins_MELZI.h" - -#undef LCD_SDSS -#undef LCD_PINS_RS -#undef LCD_PINS_ENABLE -#undef LCD_PINS_D4 -#undef BTN_EN1 -#undef BTN_EN2 -#undef BTN_ENC - -#define LCD_PINS_RS 17 // ST9720 CS -#define LCD_PINS_ENABLE 16 // ST9720 DAT -#define LCD_PINS_D4 11 // ST9720 CLK -#define BTN_EN1 30 -#define BTN_EN2 29 -#define BTN_ENC 28 - -// Alter timing for graphical display -#ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_NS(125) -#endif -#ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_NS(125) -#endif -#ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_NS(125) -#endif diff --git a/Marlin/pins_MELZI_TRONXY.h b/Marlin/pins_MELZI_TRONXY.h deleted file mode 100644 index 0da7934..0000000 --- a/Marlin/pins_MELZI_TRONXY.h +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Melzi pin assignments - */ - -#define BOARD_NAME "Melzi (Tronxy)" -#include "pins_MELZI.h" - -#undef Z_ENABLE_PIN -#undef LCD_PINS_RS -#undef LCD_PINS_ENABLE -#undef LCD_PINS_D4 -#undef LCD_PINS_D5 -#undef LCD_PINS_D6 -#undef LCD_PINS_D7 -#undef BTN_EN1 -#undef BTN_EN2 -#undef BTN_ENC -#undef LCD_SDSS - -#define Z_ENABLE_PIN 14 -#define LCD_PINS_RS 30 -#define LCD_PINS_ENABLE 28 -#define LCD_PINS_D4 16 -#define LCD_PINS_D5 17 -#define LCD_PINS_D6 27 -#define LCD_PINS_D7 29 -#define BTN_EN1 10 -#define BTN_EN2 11 -#define BTN_ENC 26 - -#ifndef ST7920_DELAY_1 - #define ST7920_DELAY_1 DELAY_NS(0) -#endif -#ifndef ST7920_DELAY_2 - #define ST7920_DELAY_2 DELAY_NS(125) -#endif -#ifndef ST7920_DELAY_3 - #define ST7920_DELAY_3 DELAY_NS(0) -#endif diff --git a/Marlin/pins_MKS_BASE_15.h b/Marlin/pins_MKS_BASE_15.h deleted file mode 100644 index e9f7050..0000000 --- a/Marlin/pins_MKS_BASE_15.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * MKS BASE v1.5 with A4982 stepper drivers and digital micro-stepping - */ - -#include "pins_MKS_BASE.h" - -/** - * Microstepping pins - */ -#define X_MS1_PIN 5 // Digital 3 / Pin 5 / PE3 / SERVO2_PIN -#define X_MS2_PIN 6 // Digital 6 / Pin 14 / PH3 / SERVO1_PIN -#define Y_MS1_PIN 59 // Analog 5 / Pin 92 / PF5 -#define Y_MS2_PIN 58 // Analog 4 / Pin 93 / PF4 -#define Z_MS1_PIN 22 // Digital 22 / Pin 78 / PA0 -#define Z_MS2_PIN 39 // Digital 39 / Pin 70 / PG2 -#define E0_MS1_PIN 63 // Analog 9 / Pin 86 / PK1 -#define E0_MS2_PIN 64 // Analog 10 / Pin 87 / PK2 -#define E1_MS1_PIN 57 // Analog 3 / Pin 93 / PF3 -#define E1_MS2_PIN 4 // Digital 4 / Pin 1 / PG5 / SERVO3_PIN diff --git a/Marlin/pins_MKS_BASE_HEROIC.h b/Marlin/pins_MKS_BASE_HEROIC.h deleted file mode 100644 index 84f7280..0000000 --- a/Marlin/pins_MKS_BASE_HEROIC.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * MKS BASE with Heroic HR4982 stepper drivers - */ - -#include "pins_MKS_BASE_15.h" - -/** - * Some new boards use HR4982 (Heroic) instead of the A4982 (Allegro) stepper drivers. - * Most the functionality is similar, the HR variant obviously doesn't work with diode - * smoothers (no fast decay). And the Heroic has a 128 µStepping mode where the A4982 - * is doing quarter steps (MS1=0, MS2=1). - */ -#define HEROIC_STEPPER_DRIVERS diff --git a/Marlin/pins_MKS_GEN_13.h b/Marlin/pins_MKS_GEN_13.h deleted file mode 100644 index e0e916b..0000000 --- a/Marlin/pins_MKS_GEN_13.h +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Arduino Mega with RAMPS v1.4 adjusted pin assignments - * - * MKS GEN v1.3 (Extruder, Fan, Bed) - * MKS GEN v1.3 (Extruder, Extruder, Fan, Bed) - * MKS GEN v1.4 (Extruder, Fan, Bed) - * MKS GEN v1.4 (Extruder, Extruder, Fan, Bed) - */ - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "MKS GEN 1.3/1.4 supports up to 2 hotends / E-steppers. Comment out this line to continue." -#endif - -#define BOARD_NAME "MKS GEN >= v1.3" - -// -// Heaters / Fans -// -// Power outputs EFBF or EFBE -#define MOSFET_D_PIN 7 - -// -// PSU / SERVO -// -// If POWER_SUPPLY is specified, always hijack Servo 3 -// -#if POWER_SUPPLY > 0 - #define SERVO3_PIN -1 - #define PS_ON_PIN 4 -#endif - -#include "pins_RAMPS.h" - -// -// LCD / Controller -// -#if ENABLED(VIKI2) || ENABLED(miniVIKI) - /** - * VIKI2 Has two groups of wires with... - * - * +Vin + Input supply, requires 120ma for LCD and mSD card - * GND Ground Pin - * MOSI Data input for LCD and SD - * MISO Data output for SD - * SCK Clock for LCD and SD - * AO Reg. Sel for LCD - * LCS Chip Select for LCD - * SDCS Chip Select for SD - * SDCD Card Detect pin for SD - * ENCA Encoder output A - * ENCB Encoder output B - * ENCBTN Encoder button switch - * - * BTN Panel mounted button switch - * BUZZER Piezo buzzer - * BLUE-LED Blue LED ring pin (3 to 5v, mosfet buffered) - * RED-LED Red LED ring pin (3 to 5v, mosfet buffered) - * - * This configuration uses the following arrangement: - * - * EXP1 D37 = EN2 D35 = EN1 EXP2 D50 = MISO D52 = SCK - * D17 = BLUE D16 = RED D31 = ENC D53 = SDCS - * D23 = KILL D25 = BUZZ D33 = --- D51 = MOSI - * D27 = A0 D29 = LCS D49 = SDCD RST = --- - * GND = GND 5V = 5V GND = --- D41 = --- - */ - - #undef BTN_EN1 - #undef BTN_EN2 - #undef BTN_ENC - #undef DOGLCD_A0 - #undef DOGLCD_CS - #undef SD_DETECT_PIN - #undef BEEPER_PIN - #undef KILL_PIN - - // - // VIKI2 12-wire lead - // - - // orange/white SDCD - #define SD_DETECT_PIN 49 - - // white ENCA - #define BTN_EN1 35 - - // green ENCB - #define BTN_EN2 37 - - // purple ENCBTN - #define BTN_ENC 31 - - // brown A0 - #define DOGLCD_A0 27 - - // green/white LCS - #define DOGLCD_CS 29 - - // 50 gray MISO - // 51 yellow MOSI - // 52 orange SCK - - // blue SDCS - //#define SDSS 53 - - // - // VIKI2 4-wire lead - // - - // blue BTN - #define KILL_PIN 23 - - // green BUZZER - #define BEEPER_PIN 25 - - // yellow RED-LED - #define STAT_LED_RED_PIN 16 - - // white BLUE-LED - #define STAT_LED_BLUE_PIN 17 - -#endif diff --git a/Marlin/pins_RAMPS_ENDER_4.h b/Marlin/pins_RAMPS_ENDER_4.h deleted file mode 100644 index a14ace2..0000000 --- a/Marlin/pins_RAMPS_ENDER_4.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#if HOTENDS > 1 || E_STEPPERS > 1 - #error "Ender-4 supports only 1 hotend / E-stepper. Comment out this line to continue." -#endif - -#define BOARD_NAME "Ender-4" - -#include "pins_RAMPS.h" diff --git a/Marlin/pins_TRIGORILLA_13.h b/Marlin/pins_TRIGORILLA_13.h deleted file mode 100644 index 0907eaf..0000000 --- a/Marlin/pins_TRIGORILLA_13.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Arduino Mega with RAMPS v1.3 for Anycubic - */ - -#ifndef BOARD_NAME - #define BOARD_NAME "Anycubic RAMPS 1.3" -#endif - -#define IS_RAMPS_EFB -#define RAMPS_D9_PIN 44 -#define FAN2_PIN 9 -#define ORIG_E0_AUTO_FAN_PIN 9 - -#include "pins_RAMPS_13.h" - -#undef E1_STEP_PIN -#undef E1_DIR_PIN -#undef E1_ENABLE_PIN -#undef E1_CS_PIN diff --git a/Marlin/pins_TRIGORILLA_14.h b/Marlin/pins_TRIGORILLA_14.h deleted file mode 100644 index 280ff27..0000000 --- a/Marlin/pins_TRIGORILLA_14.h +++ /dev/null @@ -1,232 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * Arduino Mega with RAMPS v1.4 for Anycubic - */ - -#ifndef BOARD_NAME - #define BOARD_NAME "Anycubic RAMPS 1.4" -#endif - -#define LARGE_FLASH true - -// Misc PINs -#define BUZZER 31 -#define SDPOWER -1 -#define SDSS 53 -#define LED_PIN 13 -#define Z_MIN_PROBE_PIN 2 -#define FIL_RUNOUT_PIN 19 - -#ifdef OutageTest - #define OUTAGETEST_PIN 79 - #define OUTAGECON_PIN 58 -#endif - -// Steppers -#define X_STEP_PIN 54 -#define X_DIR_PIN 55 -#define X_ENABLE_PIN 38 - -#define Y_STEP_PIN 60 -#define Y_DIR_PIN 61 -#define Y_ENABLE_PIN 56 - -#define Y2_STEP_PIN 36 -#define Y2_DIR_PIN 34 -#define Y2_ENABLE_PIN 30 - -#define Z_STEP_PIN 46 -#define Z_DIR_PIN 48 -#define Z_ENABLE_PIN 62 - -#define Z2_STEP_PIN 36 -#define Z2_DIR_PIN 34 -#define Z2_ENABLE_PIN 30 - -#define E0_STEP_PIN 26 -#define E0_DIR_PIN 28 -#define E0_ENABLE_PIN 24 - -// EndStops -#define X_MIN_PIN 3 -#define Y_MIN_PIN 42 -#define Z_MIN_PIN 18 - -#define X_MAX_PIN 43 -#define Y_MAX_PIN -1 -#define Z_MAX_PIN -1 - -// Fans -#define FAN_PIN 9 -#define FAN2_PIN 44 -#define ORIG_E0_AUTO_FAN_PIN 44 -#define CONTROLLER_FAN_PIN 7 - -// Heaters -#define HEATER_0_PIN 10 -#define HEATER_1_PIN 45 -#define HEATER_BED_PIN 8 - -// Temperatursensoren -#define TEMP_0_PIN 13 -#define TEMP_1_PIN 15 -#define TEMP_2_PIN 12 -#define TEMP_BED_PIN 14 - -// Servos -#ifdef NUM_SERVOS - #define SERVO0_PIN 11 - - #if NUM_SERVOS > 1 - #define SERVO1_PIN 6 - #endif - - #if NUM_SERVOS > 2 - #define SERVO2_PIN 5 - #endif - - #if NUM_SERVOS > 3 - #define SERVO3_PIN 4 - #endif -#endif - -#if defined(ANYCUBIC_TFT_MODEL) - #define BEEPER_PIN 31 - #define SD_DETECT_PIN 49 -#endif - -// LCD -#if defined(REPRAP_DISCOUNT_SMART_CONTROLLER) || defined(G3D_PANEL) || defined(ANYCUBIC_TFT_MODEL) - #define KILL_PIN 41 -#else - #define KILL_PIN -1 -#endif - -#ifdef ULTRA_LCD - #ifdef NEWPANEL - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #define LCD_PINS_D7 29 - - #ifdef REPRAP_DISCOUNT_SMART_CONTROLLER - #define BEEPER_PIN 37 - - #define BTN_EN1 31 - #define BTN_EN2 33 - #define BTN_ENC 35 - - #define SD_DETECT_PIN 49 - #elif defined(LCD_I2C_PANELOLU2) - #define BTN_EN1 47 //reverse if the encoder turns the wrong way. - #define BTN_EN2 43 - #define BTN_ENC 32 - #define SDSS 53 - #define SD_DETECT_PIN -1 - #define KILL_PIN 41 - #elif defined(LCD_I2C_VIKI) - #define BTN_EN1 22 //reverse if the encoder turns the wrong way. - #define BTN_EN2 7 - #define BTN_ENC -1 - #define SDSS 53 - #define SD_DETECT_PIN 49 - #elif defined(FULL_GRAPHIC_SMALL_PANEL) - #define BEEPER_PIN 37 - - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 23 - #define DOGLCD_CS 27 - #define LCD_PIN_BL 25 // backlight LED on PA3 - - #define KILL_PIN 41 - // GLCD features - //#define LCD_CONTRAST 190 - // Uncomment screen orientation - // #define LCD_SCREEN_ROT_90 - // #define LCD_SCREEN_ROT_180 - // #define LCD_SCREEN_ROT_270 - //The encoder and click button - #define BTN_EN1 33 - #define BTN_EN2 -1 - #define BTN_ENC 35 //the click switch - //not connected to a pin - #define SD_DETECT_PIN 49 - #elif defined(MULTIPANEL) - // #define BEEPER_PIN 37 - // Pins for DOGM SPI LCD Support - #define DOGLCD_A0 17 - #define DOGLCD_CS 16 - #define LCD_PIN_BL 23 // backlight LED on A11/D65 - #define SDSS 53 - - #define KILL_PIN 64 - // GLCD features - //#define LCD_CONTRAST 190 - // Uncomment screen orientation - // #define LCD_SCREEN_ROT_90 - // #define LCD_SCREEN_ROT_180 - // #define LCD_SCREEN_ROT_270 - //The encoder and click button - #define BTN_EN1 -1 - #define BTN_EN2 33 - #define BTN_ENC 35 //the click switch - //not connected to a pin - #define SD_DETECT_PIN 49 - #else - //arduino pin which triggers an piezzo beeper - #define BEEPER_PIN 31 // Beeper on AUX-4 - - //buttons are directly attached using AUX-2 - #ifdef REPRAPWORLD_KEYPAD - #define BTN_EN1 64 // encoder - #define BTN_EN2 59 // encoder - #define BTN_ENC 63 // enter button - #define SHIFT_OUT 40 // shift register - #define SHIFT_CLK 44 // shift register - #define SHIFT_LD 42 // shift register - #else - #define BTN_EN1 37 - #define BTN_EN2 35 - #define BTN_ENC -1 //the click - #endif - - #ifdef G3D_PANEL - #define SD_DETECT_PIN 49 - #else - #define SD_DETECT_PIN -1 // Ramps does not use this port - #endif - - #endif - - #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 - #define LCD_PINS_D4 23 - #define LCD_PINS_D5 25 - #define LCD_PINS_D6 27 - #define LCD_PINS_D7 29 - - #endif -#endif diff --git a/Marlin/power.cpp b/Marlin/power.cpp deleted file mode 100644 index 2f4708b..0000000 --- a/Marlin/power.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * power.cpp - power control - */ - -#include "MarlinConfig.h" - -#if ENABLED(AUTO_POWER_CONTROL) - -#include "power.h" -#include "temperature.h" -#include "stepper_indirection.h" - -Power powerManager; - -millis_t Power::lastPowerOn; - -bool Power::is_power_needed() { - #if ENABLED(AUTO_POWER_FANS) - for (uint8_t i = 0; i < FAN_COUNT; i++) if (fanSpeeds[i] > 0) return true; - #endif - - #if ENABLED(AUTO_POWER_E_FANS) - HOTEND_LOOP() if (thermalManager.autofan_speed[e] > 0) return true; - #endif - - #if ENABLED(AUTO_POWER_CONTROLLERFAN) && HAS_CONTROLLER_FAN && ENABLED(USE_CONTROLLER_FAN) - if (controllerFanSpeed > 0) return true; - #endif - - // If any of the drivers or the bed are enabled... - if (X_ENABLE_READ == X_ENABLE_ON || Y_ENABLE_READ == Y_ENABLE_ON || Z_ENABLE_READ == Z_ENABLE_ON - #if HAS_HEATED_BED - || thermalManager.soft_pwm_amount_bed > 0 - #endif - #if HAS_X2_ENABLE - || X2_ENABLE_READ == X_ENABLE_ON - #endif - #if HAS_Y2_ENABLE - || Y2_ENABLE_READ == Y_ENABLE_ON - #endif - #if HAS_Z2_ENABLE - || Z2_ENABLE_READ == Z_ENABLE_ON - #endif - || E0_ENABLE_READ == E_ENABLE_ON - #if E_STEPPERS > 1 - || E1_ENABLE_READ == E_ENABLE_ON - #if E_STEPPERS > 2 - || E2_ENABLE_READ == E_ENABLE_ON - #if E_STEPPERS > 3 - || E3_ENABLE_READ == E_ENABLE_ON - #if E_STEPPERS > 4 - || E4_ENABLE_READ == E_ENABLE_ON - #endif - #endif - #endif - #endif - ) return true; - - HOTEND_LOOP() if (thermalManager.degTargetHotend(e) > 0) return true; - #if HAS_HEATED_BED - if (thermalManager.degTargetBed() > 0) return true; - #endif - - return false; -} - -void Power::check() { - static millis_t nextPowerCheck = 0; - millis_t ms = millis(); - if (ELAPSED(ms, nextPowerCheck)) { - nextPowerCheck = ms + 2500UL; - if (is_power_needed()) - power_on(); - else if (!lastPowerOn || ELAPSED(ms, lastPowerOn + (POWER_TIMEOUT) * 1000UL)) - power_off(); - } -} - -void Power::power_on() { - lastPowerOn = millis(); - if (!powersupply_on) { - PSU_PIN_ON(); - - #if HAS_TRINAMIC - delay(100); // Wait for power to settle - restore_stepper_drivers(); - #endif - } -} - -void Power::power_off() { - if (powersupply_on) PSU_PIN_OFF(); -} - -#endif // AUTO_POWER_CONTROL diff --git a/Marlin/power.h b/Marlin/power.h deleted file mode 100644 index a5c7dba..0000000 --- a/Marlin/power.h +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * power.h - power control - */ - -#ifndef POWER_H -#define POWER_H - -#include "types.h" - -class Power { - public: - static void check(); - static void power_on(); - static void power_off(); - private: - static millis_t lastPowerOn; - static bool is_power_needed(); -}; - -extern Power powerManager; - -#endif // POWER_H diff --git a/Marlin/power_loss_recovery.cpp b/Marlin/power_loss_recovery.cpp deleted file mode 100644 index fef41f3..0000000 --- a/Marlin/power_loss_recovery.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * power_loss_recovery.cpp - Resume an SD print after power-loss - */ - -#include "MarlinConfig.h" - -#if ENABLED(POWER_LOSS_RECOVERY) - -#include "power_loss_recovery.h" - -#include "cardreader.h" -#include "planner.h" -#include "printcounter.h" -#include "serial.h" -#include "temperature.h" -#include "ultralcd.h" - -// Recovery data -job_recovery_info_t job_recovery_info; -JobRecoveryPhase job_recovery_phase = JOB_RECOVERY_IDLE; -uint8_t job_recovery_commands_count; //=0 -char job_recovery_commands[BUFSIZE + APPEND_CMD_COUNT][MAX_CMD_SIZE]; -// Extern -extern uint8_t active_extruder, commands_in_queue, cmd_queue_index_r; - -#if ENABLED(DEBUG_POWER_LOSS_RECOVERY) - void debug_print_job_recovery(const bool recovery) { - SERIAL_PROTOCOLLNPGM("---- Job Recovery Info ----"); - SERIAL_PROTOCOLPAIR("valid_head:", int(job_recovery_info.valid_head)); - SERIAL_PROTOCOLLNPAIR(" valid_foot:", int(job_recovery_info.valid_foot)); - if (job_recovery_info.valid_head) { - if (job_recovery_info.valid_head == job_recovery_info.valid_foot) { - SERIAL_PROTOCOLPGM("current_position: "); - LOOP_XYZE(i) { - SERIAL_PROTOCOL(job_recovery_info.current_position[i]); - if (i < E_AXIS) SERIAL_CHAR(','); - } - SERIAL_EOL(); - SERIAL_PROTOCOLLNPAIR("feedrate: ", job_recovery_info.feedrate); - - #if HOTENDS > 1 - SERIAL_PROTOCOLLNPAIR("active_hotend: ", int(job_recovery_info.active_hotend)); - #endif - - SERIAL_PROTOCOLPGM("target_temperature: "); - HOTEND_LOOP() { - SERIAL_PROTOCOL(job_recovery_info.target_temperature[e]); - if (e < HOTENDS - 1) SERIAL_CHAR(','); - } - SERIAL_EOL(); - - #if HAS_HEATED_BED - SERIAL_PROTOCOLLNPAIR("target_temperature_bed: ", job_recovery_info.target_temperature_bed); - #endif - - #if FAN_COUNT - SERIAL_PROTOCOLPGM("fanSpeeds: "); - for (int8_t i = 0; i < FAN_COUNT; i++) { - SERIAL_PROTOCOL(job_recovery_info.fanSpeeds[i]); - if (i < FAN_COUNT - 1) SERIAL_CHAR(','); - } - SERIAL_EOL(); - #endif - - #if HAS_LEVELING - SERIAL_PROTOCOLPAIR("leveling: ", int(job_recovery_info.leveling)); - SERIAL_PROTOCOLLNPAIR(" fade: ", int(job_recovery_info.fade)); - #endif - SERIAL_PROTOCOLLNPAIR("cmd_queue_index_r: ", int(job_recovery_info.cmd_queue_index_r)); - SERIAL_PROTOCOLLNPAIR("commands_in_queue: ", int(job_recovery_info.commands_in_queue)); - if (recovery) - for (uint8_t i = 0; i < job_recovery_commands_count; i++) SERIAL_PROTOCOLLNPAIR("> ", job_recovery_commands[i]); - else - for (uint8_t i = 0; i < job_recovery_info.commands_in_queue; i++) SERIAL_PROTOCOLLNPAIR("> ", job_recovery_info.command_queue[i]); - SERIAL_PROTOCOLLNPAIR("sd_filename: ", job_recovery_info.sd_filename); - SERIAL_PROTOCOLLNPAIR("sdpos: ", job_recovery_info.sdpos); - SERIAL_PROTOCOLLNPAIR("print_job_elapsed: ", job_recovery_info.print_job_elapsed); - } - else - SERIAL_PROTOCOLLNPGM("INVALID DATA"); - } - SERIAL_PROTOCOLLNPGM("---------------------------"); - } -#endif // DEBUG_POWER_LOSS_RECOVERY - -/** - * Check for Print Job Recovery during setup() - * - * If a saved state exists, populate job_recovery_commands with - * commands to restore the machine state and continue the file. - */ -void check_print_job_recovery() { - memset(&job_recovery_info, 0, sizeof(job_recovery_info)); - ZERO(job_recovery_commands); - - if (!card.cardOK) card.initsd(); - - if (card.cardOK) { - - #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) - SERIAL_PROTOCOLLNPAIR("Init job recovery info. Size: ", int(sizeof(job_recovery_info))); - #endif - - if (card.jobRecoverFileExists()) { - card.openJobRecoveryFile(true); - card.loadJobRecoveryInfo(); - card.closeJobRecoveryFile(); - //card.removeJobRecoveryFile(); - - if (job_recovery_info.valid_head && job_recovery_info.valid_head == job_recovery_info.valid_foot) { - - uint8_t ind = 0; - - #if HAS_LEVELING - strcpy_P(job_recovery_commands[ind++], PSTR("M420 S0 Z0")); // Leveling off before G92 or G28 - #endif - - strcpy_P(job_recovery_commands[ind++], PSTR("G92.0 Z0")); // Ensure Z is equal to 0 - strcpy_P(job_recovery_commands[ind++], PSTR("G1 Z2")); // Raise Z by 2mm (we hope!) - strcpy_P(job_recovery_commands[ind++], PSTR("G28 R0" - #if ENABLED(MARLIN_DEV_MODE) - " S" - #elif !IS_KINEMATIC - " X Y" // Home X and Y for Cartesian - #endif - )); - - char str_1[16], str_2[16]; - - #if HAS_LEVELING - if (job_recovery_info.fade || job_recovery_info.leveling) { - // Restore leveling state before G92 sets Z - // This ensures the steppers correspond to the native Z - dtostrf(job_recovery_info.fade, 1, 1, str_1); - sprintf_P(job_recovery_commands[ind++], PSTR("M420 S%i Z%s"), int(job_recovery_info.leveling), str_1); - } - #endif - - dtostrf(job_recovery_info.current_position[Z_AXIS] + 2, 1, 3, str_1); - dtostrf(job_recovery_info.current_position[E_CART] - #if ENABLED(SAVE_EACH_CMD_MODE) - - 5 - #endif - , 1, 3, str_2 - ); - sprintf_P(job_recovery_commands[ind++], PSTR("G92.0 Z%s E%s"), str_1, str_2); // Current Z + 2 and E - - uint8_t r = job_recovery_info.cmd_queue_index_r, c = job_recovery_info.commands_in_queue; - while (c--) { - strcpy(job_recovery_commands[ind++], job_recovery_info.command_queue[r]); - r = (r + 1) % BUFSIZE; - } - - if (job_recovery_info.sd_filename[0] == '/') job_recovery_info.sd_filename[0] = ' '; - sprintf_P(job_recovery_commands[ind++], PSTR("M23 %s"), job_recovery_info.sd_filename); - sprintf_P(job_recovery_commands[ind++], PSTR("M24 S%ld T%ld"), job_recovery_info.sdpos, job_recovery_info.print_job_elapsed); - - job_recovery_commands_count = ind; - - #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) - debug_print_job_recovery(true); - #endif - } - else { - if (job_recovery_info.valid_head != job_recovery_info.valid_foot) - LCD_ALERTMESSAGEPGM("INVALID DATA"); - memset(&job_recovery_info, 0, sizeof(job_recovery_info)); - } - } - } -} - -/** - * Save the current machine state to the power-loss recovery file - */ -void save_job_recovery_info() { - #if SAVE_INFO_INTERVAL_MS > 0 - static millis_t next_save_ms; // = 0; // Init on reset - millis_t ms = millis(); - #endif - if ( - // Save on every command - #if ENABLED(SAVE_EACH_CMD_MODE) - true - #else - // Save if power loss pin is triggered - #if PIN_EXISTS(POWER_LOSS) - READ(POWER_LOSS_PIN) == POWER_LOSS_STATE || - #endif - // Save if interval is elapsed - #if SAVE_INFO_INTERVAL_MS > 0 - ELAPSED(ms, next_save_ms) || - #endif - // Save on every new Z height - (current_position[Z_AXIS] > 0 && current_position[Z_AXIS] > job_recovery_info.current_position[Z_AXIS]) - #endif - ) { - #if SAVE_INFO_INTERVAL_MS > 0 - next_save_ms = ms + SAVE_INFO_INTERVAL_MS; - #endif - - // Head and foot will match if valid data was saved - if (!++job_recovery_info.valid_head) ++job_recovery_info.valid_head; // non-zero in sequence - job_recovery_info.valid_foot = job_recovery_info.valid_head; - - // Machine state - COPY(job_recovery_info.current_position, current_position); - job_recovery_info.feedrate = feedrate_mm_s; - - #if HOTENDS > 1 - job_recovery_info.active_hotend = active_extruder; - #endif - - COPY(job_recovery_info.target_temperature, thermalManager.target_temperature); - - #if HAS_HEATED_BED - job_recovery_info.target_temperature_bed = thermalManager.target_temperature_bed; - #endif - - #if FAN_COUNT - COPY(job_recovery_info.fanSpeeds, fanSpeeds); - #endif - - #if HAS_LEVELING - job_recovery_info.leveling = planner.leveling_active; - job_recovery_info.fade = ( - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - planner.z_fade_height - #else - 0 - #endif - ); - #endif - - // Commands in the queue - job_recovery_info.cmd_queue_index_r = cmd_queue_index_r; - job_recovery_info.commands_in_queue = commands_in_queue; - COPY(job_recovery_info.command_queue, command_queue); - - // Elapsed print job time - job_recovery_info.print_job_elapsed = print_job_timer.duration(); - - // SD file position - card.getAbsFilename(job_recovery_info.sd_filename); - job_recovery_info.sdpos = card.getIndex(); - - #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) - SERIAL_PROTOCOLLNPGM("Saving..."); - debug_print_job_recovery(false); - #endif - - card.openJobRecoveryFile(false); - (void)card.saveJobRecoveryInfo(); - - // If power-loss pin was triggered, write just once then kill - #if PIN_EXISTS(POWER_LOSS) - if (READ(POWER_LOSS_PIN) == POWER_LOSS_STATE) kill(MSG_POWER_LOSS_RECOVERY); - #endif - } -} - -#endif // POWER_LOSS_RECOVERY diff --git a/Marlin/power_loss_recovery.h b/Marlin/power_loss_recovery.h deleted file mode 100644 index 5f25d2c..0000000 --- a/Marlin/power_loss_recovery.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * power_loss_recovery.h - Resume an SD print after power-loss - */ - -#ifndef _POWER_LOSS_RECOVERY_H_ -#define _POWER_LOSS_RECOVERY_H_ - -#include "cardreader.h" -#include "types.h" -#include "MarlinConfig.h" - -#define SAVE_INFO_INTERVAL_MS 0 -//#define SAVE_EACH_CMD_MODE -//#define DEBUG_POWER_LOSS_RECOVERY - -typedef struct { - uint8_t valid_head; - - // Machine state - float current_position[NUM_AXIS], feedrate; - - #if HOTENDS > 1 - uint8_t active_hotend; - #endif - - int16_t target_temperature[HOTENDS]; - - #if HAS_HEATED_BED - int16_t target_temperature_bed; - #endif - - #if FAN_COUNT - int16_t fanSpeeds[FAN_COUNT]; - #endif - - #if HAS_LEVELING - bool leveling; - float fade; - #endif - - // Command queue - uint8_t cmd_queue_index_r, commands_in_queue; - char command_queue[BUFSIZE][MAX_CMD_SIZE]; - - // SD Filename and position - char sd_filename[MAXPATHNAMELENGTH]; - uint32_t sdpos; - - // Job elapsed time - millis_t print_job_elapsed; - - uint8_t valid_foot; -} job_recovery_info_t; - -extern job_recovery_info_t job_recovery_info; - -enum JobRecoveryPhase : unsigned char { - JOB_RECOVERY_IDLE, - JOB_RECOVERY_MAYBE, - JOB_RECOVERY_YES, - JOB_RECOVERY_DONE -}; -extern JobRecoveryPhase job_recovery_phase; - -#if HAS_LEVELING - #define APPEND_CMD_COUNT 9 -#else - #define APPEND_CMD_COUNT 7 -#endif - -extern char job_recovery_commands[BUFSIZE + APPEND_CMD_COUNT][MAX_CMD_SIZE]; -extern uint8_t job_recovery_commands_count; - -void check_print_job_recovery(); -void save_job_recovery_info(); - -#endif // _POWER_LOSS_RECOVERY_H_ diff --git a/Marlin/runout.cpp b/Marlin/runout.cpp deleted file mode 100644 index 44ca694..0000000 --- a/Marlin/runout.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * runout.cpp - Runout sensor support - */ - -#include "MarlinConfig.h" - -#if ENABLED(FILAMENT_RUNOUT_SENSOR) - -#include "runout.h" - -FilamentRunoutSensor runout; - -bool FilamentRunoutSensor::filament_ran_out; // = false -uint8_t FilamentRunoutSensor::runout_count; // = 0 - -void FilamentRunoutSensor::setup() { - - #if ENABLED(FIL_RUNOUT_PULLUP) - #define INIT_RUNOUT_PIN(P) SET_INPUT_PULLUP(P) - #else - #define INIT_RUNOUT_PIN(P) SET_INPUT(P) - #endif - - INIT_RUNOUT_PIN(FIL_RUNOUT_PIN); - #if NUM_RUNOUT_SENSORS > 1 - INIT_RUNOUT_PIN(FIL_RUNOUT2_PIN); - #if NUM_RUNOUT_SENSORS > 2 - INIT_RUNOUT_PIN(FIL_RUNOUT3_PIN); - #if NUM_RUNOUT_SENSORS > 3 - INIT_RUNOUT_PIN(FIL_RUNOUT4_PIN); - #if NUM_RUNOUT_SENSORS > 4 - INIT_RUNOUT_PIN(FIL_RUNOUT5_PIN); - #endif - #endif - #endif - #endif -} - -#endif // FILAMENT_RUNOUT_SENSOR diff --git a/Marlin/runout.h b/Marlin/runout.h deleted file mode 100644 index 0bfda72..0000000 --- a/Marlin/runout.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * runout.h - Runout sensor support - */ - -#ifndef _RUNOUT_H_ -#define _RUNOUT_H_ - -#include "cardreader.h" -#include "printcounter.h" -#include "stepper.h" -#include "Marlin.h" - -#include "MarlinConfig.h" - -#define FIL_RUNOUT_THRESHOLD 5 - -class FilamentRunoutSensor { - public: - FilamentRunoutSensor() {} - - static void setup(); - - FORCE_INLINE static void reset() { runout_count = 0; filament_ran_out = false; } - - FORCE_INLINE static void run() { - if ((IS_SD_PRINTING() || print_job_timer.isRunning()) && check() && !filament_ran_out) { - filament_ran_out = true; - enqueue_and_echo_commands_P(PSTR(FILAMENT_RUNOUT_SCRIPT)); - planner.synchronize(); - } - } - private: - static bool filament_ran_out; - static uint8_t runout_count; - - FORCE_INLINE static bool check() { - #if NUM_RUNOUT_SENSORS < 2 - // A single sensor applying to all extruders - const bool is_out = READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING; - #else - // Read the sensor for the active extruder - bool is_out; - switch (active_extruder) { - case 0: is_out = READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_INVERTING; break; - case 1: is_out = READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT_INVERTING; break; - #if NUM_RUNOUT_SENSORS > 2 - case 2: is_out = READ(FIL_RUNOUT3_PIN) == FIL_RUNOUT_INVERTING; break; - #if NUM_RUNOUT_SENSORS > 3 - case 3: is_out = READ(FIL_RUNOUT4_PIN) == FIL_RUNOUT_INVERTING; break; - #if NUM_RUNOUT_SENSORS > 4 - case 4: is_out = READ(FIL_RUNOUT5_PIN) == FIL_RUNOUT_INVERTING; break; - #endif - #endif - #endif - } - #endif - return (is_out ? ++runout_count : (runout_count = 0)) > FIL_RUNOUT_THRESHOLD; - } -}; - -extern FilamentRunoutSensor runout; - -#endif // _RUNOUT_H_ diff --git a/Marlin/status_screen_DOGM.h b/Marlin/status_screen_DOGM.h deleted file mode 100644 index 9867880..0000000 --- a/Marlin/status_screen_DOGM.h +++ /dev/null @@ -1,493 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/** - * status_screen_DOGM.h - * - * Standard Status Screen for Graphical Display - */ - -#ifndef _STATUS_SCREEN_DOGM_H_ -#define _STATUS_SCREEN_DOGM_H_ - -FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t x, const uint8_t y) { - const char * const str = itostr3(temp); - u8g.setPrintPos(x - (str[0] != ' ' ? 0 : str[1] != ' ' ? 1 : 2) * DOG_CHAR_WIDTH / 2, y); - lcd_print(str); - lcd_printPGM(PSTR(LCD_STR_DEGREE " ")); -} - -#ifndef HEAT_INDICATOR_X - #define HEAT_INDICATOR_X 8 -#endif - -FORCE_INLINE void _draw_heater_status(const uint8_t x, const int8_t heater, const bool blink) { - #if !HEATER_IDLE_HANDLER - UNUSED(blink); - #endif - - #if HAS_HEATED_BED - const bool isBed = heater < 0; - #else - constexpr bool isBed = false; - #endif - - if (PAGE_UNDER(7)) { - #if HEATER_IDLE_HANDLER - const bool is_idle = ( - #if HAS_HEATED_BED - isBed ? thermalManager.is_bed_idle() : - #endif - thermalManager.is_heater_idle(heater) - ); - - if (blink || !is_idle) - #endif - _draw_centered_temp(0.5f + ( - #if HAS_HEATED_BED - isBed ? thermalManager.degTargetBed() : - #endif - thermalManager.degTargetHotend(heater) - ), x, 7 - ); - } - - if (PAGE_CONTAINS(21, 28)) { - _draw_centered_temp(0.5f + ( - #if HAS_HEATED_BED - isBed ? thermalManager.degBed() : - #endif - thermalManager.degHotend(heater) - ), x, 28 - ); - - if (PAGE_CONTAINS(17, 20)) { - const uint8_t h = isBed ? 7 : HEAT_INDICATOR_X, - y = isBed ? 18 : 17; - if ( - #if HAS_HEATED_BED - isBed ? thermalManager.isHeatingBed() : - #endif - thermalManager.isHeatingHotend(heater) - ) { - u8g.setColorIndex(0); // white on black - u8g.drawBox(x + h, y, 2, 2); - u8g.setColorIndex(1); // black on white - } - else - u8g.drawBox(x + h, y, 2, 2); - } - } -} - -// -// Before homing, blink '123' <-> '???'. -// Homed but unknown... '123' <-> ' '. -// Homed and known, display constantly. -// -FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) { - if (blink) - lcd_print(value); - else { - if (!TEST(axis_homed, axis)) - while (const char c = *value++) lcd_print(c <= '.' ? c : '?'); - else { - #if DISABLED(HOME_AFTER_DEACTIVATE) && DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) - if (!TEST(axis_known_position, axis)) - lcd_printPGM(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); - else - #endif - lcd_print(value); - } - } -} - -inline void lcd_implementation_status_message(const bool blink) { - #if ENABLED(STATUS_MESSAGE_SCROLLING) - static bool last_blink = false; - - // Get the UTF8 character count of the string - uint8_t slen = utf8_strlen(lcd_status_message); - - // If the string fits into the LCD, just print it and do not scroll it - if (slen <= LCD_WIDTH) { - - // The string isn't scrolling and may not fill the screen - lcd_print_utf(lcd_status_message); - - // Fill the rest with spaces - while (slen < LCD_WIDTH) { - u8g.print(' '); - ++slen; - } - } - else { - // String is larger than the available space in screen. - - // Get a pointer to the next valid UTF8 character - const char *stat = lcd_status_message + status_scroll_offset; - - // Get the string remaining length - const uint8_t rlen = utf8_strlen(stat); - - // If we have enough characters to display - if (rlen >= LCD_WIDTH) { - // The remaining string fills the screen - Print it - lcd_print_utf(stat, LCD_WIDTH); - } - else { - // The remaining string does not completely fill the screen - lcd_print_utf(stat, LCD_WIDTH); // The string leaves space - uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters - - u8g.print('.'); // Always at 1+ spaces left, draw a dot - if (--chars) { // Draw a second dot if there's space - u8g.print('.'); - if (--chars) // Print a second copy of the message - lcd_print_utf(lcd_status_message, LCD_WIDTH - (rlen + 2)); - } - } - if (last_blink != blink) { - last_blink = blink; - - // Adjust by complete UTF8 characters - if (status_scroll_offset < slen) { - status_scroll_offset++; - while (!START_OF_UTF8_CHAR(lcd_status_message[status_scroll_offset])) - status_scroll_offset++; - } - else - status_scroll_offset = 0; - } - } - #else - UNUSED(blink); - - // Get the UTF8 character count of the string - uint8_t slen = utf8_strlen(lcd_status_message); - - // Just print the string to the LCD - lcd_print_utf(lcd_status_message, LCD_WIDTH); - - // Fill the rest with spaces if there are missing spaces - while (slen < LCD_WIDTH) { - u8g.print(' '); - ++slen; - } - #endif -} - -static void lcd_implementation_status_screen() { - - const bool blink = lcd_blink(); - - #if FAN_ANIM_FRAMES > 2 - static bool old_blink; - static uint8_t fan_frame; - if (old_blink != blink) { - old_blink = blink; - if (!fanSpeeds[0] || ++fan_frame >= FAN_ANIM_FRAMES) fan_frame = 0; - } - #endif - - // Status Menu Font - lcd_setFont(FONT_STATUSMENU); - - // - // Fan Animation - // - // Draws the whole heading image as a B/W bitmap rather than - // drawing the elements separately. - // This was done as an optimization, as it was slower to draw - // multiple parts compared to a single bitmap. - // - // The bitmap: - // - May be offset in X - // - Includes all nozzle(s), bed(s), and the fan. - // - // TODO: - // - // - Only draw the whole header on the first - // entry to the status screen. Nozzle, bed, and - // fan outline bits don't change. - // - if (PAGE_UNDER(STATUS_SCREENHEIGHT + 1)) { - - u8g.drawBitmapP( - STATUS_SCREEN_X, STATUS_SCREEN_Y, - (STATUS_SCREENWIDTH + 7) / 8, STATUS_SCREENHEIGHT, - #if HAS_FAN0 - #if FAN_ANIM_FRAMES > 2 - fan_frame == 1 ? status_screen1_bmp : - fan_frame == 2 ? status_screen2_bmp : - #if FAN_ANIM_FRAMES > 3 - fan_frame == 3 ? status_screen3_bmp : - #endif - #else - blink && fanSpeeds[0] ? status_screen1_bmp : - #endif - #endif - status_screen0_bmp - ); - - } - - // - // Temperature Graphics and Info - // - - if (PAGE_UNDER(28)) { - // Extruders - HOTEND_LOOP() _draw_heater_status(STATUS_SCREEN_HOTEND_TEXT_X(e), e, blink); - - // Heated bed - #if HOTENDS < 4 && HAS_HEATED_BED - _draw_heater_status(STATUS_SCREEN_BED_TEXT_X, -1, blink); - #endif - - #if HAS_FAN0 - if (PAGE_CONTAINS(STATUS_SCREEN_FAN_TEXT_Y - 7, STATUS_SCREEN_FAN_TEXT_Y)) { - // Fan - const int16_t per = ((fanSpeeds[0] + 1) * 100) / 256; - if (per) { - u8g.setPrintPos(STATUS_SCREEN_FAN_TEXT_X, STATUS_SCREEN_FAN_TEXT_Y); - lcd_print(itostr3(per)); - u8g.print('%'); - } - } - #endif - } - - #if ENABLED(SDSUPPORT) - // - // SD Card Symbol - // - if (card.isFileOpen() && PAGE_CONTAINS(42 - (TALL_FONT_CORRECTION), 51 - (TALL_FONT_CORRECTION))) { - // Upper box - u8g.drawBox(42, 42 - (TALL_FONT_CORRECTION), 8, 7); // 42-48 (or 41-47) - // Right edge - u8g.drawBox(50, 44 - (TALL_FONT_CORRECTION), 2, 5); // 44-48 (or 43-47) - // Bottom hollow box - u8g.drawFrame(42, 49 - (TALL_FONT_CORRECTION), 10, 4); // 49-52 (or 48-51) - // Corner pixel - u8g.drawPixel(50, 43 - (TALL_FONT_CORRECTION)); // 43 (or 42) - } - #endif // SDSUPPORT - - #if ENABLED(SDSUPPORT) || ENABLED(LCD_SET_PROGRESS_MANUALLY) - // - // Progress bar frame - // - #define PROGRESS_BAR_X 54 - #define PROGRESS_BAR_WIDTH (LCD_PIXEL_WIDTH - PROGRESS_BAR_X) - - if (PAGE_CONTAINS(49, 52 - (TALL_FONT_CORRECTION))) // 49-52 (or 49-51) - u8g.drawFrame( - PROGRESS_BAR_X, 49, - PROGRESS_BAR_WIDTH, 4 - (TALL_FONT_CORRECTION) - ); - - #if DISABLED(LCD_SET_PROGRESS_MANUALLY) - const uint8_t progress_bar_percent = card.percentDone(); - #endif - - if (progress_bar_percent > 1) { - - // - // Progress bar solid part - // - - if (PAGE_CONTAINS(50, 51 - (TALL_FONT_CORRECTION))) // 50-51 (or just 50) - u8g.drawBox( - PROGRESS_BAR_X + 1, 50, - (uint16_t)((PROGRESS_BAR_WIDTH - 2) * progress_bar_percent * 0.01), 2 - (TALL_FONT_CORRECTION) - ); - - // - // SD Percent Complete - // - - #if ENABLED(DOGM_SD_PERCENT) - if (PAGE_CONTAINS(41, 48)) { - // Percent complete - u8g.setPrintPos(55, 48); - u8g.print(itostr3(progress_bar_percent)); - u8g.print('%'); - } - #endif - } - - // - // Elapsed Time - // - - #if DISABLED(DOGM_SD_PERCENT) - #define SD_DURATION_X (PROGRESS_BAR_X + (PROGRESS_BAR_WIDTH / 2) - len * (DOG_CHAR_WIDTH / 2)) - #else - #define SD_DURATION_X (LCD_PIXEL_WIDTH - len * DOG_CHAR_WIDTH) - #endif - - if (PAGE_CONTAINS(41, 48)) { - char buffer[10]; - duration_t elapsed = print_job_timer.duration(); - bool has_days = (elapsed.value >= 60*60*24L); - uint8_t len = elapsed.toDigital(buffer, has_days); - u8g.setPrintPos(SD_DURATION_X, 48); - lcd_print(buffer); - } - - #endif // SDSUPPORT || LCD_SET_PROGRESS_MANUALLY - - // - // XYZ Coordinates - // - - #define XYZ_BASELINE (30 + INFO_FONT_HEIGHT) - - #define X_LABEL_POS 3 - #define X_VALUE_POS 11 - #define XYZ_SPACING 40 - - #if ENABLED(XYZ_HOLLOW_FRAME) - #define XYZ_FRAME_TOP 29 - #define XYZ_FRAME_HEIGHT INFO_FONT_HEIGHT + 3 - #else - #define XYZ_FRAME_TOP 30 - #define XYZ_FRAME_HEIGHT INFO_FONT_HEIGHT + 1 - #endif - - static char xstring[5], ystring[5], zstring[7]; - #if ENABLED(FILAMENT_LCD_DISPLAY) - static char wstring[5], mstring[4]; - #endif - - // At the first page, regenerate the XYZ strings - if (page.page == 0) { - strcpy(xstring, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS]))); - strcpy(ystring, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS]))); - strcpy(zstring, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS]))); - #if ENABLED(FILAMENT_LCD_DISPLAY) - strcpy(wstring, ftostr12ns(filament_width_meas)); - strcpy(mstring, itostr3(100.0 * ( - parser.volumetric_enabled - ? planner.volumetric_area_nominal / planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] - : planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] - ) - )); - #endif - } - - if (PAGE_CONTAINS(XYZ_FRAME_TOP, XYZ_FRAME_TOP + XYZ_FRAME_HEIGHT - 1)) { - - #if ENABLED(XYZ_HOLLOW_FRAME) - u8g.drawFrame(0, XYZ_FRAME_TOP, LCD_PIXEL_WIDTH, XYZ_FRAME_HEIGHT); // 8: 29-40 7: 29-39 - #else - u8g.drawBox(0, XYZ_FRAME_TOP, LCD_PIXEL_WIDTH, XYZ_FRAME_HEIGHT); // 8: 30-39 7: 30-37 - #endif - - if (PAGE_CONTAINS(XYZ_BASELINE - (INFO_FONT_HEIGHT - 1), XYZ_BASELINE)) { - - #if DISABLED(XYZ_HOLLOW_FRAME) - u8g.setColorIndex(0); // white on black - #endif - - u8g.setPrintPos(0 * XYZ_SPACING + X_LABEL_POS, XYZ_BASELINE); - lcd_printPGM(PSTR(MSG_X)); - u8g.setPrintPos(0 * XYZ_SPACING + X_VALUE_POS, XYZ_BASELINE); - _draw_axis_value(X_AXIS, xstring, blink); - - u8g.setPrintPos(1 * XYZ_SPACING + X_LABEL_POS, XYZ_BASELINE); - lcd_printPGM(PSTR(MSG_Y)); - u8g.setPrintPos(1 * XYZ_SPACING + X_VALUE_POS, XYZ_BASELINE); - _draw_axis_value(Y_AXIS, ystring, blink); - - u8g.setPrintPos(2 * XYZ_SPACING + X_LABEL_POS, XYZ_BASELINE); - lcd_printPGM(PSTR(MSG_Z)); - u8g.setPrintPos(2 * XYZ_SPACING + X_VALUE_POS, XYZ_BASELINE); - _draw_axis_value(Z_AXIS, zstring, blink); - - #if DISABLED(XYZ_HOLLOW_FRAME) - u8g.setColorIndex(1); // black on white - #endif - } - } - - // - // Feedrate - // - - if (PAGE_CONTAINS(51 - INFO_FONT_HEIGHT, 49)) { - lcd_setFont(FONT_MENU); - u8g.setPrintPos(3, 50); - lcd_print(LCD_STR_FEEDRATE[0]); - - lcd_setFont(FONT_STATUSMENU); - u8g.setPrintPos(12, 50); - lcd_print(itostr3(feedrate_percentage)); - u8g.print('%'); - - // - // Filament sensor display if SD is disabled - // - #if ENABLED(FILAMENT_LCD_DISPLAY) && DISABLED(SDSUPPORT) - u8g.setPrintPos(56, 50); - lcd_print(wstring); - u8g.setPrintPos(102, 50); - lcd_print(mstring); - u8g.print('%'); - lcd_setFont(FONT_MENU); - u8g.setPrintPos(47, 50); - lcd_print(LCD_STR_FILAM_DIA); - u8g.setPrintPos(93, 50); - lcd_print(LCD_STR_FILAM_MUL); - #endif - } - - // - // Status line - // - - #define STATUS_BASELINE (55 + INFO_FONT_HEIGHT) - - if (PAGE_CONTAINS(STATUS_BASELINE - (INFO_FONT_HEIGHT - 1), STATUS_BASELINE)) { - u8g.setPrintPos(0, STATUS_BASELINE); - - #if ENABLED(FILAMENT_LCD_DISPLAY) && ENABLED(SDSUPPORT) - if (PENDING(millis(), previous_lcd_status_ms + 5000UL)) { //Display both Status message line and Filament display on the last line - lcd_implementation_status_message(blink); - } - else { - lcd_printPGM(PSTR(LCD_STR_FILAM_DIA)); - u8g.print(':'); - lcd_print(wstring); - lcd_printPGM(PSTR(" " LCD_STR_FILAM_MUL)); - u8g.print(':'); - lcd_print(mstring); - u8g.print('%'); - } - #else - lcd_implementation_status_message(blink); - #endif - } -} - -#endif // _STATUS_SCREEN_DOGM_H_ diff --git a/Marlin/status_screen_lite_ST7920.h b/Marlin/status_screen_lite_ST7920.h deleted file mode 100644 index dcbe065..0000000 --- a/Marlin/status_screen_lite_ST7920.h +++ /dev/null @@ -1,972 +0,0 @@ -/** - * Lightweight Status Screen for the RepRapDiscount Full - * Graphics Smart Controller (ST7920-based 128x64 LCD) - * - * (c) 2017 Aleph Objects, Inc. - * - * The code in this page is free software: you can - * redistribute it and/or modify it under the terms of the GNU - * General Public License (GNU GPL) as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) - * any later version. The code is distributed WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. - * - */ - -/** - * Implementation of a Status Screen for the RepRapDiscount - * Full Graphics Smart Controller using native ST7920 commands - * instead of U8Glib. - * - * This alternative Status Screen makes use of the built-in character - * generation capabilities of the ST7920 to update the Status Screen - * with less SPI traffic and CPU use. In particular: - * - * - The fan and bed animations are handled using custom characters - * that are stored in CGRAM. This allows for the animation to be - * updated by writing a single character to the text-buffer (DDRAM). - * - * - All the information in the Status Screen is text that is written - * to DDRAM, so the work of generating the bitmaps is offloaded to - * the ST7920 rather than being render by U8Glib on the MCU. - * - * - The graphics buffer (GDRAM) is only used for static graphics - * elements (nozzle and feedrate bitmaps) and for the progress - * bar, so updates are sporadic. - */ - -#include "status_screen_lite_ST7920_class.h" - -#include "duration_t.h" - -#define BUFFER_WIDTH 256 -#define BUFFER_HEIGHT 32 - -#define DDRAM_LINE_1 0x00 -#define DDRAM_LINE_2 0x10 -#define DDRAM_LINE_3 0x08 -#define DDRAM_LINE_4 0x18 - -ST7920_Lite_Status_Screen::st7920_state_t ST7920_Lite_Status_Screen::current_bits; - -void ST7920_Lite_Status_Screen::cmd(const uint8_t cmd) { - if (!current_bits.synced || !current_bits.cmd) { - current_bits.synced = true; - current_bits.cmd = true; - sync_cmd(); - } - write_byte(cmd); -} - -void ST7920_Lite_Status_Screen::begin_data() { - if (!current_bits.synced || current_bits.cmd) { - current_bits.synced = true; - current_bits.cmd = false; - sync_dat(); - } -} - -void ST7920_Lite_Status_Screen::write_str(const char *str) { - while (*str) write_byte(*str++); -} - -void ST7920_Lite_Status_Screen::write_str(const char *str, uint8_t len) { - while (*str && len--) write_byte(*str++); -} - -void ST7920_Lite_Status_Screen::write_str_P(const char * const str) { - const char *p_str = (const char *)str; - while (char c = pgm_read_byte_near(p_str++)) write_byte(c); -} - -void ST7920_Lite_Status_Screen::write_str(progmem_str str) { - write_str_P((const char*)str); -} - -void ST7920_Lite_Status_Screen::write_number(const int16_t value, const uint8_t digits/*=3*/) { - char str[7]; - const char *fmt; - switch (digits) { - case 6: fmt = PSTR("%6d"); break; - case 5: fmt = PSTR("%5d"); break; - case 4: fmt = PSTR("%4d"); break; - case 3: fmt = PSTR("%3d"); break; - case 2: fmt = PSTR("%2d"); break; - case 1: fmt = PSTR("%1d"); break; - } - sprintf_P(str, fmt, value); - write_str(str); -} - -void ST7920_Lite_Status_Screen::display_status(const bool display_on, const bool cursor_on, const bool blink_on) { - extended_function_set(false); - cmd(0b00001000 | - (display_on ? 0b0100 : 0) | - (cursor_on ? 0b0010 : 0) | - (blink_on ? 0b0001 : 0) - ); -} - -// Sets the extended and graphics bits simultaneously, regardless of -// the current state. This is a helper function for extended_function_set() -// and graphics() -void ST7920_Lite_Status_Screen::_extended_function_set(const bool extended, const bool graphics) { - cmd( 0b00100000 | - (extended ? 0b00000100 : 0) | - (graphics ? 0b00000010 : 0) - ); - current_bits.extended = extended; - current_bits.graphics = graphics; -} - -void ST7920_Lite_Status_Screen::extended_function_set(const bool extended) { - if (extended != current_bits.extended) - _extended_function_set(extended, current_bits.graphics); -} - -void ST7920_Lite_Status_Screen::graphics(const bool graphics) { - if (graphics != current_bits.graphics) - _extended_function_set(current_bits.extended, graphics); -} - -void ST7920_Lite_Status_Screen::entry_mode_select(const bool ac_increase, const bool shift) { - extended_function_set(false); - cmd(0b00000100 | - (ac_increase ? 0b00000010 : 0) | - (shift ? 0b00000001 : 0) - ); -} - -// Sets the sa bit regardless of the current state. This is a helper -// function for scroll_or_addr_select() -void ST7920_Lite_Status_Screen::_scroll_or_addr_select(const bool sa) { - extended_function_set(true); - cmd(0b00100010 | - (sa ? 0b000001 : 0) - ); - current_bits.sa = sa; -} - -void ST7920_Lite_Status_Screen::scroll_or_addr_select(const bool sa) { - if (sa != current_bits.sa) - _scroll_or_addr_select(sa); -} - -void ST7920_Lite_Status_Screen::set_ddram_address(const uint8_t addr) { - extended_function_set(false); - cmd(0b10000000 | (addr & 0b00111111)); -} - -void ST7920_Lite_Status_Screen::set_cgram_address(const uint8_t addr) { - extended_function_set(false); - cmd(0b01000000 | (addr & 0b00111111)); -} - -void ST7920_Lite_Status_Screen::set_gdram_address(const uint8_t x, const uint8_t y) { - extended_function_set(true); - cmd(0b10000000 | (y & 0b01111111)); - cmd(0b10000000 | (x & 0b00001111)); -} - -void ST7920_Lite_Status_Screen::clear() { - extended_function_set(false); - cmd(0x00000001); - delay(15); //delay for CGRAM clear -} - -void ST7920_Lite_Status_Screen::home() { - extended_function_set(false); - cmd(0x00000010); -} - -/* This fills the entire text buffer with spaces */ -void ST7920_Lite_Status_Screen::clear_ddram() { - set_ddram_address(DDRAM_LINE_1); - begin_data(); - for (uint8_t i = 64; i--;) write_byte(' '); -} - -/* This fills the entire graphics buffer with zeros */ -void ST7920_Lite_Status_Screen::clear_gdram() { - for (uint8_t y = 0; y < BUFFER_HEIGHT; y++) { - set_gdram_address(0, y); - begin_data(); - for (uint8_t i = (BUFFER_WIDTH) / 16; i--;) write_word(0); - } -} - -void ST7920_Lite_Status_Screen::load_cgram_icon(const uint16_t addr, const void *data) { - const uint16_t *p_word = (const uint16_t *)data; - set_cgram_address(addr); - begin_data(); - for (uint8_t i = 16; i--;) - write_word(pgm_read_word_near(p_word++)); -} - -/** - * Draw an icon in GDRAM. Position specified in DDRAM - * coordinates. i.e., X from 1 to 8, Y from 1 to 4. - */ -void ST7920_Lite_Status_Screen::draw_gdram_icon(uint8_t x, uint8_t y, const void *data) { - const uint16_t *p_word = (const uint16_t *)data; - if (y > 2) { // Handle display folding - y -= 2; - x += 8; - } - --x; - --y; - for (int i = 0; i < 16; i++) { - set_gdram_address(x, i + y * 16); - begin_data(); - write_word(pgm_read_word_near(p_word++)); - } -} - -/************************** ICON DEFINITIONS *************************************/ - -#define CGRAM_ICON_1_ADDR 0x00 -#define CGRAM_ICON_2_ADDR 0x10 -#define CGRAM_ICON_3_ADDR 0x20 -#define CGRAM_ICON_4_ADDR 0x30 - -#define CGRAM_ICON_1_WORD 0x00 -#define CGRAM_ICON_2_WORD 0x02 -#define CGRAM_ICON_3_WORD 0x04 -#define CGRAM_ICON_4_WORD 0x06 - -const uint8_t degree_symbol_y_top = 1; -PROGMEM const uint8_t degree_symbol[] = { - 0b00110000, - 0b01001000, - 0b01001000, - 0b00110000, -}; - -const uint16_t nozzle_icon[] PROGMEM = { - 0b0000000000000000, - 0b0000000000000000, - 0b0000111111110000, - 0b0001111111111000, - 0b0001111111111000, - 0b0001111111111000, - 0b0000111111110000, - 0b0000111111110000, - 0b0001111111111000, - 0b0001111111111000, - 0b0001111111111000, - 0b0000011111100000, - 0b0000001111000000, - 0b0000000110000000, - 0b0000000000000000, - 0b0000000000000000 -}; - -const uint16_t bed_icon[] PROGMEM = { - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0111111111111110, - 0b0111111111111110, - 0b0110000000000110, - 0b0000000000000000, - 0b0000000000000000 -}; - -const uint16_t heat1_icon[] PROGMEM = { - 0b0000000000000000, - 0b0010001000100000, - 0b0001000100010000, - 0b0000100010001000, - 0b0000100010001000, - 0b0001000100010000, - 0b0010001000100000, - 0b0010001000100000, - 0b0001000100010000, - 0b0000100010001000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000 -}; - -const uint16_t heat2_icon[] PROGMEM = { - 0b0000000000000000, - 0b0000100010001000, - 0b0000100010001000, - 0b0001000100010000, - 0b0010001000100000, - 0b0010001000100000, - 0b0001000100010000, - 0b0000100010001000, - 0b0000100010001000, - 0b0001000100010000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000, - 0b0000000000000000 -}; - -const uint16_t fan1_icon[] PROGMEM = { - 0b0000000000000000, - 0b0111111111111110, - 0b0111000000001110, - 0b0110001111000110, - 0b0100001111000010, - 0b0100000110000010, - 0b0101100000011010, - 0b0101110110111010, - 0b0101100000011010, - 0b0100000110000010, - 0b0100001111000010, - 0b0110001111000110, - 0b0111000000001110, - 0b0111111111111110, - 0b0000000000000000, - 0b0000000000000000 -}; - -const uint16_t fan2_icon[] PROGMEM = { - 0b0000000000000000, - 0b0111111111111110, - 0b0111000000001110, - 0b0110010000100110, - 0b0100111001110010, - 0b0101111001111010, - 0b0100110000110010, - 0b0100000110000010, - 0b0100110000110010, - 0b0101111001111010, - 0b0100111001110010, - 0b0110010000100110, - 0b0111000000001110, - 0b0111111111111110, - 0b0000000000000000, - 0b0000000000000000 -}; - -const uint16_t feedrate_icon[] PROGMEM = { - 0b0000000000000000, - 0b0111111000000000, - 0b0110000000000000, - 0b0110000000000000, - 0b0110000000000000, - 0b0111111011111000, - 0b0110000011001100, - 0b0110000011001100, - 0b0110000011001100, - 0b0110000011111000, - 0b0000000011001100, - 0b0000000011001100, - 0b0000000011001100, - 0b0000000011001100, - 0b0000000000000000, - 0b0000000000000000 -}; - -/************************** MAIN SCREEN *************************************/ - -// The ST7920 does not have a degree character, but we -// can fake it by writing it to GDRAM. -// This function takes as an argument character positions -// i.e x is [1-16], while the y position is [1-4] -void ST7920_Lite_Status_Screen::draw_degree_symbol(uint8_t x, uint8_t y, bool draw) { - const uint8_t *p_bytes = degree_symbol; - if (y > 2) { - // Handle display folding - y -= 2; - x += 16; - } - x -= 1; - y -= 1; - const bool oddChar = x & 1; - const uint8_t x_word = x >> 1; - const uint8_t y_top = degree_symbol_y_top; - const uint8_t y_bot = y_top + sizeof(degree_symbol)/sizeof(degree_symbol[0]); - for (uint8_t i = y_top; i < y_bot; i++) { - uint8_t byte = pgm_read_byte_near(p_bytes++); - set_gdram_address(x_word,i+y*16); - begin_data(); - if (draw) { - write_byte(oddChar ? 0x00 : byte); - write_byte(oddChar ? byte : 0x00); - } - else - write_word(0x0000); - } -} - -void ST7920_Lite_Status_Screen::draw_static_elements() { - scroll_or_addr_select(0); - - // Load the animated bed and fan icons - load_cgram_icon(CGRAM_ICON_1_ADDR, heat1_icon); - load_cgram_icon(CGRAM_ICON_2_ADDR, heat2_icon); - load_cgram_icon(CGRAM_ICON_3_ADDR, fan1_icon); - load_cgram_icon(CGRAM_ICON_4_ADDR, fan2_icon); - - // Draw the static icons in GDRAM - draw_gdram_icon(1, 1, nozzle_icon); - #if HOTENDS > 1 - draw_gdram_icon(1,2,nozzle_icon); - draw_gdram_icon(1,3,bed_icon); - #else - draw_gdram_icon(1,2,bed_icon); - #endif - draw_gdram_icon(6,2,feedrate_icon); - - // Draw the initial fan icon - draw_fan_icon(false); -} - -/** - * Although this is undocumented, the ST7920 allows the character - * data buffer (DDRAM) to be used in conjunction with the graphics - * bitmap buffer (CGRAM). The contents of the graphics buffer is - * XORed with the data from the character generator. This allows - * us to make the progess bar out of graphical data (the bar) and - * text data (the percentage). - */ -void ST7920_Lite_Status_Screen::draw_progress_bar(const uint8_t value) { - #if HOTENDS == 1 - // If we have only one extruder, draw a long progress bar on the third line - const uint8_t top = 1, // Top in pixels - bottom = 13, // Bottom in pixels - left = 12, // Left edge, in 16-bit words - width = 4; // Width of progress bar, in 16-bit words - #else - const uint8_t top = 16 + 1, - bottom = 16 + 13, - left = 5, - width = 3; - #endif - const uint8_t char_pcnt = 100 / width; // How many percent does each 16-bit word represent? - - // Draw the progress bar as a bitmap in CGRAM - for (uint8_t y = top; y <= bottom; y++) { - set_gdram_address(left, y); - begin_data(); - for (uint8_t x = 0; x < width; x++) { - uint16_t gfx_word = 0x0000; - if ((x + 1) * char_pcnt <= value) - gfx_word = 0xFFFF; // Draw completely filled bytes - else if ((x * char_pcnt) < value) - gfx_word = int(0x8000) >> (value % char_pcnt) * 16 / char_pcnt; // Draw partially filled bytes - - // Draw the frame around the progress bar - if (y == top || y == bottom) - gfx_word = 0xFFFF; // Draw top/bottom border - else if (x == width - 1) - gfx_word |= 0x0001; // Draw right border - else if (x == 0) - gfx_word |= 0x8000; // Draw left border - write_word(gfx_word); - } - } - - // Draw the percentage as text in DDRAM - #if HOTENDS == 1 - set_ddram_address(DDRAM_LINE_3 + 4); - begin_data(); - write_byte(' '); - #else - set_ddram_address(DDRAM_LINE_2 + left); - begin_data(); - #endif - - // Draw centered - if (value > 9) { - write_number(value, 4); - write_str(F("% ")); - } - else { - write_number(value, 3); - write_str(F("% ")); - } -} - -void ST7920_Lite_Status_Screen::draw_fan_icon(const bool whichIcon) { - set_ddram_address(DDRAM_LINE_1 + 5); - begin_data(); - write_word(whichIcon ? CGRAM_ICON_3_WORD : CGRAM_ICON_4_WORD); -} - -void ST7920_Lite_Status_Screen::draw_heat_icon(const bool whichIcon, const bool heating) { - set_ddram_address( - #if HOTENDS == 1 - DDRAM_LINE_2 - #else - DDRAM_LINE_3 - #endif - ); - begin_data(); - if (heating) - write_word(whichIcon ? CGRAM_ICON_1_WORD : CGRAM_ICON_2_WORD); - else { - write_byte(' '); - write_byte(' '); - } -} - -#define FAR(a,b) (((a > b) ? (a-b) : (b-a)) > 2) - -static struct { - bool E1_show_target : 1; - bool E2_show_target : 1; - #if HAS_HEATED_BED - bool bed_show_target : 1; - #endif -} display_state = { - true, true - #if HAS_HEATED_BED - , true - #endif -}; - -void ST7920_Lite_Status_Screen::draw_temps(uint8_t line, const int16_t temp, const int16_t target, bool showTarget, bool targetStateChange) { - switch (line) { - case 1: set_ddram_address(DDRAM_LINE_1 + 1); break; - case 2: set_ddram_address(DDRAM_LINE_2 + 1); break; - case 3: set_ddram_address(DDRAM_LINE_3 + 1); break; - case 4: set_ddram_address(DDRAM_LINE_3 + 1); break; - } - begin_data(); - write_number(temp); - - if (showTarget) { - write_str(F("\x1A")); - write_number(target); - }; - - if (targetStateChange) { - if (!showTarget) write_str(F(" ")); - draw_degree_symbol(6, line, !showTarget); - draw_degree_symbol(10, line, showTarget); - } -} - -void ST7920_Lite_Status_Screen::draw_extruder_1_temp(const int16_t temp, const int16_t target, bool forceUpdate) { - const bool show_target = target && FAR(temp, target); - draw_temps(1, temp, target, show_target, display_state.E1_show_target != show_target || forceUpdate); - display_state.E1_show_target = show_target; -} - -void ST7920_Lite_Status_Screen::draw_extruder_2_temp(const int16_t temp, const int16_t target, bool forceUpdate) { - const bool show_target = target && FAR(temp, target); - draw_temps(2, temp, target, show_target, display_state.E2_show_target != show_target || forceUpdate); - display_state.E2_show_target = show_target; -} - -#if HAS_HEATED_BED - void ST7920_Lite_Status_Screen::draw_bed_temp(const int16_t temp, const int16_t target, bool forceUpdate) { - const bool show_target = target && FAR(temp, target); - draw_temps(2 - #if HOTENDS > 1 - + 1 - #endif - , temp, target, show_target, display_state.bed_show_target != show_target || forceUpdate - ); - display_state.bed_show_target = show_target; - } -#endif - -void ST7920_Lite_Status_Screen::draw_fan_speed(const uint8_t value) { - set_ddram_address(DDRAM_LINE_1 + 6); - begin_data(); - write_number(value, 3); - write_byte('%'); -} - -void ST7920_Lite_Status_Screen::draw_print_time(const duration_t &elapsed) { - #if HOTENDS == 1 - set_ddram_address(DDRAM_LINE_3); - #else - set_ddram_address(DDRAM_LINE_3 + 5); - #endif - char str[7]; - str[elapsed.toDigital(str)] = ' '; - begin_data(); - write_str(str, 6); -} - -void ST7920_Lite_Status_Screen::draw_feedrate_percentage(const uint8_t percentage) { - // We only have enough room for the feedrate when - // we have one extruder - #if HOTENDS == 1 - set_ddram_address(DDRAM_LINE_2 + 6); - begin_data(); - write_number(percentage, 3); - write_byte('%'); - #endif -} - -void ST7920_Lite_Status_Screen::draw_status_message(const char *str) { - set_ddram_address(DDRAM_LINE_4); - begin_data(); - const uint8_t lcd_len = 16; - #if ENABLED(STATUS_MESSAGE_SCROLLING) - - uint8_t slen = utf8_strlen(str); - - // If the string fits into the LCD, just print it and do not scroll it - if (slen <= lcd_len) { - - // The string isn't scrolling and may not fill the screen - write_str(str); - - // Fill the rest with spaces - while (slen < lcd_len) { - write_byte(' '); - ++slen; - } - } - else { - // String is larger than the available space in screen. - - // Get a pointer to the next valid UTF8 character - const char *stat = str + status_scroll_offset; - - // Get the string remaining length - const uint8_t rlen = utf8_strlen(stat); - - // If we have enough characters to display - if (rlen >= lcd_len) { - // The remaining string fills the screen - Print it - write_str(stat, lcd_len); - } - else { - // The remaining string does not completely fill the screen - write_str(stat); // The string leaves space - uint8_t chars = lcd_len - rlen; // Amount of space left in characters - - write_byte('.'); // Always at 1+ spaces left, draw a dot - if (--chars) { // Draw a second dot if there's space - write_byte('.'); - if (--chars) - write_str(str, chars); // Print a second copy of the message - } - } - - // Adjust by complete UTF8 characters - if (status_scroll_offset < slen) { - status_scroll_offset++; - while (!START_OF_UTF8_CHAR(str[status_scroll_offset])) - status_scroll_offset++; - } - else - status_scroll_offset = 0; - } - #else - // Get the UTF8 character count of the string - uint8_t slen = utf8_strlen(str); - - // Just print the string to the LCD - write_str(str, lcd_len); - - // Fill the rest with spaces if there are missing spaces - while (slen < lcd_len) { - write_byte(' '); - ++slen; - } - #endif -} - -void ST7920_Lite_Status_Screen::draw_position(const float x, const float y, const float z, bool position_known) { - char str[7]; - set_ddram_address(DDRAM_LINE_4); - begin_data(); - - // If position is unknown, flash the labels. - const unsigned char alt_label = position_known ? 0 : (lcd_blink() ? ' ' : 0); - - dtostrf(x, -4, 0, str); - write_byte(alt_label ? alt_label : 'X'); - write_str(str, 4); - - dtostrf(y, -4, 0, str); - write_byte(alt_label ? alt_label : 'Y'); - write_str(str, 4); - - dtostrf(z, -5, 1, str); - write_byte(alt_label ? alt_label : 'Z'); - write_str(str, 5); -} - -bool ST7920_Lite_Status_Screen::indicators_changed() { - // We only add the target temperatures to the checksum - // because the actual temps fluctuate so by updating - // them only during blinks we gain a bit of stability. - const bool blink = lcd_blink(); - const uint8_t feedrate_perc = feedrate_percentage; - const uint8_t fan_speed = ((fanSpeeds[0] + 1) * 100) / 256; - const int16_t extruder_1_target = thermalManager.degTargetHotend(0); - #if HOTENDS > 1 - const int16_t extruder_2_target = thermalManager.degTargetHotend(1); - #endif - #if HAS_HEATED_BED - const int16_t bed_target = thermalManager.degTargetBed(); - #endif - static uint16_t last_checksum = 0; - const uint16_t checksum = blink ^ feedrate_perc ^ fan_speed ^ extruder_1_target - #if HOTENDS > 1 - ^ extruder_2_target - #endif - #if HAS_HEATED_BED - ^ bed_target - #endif - ; - if (last_checksum == checksum) return false; - last_checksum = checksum; - return true; -} - -void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) { - if (forceUpdate || indicators_changed()) { - const bool blink = lcd_blink(); - const duration_t elapsed = print_job_timer.duration(); - const uint8_t feedrate_perc = feedrate_percentage; - const uint8_t fan_speed = ((fanSpeeds[0] + 1) * 100) / 256; - const int16_t extruder_1_temp = thermalManager.degHotend(0), - extruder_1_target = thermalManager.degTargetHotend(0); - #if HOTENDS > 1 - const int16_t extruder_2_temp = thermalManager.degHotend(1), - extruder_2_target = thermalManager.degTargetHotend(1); - #endif - #if HAS_HEATED_BED - const int16_t bed_temp = thermalManager.degBed(), - bed_target = thermalManager.degTargetBed(); - #endif - - draw_extruder_1_temp(extruder_1_temp, extruder_1_target, forceUpdate); - #if HOTENDS > 1 - draw_extruder_2_temp(extruder_2_temp, extruder_2_target, forceUpdate); - #endif - #if HAS_HEATED_BED - draw_bed_temp(bed_temp, bed_target, forceUpdate); - #endif - draw_fan_speed(fan_speed); - draw_print_time(elapsed); - draw_feedrate_percentage(feedrate_perc); - - // Update the fan and bed animations - if (fan_speed > 0) draw_fan_icon(blink); - #if HAS_HEATED_BED - if (bed_target > 0) - draw_heat_icon(blink, true); - else - draw_heat_icon(false, false); - #endif - } -} - -bool ST7920_Lite_Status_Screen::position_changed() { - const float x_pos = current_position[X_AXIS], - y_pos = current_position[Y_AXIS], - z_pos = current_position[Z_AXIS]; - const uint8_t checksum = uint8_t(x_pos) ^ uint8_t(y_pos) ^ uint8_t(z_pos); - - static uint8_t last_checksum = 0; - if (last_checksum == checksum) return false; - last_checksum = checksum; - return true; -} - -bool ST7920_Lite_Status_Screen::status_changed() { - uint8_t checksum = 0; - for (const char *p = lcd_status_message; *p; p++) checksum ^= *p; - static uint8_t last_checksum = 0; - if (last_checksum == checksum) return false; - last_checksum = checksum; - return true; -} - -bool ST7920_Lite_Status_Screen::blink_changed() { - static uint8_t last_blink = 0; - const bool blink = lcd_blink(); - if (last_blink == blink) return false; - last_blink = blink; - return true; -} - -#ifndef STATUS_EXPIRE_SECONDS - #define STATUS_EXPIRE_SECONDS 20 -#endif - -void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) { - - #if STATUS_EXPIRE_SECONDS - static uint8_t countdown = 0; - #endif - - /** - * There is only enough room in the display for either the - * status message or the position, not both, so we choose - * one or another. Whenever the status message changes, - * we show it for a number of consecutive seconds, but - * then go back to showing the position as soon as the - * head moves, i.e: - * - * countdown > 1 -- Show status - * countdown = 1 -- Show status, until movement - * countdown = 0 -- Show position - * - * If STATUS_EXPIRE_SECONDS is zero, the position display - * will be disabled and only the status will be shown. - */ - if (forceUpdate || status_changed()) { - #if ENABLED(STATUS_MESSAGE_SCROLLING) - status_scroll_offset = 0; - #endif - #if STATUS_EXPIRE_SECONDS - countdown = lcd_status_message[0] ? STATUS_EXPIRE_SECONDS : 0; - #endif - draw_status_message(lcd_status_message); - blink_changed(); // Clear changed flag - } - #if !STATUS_EXPIRE_SECONDS - #if ENABLED(STATUS_MESSAGE_SCROLLING) - else - draw_status_message(lcd_status_message); - #endif - #else - else if (countdown > 1 && blink_changed()) { - countdown--; - #if ENABLED(STATUS_MESSAGE_SCROLLING) - draw_status_message(lcd_status_message); - #endif - } - else if (countdown > 0 && blink_changed()) { - if (position_changed()) { - countdown--; - forceUpdate = true; - } - #if ENABLED(STATUS_MESSAGE_SCROLLING) - draw_status_message(lcd_status_message); - #endif - } - if (countdown == 0 && (forceUpdate || position_changed() || - #if DISABLED(DISABLE_REDUCED_ACCURACY_WARNING) - blink_changed() - #endif - )) { - draw_position( - current_position[X_AXIS], - current_position[Y_AXIS], - current_position[Z_AXIS], - #if ENABLED(DISABLE_REDUCED_ACCURACY_WARNING) - true - #else - all_axes_known() - #endif - ); - } - #endif -} - -void ST7920_Lite_Status_Screen::update_progress(const bool forceUpdate) { - #if ENABLED(LCD_SET_PROGRESS_MANUALLY) || ENABLED(SDSUPPORT) - - #if DISABLED(LCD_SET_PROGRESS_MANUALLY) - uint8_t progress_bar_percent = 0; - #endif - - #if ENABLED(SDSUPPORT) - // Progress bar % comes from SD when actively printing - if (IS_SD_PRINTING()) progress_bar_percent = card.percentDone(); - #endif - - // Since the progress bar involves writing - // quite a few bytes to GDRAM, only do this - // when an update is actually necessary. - - static uint8_t last_progress = 0; - if (!forceUpdate && last_progress == progress_bar_percent) return; - last_progress = progress_bar_percent; - - draw_progress_bar(progress_bar_percent); - - #else - - UNUSED(forceUpdate); - - #endif // LCD_SET_PROGRESS_MANUALLY || SDSUPPORT -} - -void ST7920_Lite_Status_Screen::update(const bool forceUpdate) { - cs(); - update_indicators(forceUpdate); - update_status_or_position(forceUpdate); - update_progress(forceUpdate); - ncs(); -} - -void ST7920_Lite_Status_Screen::reset_state_from_unknown() { - _extended_function_set(true, true); // Do it twice as only one bit - _extended_function_set(true, true); // get set at a time. - _scroll_or_addr_select(false); -} - -void ST7920_Lite_Status_Screen::on_entry() { - cs(); - reset_state_from_unknown(); - clear(); - clear_gdram(); - draw_static_elements(); - update(true); - ncs(); -} - -void ST7920_Lite_Status_Screen::on_exit() { - cs(); - clear(); - _extended_function_set(true, true); // Restore state to what u8g expects. - ncs(); -} - -// This is called prior to the KILL screen to -// clear the screen so we don't end up with a -// garbled display. -void ST7920_Lite_Status_Screen::clear_text_buffer() { - cs(); - reset_state_from_unknown(); - clear(); - _extended_function_set(true, true); // Restore state to what u8g expects. - ncs(); -} - -static void lcd_implementation_status_screen() { - ST7920_Lite_Status_Screen::update(false); -} - -/** - * In order to properly update the lite Status Screen, - * we must know when we have entered and left the - * Status Screen. Since the ultralcd code is not - * set up for doing this, we call this function before - * each update indicating whether the current screen - * is the Status Screen. - * - * This function keeps track of whether we have left or - * entered the Status Screen and calls the on_entry() - * and on_exit() methods for cleanup. - */ -static void lcd_in_status(const bool inStatus) { - static bool lastInStatus = false; - if (lastInStatus == inStatus) return; - if ((lastInStatus = inStatus)) - ST7920_Lite_Status_Screen::on_entry(); - else - ST7920_Lite_Status_Screen::on_exit(); -} diff --git a/Marlin/status_screen_lite_ST7920_class.h b/Marlin/status_screen_lite_ST7920_class.h deleted file mode 100644 index 2897234..0000000 --- a/Marlin/status_screen_lite_ST7920_class.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Lightweight Status Screen for the RepRapDiscount Full - * Graphics Smart Controller (ST7920-based 128x64 LCD) - * - * (c) 2017 Aleph Objects, Inc. - * - * The code in this page is free software: you can - * redistribute it and/or modify it under the terms of the GNU - * General Public License (GNU GPL) as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) - * any later version. The code is distributed WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. - * - */ - -#ifndef STATUS_SCREEN_LITE_ST7920_CLASS_H -#define STATUS_SCREEN_LITE_ST7920_CLASS_H - -#include "macros.h" -#include "duration_t.h" - -typedef const __FlashStringHelper *progmem_str; - -class ST7920_Lite_Status_Screen { - private: - static struct st7920_state_t { - uint8_t synced : 1; // Whether a sync has been sent - uint8_t cmd : 1; // Whether the sync was cmd or data - uint8_t extended : 1; - uint8_t graphics : 1; - uint8_t sa : 1; - } current_bits; - - static void cs(); - static void ncs(); - static void sync_cmd(); - static void sync_dat(); - static void write_byte(const uint8_t w); - - FORCE_INLINE static void write_word(const uint16_t w) { - write_byte((w >> 8) & 0xFF); - write_byte((w >> 0) & 0xFF); - } - - static void cmd(const uint8_t cmd); - static void begin_data(); - - static void write_str(const char *str); - static void write_str(const char *str, const uint8_t len); - static void write_str_P(const char * const str); - static void write_str(progmem_str str); - static void write_number(const int16_t value, const uint8_t digits=3); - - static void _extended_function_set(const bool extended, const bool graphics); - static void _scroll_or_addr_select(const bool sa); - static void reset_state_from_unknown(); - - static void home(); - static void display_status(const bool display_on, const bool cursor_on, const bool blink_on); - static void extended_function_set(const bool extended); - static void graphics(const bool graphics); - static void entry_mode_select(const bool ac_increase, const bool shift); - static void scroll_or_addr_select(const bool sa); - static void set_ddram_address(const uint8_t addr); - static void set_cgram_address(const uint8_t addr); - static void set_gdram_address(const uint8_t x, const uint8_t y); - - static void clear(); - static void clear_ddram(); - static void clear_gdram(); - - static void load_cgram_icon(const uint16_t addr, const void *data); - static void draw_gdram_icon(uint8_t x, uint8_t y, const void *data); - - static uint8_t string_checksum(const char *str); - - protected: - static void draw_degree_symbol(uint8_t x, uint8_t y, bool draw); - static void draw_static_elements(); - static void draw_progress_bar(const uint8_t value); - static void draw_fan_icon(const bool whichIcon); - static void draw_heat_icon(const bool whichIcon, const bool heating); - static void draw_temps(uint8_t line, const int16_t temp, const int16_t target, bool showTarget, bool targetStateChange); - static void draw_extruder_1_temp(const int16_t temp, const int16_t target, bool forceUpdate = false); - static void draw_extruder_2_temp(const int16_t temp, const int16_t target, bool forceUpdate = false); - static void draw_bed_temp(const int16_t temp, const int16_t target, bool forceUpdate = false); - static void draw_fan_speed(const uint8_t value); - static void draw_print_time(const duration_t &elapsed); - static void draw_feedrate_percentage(const uint8_t percentage); - static void draw_status_message(const char *str); - static void draw_position(const float x, const float y, const float z, bool position_known = true); - - static bool indicators_changed(); - static bool position_changed(); - static bool blink_changed(); - static bool status_changed(); - - static void update_indicators(const bool forceUpdate); - static void update_position(const bool forceUpdate, bool resetChecksum); - static void update_status_or_position(bool forceUpdate); - static void update_progress(const bool forceUpdate); - - public: - static void update(const bool forceUpdate); - static void on_entry(); - static void on_exit(); - static void clear_text_buffer(); -}; - -#endif // STATUS_SCREEN_LITE_ST7920_CLASS_H diff --git a/Marlin/status_screen_lite_ST7920_spi.h b/Marlin/status_screen_lite_ST7920_spi.h deleted file mode 100644 index 9c59068..0000000 --- a/Marlin/status_screen_lite_ST7920_spi.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Lightweight Status Screen for the RepRapDiscount Full - * Graphics Smart Controller (ST7920-based 128x64 LCD) - * - * (c) 2017 Aleph Objects, Inc. - * - * The code in this page is free software: you can - * redistribute it and/or modify it under the terms of the GNU - * General Public License (GNU GPL) as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) - * any later version. The code is distributed WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. - * - */ - -#include "status_screen_lite_ST7920_class.h" - -void ST7920_Lite_Status_Screen::cs() { - ST7920_CS(); - current_bits.synced = false; -} - -void ST7920_Lite_Status_Screen::ncs() { - ST7920_NCS(); - current_bits.synced = false; -} - -void ST7920_Lite_Status_Screen::sync_cmd() { - ST7920_SET_CMD(); -} - -void ST7920_Lite_Status_Screen::sync_dat() { - ST7920_SET_DAT(); -} - -void ST7920_Lite_Status_Screen::write_byte(const uint8_t data) { - ST7920_WRITE_BYTE(data); -} diff --git a/Marlin/thermistortable_15.h b/Marlin/thermistortable_15.h deleted file mode 100644 index 8e207cd..0000000 --- a/Marlin/thermistortable_15.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - - // 100k bed thermistor in JGAurora A5. Calibrated by Sam Pinches 21st Jan 2018 using cheap k-type thermocouple inserted into heater block, using TM-902C meter. -const short temptable_15[][2] PROGMEM = { - { OV( 31), 275 }, - { OV( 33), 270 }, - { OV( 35), 260 }, - { OV( 38), 253 }, - { OV( 41), 248 }, - { OV( 48), 239 }, - { OV( 56), 232 }, - { OV( 66), 222 }, - { OV( 78), 212 }, - { OV( 93), 206 }, - { OV( 106), 199 }, - { OV( 118), 191 }, - { OV( 130), 186 }, - { OV( 158), 176 }, - { OV( 187), 167 }, - { OV( 224), 158 }, - { OV( 270), 148 }, - { OV( 321), 137 }, - { OV( 379), 127 }, - { OV( 446), 117 }, - { OV( 518), 106 }, - { OV( 593), 96 }, - { OV( 668), 86 }, - { OV( 739), 76 }, - { OV( 767), 72 }, - { OV( 830), 62 }, - { OV( 902), 48 }, - { OV( 926), 45 }, - { OV( 955), 35 }, - { OV( 966), 30 }, - { OV( 977), 25 }, - { OV( 985), 20 }, - { OV( 993), 15 }, - { OV( 999), 10 }, - { OV(1004), 5 }, - { OV(1008), 0 }, - { OV(1012), -5 }, - { OV(1016), -10 }, - { OV(1020), -15 } -}; diff --git a/Marlin/thermistortable_501.h b/Marlin/thermistortable_501.h deleted file mode 100644 index ac40d11..0000000 --- a/Marlin/thermistortable_501.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -// 100k Zonestar thermistor. Adjusted By Hally -const short temptable_501[][2] PROGMEM = { - {OV( 1), 713}, - {OV( 14), 300}, // Top rating 300C - {OV( 16), 290}, - {OV( 19), 280}, - {OV( 23), 270}, - {OV( 27), 260}, - {OV( 31), 250}, - {OV( 37), 240}, - {OV( 47), 230}, - {OV( 57), 220}, - {OV( 68), 210}, - {OV( 84), 200}, - {OV( 100), 190}, - {OV( 128), 180}, - {OV( 155), 170}, - {OV( 189), 160}, - {OV( 230), 150}, - {OV( 278), 140}, - {OV( 336), 130}, - {OV( 402), 120}, - {OV( 476), 110}, - {OV( 554), 100}, - {OV( 635), 90}, - {OV( 713), 80}, - {OV( 784), 70}, - {OV( 846), 60}, - {OV( 897), 50}, - {OV( 937), 40}, - {OV( 966), 30}, - {OV( 986), 20}, - {OV(1000), 10}, - {OV(1010), 0} -}; diff --git a/Marlin/tmc_util.cpp b/Marlin/tmc_util.cpp deleted file mode 100644 index 2e9ba55..0000000 --- a/Marlin/tmc_util.cpp +++ /dev/null @@ -1,631 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "MarlinConfig.h" - -#if HAS_TRINAMIC - -#include "tmc_util.h" -#include "Marlin.h" -#include "printcounter.h" -#include "duration_t.h" -#include "stepper_indirection.h" - -#if ENABLED(TMC_DEBUG) - #include "planner.h" -#endif - -bool report_tmc_status = false; - -/** - * Check for over temperature or short to ground error flags. - * Report and log warning of overtemperature condition. - * Reduce driver current in a persistent otpw condition. - * Keep track of otpw counter so we don't reduce current on a single instance, - * and so we don't repeatedly report warning before the condition is cleared. - */ -#if ENABLED(MONITOR_DRIVER_STATUS) - struct TMC_driver_data { - uint32_t drv_status; - bool is_otpw; - bool is_ot; - bool is_error; - }; - #if HAS_DRIVER(TMC2130) - static uint32_t get_pwm_scale(TMC2130Stepper &st) { return st.PWM_SCALE(); } - static uint8_t get_status_response(TMC2130Stepper &st) { return st.status_response & 0xF; } - static TMC_driver_data get_driver_data(TMC2130Stepper &st) { - constexpr uint32_t OTPW_bm = 0x4000000UL; - constexpr uint8_t OTPW_bp = 26; - constexpr uint32_t OT_bm = 0x2000000UL; - constexpr uint8_t OT_bp = 25; - constexpr uint8_t DRIVER_ERROR_bm = 0x2UL; - constexpr uint8_t DRIVER_ERROR_bp = 1; - TMC_driver_data data; - data.drv_status = st.DRV_STATUS(); - data.is_otpw = (data.drv_status & OTPW_bm) >> OTPW_bp; - data.is_ot = (data.drv_status & OT_bm) >> OT_bp; - data.is_error = (st.status_response & DRIVER_ERROR_bm) >> DRIVER_ERROR_bp; - return data; - } - #endif - #if HAS_DRIVER(TMC2208) - static uint32_t get_pwm_scale(TMC2208Stepper &st) { return st.pwm_scale_sum(); } - static uint8_t get_status_response(TMC2208Stepper &st) { - uint32_t drv_status = st.DRV_STATUS(); - uint8_t gstat = st.GSTAT(); - uint8_t response = 0; - response |= (drv_status >> (31-3)) & 0b1000; - response |= gstat & 0b11; - return response; - } - static TMC_driver_data get_driver_data(TMC2208Stepper &st) { - constexpr uint32_t OTPW_bm = 0b1ul; - constexpr uint8_t OTPW_bp = 0; - constexpr uint32_t OT_bm = 0b10ul; - constexpr uint8_t OT_bp = 1; - TMC_driver_data data; - data.drv_status = st.DRV_STATUS(); - data.is_otpw = (data.drv_status & OTPW_bm) >> OTPW_bp; - data.is_ot = (data.drv_status & OT_bm) >> OT_bp; - data.is_error = st.drv_err(); - return data; - } - #endif - - template - void monitor_tmc_driver(TMC &st, const TMC_AxisEnum axis, uint8_t &otpw_cnt) { - TMC_driver_data data = get_driver_data(st); - - #if ENABLED(STOP_ON_ERROR) - if (data.is_error) { - SERIAL_EOL(); - _tmc_say_axis(axis); - SERIAL_ECHOLNPGM(" driver error detected:"); - if (data.is_ot) SERIAL_ECHOLNPGM("overtemperature"); - if (st.s2ga()) SERIAL_ECHOLNPGM("short to ground (coil A)"); - if (st.s2gb()) SERIAL_ECHOLNPGM("short to ground (coil B)"); - #if ENABLED(TMC_DEBUG) - tmc_report_all(); - #endif - kill(PSTR("Driver error")); - } - #endif - - // Report if a warning was triggered - if (data.is_otpw && otpw_cnt == 0) { - char timestamp[10]; - duration_t elapsed = print_job_timer.duration(); - const bool has_days = (elapsed.value > 60*60*24L); - (void)elapsed.toDigital(timestamp, has_days); - SERIAL_EOL(); - SERIAL_ECHO(timestamp); - SERIAL_ECHOPGM(": "); - _tmc_say_axis(axis); - SERIAL_ECHOPGM(" driver overtemperature warning! ("); - SERIAL_ECHO(st.getCurrent()); - SERIAL_ECHOLNPGM("mA)"); - } - #if CURRENT_STEP_DOWN > 0 - // Decrease current if is_otpw is true and driver is enabled and there's been more than 4 warnings - if (data.is_otpw && st.isEnabled() && otpw_cnt > 4) { - st.setCurrent(st.getCurrent() - CURRENT_STEP_DOWN, R_SENSE, HOLD_MULTIPLIER); - #if ENABLED(REPORT_CURRENT_CHANGE) - _tmc_say_axis(axis); - SERIAL_ECHOLNPAIR(" current decreased to ", st.getCurrent()); - #endif - } - #endif - - if (data.is_otpw) { - otpw_cnt++; - st.flag_otpw = true; - } - else if (otpw_cnt > 0) otpw_cnt = 0; - - if (report_tmc_status) { - const uint32_t pwm_scale = get_pwm_scale(st); - _tmc_say_axis(axis); - SERIAL_ECHOPAIR(":", pwm_scale); - SERIAL_ECHOPGM(" |0b"); SERIAL_PRINT(get_status_response(st), BIN); - SERIAL_ECHOPGM("| "); - if (data.is_error) SERIAL_CHAR('E'); - else if (data.is_ot) SERIAL_CHAR('O'); - else if (data.is_otpw) SERIAL_CHAR('W'); - else if (otpw_cnt > 0) SERIAL_PRINT(otpw_cnt, DEC); - else if (st.flag_otpw) SERIAL_CHAR('F'); - SERIAL_CHAR('\t'); - } - } - - #define HAS_HW_COMMS(ST) AXIS_DRIVER_TYPE(ST, TMC2130) || (AXIS_DRIVER_TYPE(ST, TMC2208) && defined(ST##_HARDWARE_SERIAL)) - - void monitor_tmc_driver() { - static millis_t next_cOT = 0; - if (ELAPSED(millis(), next_cOT)) { - next_cOT = millis() + 500; - #if HAS_HW_COMMS(X) - static uint8_t x_otpw_cnt = 0; - monitor_tmc_driver(stepperX, TMC_X, x_otpw_cnt); - #endif - #if HAS_HW_COMMS(Y) - static uint8_t y_otpw_cnt = 0; - monitor_tmc_driver(stepperY, TMC_Y, y_otpw_cnt); - #endif - #if HAS_HW_COMMS(Z) - static uint8_t z_otpw_cnt = 0; - monitor_tmc_driver(stepperZ, TMC_Z, z_otpw_cnt); - #endif - #if HAS_HW_COMMS(X2) - static uint8_t x2_otpw_cnt = 0; - monitor_tmc_driver(stepperX2, TMC_X, x2_otpw_cnt); - #endif - #if HAS_HW_COMMS(Y2) - static uint8_t y2_otpw_cnt = 0; - monitor_tmc_driver(stepperY2, TMC_Y, y2_otpw_cnt); - #endif - #if HAS_HW_COMMS(Z2) - static uint8_t z2_otpw_cnt = 0; - monitor_tmc_driver(stepperZ2, TMC_Z, z2_otpw_cnt); - #endif - #if HAS_HW_COMMS(E0) - static uint8_t e0_otpw_cnt = 0; - monitor_tmc_driver(stepperE0, TMC_E0, e0_otpw_cnt); - #endif - #if HAS_HW_COMMS(E1) - static uint8_t e1_otpw_cnt = 0; - monitor_tmc_driver(stepperE1, TMC_E1, e1_otpw_cnt); - #endif - #if HAS_HW_COMMS(E2) - static uint8_t e2_otpw_cnt = 0; - monitor_tmc_driver(stepperE2, TMC_E2, e2_otpw_cnt); - #endif - #if HAS_HW_COMMS(E3) - static uint8_t e3_otpw_cnt = 0; - monitor_tmc_driver(stepperE3, TMC_E3, e3_otpw_cnt); - #endif - #if HAS_HW_COMMS(E4) - static uint8_t e4_otpw_cnt = 0; - monitor_tmc_driver(stepperE4, TMC_E4, e4_otpw_cnt); - #endif - - if (report_tmc_status) SERIAL_EOL(); - } - } - -#endif // MONITOR_DRIVER_STATUS - -void _tmc_say_axis(const TMC_AxisEnum axis) { - static const char ext_X[] PROGMEM = "X", ext_Y[] PROGMEM = "Y", ext_Z[] PROGMEM = "Z", - ext_X2[] PROGMEM = "X2", ext_Y2[] PROGMEM = "Y2", ext_Z2[] PROGMEM = "Z2", - ext_E0[] PROGMEM = "E0", ext_E1[] PROGMEM = "E1", - ext_E2[] PROGMEM = "E2", ext_E3[] PROGMEM = "E3", - ext_E4[] PROGMEM = "E4"; - static const char* const tmc_axes[] PROGMEM = { ext_X, ext_Y, ext_Z, ext_X2, ext_Y2, ext_Z2, ext_E0, ext_E1, ext_E2, ext_E3, ext_E4 }; - serialprintPGM((char*)pgm_read_ptr(&tmc_axes[axis])); -} - -void _tmc_say_current(const TMC_AxisEnum axis, const uint16_t curr) { - _tmc_say_axis(axis); - SERIAL_ECHOLNPAIR(" driver current: ", curr); -} -void _tmc_say_otpw(const TMC_AxisEnum axis, const bool otpw) { - _tmc_say_axis(axis); - SERIAL_ECHOPGM(" temperature prewarn triggered: "); - serialprintPGM(otpw ? PSTR("true") : PSTR("false")); - SERIAL_EOL(); -} -void _tmc_say_otpw_cleared(const TMC_AxisEnum axis) { - _tmc_say_axis(axis); - SERIAL_ECHOLNPGM(" prewarn flag cleared"); -} -void _tmc_say_pwmthrs(const TMC_AxisEnum axis, const uint32_t thrs) { - _tmc_say_axis(axis); - SERIAL_ECHOLNPAIR(" stealthChop max speed: ", thrs); -} -void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) { - _tmc_say_axis(axis); - SERIAL_ECHOPGM(" homing sensitivity: "); - SERIAL_PRINTLN(sgt, DEC); -} - -#if ENABLED(TMC_DEBUG) - - enum TMC_debug_enum : char { - TMC_CODES, - TMC_ENABLED, - TMC_CURRENT, - TMC_RMS_CURRENT, - TMC_MAX_CURRENT, - TMC_IRUN, - TMC_IHOLD, - TMC_CS_ACTUAL, - TMC_PWM_SCALE, - TMC_VSENSE, - TMC_STEALTHCHOP, - TMC_MICROSTEPS, - TMC_TSTEP, - TMC_TPWMTHRS, - TMC_TPWMTHRS_MMS, - TMC_OTPW, - TMC_OTPW_TRIGGERED, - TMC_TOFF, - TMC_TBL, - TMC_HEND, - TMC_HSTRT, - TMC_SGT - }; - enum TMC_drv_status_enum : char { - TMC_DRV_CODES, - TMC_STST, - TMC_OLB, - TMC_OLA, - TMC_S2GB, - TMC_S2GA, - TMC_DRV_OTPW, - TMC_OT, - TMC_STALLGUARD, - TMC_DRV_CS_ACTUAL, - TMC_FSACTIVE, - TMC_SG_RESULT, - TMC_DRV_STATUS_HEX, - TMC_T157, - TMC_T150, - TMC_T143, - TMC_T120, - TMC_STEALTH, - TMC_S2VSB, - TMC_S2VSA - }; - static void drv_status_print_hex(const TMC_AxisEnum axis, const uint32_t drv_status) { - _tmc_say_axis(axis); - SERIAL_ECHOPGM(" = 0x"); - for (int B = 24; B >= 8; B -= 8){ - SERIAL_PRINT((drv_status >> (B + 4)) & 0xF, HEX); - SERIAL_PRINT((drv_status >> B) & 0xF, HEX); - SERIAL_CHAR(':'); - } - SERIAL_PRINT((drv_status >> 4) & 0xF, HEX); - SERIAL_PRINT((drv_status) & 0xF, HEX); - SERIAL_EOL(); - } - - #if HAS_DRIVER(TMC2130) - static void tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) { - switch (i) { - case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break; - case TMC_TSTEP: SERIAL_ECHO(st.TSTEP()); break; - case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break; - case TMC_STEALTHCHOP: serialprintPGM(st.stealthChop() ? PSTR("true") : PSTR("false")); break; - default: break; - } - } - static void tmc_parse_drv_status(TMC2130Stepper &st, const TMC_drv_status_enum i) { - switch (i) { - case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('X'); break; - case TMC_SG_RESULT: SERIAL_PRINT(st.sg_result(), DEC); break; - case TMC_FSACTIVE: if (st.fsactive()) SERIAL_CHAR('X'); break; - default: break; - } - } - #endif - - #if HAS_DRIVER(TMC2208) - static void tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) { - switch (i) { - case TMC_TSTEP: { uint32_t data = 0; st.TSTEP(&data); SERIAL_PROTOCOL(data); break; } - case TMC_PWM_SCALE: SERIAL_PRINT(st.pwm_scale_sum(), DEC); break; - case TMC_STEALTHCHOP: serialprintPGM(st.stealth() ? PSTR("true") : PSTR("false")); break; - case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('X'); break; - case TMC_S2VSB: if (st.s2vsb()) SERIAL_CHAR('X'); break; - default: break; - } - } - static void tmc_parse_drv_status(TMC2208Stepper &st, const TMC_drv_status_enum i) { - switch (i) { - case TMC_T157: if (st.t157()) SERIAL_CHAR('X'); break; - case TMC_T150: if (st.t150()) SERIAL_CHAR('X'); break; - case TMC_T143: if (st.t143()) SERIAL_CHAR('X'); break; - case TMC_T120: if (st.t120()) SERIAL_CHAR('X'); break; - default: break; - } - } - #endif - - template - static void tmc_status(TMC &st, const TMC_AxisEnum axis, const TMC_debug_enum i, const float spmm) { - SERIAL_ECHO('\t'); - switch (i) { - case TMC_CODES: _tmc_say_axis(axis); break; - case TMC_ENABLED: serialprintPGM(st.isEnabled() ? PSTR("true") : PSTR("false")); break; - case TMC_CURRENT: SERIAL_ECHO(st.getCurrent()); break; - case TMC_RMS_CURRENT: SERIAL_PROTOCOL(st.rms_current()); break; - case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break; - case TMC_IRUN: - SERIAL_PRINT(st.irun(), DEC); - SERIAL_ECHOPGM("/31"); - break; - case TMC_IHOLD: - SERIAL_PRINT(st.ihold(), DEC); - SERIAL_ECHOPGM("/31"); - break; - case TMC_CS_ACTUAL: - SERIAL_PRINT(st.cs_actual(), DEC); - SERIAL_ECHOPGM("/31"); - break; - - case TMC_VSENSE: serialprintPGM(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); break; - - case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break; - case TMC_TPWMTHRS: { - uint32_t tpwmthrs_val = st.TPWMTHRS(); - SERIAL_ECHO(tpwmthrs_val); - } - break; - case TMC_TPWMTHRS_MMS: { - uint32_t tpwmthrs_val = st.TPWMTHRS(); - if (tpwmthrs_val) - SERIAL_ECHO(12650000UL * st.microsteps() / (256 * tpwmthrs_val * spmm)); - else - SERIAL_CHAR('-'); - } - break; - case TMC_OTPW: serialprintPGM(st.otpw() ? PSTR("true") : PSTR("false")); break; - case TMC_OTPW_TRIGGERED: serialprintPGM(st.getOTPW() ? PSTR("true") : PSTR("false")); break; - case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break; - case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break; - case TMC_HEND: SERIAL_PRINT(st.hysteresis_end(), DEC); break; - case TMC_HSTRT: SERIAL_PRINT(st.hysteresis_start(), DEC); break; - default: tmc_status(st, i); break; - } - } - - template - static void tmc_parse_drv_status(TMC &st, const TMC_AxisEnum axis, const TMC_drv_status_enum i) { - SERIAL_CHAR('\t'); - switch (i) { - case TMC_DRV_CODES: _tmc_say_axis(axis); break; - case TMC_STST: if (st.stst()) SERIAL_CHAR('X'); break; - case TMC_OLB: if (st.olb()) SERIAL_CHAR('X'); break; - case TMC_OLA: if (st.ola()) SERIAL_CHAR('X'); break; - case TMC_S2GB: if (st.s2gb()) SERIAL_CHAR('X'); break; - case TMC_S2GA: if (st.s2ga()) SERIAL_CHAR('X'); break; - case TMC_DRV_OTPW: if (st.otpw()) SERIAL_CHAR('X'); break; - case TMC_OT: if (st.ot()) SERIAL_CHAR('X'); break; - case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break; - case TMC_DRV_STATUS_HEX:drv_status_print_hex(axis, st.DRV_STATUS()); break; - default: tmc_parse_drv_status(st, i); break; - } - } - - static void tmc_debug_loop(const TMC_debug_enum i) { - #if AXIS_IS_TMC(X) - tmc_status(stepperX, TMC_X, i, planner.axis_steps_per_mm[X_AXIS]); - #endif - #if AXIS_IS_TMC(X2) - tmc_status(stepperX2, TMC_X2, i, planner.axis_steps_per_mm[X_AXIS]); - #endif - - #if AXIS_IS_TMC(Y) - tmc_status(stepperY, TMC_Y, i, planner.axis_steps_per_mm[Y_AXIS]); - #endif - #if AXIS_IS_TMC(Y2) - tmc_status(stepperY2, TMC_Y2, i, planner.axis_steps_per_mm[Y_AXIS]); - #endif - - #if AXIS_IS_TMC(Z) - tmc_status(stepperZ, TMC_Z, i, planner.axis_steps_per_mm[Z_AXIS]); - #endif - #if AXIS_IS_TMC(Z2) - tmc_status(stepperZ2, TMC_Z2, i, planner.axis_steps_per_mm[Z_AXIS]); - #endif - - #if AXIS_IS_TMC(E0) - tmc_status(stepperE0, TMC_E0, i, planner.axis_steps_per_mm[E_AXIS]); - #endif - #if AXIS_IS_TMC(E1) - tmc_status(stepperE1, TMC_E1, i, planner.axis_steps_per_mm[E_AXIS - #if ENABLED(DISTINCT_E_FACTORS) - + 1 - #endif - ]); - #endif - #if AXIS_IS_TMC(E2) - tmc_status(stepperE2, TMC_E2, i, planner.axis_steps_per_mm[E_AXIS - #if ENABLED(DISTINCT_E_FACTORS) - + 2 - #endif - ]); - #endif - #if AXIS_IS_TMC(E3) - tmc_status(stepperE3, TMC_E3, i, planner.axis_steps_per_mm[E_AXIS - #if ENABLED(DISTINCT_E_FACTORS) - + 3 - #endif - ]); - #endif - #if AXIS_IS_TMC(E4) - tmc_status(stepperE4, TMC_E4, i, planner.axis_steps_per_mm[E_AXIS - #if ENABLED(DISTINCT_E_FACTORS) - + 4 - #endif - ]); - #endif - - SERIAL_EOL(); - } - - static void drv_status_loop(const TMC_drv_status_enum i) { - #if AXIS_IS_TMC(X) - tmc_parse_drv_status(stepperX, TMC_X, i); - #endif - #if AXIS_IS_TMC(X2) - tmc_parse_drv_status(stepperX2, TMC_X2, i); - #endif - - #if AXIS_IS_TMC(Y) - tmc_parse_drv_status(stepperY, TMC_Y, i); - #endif - #if AXIS_IS_TMC(Y2) - tmc_parse_drv_status(stepperY2, TMC_Y2, i); - #endif - - #if AXIS_IS_TMC(Z) - tmc_parse_drv_status(stepperZ, TMC_Z, i); - #endif - #if AXIS_IS_TMC(Z2) - tmc_parse_drv_status(stepperZ2, TMC_Z2, i); - #endif - - #if AXIS_IS_TMC(E0) - tmc_parse_drv_status(stepperE0, TMC_E0, i); - #endif - #if AXIS_IS_TMC(E1) - tmc_parse_drv_status(stepperE1, TMC_E1, i); - #endif - #if AXIS_IS_TMC(E2) - tmc_parse_drv_status(stepperE2, TMC_E2, i); - #endif - #if AXIS_IS_TMC(E3) - tmc_parse_drv_status(stepperE3, TMC_E3, i); - #endif - #if AXIS_IS_TMC(E4) - tmc_parse_drv_status(stepperE4, TMC_E4, i); - #endif - - SERIAL_EOL(); - } - - /** - * M122 report functions - */ - void tmc_set_report_status(const bool status) { - if ((report_tmc_status = status)) - SERIAL_ECHOLNPGM("axis:pwm_scale |status_response|"); - } - - void tmc_report_all() { - #define TMC_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_debug_loop(ITEM); }while(0) - #define DRV_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); drv_status_loop(ITEM); }while(0) - TMC_REPORT("\t", TMC_CODES); - TMC_REPORT("Enabled\t", TMC_ENABLED); - TMC_REPORT("Set current", TMC_CURRENT); - TMC_REPORT("RMS current", TMC_RMS_CURRENT); - TMC_REPORT("MAX current", TMC_MAX_CURRENT); - TMC_REPORT("Run current", TMC_IRUN); - TMC_REPORT("Hold current", TMC_IHOLD); - TMC_REPORT("CS actual\t", TMC_CS_ACTUAL); - TMC_REPORT("PWM scale\t", TMC_PWM_SCALE); - TMC_REPORT("vsense\t", TMC_VSENSE); - TMC_REPORT("stealthChop", TMC_STEALTHCHOP); - TMC_REPORT("msteps\t", TMC_MICROSTEPS); - TMC_REPORT("tstep\t", TMC_TSTEP); - TMC_REPORT("pwm\nthreshold\t", TMC_TPWMTHRS); - TMC_REPORT("[mm/s]\t", TMC_TPWMTHRS_MMS); - TMC_REPORT("OT prewarn", TMC_OTPW); - TMC_REPORT("OT prewarn has\n" - "been triggered", TMC_OTPW_TRIGGERED); - TMC_REPORT("off time\t", TMC_TOFF); - TMC_REPORT("blank time", TMC_TBL); - TMC_REPORT("hysteresis\n-end\t", TMC_HEND); - TMC_REPORT("-start\t", TMC_HSTRT); - TMC_REPORT("Stallguard thrs", TMC_SGT); - - DRV_REPORT("DRVSTATUS", TMC_DRV_CODES); - #if HAS_DRIVER(TMC2130) - DRV_REPORT("stallguard\t", TMC_STALLGUARD); - DRV_REPORT("sg_result\t", TMC_SG_RESULT); - DRV_REPORT("fsactive\t", TMC_FSACTIVE); - #endif - DRV_REPORT("stst\t", TMC_STST); - DRV_REPORT("olb\t", TMC_OLB); - DRV_REPORT("ola\t", TMC_OLA); - DRV_REPORT("s2gb\t", TMC_S2GB); - DRV_REPORT("s2ga\t", TMC_S2GA); - DRV_REPORT("otpw\t", TMC_DRV_OTPW); - DRV_REPORT("ot\t", TMC_OT); - #if HAS_DRIVER(TMC2208) - DRV_REPORT("157C\t", TMC_T157); - DRV_REPORT("150C\t", TMC_T150); - DRV_REPORT("143C\t", TMC_T143); - DRV_REPORT("120C\t", TMC_T120); - DRV_REPORT("s2vsa\t", TMC_S2VSA); - DRV_REPORT("s2vsb\t", TMC_S2VSB); - #endif - DRV_REPORT("Driver registers:", TMC_DRV_STATUS_HEX); - SERIAL_EOL(); - } - -#endif // TMC_DEBUG - -#if ENABLED(SENSORLESS_HOMING) - - void tmc_sensorless_homing(TMC2130Stepper &st, const bool enable/*=true*/) { - st.coolstep_min_speed(enable ? 1024UL * 1024UL - 1UL : 0); - #if ENABLED(STEALTHCHOP) - st.stealthChop(!enable); - #endif - st.diag1_stall(enable ? 1 : 0); - } - -#endif // SENSORLESS_HOMING - -#if HAS_DRIVER(TMC2130) - #define SET_CS_PIN(st) OUT_WRITE(st##_CS_PIN, HIGH) - void tmc_init_cs_pins() { - #if AXIS_DRIVER_TYPE(X, TMC2130) - SET_CS_PIN(X); - #endif - #if AXIS_DRIVER_TYPE(Y, TMC2130) - SET_CS_PIN(Y); - #endif - #if AXIS_DRIVER_TYPE(Z, TMC2130) - SET_CS_PIN(Z); - #endif - #if AXIS_DRIVER_TYPE(X2, TMC2130) - SET_CS_PIN(X2); - #endif - #if AXIS_DRIVER_TYPE(Y2, TMC2130) - SET_CS_PIN(Y2); - #endif - #if AXIS_DRIVER_TYPE(Z2, TMC2130) - SET_CS_PIN(Z2); - #endif - #if AXIS_DRIVER_TYPE(E0, TMC2130) - SET_CS_PIN(E0); - #endif - #if AXIS_DRIVER_TYPE(E1, TMC2130) - SET_CS_PIN(E1); - #endif - #if AXIS_DRIVER_TYPE(E2, TMC2130) - SET_CS_PIN(E2); - #endif - #if AXIS_DRIVER_TYPE(E3, TMC2130) - SET_CS_PIN(E3); - #endif - #if AXIS_DRIVER_TYPE(E4, TMC2130) - SET_CS_PIN(E4); - #endif - } -#endif // TMC2130 - -#endif // HAS_TRINAMIC diff --git a/Marlin/tmc_util.h b/Marlin/tmc_util.h deleted file mode 100644 index 7efe67a..0000000 --- a/Marlin/tmc_util.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] - * - * Based on Sprinter and grbl. - * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifndef _TMC_UTIL_H_ -#define _TMC_UTIL_H_ - -#include "MarlinConfig.h" - -#if HAS_DRIVER(TMC2130) - #include -#endif - -#if HAS_DRIVER(TMC2208) - #include -#endif - -extern bool report_tmc_status; - -enum TMC_AxisEnum : char { TMC_X, TMC_Y, TMC_Z, TMC_X2, TMC_Y2, TMC_Z2, TMC_E0, TMC_E1, TMC_E2, TMC_E3, TMC_E4 }; - -constexpr uint32_t _tmc_thrs(const uint16_t msteps, const int32_t thrs, const uint32_t spmm) { - return 12650000UL * msteps / (256 * thrs * spmm); -} - -void _tmc_say_axis(const TMC_AxisEnum axis); -void _tmc_say_current(const TMC_AxisEnum axis, const uint16_t curr); -void _tmc_say_otpw(const TMC_AxisEnum axis, const bool otpw); -void _tmc_say_otpw_cleared(const TMC_AxisEnum axis); -void _tmc_say_pwmthrs(const TMC_AxisEnum axis, const uint32_t thrs); -void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt); - -template -void tmc_get_current(TMC &st, const TMC_AxisEnum axis) { - _tmc_say_current(axis, st.getCurrent()); -} -template -void tmc_set_current(TMC &st, const int mA) { - st.setCurrent(mA, R_SENSE, HOLD_MULTIPLIER); -} -template -void tmc_report_otpw(TMC &st, const TMC_AxisEnum axis) { - _tmc_say_otpw(axis, st.getOTPW()); -} -template -void tmc_clear_otpw(TMC &st, const TMC_AxisEnum axis) { - st.clear_otpw(); - _tmc_say_otpw_cleared(axis); -} -template -void tmc_get_pwmthrs(TMC &st, const TMC_AxisEnum axis, const uint16_t spmm) { - _tmc_say_pwmthrs(axis, _tmc_thrs(st.microsteps(), st.TPWMTHRS(), spmm)); -} -template -void tmc_set_pwmthrs(TMC &st, const int32_t thrs, const uint32_t spmm) { - st.TPWMTHRS(_tmc_thrs(st.microsteps(), thrs, spmm)); -} -template -void tmc_get_sgt(TMC &st, const TMC_AxisEnum axis) { - _tmc_say_sgt(axis, st.sgt()); -} -template -void tmc_set_sgt(TMC &st, const int8_t sgt_val) { - st.sgt(sgt_val); -} - -void monitor_tmc_driver(); - -#if ENABLED(TMC_DEBUG) - void tmc_set_report_status(const bool status); - void tmc_report_all(); -#endif - -/** - * TMC2130 specific sensorless homing using stallGuard2. - * stallGuard2 only works when in spreadCycle mode. - * spreadCycle and stealthChop are mutually exclusive. - * - * Defined here because of limitations with templates and headers. - */ -#if ENABLED(SENSORLESS_HOMING) - void tmc_sensorless_homing(TMC2130Stepper &st, const bool enable=true); -#endif - -#if HAS_DRIVER(TMC2130) - void tmc_init_cs_pins(); -#endif - -#endif // _TMC_UTIL_H_ diff --git a/buildroot/bin/travis_at_home b/buildroot/bin/travis_at_home deleted file mode 100644 index 5fd5c23..0000000 --- a/buildroot/bin/travis_at_home +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash -# -# travis_at_home -# -# Run all Travis test builds at home to save time finding typos -# Make sure to have 'arduino' somewhere in your PATH -# - -LOG="travis-out.txt" - -cd `dirname "$0"`/../.. - -TRAVIS_BUILD_DIR=`pwd` -echo $'Tests for '$TRAVIS_BUILD_DIR$' ...\n' >"$LOG" - -# Add a temporary execution PATH -export PATH="./buildroot/bin:$PATH" - -# Scan .travis.yml and run config/build commands only -X=1 -while read P; do - - # Command lines start with a hyphen - if [[ $P =~ ^-\ (([^ ]+)(\ .*)?)$ ]]; then - WORD="${BASH_REMATCH[2]}" ; # The first word - CMD="${BASH_REMATCH[1]}" ; # The whole command - RUN=1 ; BUILD=0 - case "$WORD" in - cp|opt_*|pins_*|use_*|restore_*|gen*) ;; - build_*) BUILD=1 ;; - *) RUN=0 ;; - esac - - # Runnable command - if [[ $RUN == 1 ]]; then - echo "$CMD" >>"$LOG" - RESULT=$( eval "$CMD >>\"$LOG\" 2>&1" ) - if [[ $BUILD == 1 ]]; then - echo "--- Build $X done." - echo >>"$LOG" - X=$((X+1)) - fi - fi - fi -done <.travis.yml - -cd - >/dev/null diff --git a/buildroot/share/PlatformIO/boards/at90usb1286.json b/buildroot/share/PlatformIO/boards/at90usb1286.json deleted file mode 100644 index 3efedcb..0000000 --- a/buildroot/share/PlatformIO/boards/at90usb1286.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "build": { - "core": "teensy", - "extra_flags": "-DTEENSY2PP", - "f_cpu": "16000000L", - "mcu": "at90usb1286" - }, - "frameworks": [ - "arduino" - ], - "name": "at90usb1286.json", - "upload": { - "maximum_ram_size": 8192, - "maximum_size": 122880, - "require_upload_port": true, - "protocol": "" - }, - "url": "https://github.com/MarlinFirmware/Marlin", - "vendor": "various" -} diff --git a/buildroot/share/atom/auto_build.py b/buildroot/share/atom/auto_build.py deleted file mode 100644 index 0934455..0000000 --- a/buildroot/share/atom/auto_build.py +++ /dev/null @@ -1,1455 +0,0 @@ -####################################### -# -# Marlin 3D Printer Firmware -# Copyright (C) 2018 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] -# -# Based on Sprinter and grbl. -# Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -####################################### - -####################################### -# -# Revision: 2.0.1 -# -# Description: script to automate PlatformIO builds -# CLI: python auto_build.py build_option -# build_option (required) -# build executes -> platformio run -e target_env -# clean executes -> platformio run --target clean -e target_env -# upload executes -> platformio run --target upload -e target_env -# traceback executes -> platformio run --target upload -e target_env -# program executes -> platformio run --target program -e target_env -# test executes -> platformio test upload -e target_env -# remote executes -> platformio remote run --target upload -e target_env -# debug executes -> platformio debug -e target_env -# -# 'traceback' just uses the debug variant of the target environment if one exists -# -####################################### - -####################################### -# -# General program flow -# -# 1. Scans Configuration.h for the motherboard name and Marlin version. -# 2. Scans pins.h for the motherboard. -# returns the CPU(s) and platformio environment(s) used by the motherboard -# 3. If further info is needed then a popup gets it from the user. -# 4. The OUTPUT_WINDOW class creates a window to display the output of the PlatformIO program. -# 5. A thread is created by the OUTPUT_WINDOW class in order to execute the RUN_PIO function. -# 6. The RUN_PIO function uses a subprocess to run the CLI version of PlatformIO. -# 7. The "iter(pio_subprocess.stdout.readline, '')" function is used to stream the output of -# PlatformIO back to the RUN_PIO function. -# 8. Each line returned from PlatformIO is formatted to match the color coding seen in the -# PlatformIO GUI. -# 9. If there is a color change within a line then the line is broken at each color change -# and sent separately. -# 10. Each formatted segment (could be a full line or a split line) is put into the queue -# IO_queue as it arrives from the platformio subprocess. -# 11. The OUTPUT_WINDOW class periodically samples IO_queue. If data is available then it -# is written to the window. -# 12. The window stays open until the user closes it. -# 13. The OUTPUT_WINDOW class continues to execute as long as the window is open. This allows -# copying, saving, scrolling of the window. A right click popup is available. -# -####################################### - -import sys -import os - -pwd = os.getcwd() # make sure we're executing from the correct directory level -pwd = pwd.replace('\\', '/') -if 0 <= pwd.find('buildroot/share/atom'): - pwd = pwd[ : pwd.find('buildroot/share/atom')] - os.chdir(pwd) -print 'pwd: ', pwd - -num_args = len(sys.argv) -if num_args > 1: - build_type = str(sys.argv[1]) -else: - print 'Please specify build type' - exit() - -print'build_type: ', build_type - -print '\nWorking\n' - -python_ver = sys.version_info[0] # major version - 2 or 3 - -if python_ver == 2: - print "python version " + str(sys.version_info[0]) + "." + str(sys.version_info[1]) + "." + str(sys.version_info[2]) -else: - print "python version " + str(sys.version_info[0]) - print "This script only runs under python 2" - exit() - -import platform -current_OS = platform.system() - -#globals -target_env = '' -board_name = '' - - -######### -# Python 2 error messages: -# Can't find a usable init.tcl in the following directories ... -# error "invalid command name "tcl_findLibrary"" -# -# Fix for the above errors on my Win10 system: -# search all init.tcl files for the line "package require -exact Tcl" that has the highest 8.5.x number -# copy it into the first directory listed in the error messages -# set the environmental variables TCLLIBPATH and TCL_LIBRARY to the directory where you found the init.tcl file -# reboot -######### - -# -# data/definitions used by memory check routine to determine if need to -# insert % memory used -# -mem_check_environments = ('at90USB1286_CDC', 'at90USB1286_DFU') -mem_check_builds = ('upload', 'program') -FLASH_MAX = 128 * 1024 - 4 * 1024 # DFU & CDC bootloaders start at word address F800 -RAM_MAX = 8 * 1024 -FLASH_PERCENT_WARN = 0.90 -RAM_SYSTEM = 1024 # assume that 1K bytes is enough for stack, heap. ... -RAM_WARN = RAM_SYSTEM * 1.5 - -########################################################################################## -# -# popup to get input from user -# -########################################################################################## - -def get_answer(board_name, cpu_label_txt, cpu_a_txt, cpu_b_txt): - - - if python_ver == 2: - import Tkinter as tk - else: - import tkinter as tk - - def CPU_exit_3(): # forward declare functions - - CPU_exit_3_() - def CPU_exit_4(): - - CPU_exit_4_() - def kill_session(): - kill_session_() - - root_get_answer = tk.Tk() - - root_get_answer.chk_state_1 = 1 # declare variables used by TK and enable - - chk_state_1 = 0 # set initial state of check boxes - - - global get_answer_val - get_answer_val = 2 # return get_answer_val, set default to match chk_state_1 default - - - l1 = tk.Label(text=board_name, - fg = "light green", - bg = "dark green", - font = "Helvetica 12 bold").grid(row=1) - - l2 = tk.Label(text=cpu_label_txt, - fg = "light green", - bg = "dark green", - font = "Helvetica 16 bold italic").grid(row=2) - - b4 = tk.Checkbutton(text=cpu_a_txt, - fg = "black", - font = "Times 20 bold ", - variable=chk_state_1, onvalue=1, offvalue=0, - - command = CPU_exit_3).grid(row=3) - - b5 = tk.Checkbutton(text=cpu_b_txt, - fg = "black", - font = "Times 20 bold ", - variable=chk_state_1, onvalue=0, offvalue=1, - - command = CPU_exit_4).grid(row=4) # use same variable but inverted so they will track - b6 = tk.Button(text="CONFIRM", - fg = "blue", - font = "Times 20 bold ", - command = root_get_answer.destroy).grid(row=5, pady=4) - - b7 = tk.Button(text="CANCEL", - fg = "red", - font = "Times 12 bold ", - command = kill_session).grid(row=6, pady=4) - - - def CPU_exit_3_(): - global get_answer_val - get_answer_val = 1 - - def CPU_exit_4_(): - global get_answer_val - get_answer_val = 2 - - def kill_session_(): - raise SystemExit(0) # kill everything - - root_get_answer.mainloop() - -# end - get answer - - -# -# move custom board definitions from project folder to PlatformIO -# -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 - line_start = path.find(':', 2) # use 2 here so don't eat Windows full path - column_start = path.find(':', line_start + 1) - if column_start == -1: - column_start = len(path) - column_end = path.find(':', column_start + 1) - if column_end == -1: - column_end = len(path) - if 0 <= line_start: - line_num = path[ line_start + 1 : column_start] - if line_num == '': - line_num = 1 - if not(column_start == column_end): - column_num = path[ column_start + 1 : column_end] - if column_num == '': - column_num = 0 - - index_end = path.find(',') - if 0 <= index_end: - path = path[ : index_end] # delete comma and anything after - index_end = path.find(':', 2) - if 0 <= index_end: - path = path[ : path.find(':', 2)] # delete the line number and anything after - - path = path.replace('\\','/') - - if 1 == path.find(':') and current_OS == 'Windows': - return path, line_num, column_num # found a full path - no need for further processing - elif 0 == path.find('/') and (current_OS == 'Linux' or current_OS == 'Darwin'): - return path, line_num, column_num # found a full path - no need for further processing - - else: - - # resolve as many '../' as we can - while 0 <= path.find('../'): - end = path.find('../') - 1 - start = path.find('/') - while 0 <= path.find('/',start) and end > path.find('/',start): - start = path.find('/',start) + 1 - path = path[0:start] + path[end + 4: ] - - # this is an alternative to the above - it just deletes the '../' section - # start_temp = path.find('../') - # while 0 <= path.find('../',start_temp): - # start = path.find('../',start_temp) - # start_temp = start + 1 - # if 0 <= start: - # path = path[start + 2 : ] - - - start = path.find('/') - if not(0 == start): # make sure path starts with '/' - while 0 == path.find(' '): # eat any spaces at the beginning - path = path[ 1 : ] - path = '/' + path - - if current_OS == 'Windows': - search_path = path.replace('/', '\\') # os.walk uses '\' in Windows - else: - search_path = path - - start_path = os.path.abspath('') - - # search project directory for the selection - found = False - full_path = '' - for root, directories, filenames in os.walk(start_path): - for filename in filenames: - if 0 <= root.find('.git'): # don't bother looking in this directory - break - full_path = os.path.join(root,filename) - if 0 <= full_path.find(search_path): - found = True - break - if found: - break - - return full_path, line_num, column_num - -# end - resolve_path - - -# -# Opens the file in the preferred editor at the line & column number -# If the preferred editor isn't already running then it tries the next. -# If none are open then the system default is used. -# -# Editor order: -# 1. Notepad++ (Windows only) -# 2. Sublime Text -# 3. Atom -# 4. System default (opens at line 1, column 1 only) -# -def open_file(path): - import subprocess - file_path, line_num, column_num = resolve_path(path) - - if file_path == '' : - return - - if current_OS == 'Windows': - - editor_note = subprocess.check_output('wmic process where "name=' + "'notepad++.exe'" + '" get ExecutablePath') - editor_sublime = subprocess.check_output('wmic process where "name=' + "'sublime_text.exe'" + '" get ExecutablePath') - editor_atom = subprocess.check_output('wmic process where "name=' + "'atom.exe'" + '" get ExecutablePath') - - if 0 <= editor_note.find('notepad++.exe'): - start = editor_note.find('\n') + 1 - end = editor_note.find('\n',start + 5) -4 - editor_note = editor_note[ start : end] - command = file_path , ' -n' + str(line_num) , ' -c' + str(column_num) - subprocess.Popen([editor_note, command]) - - elif 0 <= editor_sublime.find('sublime_text.exe'): - start = editor_sublime.find('\n') + 1 - end = editor_sublime.find('\n',start + 5) -4 - editor_sublime = editor_sublime[ start : end] - command = file_path + ':' + line_num + ':' + column_num - subprocess.Popen([editor_sublime, command]) - - elif 0 <= editor_atom.find('atom.exe'): - start = editor_atom.find('\n') + 1 - end = editor_atom.find('\n',start + 5) -4 - editor_atom = editor_atom[ start : end] - command = file_path + ':' + str(line_num) + ':' + str(column_num) - subprocess.Popen([editor_atom, command]) - - else: - os.startfile(resolve_path(path)) # open file with default app - - elif current_OS == 'Linux': - - command = file_path + ':' + str(line_num) + ':' + str(column_num) - index_end = command.find(',') - if 0 <= index_end: - command = command[ : index_end] # sometimes a comma magically appears, don't want it - running_apps = subprocess.Popen('ps ax -o cmd', stdout=subprocess.PIPE, shell=True) - (output, err) = running_apps.communicate() - temp = output.split('\n') - - def find_editor_linux(name, search_obj): - for line in search_obj: - if 0 <= line.find(name): - path = line - return True, path - return False , '' - - (success_sublime, editor_path_sublime) = find_editor_linux('sublime_text',temp) - (success_atom, editor_path_atom) = find_editor_linux('atom',temp) - - if success_sublime: - subprocess.Popen([editor_path_sublime, command]) - - elif success_atom: - subprocess.Popen([editor_path_atom, command]) - - else: - os.system('xdg-open ' + file_path ) - - elif current_OS == 'Darwin': # MAC - - command = file_path + ':' + str(line_num) + ':' + str(column_num) - index_end = command.find(',') - if 0 <= index_end: - command = command[ : index_end] # sometimes a comma magically appears, don't want it - running_apps = subprocess.Popen('ps axwww -o command', stdout=subprocess.PIPE, shell=True) - (output, err) = running_apps.communicate() - temp = output.split('\n') - - def find_editor_mac(name, search_obj): - for line in search_obj: - if 0 <= line.find(name): - path = line - if 0 <= path.find('-psn'): - path = path[ : path.find('-psn') - 1 ] - return True, path - return False , '' - - (success_sublime, editor_path_sublime) = find_editor_mac('Sublime',temp) - (success_atom, editor_path_atom) = find_editor_mac('Atom',temp) - - if success_sublime: - subprocess.Popen([editor_path_sublime, command]) - - elif success_atom: - subprocess.Popen([editor_path_atom, command]) - - else: - os.system('open ' + file_path ) -# end - open_file - - -# gets the last build environment -def get_build_last(): - env_last = '' - DIR_PWD = os.listdir('.') - if '.pioenvs' in DIR_PWD: - date_last = 0.0 - DIR__pioenvs = os.listdir('.pioenvs') - for name in DIR__pioenvs: - if 0 <= name.find('.') or 0 <= name.find('-'): # skip files in listing - continue - DIR_temp = os.listdir('.pioenvs/' + name) - for names_temp in DIR_temp: - - if 0 == names_temp.find('firmware.'): - date_temp = os.path.getmtime('.pioenvs/' + name + '/' + names_temp) - if date_temp > date_last: - date_last = date_temp - env_last = name - return env_last - - -# gets the board being built from the Configuration.h file -# returns: board name, major version of Marlin being used (1 or 2) -def get_board_name(): - board_name = '' - # get board name - - with open('Marlin/Configuration.h', 'r') as myfile: - Configuration_h = myfile.read() - - Configuration_h = Configuration_h.split('\n') - Marlin_ver = 0 # set version to invalid number - for lines in Configuration_h: - if 0 == lines.find('#define CONFIGURATION_H_VERSION 01'): - Marlin_ver = 1 - if 0 == lines.find('#define CONFIGURATION_H_VERSION 02'): - Marlin_ver = 2 - board = lines.find(' BOARD_') + 1 - motherboard = lines.find(' MOTHERBOARD ') + 1 - define = lines.find('#define ') - comment = lines.find('//') - if (comment == -1 or comment > board) and \ - board > motherboard and \ - motherboard > define and \ - define >= 0 : - spaces = lines.find(' ', board) # find the end of the board substring - if spaces == -1: - board_name = lines[board : ] - else: - board_name = lines[board : spaces] - break - - - return board_name, Marlin_ver - - -# extract first environment name it finds after the start position -# returns: environment name and position to start the next search from -def get_env_from_line(line, start_position): - env = '' - next_position = -1 - env_position = line.find('env:', start_position) - if 0 < env_position: - next_position = line.find(' ', env_position + 4) - if 0 < next_position: - env = line[env_position + 4 : next_position] - else: - env = line[env_position + 4 : ] # at the end of the line - return env, next_position - - - -#scans pins.h for board name and returns the environment(s) it finds -def get_starting_env(board_name_full, version): - # get environment starting point - - if version == 1: - path = 'Marlin/pins.h' - if version == 2: - path = 'Marlin/src/pins/pins.h' - with open(path, 'r') as myfile: - pins_h = myfile.read() - - env_A = '' - env_B = '' - env_C = '' - - board_name = board_name_full[ 6 : ] # only use the part after "BOARD_" since we're searching the pins.h file - pins_h = pins_h.split('\n') - environment = '' - board_line = '' - cpu_A = '' - cpu_B = '' - i = 0 - list_start_found = False - for lines in pins_h: - i = i + 1 # i is always one ahead of the index into pins_h - if 0 < lines.find("Unknown MOTHERBOARD value set in Configuration.h"): - break # no more - if 0 < lines.find('1280'): - list_start_found = True - if list_start_found == False: # skip lines until find start of CPU list - continue - board = lines.find(board_name) - comment_start = lines.find('// ') - cpu_A_loc = comment_start - cpu_B_loc = 0 - if board > 0: # need to look at the next line for environment info - cpu_line = pins_h[i] - comment_start = cpu_line.find('// ') - env_A, next_position = get_env_from_line(cpu_line, comment_start) # get name of environment & start of search for next - env_B, next_position = get_env_from_line(cpu_line, next_position) # get next environment, if it exists - env_C, next_position = get_env_from_line(cpu_line, next_position) # get next environment, if it exists - break - return env_A, env_B, env_C - - -# scans input string for CPUs that the users may need to select from -# returns: CPU name -def get_CPU_name(environment): - CPU_list = ('1280', '2560','644', '1284', 'LPC1768', 'DUE') - CPU_name = '' - for CPU in CPU_list: - if 0 < environment.find(CPU): - return CPU - - -# get environment to be used for the build -# returns: environment -def get_env(board_name, ver_Marlin): - def no_environment(): - print 'ERROR - no environment for this board' - print board_name - raise SystemExit(0) # no environment so quit - - def invalid_board(): - print 'ERROR - invalid board' - print board_name - raise SystemExit(0) # quit if unable to find board - - - CPU_question = ( ('1280', '2560', " 1280 or 2560 CPU? "), ('644', '1284', " 644 or 1284 CPU? ") ) - - if 0 < board_name.find('MELZI') : - get_answer(' ' + board_name + ' ', " Which flavor of Melzi? ", "Melzi (Optiboot bootloader)", "Melzi ") - if 1 == get_answer_val: - target_env = 'melzi_optiboot' - else: - target_env = 'melzi' - else: - env_A, env_B, env_C = get_starting_env(board_name, ver_Marlin) - - if env_A == '': - no_environment() - if env_B == '': - return env_A # only one environment so finished - - CPU_A = get_CPU_name(env_A) - CPU_B = get_CPU_name(env_B) - - for item in CPU_question: - if CPU_A == item[0]: - get_answer(' ' + board_name + ' ', item[2], item[0], item[1]) - if 2 == get_answer_val: - target_env = env_B - else: - target_env = env_A - return target_env - - if env_A == 'LPC1768': - if build_type == 'traceback' or (build_type == 'clean' and get_build_last() == 'LPC1768_debug_and_upload'): - target_env = 'LPC1768_debug_and_upload' - else: - target_env = 'LPC1768' - elif env_A == 'DUE': - target_env = 'DUE' - if build_type == 'traceback' or (build_type == 'clean' and get_build_last() == 'DUE_debug'): - target_env = 'DUE_debug' - elif env_B == 'DUE_USB': - get_answer(' ' + board_name + ' ', " DUE: need download port ", "USB (native USB) port", "Programming port ") - if 1 == get_answer_val: - target_env = 'DUE_USB' - else: - target_env = 'DUE' - else: - invalid_board() - - if build_type == 'traceback' and not(target_env == 'LPC1768_debug_and_upload' or target_env == 'DUE_debug') and Marlin_ver == 2: - print "ERROR - this board isn't setup for traceback" - print 'board_name: ', board_name - print 'target_env: ', target_env - raise SystemExit(0) - - return target_env -# end - get_env - -# puts screen text into queue so that the parent thread can fetch the data from this thread -import Queue -IO_queue = Queue.Queue() -PIO_queue = Queue.Queue() -def write_to_screen_queue(text, format_tag = 'normal'): - double_in = [text, format_tag] - IO_queue.put(double_in, block = False) - - -# -# send one line to the terminal screen with syntax highlighting -# -# input: unformatted text, flags from previous run -# returns: formatted text ready to go to the terminal, flags from this run -# -# This routine remembers the status from call to call because previous -# lines can affect how the current line is highlighted -# - -# 'static' variables - init here and then keep updating them from within print_line -warning = False -warning_FROM = False -error = False -standard = True -prev_line_COM = False -next_line_warning = False -warning_continue = False -line_counter = 0 - -def line_print(line_input): - - global warning - global warning_FROM - global error - global standard - global prev_line_COM - global next_line_warning - global warning_continue - global line_counter - - - - - # all '0' elements must precede all '1' elements or they'll be skipped - platformio_highlights = [ - ['Environment', 0, 'highlight_blue'], - ['[SKIP]', 1, 'warning'], - ['[ERROR]', 1, 'error'], - ['[SUCCESS]', 1, 'highlight_green'] - ] - - def write_to_screen_with_replace(text, highlights): # search for highlights & split line accordingly - did_something = False - for highlight in highlights: - found = text.find(highlight[0]) - if did_something == True: - break - if found >= 0 : - did_something = True - if 0 == highlight[1]: - found_1 = text.find(' ') - found_tab = text.find('\t') - if found_1 < 0 or found_1 > found_tab: - found_1 = found_tab - write_to_screen_queue(text[ : found_1 + 1 ]) - for highlight_2 in highlights: - if highlight[0] == highlight_2[0] : - continue - found = text.find(highlight_2[0]) - if found >= 0 : - found_space = text.find(' ', found_1 + 1) - found_tab = text.find('\t', found_1 + 1) - if found_space < 0 or found_space > found_tab: - found_space = found_tab - found_right = text.find(']', found + 1) - write_to_screen_queue(text[found_1 + 1 : found_space + 1 ], highlight[2]) - write_to_screen_queue(text[found_space + 1 : found + 1 ]) - write_to_screen_queue(text[found + 1 : found_right], highlight_2[2]) - write_to_screen_queue(text[found_right : ] + '\n') - break - break - if 1 == highlight[1]: - found_right = text.find(']', found + 1) - write_to_screen_queue(text[ : found + 1 ]) - write_to_screen_queue(text[found + 1 : found_right ], highlight[2]) - write_to_screen_queue(text[found_right : ] + '\n') - break - if did_something == False: - r_loc = text.find('\r') + 1 - if r_loc > 0 and r_loc < len(text): # need to split this line - text = text.split('\r') - for line in text: - write_to_screen_queue(line + '\n') - else: - write_to_screen_queue(text + '\n') - # end - write_to_screen_with_replace - - - - # scan the line - line_counter = line_counter + 1 - max_search = len(line_input) - if max_search > 3 : - max_search = 3 - beginning = line_input[:max_search] - - # set flags - if 0 < line_input.find(': warning: '): # start of warning block - warning = True - warning_FROM = False - error = False - standard = False - prev_line_COM = False - prev_line_COM = False - warning_continue = True - if 0 < line_input.find('Thank you') or 0 < line_input.find('SUMMARY') : - warning = False #standard line found - warning_FROM = False - error = False - standard = True - prev_line_COM = False - warning_continue = False - elif beginning == 'War' or \ - beginning == '#er' or \ - beginning == 'In ' or \ - (beginning != 'Com' and prev_line_COM == True and not(beginning == 'Arc' or beginning == 'Lin' or beginning == 'Ind') or \ - next_line_warning == True): - warning = True #warning found - warning_FROM = False - error = False - standard = False - prev_line_COM = False - elif beginning == 'Com' or \ - beginning == 'Ver' or \ - beginning == ' [E' or \ - beginning == 'Rem' or \ - beginning == 'Bui' or \ - beginning == 'Ind' or \ - beginning == 'PLA': - warning = False #standard line found - warning_FROM = False - error = False - standard = True - prev_line_COM = False - warning_continue = False - elif beginning == '***': - warning = False # error found - warning_FROM = False - error = True - standard = False - prev_line_COM = False - elif 0 < line_input.find(': error:') or \ - 0 < line_input.find(': fatal error:'): # start of warning /error block - warning = False # error found - warning_FROM = False - error = True - standard = False - prev_line_COM = False - warning_continue = True - elif beginning == 'fro' and warning == True or \ - beginning == '.pi' : # start of warning /error block - warning_FROM = True - prev_line_COM = False - warning_continue = True - elif warning_continue == True: - warning = True - warning_FROM = False # keep the warning status going until find a standard line or an error - error = False - standard = False - prev_line_COM = False - warning_continue = True - - else: - warning = False # unknown so assume standard line - warning_FROM = False - error = False - standard = True - prev_line_COM = False - warning_continue = False - - if beginning == 'Com': - prev_line_COM = True - - # print based on flags - if standard == True: - write_to_screen_with_replace(line_input, platformio_highlights) #print white on black with substitutions - if warning == True: - write_to_screen_queue(line_input + '\n', 'warning') - if error == True: - write_to_screen_queue(line_input + '\n', 'error') -# end - line_print - - - -def run_PIO(dummy): - - ########################################################################## - # # - # run Platformio # - # # - ########################################################################## - - - # build platformio run -e target_env - # clean platformio run --target clean -e target_env - # upload platformio run --target upload -e target_env - # traceback platformio run --target upload -e target_env - # program platformio run --target program -e target_env - # test platformio test upload -e target_env - # remote platformio remote run --target upload -e target_env - # debug platformio debug -e target_env - - - global build_type - global target_env - global board_name - print 'build_type: ', build_type - - import subprocess - import sys - - print 'starting platformio' - - if build_type == 'build': - # platformio run -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen(['platformio', 'run', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - - - elif build_type == 'clean': - # platformio run --target clean -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen(['platformio', 'run', '--target', 'clean', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - - - elif build_type == 'upload': - # platformio run --target upload -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen(['platformio', 'run', '--target', 'upload', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - - - elif build_type == 'traceback': - # platformio run --target upload -e target_env - select the debug environment if there is one - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen(['platformio', 'run', '--target', 'upload', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - - - elif build_type == 'program': - # platformio run --target program -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen(['platformio', 'run', '--target', 'program', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - - - elif build_type == 'test': - #platformio test upload -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen(['platformio', 'test', 'upload', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - - - elif build_type == 'remote': - # platformio remote run --target upload -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen(['platformio', 'remote', 'run', '--target', 'program', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - - - elif build_type == 'debug': - # platformio debug -e target_env - # combine stdout & stderr so all compile messages are included - pio_subprocess = subprocess.Popen(['platformio', 'debug', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - - - else: - print 'ERROR - unknown build type: ', build_type - raise SystemExit(0) # kill everything - - # stream output from subprocess and split it into lines - for line in iter(pio_subprocess.stdout.readline, ''): - line_print(line.replace('\n', '')) - - - # append info used to run PlatformIO - write_to_screen_queue('\nBoard name: ' + board_name + '\n') # put build info at the bottom of the screen - write_to_screen_queue('Build type: ' + build_type + '\n') - write_to_screen_queue('Environment used: ' + target_env + '\n') -# end - run_PIO - - -######################################################################## - -import time -import threading -import Tkinter as tk -import ttk -import Queue -import subprocess -import sys -que = Queue.Queue() -#IO_queue = Queue.Queue() - -from Tkinter import Tk, Frame, Text, Scrollbar, Menu -from tkMessageBox import askokcancel - -import tkFileDialog -from tkMessageBox import askokcancel -import tkFileDialog - - - -class output_window(Text): - # based on Super Text - global continue_updates - continue_updates = True - - global search_position - search_position = '' # start with invalid search position - - global error_found - error_found = False # are there any errors? - - global memory_check_first_time - memory_check_first_time = True # wants to run memory_check twice - - - def __init__(self): - - - self.root = tk.Tk() - self.frame = tk.Frame(self.root) - self.frame.pack(fill='both', expand=True) - - # text widget - #self.text = tk.Text(self.frame, borderwidth=3, relief="sunken") - 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) - - self.tag_config('normal', foreground = 'white') - self.tag_config('warning', foreground = 'yellow' ) - self.tag_config('error', foreground = 'red') - self.tag_config('highlight_green', foreground = 'green') - self.tag_config('highlight_blue', foreground = 'cyan') - self.tag_config('error_highlight_inactive', background = 'dim gray') - self.tag_config('error_highlight_active', background = 'light grey') - - self.bind_class("Text","", self.select_all) # required in windows, works in others - self.bind_all("", self.scroll_errors) - self.bind_class("", self.rebuild) - - # scrollbar - - scrb = tk.Scrollbar(self.frame, orient='vertical', command=self.yview) - 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) - - self.popup.add_command(label='Copy', command=self._copy) - self.popup.add_command(label='Paste', command=self._paste) - self.popup.add_separator() - self.popup.add_command(label='Cut', command=self._cut) - self.popup.add_separator() - self.popup.add_command(label='Select All', command=self._select_all) - self.popup.add_command(label='Clear All', command=self._clear_all) - self.popup.add_separator() - self.popup.add_command(label='Save As', command=self._file_save_as) - self.popup.add_separator() - # self.popup.add_command(label='Repeat Build(CTL-shift-r)', command=self._rebuild) - self.popup.add_command(label='Repeat Build', command=self._rebuild) - self.popup.add_separator() - self.popup.add_command(label='Scroll Errors (CTL-shift-e)', command=self._scroll_errors) - self.popup.add_separator() - self.popup.add_command(label='Open File at Cursor', command=self._open_selected_file) - - if current_OS == 'Darwin': # MAC - self.bind('', self._show_popup) # macOS only - else: - self.bind('', self._show_popup) # Windows & Linux - - - # threading & subprocess section - - def start_thread(self, ): - global continue_updates - # create then start a secondary thread to run an arbitrary function - # must have at least one argument - self.secondary_thread = threading.Thread(target = lambda q, arg1: q.put(run_PIO(arg1)), args=(que, '')) - self.secondary_thread.start() - continue_updates = True - # check the Queue in 50ms - self.root.after(50, self.check_thread) - self.root.after(50, self.update) - - - def check_thread(self): # wait for user to kill the window - global continue_updates - if continue_updates == True: - self.root.after(10, self.check_thread) - - - def update(self): - global continue_updates - if continue_updates == True: - self.root.after(10, self.update)#method is called every 50ms - temp_text = ['0','0'] - if IO_queue.empty(): - if not(self.secondary_thread.is_alive()): - continue_updates = False # queue is exhausted and thread is dead so no need for further updates - self.memory_check() # scan buffer and add percent used if needed - print 'starting memory check' - else: - try: - temp_text = IO_queue.get(block = False) - except Queue.Empty: - continue_updates = False # queue is exhausted so no need for further updates - else: - self.insert('end', temp_text[0], temp_text[1]) - self.see("end") # make the last line visible (scroll text off the top) - - - # text editing section - - - def _scroll_errors(self): - global search_position - global error_found - if search_position == '': # first time so highlight all errors - countVar = tk.IntVar() - search_position = '1.0' - search_count = 0 - while not(search_position == '') and search_count < 100: - search_position = self.search("error", search_position, stopindex="end", count=countVar, nocase=1) - search_count = search_count + 1 - if not(search_position == ''): - error_found = True - end_pos = '{}+{}c'.format(search_position, 5) - self.tag_add("error_highlight_inactive", search_position, end_pos) - search_position = '{}+{}c'.format(search_position, 1) # point to the next character for new search - else: - break - - if error_found: - if search_position == '': - search_position = self.search("error", '1.0', stopindex="end", nocase=1) # new search - else: # remove active highlight - end_pos = '{}+{}c'.format(search_position, 5) - start_pos = '{}+{}c'.format(search_position, -1) - self.tag_remove("error_highlight_active", start_pos, end_pos) - search_position = self.search("error", search_position, stopindex="end", nocase=1) # finds first occurrence AGAIN on the first time through - if search_position == "": # wrap around - search_position = self.search("error", '1.0', stopindex="end", nocase=1) - end_pos = '{}+{}c'.format(search_position, 5) - self.tag_add("error_highlight_active", search_position, end_pos) # add active highlight - self.see(search_position) - search_position = '{}+{}c'.format(search_position, 1) # point to the next character for new search - - def scroll_errors(self, event): - self._scroll_errors() - - - def _rebuild(self): - #global board_name - #global Marlin_ver - #global target_env - #board_name, Marlin_ver = get_board_name() - #target_env = get_env(board_name, Marlin_ver) - self.start_thread() - - def rebuild(self, event): - print "event happened" - self._rebuild() - - - def _open_selected_file(self): - current_line = self.index('insert') - line_start = current_line[ : current_line.find('.')] + '.0' - line_end = current_line[ : current_line.find('.')] + '.200' - self.mark_set("path_start", line_start) - self.mark_set("path_end", line_end) - path = self.get("path_start", "path_end") - from_loc = path.find('from ') - colon_loc = path.find(': ') - if 0 <= from_loc and ((colon_loc == -1) or (from_loc < colon_loc)) : - path = path [ from_loc + 5 : ] - if 0 <= colon_loc: - path = path [ : colon_loc ] - if 0 <= path.find('\\') or 0 <= path.find('/'): # make sure it really contains a path - open_file(path) - - - def _file_save_as(self): - self.filename = tkFileDialog.asksaveasfilename(defaultextension = '.txt') - f = open(self.filename, 'w') - f.write(self.get('1.0', 'end')) - f.close() - - - - def copy(self, event): - try: - selection = self.get(*self.tag_ranges('sel')) - self.clipboard_clear() - self.clipboard_append(selection) - except TypeError: - pass - - def cut(self, event): - - try: - selection = self.get(*self.tag_ranges('sel')) - self.clipboard_clear() - self.clipboard_append(selection) - self.delete(*self.tag_ranges('sel')) - except TypeError: - pass - - def _show_popup(self, event): - '''right-click popup menu''' - - if self.root.focus_get() != self: - self.root.focus_set() - - try: - self.popup.tk_popup(event.x_root, event.y_root, 0) - finally: - self.popup.grab_release() - - def _cut(self): - - try: - selection = self.get(*self.tag_ranges('sel')) - self.clipboard_clear() - self.clipboard_append(selection) - self.delete(*self.tag_ranges('sel')) - except TypeError: - pass - - def cut(self, event): - self._cut() - - def _copy(self): - - try: - selection = self.get(*self.tag_ranges('sel')) - self.clipboard_clear() - self.clipboard_append(selection) - except TypeError: - pass - - def copy(self, event): - self._copy() - - def _paste(self): - - self.insert('insert', self.selection_get(selection='CLIPBOARD')) - - def _select_all(self): - self.tag_add('sel', '1.0', 'end') - - - def select_all(self, event): - self.tag_add('sel', '1.0', 'end') - - - def _clear_all(self): - '''erases all text''' - - isok = askokcancel('Clear All', 'Erase all text?', frame=self, - default='ok') - if isok: - self.delete('1.0', 'end') - - # add memory % if needed - def memory_check(self): - global memory_check_first_time - if not(memory_check_first_time): - return - memory_check_first_time = False - search_position = self.search("Environment used:", "1.0", stopindex="end") - env_line = self.get(search_position, '{}+{}c'.format(search_position, 200)) - print 'env_line 1 ', env_line - if 0 <= env_line.find('\n'): - env_line = env_line[ : env_line.find('\n')] - env_end = env_line.find(' ', 18) - if env_end == -1: - env_end = len(env_line) - env_line = env_line[ 18 : env_end ] - print 'env_line 2 ', env_line - env_found = False - for env in mem_check_environments: - if env_line == env: - env_found = True - print 'env ', env - - search_position = self.search("Build type:", "1.0", stopindex="end") - if search_position == "": - print "didn't find it" - return - build_line = self.get(search_position, '{}+{}c'.format(search_position, 200)) - print 'build_line 1 ', build_line - if 0 <= build_line.find('\n'): - build_line = build_line[ : build_line.find('\n')] - build_end = build_line.find(' ', 14) - if build_end == -1: - build_end = len(build_line) - build_line = build_line[ 12 : build_end ] - print 'build_line 2 ', build_line - build_found = False - for build in mem_check_builds: - if build_line == build: - build_found = True - print 'build ', build - - if env_found and build_found: # find the memory values - search_position = self.search("Checking program size", "1.0", stopindex="end") - if search_position != '': - print 'search_position: ' + search_position - line_int = int(search_position[ : search_position.find(".")]) + 1 - line_str = str(line_int) - line = self.get(line_str + '.0', line_str + '.200') - print 'line: ', line - while 'text' != line[ : 4 ] : - line_int = line_int + 1 - line_str = str(line_int) - line = self.get(line_str + '.0', line_str + '.200') - print 'line: ', line - line_int = line_int + 1 - line_str = str(line_int) - print 'line + 3: ' + line_str + '.0' - size_line = self.get(line_str + '.0', line_str + '.200') - print 'size_line ', size_line - - data_start = 0 - while ' ' == size_line[ data_start : data_start + 1] : - data_start = data_start + 1 # eat leading blanks - print 'data_start: ', data_start, size_line.find(' ', data_start) - data_end = size_line.find(' ', data_start) - 1 - text_str = size_line[ data_start : data_end] - print 'text_str = ', data_start, data_end, text_str + '/////' - text_val = int(text_str) - print 'text_val ', text_val - - data_start = size_line.find(' ', data_end) - while ' ' == size_line[ data_start : data_start + 1] : - data_start = data_start + 1 # eat leading blanks - print 'data_start: ', data_start, size_line.find(' ', data_start) - data_end = size_line.find(' ', data_start) -1 - data_val = int(size_line[ data_start : data_end]) - print 'data_val ', data_val - - data_start = size_line.find(' ', data_end) - while ' ' == size_line[ data_start : data_start + 1] : - data_start = data_start + 1 # eat leading blanks - print 'data_start: ', data_start, size_line.find(' ', data_start) - data_end = size_line.find(' ', data_start) - 1 - if data_end == -1: - data_end = len(size_line) - bss_val = int(size_line[ data_start : data_end]) - print 'bss_val ', bss_val - - FLASH_total = text_val + data_val - RAM_total = bss_val + data_val - - tag = 'normal' - if FLASH_total >= FLASH_MAX * FLASH_PERCENT_WARN: - tag = 'warning' - if FLASH_total >= FLASH_MAX: - tag = 'error' - line_int = line_int + 1 - line_str = str(line_int) - self.insert('end', '\nProgram: ' + str(FLASH_total) + ' bytes (' + str( 100*FLASH_total/FLASH_MAX) + '% of application area)\n', tag) - self.insert(line_str + '.0', '\nProgram: ' + str(FLASH_total) + ' bytes (' + str( 100*FLASH_total/FLASH_MAX) + '% of application area)\n', tag) - - - tag = 'normal' - if RAM_total >= RAM_MAX - RAM_WARN: - tag = 'warning' - if RAM_total >= RAM_MAX - RAM_SYSTEM: - tag = 'error' - line_int = line_int + 2 - line_str = str(line_int) - self.insert('end', 'Data: ' + str(RAM_total) + ' bytes (' + str( 100*RAM_total/(RAM_MAX-RAM_SYSTEM)) + '% of non-system RAM)\n', tag) - self.insert(line_str + '.0', 'Data: ' + str(RAM_total) + ' bytes (' + str( 100*RAM_total/(RAM_MAX-RAM_SYSTEM)) + '% of non-system RAM)\n\n', tag) - self.see("end") # make the new lines visible (scroll text off the top) - # end - memory_check - - - # - # error reporting proceedure for copy_boards_dir() - # - def report_failure(self, PIO_path, board_path): - # didn't find the file - user needs to copy it & re-run the script - self.insert('end', 'Unable to move board definition file to destination. User must manually copy the file.\n\n', 'error') - self.insert('end', 'Please copy the following file and re-run the script:\n', 'normal') - self.insert('end', ' FROM:\n') - self.insert('end', ' ' + pwd + '/' + board_path + '/at90USB1286.json\n') - self.insert('end', ' TO:\n') - self.insert('end', ' ' + PIO_path + '/at90USB1286.json\n') - - - - # - # move custom board definitions from project folder to PlatformIO - # returns True if the file ends up in the correct location - # - def copy_boards_dir(self): - - temp = os.environ - for key in temp: - if 0 <= os.environ[key].find('.platformio'): - part = os.environ[key].split(';') - for part2 in part: - if 0 <= part2.find('.platformio'): - path = part2 - break - - path = path.replace("\\", "/") - path = path.replace("//", "/") - - path_remaining = path - still_looking = True - PIO_path = '' - while still_looking: - colon_pos = path_remaining.find(':') - if -1 == colon_pos: - still_looking = False - path_maybe = path_remaining - else: - path_maybe = path_remaining[ : colon_pos] - path_remaining = path_remaining[ colon_pos + 1 : ] - if 0 <= path_maybe.find('/.platformio'): - still_looking = False - PIO_path = path_maybe - - start_loc = PIO_path.find('/.platformio') - next_loc = PIO_path.find('/', start_loc + 5) - if 0 <= next_loc: - PIO_path = PIO_path[ : next_loc] - PIO_path = PIO_path + '/boards' - - board_path = 'buildroot/share/PlatformIO/boards' - - from distutils.dir_util import copy_tree - try: - copy_tree(board_path, PIO_path) - except: - pass - # check to see if it's there - # macOS will throw an exception if it can't get to the directory - # Ubuntu doesn't complain if it can't get to the directory - # Windows always succeeds (have not been able to lock it out in testing) - short_path = PIO_path[ : PIO_path.find('/boards')] - try: - PIO_dir = os.listdir(short_path) - except: - self.report_failure(PIO_path, board_path) - return False - if 'boards' in PIO_dir: - try: - boards_dir = os.listdir(PIO_path) - except: - self.report_failure(PIO_path, board_path) - return False - if 'at90USB1286.json' in boards_dir: - return True # it's there so all is well - self.report_failure(PIO_path, board_path) - return False -# end copy_boards_dir - -# end - output_window - - - -def main(): - - - ########################################################################## - # # - # main program # - # # - ########################################################################## - - global build_type - global target_env - global board_name - - board_name, Marlin_ver = get_board_name() - - 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() - - continue_script = True - if 0 <= target_env.find('USB1286'): - continue_script = auto_build.copy_boards_dir() # copy custom boards over to PlatformIO if using custom board - - if continue_script: - auto_build.start_thread() # executes the "run_PIO" function - - auto_build.root.mainloop() - - - - -if __name__ == '__main__': - - main() diff --git a/buildroot/share/atom/avrdude.conf b/buildroot/share/atom/avrdude.conf deleted file mode 100644 index 1194847..0000000 --- a/buildroot/share/atom/avrdude.conf +++ /dev/null @@ -1,15478 +0,0 @@ -# $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 deleted file mode 100644 index 0b7f3fda43501321935378999e219175e706ef87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 zdUO`k;9C?z@82c>K~vJZG?&i2pUI`e@2ed}hhMSGjvPeNJyg*wFvly9F4tsw|H~wK zQWR^+^7@YYQ*cAnb%+FxpaP~*n zJ9{}de~gsxJ`v?*hHK()GA^$@IyQnf;i?(dN$q)&A=^#MjBnIt!q3act&05pMD6=C zP{^3#0!0P;egj`#jSm+i_%?>A=IDHXI>*zsL=`rU+-Z^WY2f5^>^5)?VB()U$9+#2 z`K)uqrCL4S7?r$+q$?wHNXp^*9!O=lj-3RF#E(u?=w3osMb=p8A|M31i%?O)l?rXc zdhl^ChP$)-_1Dp&`Qk3hk$2yUQZ)TEZnBVH@p&poDws`#T%gU%s8g+_%Uo z%3Lj@_kfOjSEL)}MdBoH1hcH7{LBDXQF60^a>q>s>Ky3c1MxqkBO zRJ^6R;*Fi1ria9b_881N=ofRKS*J#4&Cli-J9FzsFRpe~U>!Yprd`0p*9AmwwiFY{`Pg}`)!R{PRonJrBK40~! z#KW~Xu~K~kRz6IPQThu1C-ORD;c0?c>{s+YZb0jFcsmjVtJw3a!3Bb*I+lexP8}7E`F-T zdLHS=2eo(`W4(^sKJq}%p<&|LBf3v5w3pONa$S>@+03^!sQ;}y^0D-SX57# zUHhC~62#|nUFZ!hQ^QXCTTZjN+P@pYD*gLC0>%`w)J}I0`bExg3+*yPq3aPamxb!x zM&5mdRzzwEWykCU!gNfHB7(B|FAKOeG?#_-3N6OIusb~R3duNg{uX2dm?)Qpelu}d zX!fe9*LPX?R7&^ zRP@nNedkV$%D5WnPDHK)nOts6FX3|YMg8UGGX?T;v)usoawEqaanZpezKY@X=KTPM z*PBAMH(pDAFuAziq&I0YuNJxUMFOt6r;k+2;0kpgO_%39Wi|9L*}R&_1;+GjMY0XY zDAK&#(%*nH6vcW@@zwK#rgJ@eZJ?g0Y$>yb5;Z+ywgoZ0xbzK7#o5-4fR`V~rw+iER*=rs z%i`7*y|F!ZZq7i^-9H;=&3SX#<{?v04Xb@J=X(e#L*yF(1~5^E$b>lj2U446%`y{ zd#?Xinmiti6d^}B*f zEY+r*V=PtfT-(6nhmB@}4Xl3;kmzchg1jrumYlmRRX>kvPJ>jLuip{EvlQCd%64ha zeoHvrBfOzO!m6P1e^pRdOLb+==tZir8jq@(8bGj_e%WNj;{tU4Y=tKA+@lYsD6aSS}o-pGTo3f_g*Fj3pT6D5?fN%lE z(eZTd7Ydn8~0Md)Sx!Mt$-#noQsJvn1EwD|kyS=^uTCQ}8>u4w19J>XKD;s!txN z$>cm#k{epS`A$*d66L)f^MI9gc^uyOpeH);aB+IY`jEj>*7WMyFR^a&aB-6b^Kg41 zFEu(`e*bbY;^s9)lV!TEuPN%KM4khgk`p;aZFnP!7+*9=Q9&C{-f2gDf4-(@mV&CW zOXZ%NGl?{OP0?RLBd;mik3jhfMSTMOKxN@m&1;I}lI(j;(G?2Iw+&pHvzCN>P0=Cq zLCDt>%|&3;O^O7WnBOEk>}=K70J2rwr+`k>zmdGNG@^jl4?S*YA*MXGxb7HlqW9i-nLfncWJI!M1Y zTVVU`Ab-EztVCYFbbU`0YyyPo>Ek>-}c=R=(o2Nlw`jR&&h>A(r;&iM*3|X z0_EQ->c8|`IP>*VV{$4<$bS2pgzUG}LiAhXKYhJaC(ZHtZAi|Iz{q}42Y1kx`w*Ba}?FU5#`|Xe|fqsi;GN9^-`EO-df~D(L(9BD@e$GdkBG16^i`hc&pMJuisKRQ^~=8dj~~L zzb#kPf9W?X&>3K8u-_&qPq5#5px?%Gyge`dwlAL9Z{yCe{r0@{Th1ceZ_i7=%|P7r z+b(~_j`Y-)v1?mZg z2K#M=@&x;>5Blxieo#oA^joR+TfLvmT4wvLPWo*V1T*8UPWmme*!J5xf4>b=B5%Ci znEknJ+fWoSZJVyB;CO2q?6=btw37YyXm;6|+HdngBmGu`K>1~g`Y-)2n>{g-}wU146ot;sG$3#H%ABO&{3 zBLbs7R^%W1&B^Sy3$s^|gZ=g*ikg0F`M>KoE6`0~Xt3YDRXKwFMn8EJu1oGP>9@*t zF0WCJ&Ob2>U%?82nU@Tce%lYhdJP&PCAfW9dMcKq=PkfnXR;HB&Ox*+rvtJ_X7kL% zKbU5iZszT`ywXi@fP)F+G9OHQbdZo(O1U+!i^eYsoAS)9Ep zZAxTDot4>jxG@n0?m|tXKr;tC=?2rV;TC#i_U9J*ZwoEIMo~dK+IyL`qw;sP#%`DZ zP|IA)#uGJbHXDRInz3O8j#bDT;BliQuTADw654B4_`Xw$(li8~kzIuh5xCt_+vAZ; zDR6Uirj{Cvicd!oRE`bFNlrRn!K08-YcgaJs-31Ej`WSb^xZ!E6ZPp8@%2VQa?3H| zaJt~~Y)5M~gBeM6zoLlwZL4xI2Y0eFVgctz-Ls4JVZg(zitDagX>F&wfG41d{rMQ+ z(F#qDLCJyHX96dW0lo#m046r{7~t4NT1p=Sl&4B@+gGN^5A8%`oG;?^Xv90EXR|nS ztI-|tkG&_DHmci+_Z_Gfo&E3M7{fb7Jut7T)T4la9HFESp&fq zuKoA2z6){EXP1yWWu2+87qe*c&!J@h?=L}RuIDsZlJ|DdecC22$}C5DS?WouxXy8C*{|Wfmh4lHtW*&}GXDY+PC)$L+_F|YsWw3WlfFs2 zj6NqDR&A~~co&nV)91AGrSJ3Md;8K4RpoHS=WtCo3*~Ul>7zB5i#;d%b2&boit{y_ z!#@3dvC$w`Tdp!#F2cO2$y{yOCdrfVsFGQoHY+%|8!XRO#j-G(f`TwjdWU>14lg1f z_tUJ#=b?)qL0)nd9=**340JBU(`?Amm4}g;1fOLcO9C2e4PeGbW+^Jz7hl{(8h&I| zWwHuc$}Vk_y_z(fy=()G%sRhdwPH?}Dzu9!jx~qu*KMtdvu&++H)u|4gO<5fLEh5l z_gSsZ*9P?UsNQRks>&N}BGs{Kao)iFd)6FFHO-?st3kUg4pMDbPF zpEO9dS=CC*#thJCEUahqJeT!z)@PRRQA=osR!X5&?1xl#>kCvHpIcaYdqsHNsg;yy zdTT3n)9jOM=_cpcZW)zX8gmM~9`zP$4CyvH61k&u0m^gmnKdT7^sQBEGY;fh*xer) ztdTo+;wm}O7fGL~k@!V;LOno;71vAEHhFewpO@*R2WyveHrWWnp}q z#S~SdsNrOd$jqk8THIl}o8%(yCNNq{<(2K5vbZ*Lc+$N)>q`*jN#Z?{=uDCqcy5*= zQK!!X2ZP|=ES8Oh(~p>b;cpi{YNi6oXF$M7jx5(koGzU?2{}tLT|PZ#et+^TnRA%m zfm|t>-DUG?RTej|y2(!nuFB#A9^J8PwMuGtx;)0I)=kzUy5vS8IN59nHkd00&96?&O2;q{|?gG+{#8 zV-Anb#HFya#S~sNKw9&hc7e1G=bp;HR}9UH#?+r1p{H73Fh+AdKh+{Db+Hce zPf&&N*>e?jHii>9_#T5;c>NlyC%FtydBC(^_B6X^&9XH4=UJN56%nNIUxrV$mtk0i z*|J=tWhzHP(LJ+nB`c>b1Hn3gi85`eL#*Ne-F@**Ti(;sUh{fp?Xz6bpec?X!k*+AHf0=i4Tppr~LIcdMr8hS{?8nW|9E1*U_=%qgH+ac=Uy zk<|*}gy8G|q!uUD?$cbE5A;|0c}c&`Ksg^6smYuVyd=pDom5K?R*_lyQ?GQzGEEjo zGVWE5pB-U$IcDQ#Nbd;qHiGX9*b(L}gc;mVhG(FCW)r*cE~*>@=Zj~@Y%G7M8=B|>&$s|ffn@a;*qd)R;jweO@Wd&|fKX>{B^biX0Ozumk^WDgQa*z30t)P zutC=ArZF{Sy*+$ASvl^ff^`5BW!yi4SjBk?^^N;+n&kEG?cp!1TtydIRm@jZP!*-? zJXO$CwkXIO_t%8`*Ju-mdsMGBNVP|`YNuc6Eovwn_s4>ze%#kq&@ZF;=_eG!fxpa; zF=xEL)@+Xak&RTdH~Vq)?&%vfhokxtlS`j)wnQ&xpwY$fXwCZ2t@_$WaX{aPULq%A5qZmNvLLbXgF#3SmQrHBab!a z*CN2j8p{wcL#J^_9mZso$q8R(t3HmB$NzB~?NAX;2O3 zrOCA5noJ6vrLWg?@7`i(sOc5j{<~1ODg9JtX}SDw)%Mf4VR2^IzOB$Iit(?|B$9F1 zz74VgOq5|e;BpSzh-tiU*meq=q&(2^1BMk=oV6$;;uzKSQRsSBv^e~*g*|0q<)anh zsZEu>RMU5}w z@IJ3=&0G(!NHbbLTanHY(B12yL078o)_Yv*8y4%ffLIpfiS^geC6?+%kLs~ZvA(|F zu-GXme!|a)^`s(8Db|~z*Dcq6k85v(V)gUHk{Rr03aTQ_o>23vv~}$9&XwJPZikLHR7X)=_wRzbx_g65;p`Ig4PtlQ}N!3JsS zl_XvEn1U)v^GWC>OVib(+20_|R!`SL^P7U!ljieK!CGz96pyAPr=gzT@6kw?ZBUSR zIXO0byrnwVqk6tUs`MRph{*h>g?h)mlxT7IdeYF5ZU)T&CW<3XT?I$_VbqA`bEKDQ zY0s~J7y8BuvJhpAhVNBW&>I!&g(cwLo>8dRvH{`#*Qk=N^9Vn0kg#T>ZJ8*kSj8>2 z?rlQ&Tub$=N0nAoP_{ims*@Ge#8TZKy2n!e(^8qq@p%e8&_cU}-?7lvSF1*hH`!zb zoC4J^43}Q3?Hp@itCf_j>4Dg7~!hLd46hF9^~eV`P&Mi zfE)Y}S#iUAeVz2D3Za0{1RxNwB2TSVn)|CpSmD3?(E18f+AUlYY63=1-bEvP%XKr& z0`8~50l5`Ugy>X+xQl{&B5F5Q0pq>QrL3Ek7_rdu&@wdsl zjYP#GP{oCz^RL$-wgLc|_}+;?`7MglYnv)tUZUAkC$Rk#($uufanBFEWywAQhjDa= zDk^CIJMRliDZUpF_FyEl&`L^nai~4ym%G_U*IKfL4U)Z(K~~XGVJD&E4fVh7GL7C0 zy|}AF%Pn<(P)nm%AyD3?LHeyqk009OZ2!}H43*dHnvh6&iznreiU|D7Spr>qv>L-c z^s75Rbo0$VY1q!gVHn1>@MB`py68G!+W4ZIGq(mL$Q-j2X~xTzg@KLRh|MtR_4 z2+Um{cBVX!fHUx~`1>KE13yAw422Dm_&z(jIVo_(@VIoz-(5$JU zH*e5>+X}QXg7u0B8Ub%B%tvU}D`yR9Dnl*TE6t}K%`=J!(o}mi;_N?CP#fiTe{*MB zsw5`YMxxLrBXf{yJ#LlE$6PKIRBEZdbnmxRgFLFC4N{%&S&cOALGW=C)k!z9!+|Sj?5+S7)wwd z*BAaE7caTEJdaGM{a&eAE1qk^EM9@+Vt2IWv-tgi;<(_9JX0<5oj~avoV?0u7X^cK ztdriYFkTaXFwiVw@H#X#4d&$CEYfMtotm=}75DVzK)M{7OS?E;2%#7XS7|WXHeLzI{$?jG#owI7y{IsfxDtP( ziKh4)OSHt_c;d)DAaJ^!+6ENwx@nMhyBV_t{BBGosJqXzp>72Ly6=m`-D=@}+z(8+ z4bdM;Sf)CAO%RipkMO!HP{@wuM=qBmyFCNzKzeuFd32L`(#LKEFx@U7$tM!-ehTJG zpSie*I^CwR&cC_c2zecicRx4bHTB`c@)-Wvbs|wRb=itmxlf7=E~mIgu}_L(OV_5o zOlSPQLl9Xf$m9m&V+NUj*bvFWJ)>EOT_;69MBkei@~xAW9EJs>p0f3@&gJ`TcOu?f zTDo5HkH;OCIQhv+T?Ogfd)?u;!#wHa9|b_1{C5m+ee)pP$(CQC@H!Zdta8K2=&gfU zE#$LS$0?|WocFj3$;s!ejt7H0XLUAjisdP;nF@_VH~hGFyXy$&b5^$#&ZoFu5I84D zyA@ty&{%eMza^YYqTd2#%>M^PWte|0D#gd%0E>VBNufI^>IS#Z1|>TX$AJu4Yjxj2 zvVKaY!?KNnV5RbLA9Pn)szW@giUz5wJgW2nm4*)U8k9G;BKR2#O}`dS;UP`e_m)SU zkq>F^9+MMZX09OSU@&hio>l-y`#!I@Q$9}R;Y|#x;;Y5RjiO1XTsIB98{147+myFG zro?!;J@PX*Ke8q zip_pSvX6a-73^f#ove_Zwt}Y(q*pIwZWYK1EuM+8zeipFP&h&?p@UK%aS$4wQ_nUEOBgWx8 zof&SF!Pd~dGySN>2oGFK7%x`_Ch-~njxdW|G2_^L2HA(s^qFW)R!1qp7xS7D5;w#h zKgS?5B|4fC#T2Erl;8+9C0b)KLq%!*wO69GDX|qA2p!L=!}qWRHj5E|fWdnuNa1I~ zq23e1m4lG!@4}!$t)=9X47nw`T#L{ zT|REz>P_$nT%p?p?N^?Iz??@=vWWt#)98SoOa6+a{Q#7_fI$0AaFl%%aH|V*i}t5K4me|t`)!jpy9D!}I@%BN}C7Sp;=v{IUd9cKEC^_u&L zt+$Q~A0^|E^)BiynT)`+yKvuk90G44Ag=g6Eww(421MLPtf+19+?)~hKZ@{+%9Ru6 zB-Wa~krs-HmHb6t+B(OBK|t7%YcF(#13;4gKpGcD#pj!l{;A1B_3C#GZb9S-1t4p^_It#yvbCN}Aq0T~S_34i9Iv z1inV@1lMNrEp|V(e3LxBdo%gIM;1SxX5eOpZ$~EI0=I0lYGz>5tKweCPd{e3hAehqSCz>(!<}OJ7I=K8XYy^!l+W_5%;Y=P-C+5y_4uyIAe?Mzl)89JE#<@>o&IirmevSn8HMsBIlmH$IbZpgYO(6+USDXJ#f}D3hgvVyG*`5%C}9C-t(sY+~HeQ zf7f|@f6e6kERzquM7s81H6pJ+M!Rb)-?JXys7zDqm#IJ7-btB!W86&(~X5s4Z5xC6x7z5-9_%1mTIg=wKY?$$(h4$ zh^pAIOXjRE_17pp5#le^pfYV@g>jllGEEXnKv!xnPhoBoNpY$=C&{Q=FHsk{(3#} z-KWgvc?{=K<7<8mna*(Qc)+w|DY9;c>IR;RKxiwr;`oya;o1jROytih@bSxm8xXh_ zSp)g=3fmD78_80_>O){7GL(IEdDx+zTi)al6#>kU8u; zcAF8ijWwBhSsN|$3H8j1@-xT6ORwg&m!IA3tQ^4JxU3l!{WydaJT_+j{5Qddp`hBB&kzQz~-mQ3ushMSB`Q zCF{V)v@O?ooYyqS*#~nU^AWf9x`LW(qI*QvOiT5&NA-1sRJ*UTROw~fFI@e;5aoGS zZ4XT9p4SBm;R7DG2O!I_UvZ!2K7>J-K0vGEfY@cAd>o~{CUfE82T7iksI6PECd>as z%Bd*-oUeQWL&l8gieEKZ_C#j$B$R!VuAW@Og3RqZphy1j%Xet}z$05fN;BG{X`_fBjo(td=b4tFfih~!w9Ia@-jG#JR*sq_U>(3j88vSrR`GyBeGjND z(I{Li&X$IDm`Aau=6As+t@sZD zV=`ftZ|uMo<$e4K*KS)e@nZx+wdsMMOMd|XaF$P(eb%)EcEbqI_M_PZ9;@6Y)-q=ZGW$W{H*w){uh+yk0&-1sQ_P7|V zBIs5vu$Po~#&%di2Y^xporysCdl`b(rtNh^1-;x8v^=iZ;BT$)*TJYR)SJFo^-e?% z48}8Zw~wH;rYvG?3mdIV44*jkkO_w#UpaiVvoN(Tf6Szzhm0RPdi3!_kC@o2 zr?W73U0e~vk8~F1t;^LIan8d0b&b3N!T^AmzygVNF&lTP4-PpFzoE&CxHnOWZ!?FX zMchVcif=QAp_9kr55LV144qtA3?#nIdxffh2A1E#kte@Zg2iQgBlo$B_rT4{y{8{i!qLcTVm8IU#{ zimc7UzpTiml9;nh60>8CfX~XFv)~jI$j*g!LiYoZeaRe9gx*GzvoB>ZJDL-{0{kS!b?GfvXc6DOge>rzDPyAkx^a zM$Xa%PgCVIbw?tyGBJd0Da4Utc>TojthC5o0Jd`yD+p`ho`uNj#L*<^;GPLsO`;o{ z(9Jy`k+q33M!HL6ePSRZ2TNo_qJoi9iEK`cW~8S)eXuoA*dCEyBHNC{FBG&lp47w- zR5_uJ(0?Ry1E_O{QRUah#v-FAXFb~+Pc}u;jSM>RS!BG4Esw^JXp8V|Cn7ls-Sj|O zPLv#t*vV``9&L!Joe`1LH8!=0lm8(qO|GIGLtLgO7g7;v6UOYv$r&o)oanWPL>~hr z!au3a5HWfIWk}r#V90GD*bgCMZc9@P29VoIf}f&nZfgcZ zJ3^poe?EduB3a|{FRyJG$`pKoW;+EJ!@Avq?XcHS!7L!d1*@ znKy?OR>jxA{pFp+@bq|Bl+ByV@a%XBZO@xG1mSswCob;knfPjkm&RYj7|1)BieDDzGevo)FnwkGGbkeuFaE*{eB*o&DDPB;SI4Kp zrRSZ-@FnrH8D7e8P5e04bvnaq;tQxSzN)}k8}ArG_)MnP#V?`0mNC3OzJ)R@XZV&l z4`1f3V7G6GpGy47)4{MQ?xJ7vR#E;JvUTh+j+m z`3!#*zmM`shcYp zDRztE6mktC?cE~YQRiLBNGG@1oarY!c~?_~UEQL~30uoZH@E02%61JS-QA)ww2o^> zB2wxWwW5_>$F3}Mn=Pz%@~*!ImGyI*@mEgsZg>g&Yu%zolxF=s$XSo_tr5AAb*@jD z(M)ZNsSa@(u@d%##6u>|9#B)3d{!axCQhS`2=goP1Y8U4UVOw3q&BAm{XO3aoljNY z^gQxn10et2yjyQZiWva6O$8D!+@t<(r(Eecf3iGp1H;4Pr&ALf86FiULEaq;5Z7h8&!>1JTakIQf?g!7(LTda`s$-?m6jMbLE;K<^hE8DDZQBKi z`nvpP1rV^H7MX6r*Rae`!4_yFT+kLNSp~O*=;anb)|`Ti(b`DCjVK!}I2!4(f|<}! zykIO+5>Dzo4Bcd#IVg5uGTCtmSmRyM(aBEdBgrY8QSBs4D00+k@iE$%Otzg5Ov^bl zr#s2^%xGE7UPi>eom`zLEU;a!ma1< z52Mr_{^dj|K{0WxQ?dkvoL`XBinZGU2Oum^R&Ai{jMm*y8u*Sjn-Z98@*-yh5>h|I zOC`%sLNF&vC8fF}FF8bl|6*QRfHu*Hwxj>tf==ky zkQ3UC?n-s7L#~B(|D4cDfnF}qUNi*ET+!pHp3fq;>4U7GZK~`}RL_e;sy7F-88WFp zOpVGFE7g}5jVW=yM?BS!V|-~*4LUH@|50F;CX3dx`T-Q~mSoXGs53Q?)o(}^#n{q8 z)WfD^(a(?|HJFjj$)a1){!}?5TaraD<6mmXF0gG)7Cn!msWfwTB%8r}QbXBQ&n1gE zOj8xi*pn>kF&2?wU!lm}WYHar3}@tvWKkX?BN*A2EP8efA|n~u4>@6JsY7x>4fGW zGjb>+{Zh^N;*QjWiHM|A%@$YBaZ-n!ipZ!`5p6wncnu36dXYzJL zs!~NI%sG;g*{PzY_?Mdc4*piBipIA`!l=>u! z^F^v?Fe7sr*_V>*Mrs~yYJW#v1;QeiiP6i;gKpaimqHPpsAt%kzw#N6<^u!NN za2kzAI*mu-aVH$jIuS-FWA$%HZY_UEi?R1TtScw_8j>YH2ep`dhLFQ+3Q)*zMcXiW zoKqvUF%nu)a7jf%CxnHDeQluP68Hz%{cSdTKO6|KaOcu-_LZJB5{8QHCQ{cH_$A;(?|q)jyl)Rx7NFAb-?WdOm` z(`M6}Og8%mIfvOCTA;}pPXRQ0uFa<9nQVVcFS6M*GRX$zMw>`uGiAh&VWNP9P`@mg zPBptdbQ@%7-0B;o=0v%O&?<(75YeL4FV_gC5oZ7e$iUr47>=iLF;S@jz&CFD3I3{! zZPH>4(hFu|1ULo1;ICV71O8&h{~J`AbW1Nlc474#yu_x5*k0kuGjN_zZh^97GVk_c zdNkggh07SubsCZMYJA0(lTMo_LFV=)7oLQ~;xRvM?`wv{%iOBoA&FPQ8S{gu+f(@M zX?dRYGM8a@a{C&r1J6<*Y+F8Vt=r*Fq~E_I>~vU~iK*di0OJwsG!4fdPm}05h?X3q3n=4p^V6B{%k8_uGy@Oy zf5_GiclY%&4VmsWWC3nUOf|!$n%h_nc!#?ji`h?xovwxO3GPUjQ@e2OjX3vi(?QZ98-W@Ieg^sh1WHC|k*Ol?OXD7;ZdkCS03ZG-8nd)vM{59nD2dewC2$bwm z)Ka4_w};eRgN+b=I%73>G5&IWzO(*FrO1+_eGJo(k9(;54=c+Ikc%vrQkH|MnS&Hw za{{zB(H#kWi&i!hO0B%d0JVZwR5>MM6mGS$9F;eql~SwlnGmD2hZd5^B#oQ{Zl}vX z+3`(Xr_}V%an6{^Au-tvp!bbYm5FD5@M1^5gb%7ZqqVOF$#lT*CmX z*@i%`%py|dhph6GKd;g)1-aDNgG)mA^p(G;vCRF{)_54s)JTm>7+{TS5$Kg!L~48# zIVIDSETfTVur{)+o62+v`oM*vsS27Ae=Vgf?aOTK&*aK`**?v^8b$khxlY-EzDg%+ z`l+_clBK>}t9SkisMGre8o&=HqTMSM^NiI&-H%vJ>my$52RgCu(YU_yBQ`(q(m3nc zu+#5k9DMi}OFx5{46eOOgG-ov+#L6F$RmTR?Q=S~oP#+IzftJ=D#*~tZG-9rcBqAw zxIIn3cw-O)lqHKa9a9)n$*+rS;WNC#gE9-t0FHVC*lewpU8Pdo1dUz@7V3wZzERWf zLi+8RE}ewUUZ?B<&E1OJr!<%PmM(nJm-$g3vxieMQpMVdlBkP^Rt8L>&-`Gs=A3L> zRd;Wp?ST*21Gk}V135w-Ris0&@!blb25}4;JN+IgvC{*d#{eWmZ1YgWN*b$&x3+2g zhYUa&4P|dAGXZtrr8WqnwUm6InXeepWh-dFdzAg{|u7=a$l7P-$vtYoqlYCvvw2R;L8DaRX|yBj$sN+MF~c6f5U zK{>t#oyhU9B9m1>z3J0m|6MA_F$nZvw#cyov6An#Py=#^{+t1?b3naNshT>@6NApz z45k+-M)Mc7E2k=QH^q4IP@u$}&P2Xwx;Cy13?>FX@pQP!P`R?6=V z_E@$akM6yZ%G$zVT&fna-IMhF=5Q_50^po*GG=i@S+ zFg+c2Yg=5{Lba6xTf#(+Q0h`z>0@m{+o2zlJHCt-bwgkx0wotK=v^eR4RW2Ai>=!a z7ui@iTd(!J)-Fa}1Lwd2tkF_cq~5WZ)aN3338_y@#P?Ik-ZH&!P(ma}GU>N9@99{RQ!1 zJYp9<>$wnNJc$>cA~0Tg4Qxt1Y>I)IGjD8A_(Q^=1}Aj3d zwddhm=rAj@bjIS2BFp*ZFx647XWOKH-{WC-v)Wiw?Q8BZIH)& z8{{$H26@c4K_2&SkjMQS;`#UH^`5LgjI3fAfJZF?6`k} zJnr8hkNY>sZWxOu3RzSrghA>X&q}|)0%V#*iGxfDBRR+S~G~= zBi(p>RX@6E-3}=S*iGv%u#FTmo7N0EO=Z)%C3w>@-==lUw`m>oZCb~Co7PQzo7OS2 zX}uqm3t}U|rkmC=-==lUw`m>oZCb~Co7OSkrgdx@7Rz+gI_BH7j`=pNW4=x6m~YcM zb_p(ex@jHrZCc07rZrb-HpI-Pbrf^oO);}+P5EDpnN8~=q`wk72PUSQ)-m6vbq7sgb)kRLy3oIAUFhGmF7$6&7y37?3;mnch5k+J zLjR_9p?}l5(7$P2|9#B)3d{!axCQfcYg!z>?H?3*+!a4z| z&FIvyX>E3JWt%l$wpp7e^E<8tAjWOhe6!8k6x*!%y3Kl^Y_sOKy&ISo+-A*}ZPpgt zX3dvv))w4m&F@?VfD@H%*8FYHn$eGqhF+-A)$D}pwFq~Laho;2FTqGt1i8(cKU9L;X3ei)Q1^{wn;_YWBQYoXBmTCG1Ja7Mw0a*=X`_?N2XqcV zhHeuii;0qLf@IrI0V_5S2BlhzMS26<1e)*moXh-ym`6DUXX3A0a321KoHm^GxqsU{ z5F-|!De{+-{@yT+wlk+=G5l}T@jA@o+dYnH?>maDgrx2l{Jo6!ZzK6Pr7Ix*fa|-_1?q_V*&W*PCeWZ3rBRK!*(q>SLtAT`C*h6PqN| zSXXVuK2p5a3_F&hu}euojXg|?!xa?N*izM4M}1IU_~t3Jm_4wE53&m1dzLTy7Wl4c zkZ)}U-$C0{a`wY&FhQ4CaFX7*xY{{rk7i$kyQIyUy;vGoiXN4APQ=2{L0|fCdjdH2 zd_C@09}e44Qk~)J>Bp6HQ0b-Pt^U~YB~_X;f{_`1m{kj52VJWdxik z?IeB^IR_o-Z#;ORYrav0%EnzV+h04YBQ{B}hQ8~t?E4Bdn&thbEAtdb)A=MYKW-g2pG`YfvmLqb*mekh1f$XpiJpZh+i{U! z(HFBFFCgcjc0TcbG2%7Y^-%PrfPlO=c9)Q6Wxo*Ra#qM+3izrg;1UYxylVv%{PB#6 zfD(NiQ3`mPU(riR+~_?BxK-Jy=xezmO3Dt*9< z{}hOJEcdtL;Nk3#eyq+eMNIInGrU}wcJyOAo`F239fF_!0ix)D{+wn^!X0JjgW7_t zKikn|Z`diFL+XK?4dP0vYtTK8W8xsz_dGB?c{$nDCxj@RzWhb@=s8H0OTdheuye;t zN{4S16ug{N*1LbY9Qer&eGM7?|0;axg|G_U;Rav2ra5Jt+l6I{7^Wb-BPbg#*^0lt zkAR#etB+IWTP*t?;QEmEcYk>4RxcbNo*d()VD5_zg|&do8H=ZCuiilSY2y z)7`#rW5bf)CLQ|Cz=j*Y1(&$}>|)dbGei9;-+BsiAVUM}I+qh_#^t2cWXwa&a?;@g z&2mywXA!4E>HK`W4iX&K7CZm{@5@O!m&^g99JT}1qcE+YOz z7ZLxVi-`ZwMZ|yTBH}-E5%C|oi1-g(MEr*?BK|`c5&xl!i2u+<#DC}_;y-i|@gKT~ z_zzt~0*5Z5^@lDZdgvljf9N9OJ9H889lD5kYf9V_{l7bO5%C?mh@|TeT}1weLl?37 zLl?37Ll?37Ll^PpC!*&YJaiHNuZJ%5kVT?xs2me^-DfY8V5l`J8qeU57@CcmF&Jx(ySqV+TJR1&{uz^7ozGi?_}2`# zW;iSUFvG)ovcmyP`r3Al4qw?hbEcGd5&668VIRcXJ zKLV0$`y|Tz|2qPbO#hAie|7{UIhw~y6qhRqR>GTLl za>5`KmZ!#&l?+0Qq#K8?YEM?vl83cLiXH(;&iovjktg7jvlx`8e3P@eQf`ibBO} zUx{-yjdm|bKn_J};0Q?arX!JOj({X@?ST~xGXQRr0U$>}lD;D#$^XOJo5x30WN+j5 zraPgNPA8pC8WKPVfnZodLJ|@PTL}B60fK-V`zk01A}UMVMqE%(P}Hb#M{$XW3a+@~ zE^Z?-<5y-x#ZgDp8Nrp`^PD<$>5ln*-}jIAem?1(Q+4X8Q>RW<-KCZ-w2N5+626bL zSppKipR`#55{_8{5`KW;W(i36LDFUkNcbVrW(i1m8?!Y_K*HM@ZkB+AA0us+fP^0> zZI*z9pCE0PfP{CDHcLRlPYwc(ECC5WMRU}dB_IqHOT;Y!2|qmrB6j|N&K(f?f3*Z8 zqDw#`o!4mSnB_NUFTR@v7Ad#LAfi_D(BBgJEHcLPvWu(m#kVr4CH!w>;A{C^~5|BtAS`$k^ zRv}2H_nIXjWZ^|DO;Ugw@QsbbJll)pd~k@l90Bc^yM!X(PAkf+jVLR_E&o^`|8unI#hut4lyK%Q#b=OF%Mvu`!z_lUdGCvjilwf`f)x0+QLA zZQLvY$?U@=p1K4ivy#f`5|GTk%wCs(WXgk*E&<7uPw%<}By#{Qq)R|D2TlQ+E&<7` zVvJb=k~xS~rAt6EW0!zr4n7}AbO}i25Hh+1By%VkT>_FhjEpV;$sB$Y7{@FD$sExL zCSaC;WR83uOxP>|$s9!{+bjXe98D(IECIoHvjik_;#kB?GfO}+Cy|+FmVjhVnFnUESpt%I z@&+&~%o32yQ=bG=XO@6up8heIwPp!O=2SwjH%mY=r~QbS&1MNm=JW`jtsBe|kjxp3 z*ehXqJFv&gu!V9cBqg=4={qmstXmIfu-vW(i2V&0!%ylhDrNOg2Xj2l!{9z#2yDN zFsy4MDqRA95WU+*v-X=r%Y71-yA^kcYDK!7X($z058mv1{+?N%Z*DR2>f z+i|UhSW)tqF~SM)7UB*>=(nA$TuRBeovgeiAUkB@k;X0FfIczVw_jfgg{bByh!r19 zb~=opQ1x2~!3@A>A&V>TXln$vbEgfWKjBTe_mXN9-nN*f8|_@u?!-?2!aP_j2o$;8 zTsJ>4+i^DFjZ*$E5ZDQVrI`bX&JW`83cJeh8eq_?ZKC?ufN0iJWD5GHNLBEOiY)=& z9T4ckS;SrVLCBWL>H59OJSFjb$qNCz3Gep1Myy0)r~4w7bssGd9%%AzW&YuH=nHr` zR48-a_OW2K|HNc$`RcQeZvH6P4qPqk{+;&pZCJmih+pE}Ply)z3@_l$#vElb>%jDU z0c9@LJm4yFxd&F_eSH2Wi24dL`R{>9KY-VA)hf6aN_LT1iYTKmB?0)Q83?PXGFsLF z-u?Dff^UMA*=YHfDGVvLp0K(Ojmw2@f9W@ReY=^oY{|5sSO zsMkv>x}R8ncd7-u0$}-6>~WUvV6%WdR5`xigXGUD6rKsFpnJcC`q)Axeh#SP)F0!^ zS>r(!Sd-rY$QOV?YvQ|2!D(vY2NAwc!sT?Hf;TjrzIE7yi*NBIX2F*lxdV}z@D4g& zDgCM#ADC5N#&y-WGN)ju2ET~lY6<3?Q>S2cO!#yYp6qLF^)7fQCc4f>ce2st&uH{J zKrOdM-$&+$*cfX=i8)?P^##P7io5CfAM*WYZ*lPt>EcesQw-j7$P3-+)o0>)yd2PSs))&Cp9>2H)iwj7O}j!}9Pm99kI#%v=09@ri-(N@?=2W=U~m@*8Z(qn0k21FHX zR(L9%3Si^-?LQJyJ*-~yschP8;d$~lT+&=5| z1p{NEH`(a#tyu~t#zb$o(Z{SdOQXeV{rN&aL7o789IgiN(?dd+XYf0KpB_xqK&L;a z^ZLznUiL}@%)uI0!zKgF!5Xj9=KcAF!Z($s@^Kx<02mwmK$4FLNwI+#?%Lyj3yM^+ zHRWne5`&jpKNnGhG7;rYbgBclCQTSRzPj2OTnEqOUv$`zB~|7dMsSup)PA5ykPj4t z`N4yKzKMhFq}!HxgKtJU{zas`h1ak! z5aQ#8R7vZE97J-X3B~Z3bUjIIQ?-q9?<0NEV+?5#cpbk`;9`v7LMONI6TMwg8E$b> zQjpehQ_kjXOhU?ytX6-@zsUts_>~V2_=ou~H)ROps!|s4UtRD6{Bwh^ASxlq&sF{) zZ&U)v?_I-GS% zHjOiZ1NrU-h^HLaVBu!c9KqrGl2tl zu;hWzNvOcUJuG+_wfhgGXb~Vrn2yB~WK@G-=sv_r=nxy4=|ngaIFmDhajq7_GdUAD zP-SS&1P%-m+V>&6GG+Kqgk*7-tdz@`eHM4gN?9u;CjqBiE+i)b2V09yl^`F6WYh`V z#RQxL9Bji7v>(39Oq~xG52pscMo{Pi+?l4P)KlNkCWNO3@1+Wk&xd9g>d6+5gwSx`NQKpClXEg{wuNH=>gY@zW|?h$JJebPFeylaB*w zWoIHNw3F{!%c;8)>Wb2(Rgm_>eoT=>ne4lewP~guvtLF)a2o>L;MY(xA(#N#7aWRT ze{czY6N7#6n-uH;l~Qs#;Fl#zc?ZHQ*{}GY-j*JjnvS?|_~HLjjn`oA@FN6wLM<4+ zjll_~0u#{=q@*Focgu00vuhyd+k<>Ea%PZR0Mv}u%Sc8+M%uMOlGLvN>W{P^1v+#F zKqDPGgM`eTWX=tPX&sJyxCZ~*EM>Bfggl$Ed#_>W6(m2tjj6)af`MxDFq1Pz_!dr> zSw3uepOg9t5W|u8Uqw)8Cvo;o1PLQhDC+gvzk=o1Ei zXH4=r!Xt-Rkc7}dhJW7^v_JFPVQ35I+KD zbvhq(S%@D2v+_yz#+G*Y7lKA&?e*qvt!r3f?jP5xt;q7@VXNazGDNj%C*%R7ZPi{# zZhVy8L7HheyYn-U32{blb^$v~r|s;;PIeax2Atz$Ms9ZA*N|z)8M)b=7}1V1avrNz5Rk>~kFp2+8)S6_yR6FaJRd!pdZJH(5nlEQRl~8jtJc2qRV=?364mlYB~SHOeM}^d_vfB zz;=_>vO8omOW%fvS9dR>_{;7=)unKQ5@-~1-2k8N@fQlcARs-iJVrZ(x2ZHNCfDnb z?mBfUO7Nmfdv8USMO##8Z+nCkr{fXeDh;Wc3EYp}R%op~dm;R5i1+LYA{~QV&-Nfn zK$KJsF^2jK0Ht`yT#aA8U~o8Y?eH^FOYs@iLA0;*V4d&t9k zrYRn`edguiRVdzWm9&-PzVCJcUN06^is=;7B70SAG0poocL7AoDU#v~JZF$^Ge-GZ z1wEtSnP#8XO=>RQQT(DzD=@bKhSpyy)-Nu_oI?D_P6b6)u{0 zXmBNhi;gP8T#Ay0n)+pGC%-)%Y>qfvu14^tg_m3ZC~obgg+Kr;WFL&!SzLOK%MNGz zH)t_08UXe^TffBuTxl`$q{XEC8%O+{`DD7#PdssE^-8d7IJ43b&ofFfB4DA#q4Kt;;Z72=3 zYueCqX+w7dwkTbNqz(11nuRd~_m5rCwr`WR{5gcA?gPUO+G2>fce!T*Ox&%__h?aU z3By5@tWzm0h^u*ep3aIS^_t6IE+g}=z1Z{a`m;BCFc>pM-Gg?3NZ zsj>H??%b>0zX7HfyC>+I!b)U8!| zP4@!VX_<)}*m6y&2EFuuH@lnp^7~_N%v;+Lz|S#-Riz$p`P)ezEh~$Txu=HKT7IfHQejW z*1A6-b<@r)b%b%~2AXEQTa3)aG@pAJv{wnQPSK^jqTV3A*dVnXd$GAl@AYEh_k2Ik zery$zS)KAASZJ@56pdAeJ)G0$W{&h_(%{`fJm6JwU-FS>L=Zl(r2TgR|r%;bU(c%VL$15`bfh5{U9({dIG!# zJDnY12e(Gmxd__ua_if{-=z2KAZld%h;4HA!>&GrOE-7Ca#e#71X((b+lxUy9VNpa&XI%Ycle`-^oQbC z(T8Vl!*JH~2L#`Yl%p9o=67(1!Hs1{Ja3fgZHfWT%bg;fP5EIv;9aEx@m_vJn*;li zrIPRjqRkv>(7Y~g(O%>q)5D2WgF<>E*QHUYB>B$p@_oK(zUXg8EBuCBIMQ@wZUIw? z^z7u$Mfjr{z6IfvC7c`Cm@d$%ct&F%MeOoF#lEhwY_ZoFOy2X26X4G^@>xVSYGf%R zVStK1Vj_2IWEr|;Ek!EQ6#b7f;+-cp(j!K(+T3KA&NSXptn$H&ro*kqFcj{?XSSLv z3((T?c=PTXMB&$w7(4_9jTLem$!s`gLY_Q>*6>N%FAwCt`ApFQHRJEX1~7;pAxzXb zr-lb&B=%);-_4ZcM+n0Y;`GEsd6O`R$95<7HORRbv=ZA(3f8$v(SAD>;Ae}(_N9K1 zlA^syVZLBcTi<_~g5#%e>aQdp5pp2Z8i%s-{d5vV#`C^+zuIfD*HXT34L^AaQCGuH zdcH%PBOv|;Vl9XXUxJwMBY%$KXAIx4hky1tW3oVO22o4c#b^YQB=;8ud71=atA0fz zVf=)0d@GsI7e8aF@Uso!6NWPA1pLTQF_|xLaW$}+Rk;TcE*^XkqUKg{rAoxNoDc0M zCud?VwAzE@zhKG7m=0jFe#19*+H}1pg(J!34t06Nh-5GdLMDTIn#~~gUUU^wi?&uY zJcmx_Znj{{J+R%)g2mp45=^u^prYs-<#I>3-&nvq04PJ`+aOAQS4r>5akt*P*`d%a zLA$t6r3U8$PI7R@7~^{7uW@^`>iJOT|J{~9L#1MFw4|_k8eYZ1p6p(1Q+7v6(QPt_ zl3^+pUp;Ggp^eE^(N)!YE!T0L2L`*4<@g^Nh%)vlYgH+T3HS;|fa(f{j_LDl1;|_~#)--d)S&Bw8Pcfo=Dqp6-QZF_~CV&#W@j0M5ICG(d z-+i4Ga0%D+U4!7EK4f+Yi1{SW1F;T-Gw~6mT@29@2u|1r zX3R7Ad4+K@vVN&>omd=P?#{CaNhAISA!GjFpUp3c^E4cuBA2`MMw__6uZc}I8&uM3 zp1WSOlC|-YkE*11L-5*Hkc_z@7{%`HC6#KR6+Xyorz+Q3tdfsZAjV@vW#>d=KJQNA z?u9n-176||D&!?b6HfLu9&6}dX_X(y#Tgt(Pp4YycPbLpn%^OuJ5n-SUK}I@DxHdA zjr|3&uV^e^)YZ}fkOdBEtC*oOiBRx=JOrm=xrT=k{!>i&Wg6ZV;jQ3#>>f(IzOvY< z_^S#W4}rc$z^H^*qmpTrQ<160BKQPP#;G_?!`UDfC^#C#0~#z1!q%6xpnt?9xcOLu zFJcpXtBmw)-PF>tJzJ4=t4d_+Oj7T4rH zxH~DrUu!vwYm%M!(0!E%1 zq~1`5f9=aB<)JM6Yu{&*oeR<7x+&QM@y;H9(IxI=-ji|7r(dR2O!@?O9QW@>V-jhXdF-?=-yV zH&Z5hA~)_sR;;yhb7xcluE|?qbF&}3&z!%d(;fVrFyP-i7Bb%K2|2hHz#-Xg_z%*+(j}e(BfMB3k2@MZ;Ko8qmv;L8DNj^;wHL!d{-HQ?eSd{x5syp zw#Rpow#RpoHY-V!j*|9{?;_(J-$lkdzKe`^d>0w-_%1Tu@m*xR*9^Xa0Flv?$ z^ML>{LabAkAdUXR(7s?K^lls4=EFfAC8X^-wY z1xz47f6$}5gyg5!Uo!wcZw8|~m5Ho5y2~VM zfn@E3Jb<*R?MeD~p**2Ztlg{@evFYgx@(XhMU9NiU_qr0N-LAB)QZb+s?<>;;`UnQh^*nK%qJj$7&PIM)12JqU}?2jfn zSFK^Jtmur&p0yv2dtYDU56n^eT?9?V(=O-yZ7K2-+U%#kBTNFVglHDQQ=eNp*9~{%B;v zZVnz+aHtoVEH}sOk47fj%`y95_k+?*Q-u!&58+uH1pRtu)P zn`8DzBU9++nElbn^l)>`{%F&{6uUWQe>7HQncG_SN81H+^>$mE{n4;93RZOHnElZ> zU8Di&+au50nP&qI^|}lHX>D;;tmtGWtO?<k#7Xpg-^3xTV>4lFFk#}q9vhKpHz)Uax0>NelW_r)Vpv?-*^wO5_ zakBz5y^OS3ftlW`7_?b|nO;HKtiVj~Lk%z&}q;hwKbDn@r!hM<#De5U%jxr=h_9a1IaQ3J)Q3Fr33f zxWYrp917>~5U%hrGDn~%JS{x@?_e;;Z*vux5j<@vkdebfxWXfS%pfCY7-L3}$oanA2v>MoFT`xl$Y~_> z^ja_t89CF*%wWtGl$6X&GL0EIJcKJeYblr=895zT?AbKpu8bTW!WEuF=GBZG9>Nu# z%ku2W$XPfT%)GTovo|B>^&pt}cYxWSk#jM%UO;sYX5{b?uJ9RT4rNF`A6`hGI+7v% ze0UKn_(+GGvmp>ZQ#zWw93H|IKI<;T1aJr!|I_uP-@*#ax!~`xe2Qt$kAu&ZAL60W z(X9djib;F_s~1lSG3@*UffvBEr&E};yd_5HKN(7mB@_Wi5FjwDWFsnl0e=vkj8KVY zwKs{*RecJq46SEm*heAt7#nlB7bDsV%hVQPKXMBM=0K`F-NS%*qKMjLk?1f@qI1U* zsn%r4#ipV#ovB$tE!oFbkdD?w5E&*QRB-4=k*iWMb)862Dt z$NB?^(506dxs;Nnml=7Fg3N2(2De>hiH*zX6}VMEAIQtCACFHpW&vecB55q3+&KvC zNCmTuoa2@!=6`_jy?AGq{~8D<5m`c~EkN(Q7j4$-D%Kzf(BJal?tM|B2wbCoxrqJc+&tzSEFuyzD*I=zJW6cwzl%{#1mwYvFf#)Pg9= zRx`XeOjcm&B1s?S`{`9ooNkJ9Aias$;TkEZ?g{yps=oJKirHsrus9?%{!+{_5X2Kb#EY9n zj5I+MKr4E@mcsp){}Ky$fd_bhvw&Tj0G4!9F;?&vpu{*+ovq;hF*0w)%UmcjaHbPu zWDdp4TqH7ZCTj`im4%v)$!oJZO381E!``?gP6pjZY4%j(G2%w$Ls`4`_}L9sO)wEZ zc&@}1n8uav5m&kwmZ{*jQ%J$ixNQn}S?_81-Qde)*4Gw4(_-T3n(hyvQ+4l?92_j} z>Ae+sxm*1=YHr1sVd(Lg`H0)*&%o!Q{09-f9SQR90I`?E4Iq96(dT(h%fhdbR(mdf z$FXHg?T)B5C4r6PazFCVCgjv=^wz0BVsAYPMA3AWjCaDtFIp#@><&@P29@k!F?aYI zE#@LXnGxXmX7Q>NPoX|gAtX2Iz3cbGTB6>K9@N*(LhU%FTH;cy%4@BdKd7|l(9ip8 zE#}J}X3j)onE$o7B^%Vd6=>rN0YWpwb4uRT@X@G;YrJrFn#TM+osvIdM7A|A(or=f z%7@L16sns4MNjvQ5y4m7(h?08&y_bRYz1=PosQ#w=$8w`&l)G0VjgzY!1X*K$$0Vt z@#ODe6647W#FOWQtS2wKMN+)k@y4@tzN^^q0W_#Bs&~!1y2z z!<1sjSMs5kj87|6K!rSixzvA&g*wlJDry!g_vJq~k3LQDZuEa(@$UBUru|>zEmO%( zrUo7NI)6UuMT+{ahqt*|ym`m;!=Mhw#e6k^p+olvigoCI8ctW7=7q;O^!yl+i<=j@ zG)Cl}=0$92=+Ms?5jym}s=hdMAiyrQ{K+b~$~e;@tG|CF$|Jab8-`Qk#^c0|e}^TG zhg**G^Un2yFz#b#or8&)6D0lY48Kz;gL|#S2R?oJrWGfZZ5vRzXgcO9YG9sRB?IM# zZLMZGjUDlH|Kn}dz#!@OyCP!KJnIL$fo%Kf`{{@Gp_) zw0h;sv(Sqz#-YS*`~=4Q2fcMEoIeW=&`y-t2BAXEH8pIXsNdxsE_wX?iPd(l$}P7`uLPuwS{Ir>SLOLs31owXwVU8;3i1r3~I~dhIR(*W5gE* z>!64AgohxJvl#;Q4&8TBPT-Mr>y^19y$Y{si9K5#I01nPJK$BWJ!cxeFn? z&6kfMPe#s@+vv!-ngs6%ZwJw5qKczR{Tq&~PGTRt7V3}(^^azu>f)hNXBn+LsONpbJk_dgTdP&6 zO2unsp}M%o?ovmoWYCs!kFVU~jj(u5$#v6Bw(f9vJmO)t#0_<8Hu`C|zf&?>6LQ3TFIGTn3%8KB z#EASHBQh?CdG8zj<`_n&MD%}48PVUGiR1BDlbGZ2$!a|r zj|Y5Br=BZr>fQ{Ys(B`0E^J#REyzTgvsvf)C{sNj_n?vlFVaqdV0n;<4kWM>nWpfC ze9wlrX~&dpveD&yfoae5?F+xx!|SY{!8NbfFC4H^K0QvBmPF{_8m+k{#H^x zM-B!3w{RWvfK!b7H1|7^y%_vpdC2SK8!{FdeTjf#c2V!mPGGT}8n)?T-}e+k0( zb%dj@0Fl2CKfi+;N|9mf!R2+Lv5F(r*k@*rNnXd~RlZ*M-q52r!t)F9vl(*vc_5ww zQS^z5<_#Ce@Gsx823^89|MJail7PlX&VQ&#Bhd!?E+rZtIrI6rxu0n4TzvWHTz*wi zb}q{siKI_F{^bqClV{FxoP~i4mY2&t)%PJVrGM!R6w|+~P^tKq?BKv?Ua>8?Q6)P_ z40Ign%k8Xq<2}50o5kA`-^q-f*F?4PzQq=5wFk9KrT$mdN-otpWY2LuK-hCEXS<|P z_{_q+%Sx|SDQS7vDH>HMy*KrE9UhBG(1Ry{=ySWKrO{#^EYT~8^S0Dm3Jmjdxo;;d zA|waLtANUg{-HQ^Tc_ zeVe%xfLtX@v@GuQsK3=!~%GKSm)!Hi~RvV}ctrkY9na)@Z z6PrhCB)!8#;9dFiVB9Mc?3`GmGJ@*IBf0rhcBL2%d!%(9ScRA=3Au}m*x9a@tp15Y zYvCy(`~`|-?vzi_#@ncGJ5QB5I;E>^yr(D3Ry1k63zVr@gq&t49EB3ncn>2%K8K$+ z-L&xz0MX}S6=!i`d%O~DR}W}B`X#yCr3oi?*Ty>?0A}QQU!}ZODeY?B>wg}3j;JKs zromf~aFfMb=i%j?Y3vh^*IV&awFxSOcX$Ts(uA)p)J_(%wi+}2Kores7H)4m+!;;b z>JrLODbh^^y4#YjZWgN1gDRP>1*DIRL3$dNJ;-$$&K~3}FFdXXDOPNXT-&_JIu&6L za-R`l4|1&rOAk`Mflc{FzOZ&0G$Nd&Hmav%n_lEbmv@C_C>rkyZ*+NAcpo_9b~n2X zE%=gs{hC7DCDyyVOAO%V(%iY-BItQNAT8f}ZguA(10SA_%m*LK|F*iCPye@xc=t*w z)*$pgBsDj354+;G;})ALuUiC}NWv36)Ni{Kso#zz!9iy+h(2eiIL&JY9rI)XyU3t( zoyL29+cKd=k=EvQ05E?0q)Ns6S>TOhemfL+`;qBKD%sxH5u>s@ka$V(vFE7SuMj#w z;t+^HF>WkHkDHd5VrAKMxd{ub9^D`nGx$BEqK&jb*Mz&Q*d!}f^t?)V>f(0uo(jB8 zIoo8yCDZQMgnTsK9&aJM$BX=V0zX3;HS%LnK0JyI`y9l@fF1Tdh`v3sbm&(QQV+i= zR@IrnYUhqbM=JeCd5PA;91^UD%R%(XSZcC9RuA%o6x{F)9?A4^%2?t{mCUr37~yUv zIBx?UASRpZUJymUsH9g+=}kuHr&cv={xXwsM+?`{{mjDs3KUbp!&E9Bs`s0Az?V82 zuR{1LCKnc8_P|>N(d_tA3pKl0s6+8kb5+Rellr*lS*Qsf)cMUq?TUxGM1|0$8Lhgz zuUV)y9@N%mp%yEY-t(7qP>Zr>`34}zdVBjkTQXcl*l+paKt{wVdMqaCpOa~2Oi>}+ zW*A*d6P5!*EV$Lvb(KoRSH{6(txaC2OO;p`=wJa)OnBY`e&hkRX}0idJx3{dU%Nkk z%K5@86g%AjKa8@!a!Njr5ek;tl8X?(jQTeGhDBKaRw21#_(>VLW0-lCam1?O`0S_2 z<&GiQ*T<)RR^KZn`s20Q zaqRU(;_8@h&Mj5i8^D*juUgF0J3w1!r;-^~#|zy|RH#_*3J-5avv{-g z%LZKTd#z+TdpD$KW%2f|otl7te1aEFKQ@(!b}}YLWJ&WPR!KVaS|dV-K1;Pa_MU*F zzI;gtI0MeDf-j_sJGy?nJ2zhvQpKMK;^nxB8Yo^Jayh%PTHfTPyL>A!NZts9B{^R( zW(Z|&%`#nQ^qstCdk2lnnWj%aPr1f~Zv9i0xW|?67Vq#@@^P4P3~nXg;hki+3coW} z@_E<1d}v&Af@Jj`v1TFmM0t<*!F>u_!)Ei4GP%5y`PV>nB zcym1bssKfo?q*%g+nz3ik#z)SF3|Cvjhk>ICxp*Ej*)_Z`EX3!4^D5y|d=9vU z1fK(*2VrV_{y3vWN2|pno0*J#_W=kQ-?>VK;=OS33&wX)PrjvlkzQ)*I+ewzV!7O% z+}TzD!+kAaW3zw-ODv$7>p3EzVlGO|y0R}kO4@0}Xbj;w63MD^MigmypV$PZ5_u#* zX@$n0gmfbYD>E%l7@g*b6Ex<$*ciUzeNrQib$B;GL^?cdIPon<^b1+H>rXUR?dqx# z>gjT(ZZBlr_Jb+LNOfMwj_+o&QlA%*{ROP)qb@NIyA5lk7rIel_s>N}>jw6RUHSfV zNRl~;J>Tn@`Wesqc@s7;HBf6` zH%wTFM}Jq@MpGf5DNX}zGxdFBEEUqNzgEbJBv>J5gXq(7e1c@>xw76%Vptf*{B3-? zQOa?rwM1_ruN5~Dh_4lQ5~!pp5ML{f<2YqwyxY6!{C+1&{hbi>5@&!a)e%IW;Z3oc zC}rb4rDklkN)00rm0CcclbQliDREmHDGs>g-tJ-6!y{(W}v@`xfB)-NS2_z}nA`pF?2~8?a z>`i6D8sjN*_8zOudQX|2Dip8G5l@+tI@OlVhkrymSPbkG-AS^#GSf)vhe&Q?z`pdYk+eJ++I?!T1<-e8$ICmBhgox6zxq4 za~e98_bp@!-dQ9}J)7hsLQ<8J@j<&7|65Sx6xy*$JJu19;pNt!F&I8`3ZkB-&&&Z4 ztOBtF#1Ig}R)Sas;#4M|rpXITY79b}_)(@|;*V|OqaaReDu4QeP-H5L*fho+ES+~g zmdl$#`$Eks-s{4i*I|^Hs3LHtB&=TPC<6tLpy%s_AKh^%GyA1o+RM>IyxjWjRGTe- z9I}%J(*R=HyDIo6JOFWyQKL@%``F+Bs2J}t^A{oNV*;HAqIWfjOF=9FG3*);4}ciS zU0E=M%Otu^C!V)_TQIaP&hUF;(cb*To9 z=rWrGb-5D6X-(x%{}-%q`j7aL$^T8G-48;H`&RYv-PQ#g-ny@s@Ljq%<3-54wLcOvRj7V~8g z1BSrT?|^`%hy4xz&q07Oxi0xwPm}-0_bjW8CjS%y#@$X+iFlJw)=!w24Vk!M#82EV z{#0snflA{mkX&P}F2SLyOAipIH5EJkG-Q1GZ2XAHn?}3e`b4YoNNcpJZ&s^Z@53rg z{*fAnCSStahhru;D_&so-(pO@DPBfa&hVwrLd}ZRvNK-BtCp=QBh@lJ`PLQ_YDf1f zE_P-V!K3+?Fma~c5-3x)1e#?x`I(*LH#`4C<|NGc1sx>+GKS3v`!EXOFH|#w_hbAE z)y`yp*b;x44yl>kQg0CcG96Mga)N-uU)ozUa_|hwzqFTTa~T!?Qr>Z~#Vy{pI=g4! zlY!Y{XFl$jxy8=G#pWhmDKKr1Qfv;Tn ziIaGG9)9*t2APrvczczpj1b1LaO8Sj-ILNbsl71(h z9UOvolk^Aa+#t^eN;*oqAeCnWB{?pc;?xX+y2A8M<=H?<3BpvR-p%BGVMe6#Y@nn> zVQNx;M9QQjVJ4^YY@nooyBQizOXb->Nh$8FVCJQAnQKz26lrlP&jv~g3$rYhX9Fcg z+(p1yk@`NqxUBwN)oDrJ~!e zRGtl#)XRMm`Ml&Lntgaagjfh&j+1m#%4kGnCpECVL7okibUR5W$g_cx?qJCS!ISbp z-@}^XK0KVh5(p3@jWx~^q_c7v%4rM|`nnCxbi$va(vx{MP|`q`;mJH3D5=WO&mtZ6 z;bC|nunmm=N02S}Bm3|qUq&5dAD-m3LMFhb$(IYs*R?6FsaV?2kg7yR5yxMIf3gox zN*jjgK0GOMKu|ES96`YgaOV)}2+Ef|uS zoQ9lI^Ahd`69_aQnQYb*>LesL>j{-mBiXDcR3Ric>k0KGnNrAPX=T{4(g~U~f*9-s zyTZHDMA{G7j}YC0GHDHn#N1e;iR)z4qsZyEwLnP5QWzq=K{DtD(e&HdJTq>kz&#>x z4h0?(0cM;2un2Iwpl}XxrI=>{O1BFNx1L2@p41XpA{gH9-etejV%q1yXN<`+Zg7K?@pTX-R^M@jIT5uye{Kx{*vx41W zx5yc!=LItW7Fo#d+UyS$SwwnK@E`Dw$eCjSd1i1J&?0A1ep&Es$}c9pBFM96B0OWs zSsC2W8T2xS*9AXEs>nH{FA3hvw984a4bDUxh@4CMs^CSWSCC#GJe_%+M|xxMOd9Nb z>aaQ38C4y*fZ_GQt7xy4q#J_U6G5*ceOK^1=Cy{^z9qPv@^z;nHh@JK<^&8ob-`k zKAb*s1!=QCP~=L|j@ch5aupfB*&isfj*RXP6uFv=?hh2XhK%kH6j@J3_Xmn>Afx*O zMXn{I`vXO;Ba>_P2a0SY)5+`)6xl>Z_XmpHKojczK#|R4bbp}8jbwCxpvX-eHFSTV z$jz)uvp-PemQ^s9?hh2X?H;sB-5)5@z~g}$%>F=;+nHxWhH2Qewz%p*bSwyGO$eW0 zc-DZrvcxkB;WM#`5@`Mj&;5bu_tIVPprJPG?y)~mBKHT1-0>jdQYzuy`y+Q>1}8KP z;GX`7bb<+pjND7Ts)Br$h-@J}B*>Y}k^4xG2)>5$MD8a&CU`16ZYzsk6YNT_e1PG# z!E@-{50ai7+{qRr{o1L)yD77c*-i^)cLKegGP8melzEKwyx<^WK2CaJ@JHtR1nI@b z(|3?I`vXOuya70}KTzZ;nxoEGilJf&?hiy$CUSqE$kPu)MEknToFfp5Za}0P{T7~? z5Zw-o_@a3T@kcr4Cq{X=cT)69l(t3mcIXs{@@_OaIwuhZjE+V~(Cjyq)qy>A+i+Ir zj%Wx$o_&>7z@An18_McJmF<2*S$X3SE&B~+bz+34)awU@Ow49YJRYCz38Bog2IvMat^cA9O*G zXJ2JikS><~C#w%NzTCdT91|)B0zoA6#Hx%t&hgd7x;|+@bdB35=(^2EmlC6l<{f44t+}DQt4Mlsg zF`Fh6EoW#zMyzNB2aU-=PNj_YW*ayA4MqFh1{vLNC|XJ7bibi!UuLiS4MqFW4!Yk^ zv_Bc$Zzwu|jP5rS9oPko?l%;zVvN~uC_0E$rTYyh;vC_0Rc?l%-2{uLO<>^Br0aTH9z>^Br0$zy85X1}56C^Fe*zoF=8GP!2Iq39Sg z1!ljY=vbl^oBf8OCy>$ohN34HK}`1>ijJEAW`x;qC^}&gm>RR+P_&k4lg)lZ(TVk7 zrkVYQqLawXGy4rir#t~>vDt4Zdh&iSE6jdF(NmMd=p4*`L($U5O1m*v@G_8W@M+k`ZG&3;4C`45BHZ}uCCE}%LG&3;4CGsqk=`wc}G(x;A?{f458 zSi!pAQ1ndcXv}^?(X+N9CXi?Pe!8CYgC{y^?4cjFJoXzR!i(T@<%b*^-CyC6fdIuM z{xdJ06k<4-1Oo4XX-}sxX?g39(C-*ZjU^NTiJ%3Bm25<%FW?WNTiR$=dz0u~)rULs z2n4NXWEzkdsi)YO>%AD!R#>LC5Vs(=K!7{+w5NL*5Kk0Q+=xf=pu;qY&gHE z&sae^Q?r6vvM;P49j%EVaMBSf8PbhRG+Q-dde|7co{3?#up(Xl0+YoqC1 z5)H_|*g$%jNh2LtAaFAR67h-Ji7sZfCvv}`mhIj^Xdv(|e%pV+6p{h+&uzeulg4|8 z?-8N<4YkarlBT|KclY4AGflWeS2{mV-Wn)!IFnJQ(zHYFZrp19`bC=p4O+w~=1M zrd8#n{2LmD-L)vS3<9p)xjMn&D4KgE{U2MFQo}UTQAkOvOLX#{LqhlJM1&;!_AlrJ zGz{!xkj(FHK9OkhMe`={FuC1wZypDc1jpYMv1t^Ug+GDo?)Ym#=lM}5ZUcjpeYrRR zhF2O@yV^3yP)jX5CNbazbEgkioBvE6i+;W+JajuGt?cDMQt zBPexw2Sh*UqxJA8&HNwonPR8CkN6gNIuaEFPRC`m+ryF!>M2qhJ*d!1-RX2JqUHV( zI1WL{J_qNu@yg%b2BBr?HTz*jT*a>Z!%OcQAlF&G$CRa$b|)TRaW2LO6`Y1wY;Jja z!FYtN#+%H7;UMk-L0^6hUYTEz1BuM^+)oYi@gDN`9&%P+9{VDG zi--G;;))flphI2XHJA%6=0<}#jF=ClE&iLq?C$CMy@&ZwET$FQvl{6d4d#;;^PdKD zGHrTITFpL#ndM;)#kW*bTi3*5TEPZlZZMdE;ac`$5Gebl#5^mln4gkx<$9R6c$jC! z+O$FikxVXkiNQU|;;uHhw-NV*G-t2DJ?2^8d$=dW>S_fSQ`Z`Ud6&g}(_r37n--?+ z`K!S^=2JuQTF#WeFc#AaRuQwvVE$k+TaS?Pe?~o1(&|1mn1j9Y-{@hc#9~^(FfmgN zW)+~M1rD7Y&XoXc`L+TvTz0*HN^NrZiMUZ332%CAuHG34Gmz8$dl^vkkB5nsD|3~6y&Nc zrj)m{=(yba$uMcLsMu4ox*8=YMs__VyR$}ulZ<*wM(={}DJyJC1n;k-z;DV0kl|k( zjRk>Fu`I;lVCYyZvJ%yLiE6va^Xb(s7yi@}z{^6|ickf#d6WDo_I14leej9k`_nFc zLVTQ=NB)Mc;44EMVtyw-e+c-#lK%c0OgKHX98ce<)6zXvh`2~H>M#xmW~@IK!`l7o zjiB8dLNl^4Ha!md1qc*u1<`Iihz1b1fN*-94r<<3lco-|dueDl(_BJ&0z}UPF@waJ zAT9$@evyiQb|X$b!EtG;9qhG~l-Du2f*;6^R=DF*Qyh1d)7DP#@BIRjp80^ugigZC zT^0I)8GVAd{ebQB9tfv=mFnLiU%>qvuxysNtC1B}eNZX<^NDA_a+t}yT;+Rf!4dSsr9Nu z#WwYwHnkDGwW;Xr&?#2*op{klRJ5~E$#G8$J!D0HwW8%8sg$P^Y61iL|Cj-`!kz5L zGN2^9dH-13UMiG-2RLw!AdU&~R(e!^uL2DxJI;4Tz^hMrTBSPzlX&RVoT76Fp#nZlWmj}aOZS>_ zC3F~1A7?v^PgB{a9ed^XD6Eu9mWCSXONc;-^=s-2 zG#s}=a=9s?7j5cJr`ZN=yjMj#SjB*%#i>8)|QTtWkVyC9J?fsZo5aHC`4OA8QmJ zn*hG2c+DeH>)(@?&F>x&uXCsf;CTy4{Rv-09lj{92m8T7f)yt;Y>ODiH zyy_LJZ{BaLu62FB3V9XyO6p%N)HDz3)@GrmDHJNu%x0;a*?7#h{4#?YcGt?ov^&j#sAcw4&3jX!)y6GZJ^1_rMRfQU`*l6Q@y~s)KsCTb}_9jISIBvcta$rKPVN z2(rWf8eCtQh4)2}l5+A@2JyZO!b6;Y&qZywLv^_ag>RUL4qtrhs~`u67r~c4$UD@3 zN&ffE$D$yP>CZfBYSz0WIzH8(r!{-s0^5Q1qUatK&0PVQ5vc>L*mG8_{4HsbH zX&x7>BbVz-z1*h$+Dl!aQeJAQ)fNAU>jX+v2wrQT4h283P_53eo;a>qs6FxhNu3IL zMGvMPwNQgCl(EuvO+}AO?b=bTbXL6RJxxUq2Paz5o8v`yHWlrcT4zOfd!m)Us;~4$ z2Xr^$>7#N(lI-&q!BzI!W=#C_LdSVag*Zmo-mHX=SD zH8Rs!JZ%`2dt>B=HX~Q2c%9WXsNYJQ^n# zxC?j*frC!v6){+Ui<2=}rK;6qF>*fSd#sdka{b=bnmX3}silko=}z~LtI;4{kap!> zgmBXXydcfE8%9J>X#f594~5u^(meaW!4AXFJ$~WKtd~Wm5X(4T5s5-huH7w|PEp2S zNL(z;{*|Vl`?~7?_4gfbJC2Jb#~~f&BHXVGR;j^oYuKGTY|vfB@c2%M!J_w;C74>QV(7%=a_A zcPelSc7mt_F>sDbvJ&N93is)zY_DnzZlMgut-*9yP0DsBlA5x8u2SQTLdm{e_nTrt zEf?Mg*TO@w80#Aq^^EmU@MH`4jt3Z8-JG%Zdd8}923P~%()91kL8flysLz=-SU2e>Zt^SCG;Y#Q+~njlt(y#p zbCZGMChHL^C4W?by^>c4YYWtruRzF{@&lEMcav#e$;C~+R-yf8LG4q6w-bhL@&jPR zO`@0)RPIy1{6Dx!D;4wHWJd6F0@6)p0Y}_qEr@}gRr1envQ}d}H<=VHht6TyoUL^P>at}ekTNGpcA z0z$@6r79I)u7Fpr^06wg&@?!VFL2@{I`M%N^p(yujX&1cZR&0{Jdnbhq{oq&apD6h z4M-7PVx9Pll-R!R%M|u?qY*3mFKw#-zfy9#ss0y2$mqYZS^a-M7}wWrRiQ>Yu|GJ6 zFm&Pv0V7Vl2SoXcD)oPG;*V6!bK;cX{RE^Fw?A8*crb{8U#R4top^+{D$j|Jru=Hl zHU~*f*=DQM|AiATR8g<8(}TlM4N}?HdVuRxD!#G{yvnY!Wt)q%%{pQHabJhD8FOC~uP}GrZ={?S!24T{qi>3wGboee-b*Rrca7(#!Y6pS z^=%5RU%ey<&!Sw_ZB>ks$XA~ZV-NKhG=_kSQue=L06QmIz%$D%;35G$3_#w^FG~3l zqR%e%J00avkF!!LkR)Nlu#R%5hh>L%EUN;tWk+}zrlTC{VcD9FV@5!DF&`BH zHKOBW+QzbDN@h*R_BMtcybO;8XU$w@`8UCL`~dFeiPv_a z?;NDYIU!5A?U*wST&e7jyG#nTm%Q{A=SXW?yFaTbHt~hdR*h5HcP) zQKjM?$e#Iu`!$S?xWC|o$Qvr!a6Z5;PuXX|-txd&yk)YC2eYSY#DRrXbU(qaOgX+t zHT&5E>(?xpJwU{QNylPEy~cM{$_fjZf37X+lx6|#0U{Q#*J{*2gNo)}0PSu`d4pg# zB77Xc3a$aM0mNWR?%iXG%&OrfV!N%_cOdlMrL6;{W6&FXmU zC>N=SKUAoO+TEQp)4~k!V7k5CTt(dUmFYvhqOw+(tLS=yZB1#kU<*93JDUZ2qB*dq zRCEu)9!&Y&f?e-{9c&it{pP?D-Z6y;U>qajHl0;>a|=*-xx3R0&!3em5;{Ad=M}5qLuk2M&?Mo%r2|*2=xNy)fPsL zvElPp=d)GjTnyS=I$GgQ5B{eM#$CDazQMZEMG%-43&K}xsE1moUy_cq#~!ZPPUPX* z=X5XNa5Pm$9QPiCcf$Z=*#0v3Oif`ZrbBRG9rPCOZQG^fDkNS}%jMQjMIp?+Z95r| zOW{x)klV@FbuGBQvP)d94#;Er%E1Aa9ott<1+wf39pzLY%bwVAM>X=bY)!{QRWa7_4=fel#49j zQ4cWfJ=3$sYq(Z#vEu-bsHg|nJLP=~*lndPa)%a{Y-vrl((tRk| zhf+g|5jLC>lOWH_RF!6PoCHZ$f46$CgP^JVPn*?yR+G9Hz5k=4i;b(D>UXsoo3|z0ZO?FBvN;KQL9Z-(<6%+3+LZ-4HT5pQ;k^-mtQX z&SHdxDw=1FFfrvH7VupU@akp(H#P@&tBT?=RxWo^N=YBp@OKYzSF?Z*GzS>gnJ(UF zHX`L>3)p3iEpnks#TVHg0%jXP<*nNAI5gY~l$fq~y>z1|U>J&#c_UtCgYB+uGbhe> z@iNzn%vh(gmo_v$_Jk^9^TN1a`GUq0p=VrdV2dDN(EK1qW@5a|eIhf?sr({F=Dc{B z`$cBFQ)!z#^SUKoW~<0da4IiQ=cUZ^@iO;NW+im~E=K0_c$vGcjCCjucFFjQvGA)_ z#`*|l3gcy7voibCL#WTVc$u3hv*ARi-)gON8SuJ)!H2hy^!IK9QuI$ABLPAmt-R5Jve@*6VlKygL*{{jy zCY=8A$@bS|J}jCC<=>O}pzL(NiU?mBgsxEEAbb^r@Kp@LSILwy2wxk7K!Bj#Td+VM z863W(H#i@~;CvK=W9S}SV;f1pM%{~Eex-a3_`HDfKQ4QKFF=(&Epc&d|^{STZ z6P9bcK}hIt5w^!5Y>z=ec(N_m;|8JVTPk<2AXGhRda)}|QeJNTTtJ#Ti+crfA{uuw zM)Z4=IkH?0u4L)VGjIf)nEW;H)vqhaJ>np^C*6e?UtA35-XfXo(fCW411`6|8!T%w zxkWPRU1u`6MKZYooO!IjO)`0#ygc?B{(JD1-zez1oA9s!opGy{v0?I0fiCubt>5~p zHcn;qDN{h+(WN8TrgwDJwJKngx35JK0?(ri$MNOeaw)^1#|;h_OPewr9%#$3T*}br zLcF}&5|$KnoXy~AxaCr&!{9o$twQVyshxxklS<`une(KGB^T+fQ0)^YpH7ks#5W~> z4Kx{A>LFx?mK7=$-_I5t@JT98>p7~i5EX;pAnEV|^`*^+9dN7qe6@spRJJPdXl8+nqL1vOu`LN2cMqZAWksJP{ z=mU4h$b1zqBM%Oc=~t%8NWWC{DE)DOae9sTuUD5RSKGQAAa$90v8lTOQg>^>l}g=J zN!>jGzN1v$AgMeYVq3!Za@B%9=@QIL;2VH`JB=~c(_AMcKaR>5tFMEAsm7%$5pS;b zUNz20+OT5{Tw3jamx}Kp;MC+6gA{P52l%&U0mGkLzc>acw;jKzc$#&#;mIWy^m7Yp z+$f;U%^UwGCoi_58JF4uwNWXrK&YxK)Y|ODHzG;QP$X4_`=`pMVq|v2%Se?&rs_+T zdDDw`Du2?jVz?7`e~ZDE=VG*isthfpA9ZZvoyxTuMi(pa!sU6|d+t0GBQqvm#y)rU z>!sy2E>_1!oqTbEnoXweKeCpsA27taSiZPee;AG3L%z6J)?e7g@vOJw#l`LhKSCba z3MAe;>urRb^`?RLtT%DD&6;KIGHB5&c_4-fakmAR+1hzYCA`|f2%hXawAXrvIqQub zsCU*|1k`Q6I&?9EZwi3d7^xs*hKN znO9Q*P8{vt7M|b+rP;fu0;PWtuWL2HDf$LJ=pGKBtHB|trs&%}56DEY8T1YZcpGy) zDuy0#m<`+stc3?)H_)FY^-18w)C&~m5KZkSA4Zl^tAB@pvGF>Uh_`Wp_PM<0MrY_$ z-=SiEDjCMPBC7qMWL&HU;C2YS-1=^h9eE2Z7goG14F*!sS>dCWO>(m&>EB7CZr z%Y83!E>sZc_dMv~%|fs6pyeF9$~u*z{khSO>58Pwx!$S1IVLvN?{2^xJ>E<_j}-C> zDaq+R1+=?S4CRJ!hhlCaH%jI7mm83ca_8C&zO_jzsfP?!H%Nu_kb%t5PSIr}fpvjk z?NJpvdNqF`?tD$nUm)OrpvZLC3k3AEb#@e7CBVF+5p2V5M6`JD!p+9=jr8El15ZO^ zG2kB%Fm-d6O2m8cLC=6@gC#T)sgxI0x`VBhivqkw7tF3#Tg(H^Vm2x!hMXJ~kehI% zXMMD=Ng;e3{t%B$S9R_Lc=WZ|)j$SirF?z*%swf-}>k&k?k&Yrt>H1-jwKg0J4A zStMK++oN&TD7sGkn~Wa9?K%1o@r+CNH&@#q#FprU68bfcnR?V&3AzNhFJqUc|c z85KQ46n%~y6g@)}JwnA~0mwo@8?xRiYWP*)tDpJ**n1N=tBPZP{G2=6<<4^NVFoTR zECaF(+prHfY{NP%vMDHTI0CXLB8n2CAc#iMXaqM$s4ei?9c zV*cSGdY77uflC_=zJs{5)8KCqm$n-GDjd)@C*}=aekpKi^CLxk(0U4RbG-A>BFde& zb?5s1c#y|`O!D)#Hmx5bx_DgVyA||{o96T=syaR4G2+) z{}{8)`i~V#757P-e`V$iW%a%i!D{5=zfp9#Wp!-Gs{C40VVqUHvNA`w=fab$Rq3~5 zt9mEcU~ZtIa0f&)c)I=t$*_kPPY03Q-{`24@O*wgG!Ac;zxB;^JfI(}_O@+^`^s_OT}7nfuMOTQMG)>mgS-Jp(Kv3FqWhQy9OZVn(j}x1pFjMa*|l6~){sV)nS)h`Ce5TmZ~?#A}4xEyP7k zgMSQsyw$|tBj!Ly%zhWrk&G6`{`HXF_`}g675(98k%<0qv`Az6X^a#w{!rm|^oL`M zB7Zo}_zUqB3V(h99eB%U>!T82|Kp|@$ye_Z8AL{)xCW*WeSb0xnH9_?^HHkY*cvgYlCFsojBhElb-Cu1<1yAtl~~ zOyeZKS4ag!PV)PObfS@y{DDaN#x>SS-d{*3+3DNBzecBN@Fl>-X+Fl6;^4D~PP1Rp zh&k#szY79!n#pU`Y0d;td+zmy{91SyE`m-^(P?f_rzvg#Zv^m$an!%0v{(gVE-gBZ ztk)v_WO7^qU>ku(0N)2Nkz@^L0sA#D^_jD8Fx7?bcVN*IWW)XAwCk+3KK`eLzqhQ`SXO2cx?M>dDfqjEeX+ce8ozDHYH!W0QRTfy(?fUkdf~yg z^wYMqS()z5B`qjA!;*d)lGb_JKlJmLBcFQ!20^+x>32BkYn=2SIqBP-^fx4(H}NdD zqqM6yBeaFNxiiAL<}=u3LEnF5~QRyV&=$y5zwiHNDw1e6AhWx68QhdA%9ex68ObikRF9 zxm`x~cHrhh*LMo%gTqgW%YCEo6b=WTx&bcrWv%2@u!ct9Z0qvP9$ANOeDQdB)tc? zk@R|z^gZGt>GdLMuNxuhQ~!{pI9xLzkNd+4k@S@-&0zZ_haWzE(^*iBk+ec2ZA4v^ zv_d3(h?q!PA(CExla;iMNV@uFD`^{%^x|89%OugZkdwqyz|F$0oz(x#t-u#@f-rc& zZNT{sJ;k>WUz-Z?wYOWJ*go`$L#TeggVf*n9nc>&KybEX|L+2q2u!7T>+~+*;&2T< z{fLst9fe2A*+iD@3pL+3|XyFsyM4p;;b%I zqV86ia|(-K1R~YPA*;JuWVJEYN$|FZsqplVL%@YopFD}kY~8ZHaO-wmF`tfGUUkcO1j$fMp@a#4JMPw@do^!1GQKN%9e*ru?pL? zrXh#gfm$pBwc9;rpcczOJ)D>f)M6Q^mjE{|r9=kGE5zl|Xo(nlzkA_QuG2~$-;(3} zG!zhD_WlV1&@n>Lhd6>0BIqjRfx#{xzv)+@pa~IlEvlkNNr<3#5EDTYBIw(|ji7lV zXzhJg&^!@z6Y%k8{5J$0I6V@y-yxh%wiIxg=(A(Z!gosnSA|^oZYki3u&>CorGV?f z(X!UtTEGr5&yu$m$n_@iY8MsA(pR>smk8S$@n!}#%hyW_Wceyy>N4R|BOdCq0(z(# z@lM+cWScFXNn!Cy3X4bDF7-{c))SvP=16k+xIQCOW$_)&?7C6 z5yGRxZgimB&l*v%6GXd#50U#>bp@D>y!U|1{g@FK8di-M4)~SvharnxEok#S_$j^! zXas=T*-DjjwSXg2f2dflQ7u%maItWBLBSDV$g2hCkRh*8-3nmriAu@wEw^Rm8r6;y z@Je*eX#*+w@sBK6Ngm%t-qR>LGnb&@2gvz7awh!{z@+E-^)kL@{SIHXXDd5@qj4r^ zCfdY1Up6Pr6ny-n3huPR_Wr&KI|IPjOIs9{5$;zsr;}lUlT8JA=n3(Ct5DQ<&XiX5u zSj1=fJ5i$U2i77!&!k?70c5aW~10dCW-}|4Xi~AxJel|w}5%M z!u2n>+Y0xf74A0_ZgES($(+1Lb3zL!DJX#E#R3W*uom!ZrTXg@P`6Ke@lLGW`+!Sm z1+DTH>Je(M-l}w(OW>Hv8IG(_jyJA`yY!Fq_ozoPhJvJ~&ER0(wDhr<2!5D*+)JGO zexE=4UPFdOpnUwMpMuydQGYMQgV4C~hbdWyMtAO_(;e5D?&_`ldZj1|8Ijg7dP^7` zOGXVXGlF6ENpPCmoA1v@IWu$Ym2#uoVa0(A&IQKnKA9hR-5<-a@cKN*(s$(h=Y^&3 zkkY2aT~3L+O^E?_aZ7QVAglDsO{9f)Lg8-{HrGOUPOG=&a|-(vn{uiant8OV6Wz?n zrsWdKbe+`DsKk+aSWGu9QbU^uO%2yc4Ksm_U;0;TfX)W|h;3+;8lK&2dXn#+=Era9 zz1Y^!C^ej;H8e^MT^@p;5Y;w{YVQMX0wN3ZSrP$}4Q4a3NcfN6gMh~h{Ji4gd@SR= zwL}ruIVPX;_@}^RUEE4vID}DaK%4vz^l99b-*>s+js5=##^Bs+js+z((-ZaKF=n=t24T2j^dnDynZlUYker zVLo>On!U!b52@znKTfJW$eT&3*|U_QRorav-kiIm>^n@h&GH63fmz%i zAkC=yrpf%Sm8R+Juo(l)h(&E|#sF!?9$;pK4ia~U-)gM8M|sd1)}pjl#NDNN@y!0P z2EX1L^^6kA4rsvV^^l^2NU`xeBgLhm6eUZnGCPPAtsgT|bPy?~12a-|45j$9@}Lx- zwpZvI$;_*CA28pfp zJihTn-jiT9^9lN<)l2ct19|`EEyQ_5Y_HT+_(M1=uIef-HnnZRK=9wndj{y~IeghZ6lHZ<%FtW5}jn zDdG~%SBb*MS;B3S((WTSFaNui+w&o}<67jlD{Nm~<3&awMoWK)@?uy?uWp^Dv&Y|; z^q3d&N0|<1`&RDPE5Yx|@fJm1LUL-NGddG+sT9e0=}o7b~o6;sz$C1nr%r<;jV zd{ilKKf#-=`YGK@u$1}{ig=KdUA|fjXAN>DXij@K2b;oCn>EAqVAE8z{uq(=S@jw3 zg{?pRINSPTr1eLkJ=E_p()ynPGp$`JffIfN1qunuK( z*`ZYN@wV(gj0Z45M>H#?Wcy;xg8D{j1_w|Qa?1e9^XlekI@LN*(yf-vz!e!}qN7EvH$e#l<;}~$ zTOmG5T#nO^5xm1wR#6%tGZXT?QHRP@YihCl=*6eH)^eNGTJ+B0<`yb zLguS;jP_piO{4rK?qJQJe>=hXsz1aTC{NviLwolSm*2bmUE)a;8vQf|=>+zN!5;^H zAf~W)gugfBHUz`{cLka83@my>1Mv3*e+&3Q@?+v3CO%a`hVDEG&m51(@5RZ)S0oeP z{Acs!X@62Wq!;JBk2f2^p9Q(!E>Ak)G?1B2=%4X>TeCLf|GoRHu+uIHukk@-9 zI+UCB8^LR4E`e;^pF~cJ8~3-AoxjmK3-A@oIY@X(3;9Ek$h23@~>S@^x&U@6dn*%OJ2M@N$YEPV1y(%h{tY=;sS}&5V4_O`5qB@tw zSskfFp-p>vhgw!QhpbL-kyR#SRhLw;pF_xNJ<3OJSE6@(OK5FdrD?sYc|Lbf{eH`7 zZJQXGp8%2Bhi?;ut`UpeE}3RmeR+a3HS+t#mnV4dr$(&w3Za=R7J5x$Ud>ze;JPa@ zM$|56SSWxj>`~_(th1-7vkbzUI(tf;eZ`moV*rglHY0=_JO{r%JbZtCuf!H`YcqQs z(%TFf2AVefA=^ZowSe>5Y`}MZn>&W$HTi8W#dl$w&rxAfn?q{hki8mtXM3+i0~>Pf zU=*$vIcuI954g91<&jw*({LP%?VCX5Ud=hAR(KJZ`TY|Ek>3AgEHrBpb1-CTo(G{n zAkmxTmqhSf>cB^b_A8qT;4_~d#a|k>{WD)8=F)b+VcY*Azl0|*A^Aee)C{MTo~Wnh zChE~oTn=7dKmKNu|DIvYAgEF5dk$m3A>;QW#=n;`UcZHu%>2@!Pm?kX-Vz3*x7UZ6 z-hgTJijPaN%-4)_*=_z|DKzI4>lGiDqA$Rp&BIpUsQ=>UtXF(oWVqsaJE#26XW2YF z4&uUouki2oGYvB=(TY}K`1&vSJK)SD%&-{*5@xuS0K*Kg0jS-s7JE6`J2G4Wk7|E6oP@xNm5sADO;pAkG`{9<-X&3=UF$ z{HOdsQsykyPwoE`S}X=Iioh43J_UeG8r`*6g(-z!yYOFRF*fy95J^+Lu^p9+ONljm z5rc8;OO{~MF9$3F6rW5u8{KmSD)(nSIUom8u!v9 zKg{X%+cO2^XG?}p-S(Ab;@SRiG>yj#H%oD^-x$iW&d9=dff!lVIkEtT8!)o06Ir}| z1Hi^#ZMaWkDZKV@wUKQFPFG8YH*V~BP%ZJFRc(Z(*z{c#F)OhpQc>P7uzV8lxJ<+! z1-$M}E#_Z|{SgXK(+u7m@_WsYDAc$=vJ(6(n)XSF?YgGlg_RsFm7D~ohmjVh;$EHzJ1Lk9Nx^rkBv?fdfHL$eZ>65f3Nz9^Art&i{=j)ceysD*Bhv&qk9zZ~$heD? z;PTLv=mMoE<1QD&A(#?fObPzLc^*%UdURVbU{9dVxv5l%$;-8eRb~<7G^*uLEcTa8$vG zcucE}lS$4Z8^PZ{FTwYFi8Aka#VWJ&8AcbOGBN3L5S*pYP}oBM*u)36Dv_#!$Dom?atuU7>MV#fb=dDSLWIL3o3XSzo zNStBW3=7#j)*_qgkWJm0s-sF+_zsk(h0ENEXhHqWn)!fcn9IR@a6gB!pvRoDzsMe-{ zbIWeh%qLqed$m*cjoh-&Yi1#gpBm0-?@+ZL*1MmQgza6Xnd4h7`-oHasNAw2Yv$=K zmaQ#U>tMZZ$HPjw_4-8ncQ(yySmGqCr>choJ{sm#-50>K1iAn?@HZH_Bx{&}uZMvx zmq6`kB`re&KYrW9t(M^=%g{W}Y*2+|u*2}XCB7gT*WV|C zOg0)%65#qf@jBMu2P%2E{^rO@uGtX#-Izut3S$Qy5`Cy?dioyVVpfzgDf}vzG?|!Z zN#}&5wPo6%p4zQ+KDfQI6QtfS?khJcK|Px>B=G@xY(e^Z@;D1X^;&%01#BWo8k&H; z1x$qaQLYdl`MGNIw({=88iYI#|&9?k%g_YGqd-!cC%2@T%_ z85lpB4u%pgx&^=jp7h}quz;t1#JG6k=M`khsUH#VL}k{4U5StXlf>m4Rh{R(Va?+* zrHWfw{m-m>6;@9xQ8)*`nt08!x;JF?ev7R3hOCbK05YzE8ZSNrs{9bhZ%|e$_{G_# z#oS5HN0Non;89boZ zd1StlaEZ`6Mq*-B$trKucT{d;HGEfZW{XiCG%Fum*E|!ty8&5?A=!dE0pK}c!-M#L z6%ra*Xr30T)=e0)J$F;FL3^ijj zTc;!pHg|-;93QdY2H`WX1e?4`DNU32jKY(8O*ubo^60Z5|4)(C<8AcHuK_F|z$1XS z0a)-60REmsBa8n|i$f3cDX@i$f2U;z5g?bj0A}XWPilm`qKVub|Nd5@iLarU(L_d{ zgvT}UO7x(lV70sn0D{y#;izN)WNN08!B!<5m8($+pAJ@O3M7+{-!$tRP|1bJx|WT( z62Pwr+z6oeJ5b480ALr5EPaxewi?OWvTHyoMVbhZ$s+(}=F(4E4RJ*yxjFtbMkBAI zn9<0#7B$i?dQ|IZe?gHHUW7te-9#vvXeisb z7G+zevQdh<+qID#9oIr0Iw!L>rs?X#V*LMh^%5WVQ9k_g=tZNu-3;)uV@&BM) zx&xS*OF!uX2rH_}&GCP4EVTi}jB6OKb;UdI#qg~m^BvdlU)n6Xh9e+TGuIG0%L&TW zsDvl*XKTuZp-NVs2bJ7`tkrDH0|0IVu;51kaGt2)1^oX635_g$r zTmUn3$tG=sl#{N;muMq5+ds2Fe9EaPYqarvi`r-xUO$21Y*P{{p%G#;AEL#% zxsxt}NRzI>m$W!H+kYTmT09bEO^Z)d_VNC2r$0dG;ZrwMN!a28QG2r%%fSnr>{_dY zro~<1Z8vJlZZg8hZ@TgVw0JPGmO_N;F#w(*Fatktq+4US_#}kKD_&h~+N#3$W)P_jTc02O6o7jFMVQZfEuJ zD{`bhz92w-bo&zk>f>+#Gjj`0x*ANfiLOqTpItGV(ISF!N7EPtyUlJ?)h$a z-=wPIqmbE<4&B{tjknITuTQWI>Qn7|ZOixb^`#1RKi6_Jle0}Zy|X40T5^q2Vt6Fi z*;2KyYbge*QIm;d@<+&CxjT2TZ1@)Xcp$QFL30+20+86cq>;1(?=iFhHwtVLJYQfP_YtF1pvWy02$G zi)`86f7Y@G0GOFeHt9A9Iq7bE$zsc9TiyA;%AZL_Tx^|y^2TnewXV1xZVL5KJ6H*v zFt<1AJZ&F4chofwQumG`G?wd8o#}dxNptAPx|HF{*656{X=~IJtOn%cH}M)<^?k^? zlI?yJz|ROg1EA|?P~I;AKzWTUeXo}8r=>5jWe)?T6xm3COl|-$GnanSTM$-kCpX70 zFgvmzp_tLxFSV|?&fZj=Ve{-vtyd^5^>H6$a*W6*gzw>yRrec8X*9x1ca1+#hm~(N zlEA{F`dwsw#Kz=d0-gI80BHbk5vT+(;tK%10IUKqm3QX~Kjrt;4MUK4r&r)Lj0Ny# z01KuAK+I!(!yy2k_mQ;-z{UiC69Dwj18^FEKKTI70q_`sivcVsC@^NWLxsd3k&l06 z!NXhC%!U^hsLCEys<_JLhwm*!yaB3l0%*(ckB5xPA7^T&-Ll!1KqG7W`-UESjNJ9w#cF6GnYF8+^>5wmZ@y~}!6n4bH$$GY#9`8TE z#dJiQhfU4#j!5c{aYEr|C>y@^U=hkkE=(qVJjAGbTuInh7a0=0WG!#wv3HB{avymc z&pS%aE_^Ufu5aU^Ta^37qrR)+nV#e;XY32U(mFR`b-4|#`Vd)(QYa}k3&AJ?6#zz* z0jL7-eFFUev`?c;`HGvuPx*ay!w7s|hs1`70Q?Mq*#M3NaP$!XHZ&~5_p3}l8NeX{ zfQ%yjTBYa^o+I_o)EDd-byb)Xr6M`xEP1_pK}3 z;C0(iF2c)CtmF6veqr3cEJ|K@a+4O?$2!&*tzaE|;mK)a%@>~RAix)%JPcqW$>fD6 zuL0BXzxgrKoY3qpF1n9wXm)ejShKrXsp4igA~L%&m4r6+Unnn{iQe$E(Z1nHZR&U> zr%h$I#mMv7ax75PZ5hL=`<51n{)w$n{+9^cHm2!v0p3%m2R(z7WRyYs}5*#j*y+ZZyd`-^I51k`;S%A-5Yaj?0q@;*-JP_8@7R)*>G zXNF2UW$QvNG41d9{z&Oe5AbBj#vdEi%?W#;@p4G{39_z&lnwb1_cH<+0FCVmyt?gL zf(H+VftG&F9z3YKOEU){bB1Pu)!3hE`gAgu=UWR)cN8BqcY5u>fm04XXtuYoct_{ojT$EI7Dodt!lunyFu3^UXsZ)=V1jBh)oHJ0CHPrw) zc(AvKhfrqYFY6InRF%OiaPXJ)2rV7}&G0X8-Z9gG^RHcHV)3USlcYu|P0iW8Q4{Oho6ar<(l;IH*#iyjE@C=7pDkI>=|;qmxa zdGg{6EQ5c+?8VDb7yp6-7cWN&|AM*4OhpU$SMrR%cwYlV$6xzS$F#>9k$>%$BoK8`<%}W+-PT`-QJQZT*C5pC};a`5y1(I0E zhe>&ff>x!V&o5ZM@?;b!C`p3FT_7kpe>qqr{u6C2xPV|mvM_lu{ugZ~YrpVJ6qkfn z-2lB<_)!-KllpNh%xNDl1c{eA4oxroGs%;w-KeGTGs2nFQ-y&4LbzRuZ+0*IoN!g@ z8HiW-1>x%ARY|}&PzGdRaX_ZNAR~$oM#Bpeg47pZ&*J%lOevlPSqlpUnO*z=N){Fh zGQSuLD6cT-FNB1R#SgPg%3lU#S#dYkS>jXRRmC?`u#6xl7avjtq_w{aIctlbXPLG> z`or5;JeFUpNd^j2O@J|ETmg4?wLVy2kAlr+F z5~&enXYoiP0|dFLcs!ATg6t}uN@TF#A7yqIXS)L#BC_o%{xby~=AVUn9`h1Cq5q9{DLa`h zD5DKAwGR+UWq@2#%f0l=s5Em1d=J*zlUt8j${+yoRF95B;fn#lvHN{Uqe=^3&8}Jg2mn0Ipy17UPXMFqgPVD z1$-+0fOdHmH=sJd;uCx)yjGXOI7>>VK8)aw~(`BIV)^TT>^JfaxCG+seZ^UIgaqM6jqB~$%?Un zSF~NYdaze=JmKS0uR?7lEAIg1%G6|3SaJgCPfk5e`c;J2rk;ZBl$=DxtV{7^e96g7 z-T4b0ovFJi!+OHkrQT;<8&;r}n^J2?zwu$nd|S##zm%Lo`JYPtlr)=u3iz4S znWQ<3WnW9RBm51*Z>Fvw{n>=yN!>|#&LO-nHJUV=34fS64u(*2F5yp7Jz$b0=Mnxa z`x5zold$J!_cG&rBKdyy1aiHANYc;VK~;QjGiM8t3P0P6t=meZ zou56FWETcmvX8l2i!(=BDC>>0rmp5W{eH=k7sUhb9t9x(p|FNVwE zIFNCjgcjP<5q**N5@%EO-}dPQ>d>B7O0NGMvdw_FVJpgeDMU%Uk{c;!edIiE2R;prlst>L7Hm1)_okDBBo$&nB_rSU2JA{u&T~C@j zS#4vgU3b8DGktMtIBD)7yeu`2JntpEBJ~05y^ruJWBI!YpWK!=#7e&ZXHc$f%O3av z)v?iNim9RrADW;l6F7nNnYDyR(Ykp zSw+&T{0&%UO1m8cnvTntEcQyfGo#}wf;~vy@s!mIz0y8e5O}TbLLK#`{huSpAEVaN z0q-(Bb>nEj1B;-KWa`9vz=PTW&ZM%0hYSbYE;WzvP{LKIE4u+6HV1HZ>JdC>D;-XF zp!ko{{VBl+uhSb~-FY+M&dd2l6m4Z|3X_yT+%oHwEFnV92gvEf+HHYSz(UHZ4Jnn^ zxj)!}zO&7y1SXsHBWE-cf=}UPO2;e&SeT@ef*RzNjur4@=G6;07Fng^1Uv+^rQ-=! znK`1Y`femuG$F;ScnG%PS5(6?6JFw3c4EIvkZVb6UMA^mA-zaQhrq>vbOG$KZ16+K zZF4WaGTq9CUW*($_p)IejK;*vYMGjp8K-RcHR#;=DW3l*8^JNUHoFBKShoLNpjn&A zZfEs%6z;lA_CC~EHj>rfl*zWjzp_!(!)=-Dr=TtyO=MRldp+7;HipREne5Z}S2p%h z?k%>g!%w)@m zOd_%`ll|c|Ad`uF0y$x6Wexezwijf#*8`c-0Z1~)?i~YUYF{9kAUl~k(}=VSvJWF( zTsECZRgk@v$N@yEgX}HjHiO&-2HCTT%p@`*Xvd2RWwWLMsSnz%UbWmSo3j$glpsr6 zFFR;6kl8_&23|Io+~x<_*36lAACSf%+nYIu5Lp&v+p^h*J_lq~kevZHP5N_{NFc{9k4CUP8+eS!G>vK6$cPXh7#WyiCFKk1r12}R3R(sOv- zviDP*6S!DRb~C=3rYC-DmRC9h=`l~hAGRnBvMmI=tRLK6$w>sz2oKcwk7N|PWN(_^b6j={gPPChx?9QC;`0L!{@uDT9 zO|?jqK%L*dAPOcDO#}aJ@H|Yo9D- zt)@=*Xx=rUylk|Qx0;+U1n0i=`F=Gm@;#va7J}quEr_Pe$L~J@@sHs0IvDf;*8~Eq7lG`+809VA+p(!WRB|SopBq!qvR>_X<~X z^6B+c6_U}Fmr!2yJn+|={z;gIx*63P_=)C}h&=MRx|gTbu(!HL>4Qo%-EdV7-e6v! z%9~GR=L;wbh(-gzX$AMh;%?+}n=Lt$MEauktd zSY}5VLTreAHB6d0>A`~zlLS6hE_AH7n=mzSq0y!T*A72G>um=3U8OTA*v4{gPS#)L!i)*eY2E%2@ zx}l5Lsz2alYUm;Om--&2@Ko(W4v-Y5v(#|H`52WfQACMO;a+Mg@V>t3zbOu;6T({GE!0*R4R>vO80_GYfpkor5$bsB0;6njzY_zQfU-a zDwU}}cn!=;Wg3>CQdxJdmYkqcy1paIeQ8iBJ#_}MWr?4j#%fGZDLtLA2`Z%zAgn>9 z^bE4opi+9)NkAm1l%7oxqLAGt{HZ=AsFa>FA1NACN-ya|wKAxbUP@5*9qDBZ>YAWZ z+6gM9k7ea1sFXgAun8)qouE?M2`Z&m_6JK7R7yKRrL+@NN;^TNv=dZHJ3*zi6I4n& zL8Y`4R7yKRrL+@NN;^TN^g7CHf=X#8sFdFD3EFFdO6iTGA+rf8rO%-JCa9F&Gy|{+ zDy5yEQrZbBrJbNs+6gM9ouE?M2`Z(}qdX?4l>R1R4JxJ2C!#^6v>Q}PyFsP28&pcW zL8Y`CR7$%+rL-GVO1nX&v>Q}PyFsP28&pcWL8Y`CR7yKRrSw%tLR}hEN?-jh^s7Oo z^v>1D(V$ZL8tD-YDpA{Fst77^0nDBdT!TpL0X1dGXBC1Yh;%$){t3eGEopI)8}FkXb>sWe^PS$X$R<5Gga1un8h%hW!Mv2_j{N6E;Dlj13|!LXs0i zB8pyTYYLN;K-@6v>@1Yak&T=akkE;>ODYo11uUej+K^ItHi&eE&87qw%FpPuGn0QdjR1-uBhSSNLAW|@bW6}hXg8c`8MuSK}9fi{% zQZSO$YY-_IMLlQ`DR6^G!5HRf5Gfct7Th$56gWYoU>v(jgGj-67SSM5Frg7eG>8;T zB%(p2U=k4xA_bF)Xb>rA*a*ZkL8M^HWk8Z9h!jk{5lF@ak%DPN+L<6yFr7%12_gjt z5UDmnq+kZQ4KzWdU?vd_A_cRa0HQ&pV9wh>rkEg7a8N#$8naChDVR%c^Gy&bm^TDD zjV6c`971H72_glD&IGc`1d)Qnz6NBi2_gkY>;$sW1d)OT4*}V1f=IzpWWB`%k%Gqm zM9y{-L<)}n1jtSkL<$x%=Oz9>L>5q{EQhS-x~IE`ebdCMP3V#`39QJ|X0A4k%160n&-KVah&`ki4^* zO2H)+WKDpD4g1=Vic8=ZvTwK9?ERc<8v%OC(ol(pW-|(-^gf%@Kg7*u-UXGlg<7?&f_+R z7HD#2uqm4TvdyODnQXVEpWAF2nPh`yC&1D=8k;F2ehkZfBuEe`SjBEn+yEI`cV39p z!sIf1cUsR9QUU9iIl?RDl+XANR`hvr!L6%E71S}M+adVw`XJ&P{_Mm)-Hh)C`T6mi zK1QwyM$JwTMl|Xw#1$-Ig`x9sX1M!qq+gGiNcYEjlf6E|R;yjIU!r)ca=u`n;}G z2?QMaGLX}kv6yy$GLnZy3P{}(a0|zg0 z)E@}mAs|B~HE4Ag{4XNOfL1$-@TBSJ)vLUL42tkCF>jDP9aFv};e80Qd~e+GaM~s^ zG6~vZWTfi1AjW5geB%u#&!OysZlL}uGV)bqOKytH{V#kr9vE$7qL*eb`r#5m8APIQc3v!j+^%X8zvD zNE=2*x+Z4pX1tSb#@)zBR~s2Q8(Voxh_H@){QVN$uR;1&L@2sn2H<-D!pO)hMn>98 zWW;XwqsR!^naD_ciHy9Ak|r|JKEcRHyN(6kehjvBSK-3QNM)k?UZl?fLG=RwdQVac z#w7YMD$<8hk;X78;`MbxAY|Du3W4-_gaI_91L9 z`w$K<`w$5)`w$5)`w$5)`w$5)`w$5)`w$5)`4=$fM2c6Wgp7W+FbS#&|LNr&|LPRV5KjBsx2av zQbbqiZ5c-9366ygbm~EJZV^$ z@LLAL=Lf(4JVwBD)`ocfHZA)p=?q9RHT>9-yaFt zC#D0={uh${>_U9w4$@pCRh2E{+40nNB$XZ4ALYH&b4V{co^Zx%&GRhj_H3eb>B%52 z_gbF^x18><97trMnQ6^DLR}wAOY;xS(6>0*Ljd zkEHB35v=vI4&2kE?}|oL47Ux%LS~gT)@h@5usq}Qe?|nnP3_vG-qXk>4eQ$ncx7zdR8Ww zL3ZuU1*~A!`9M1G0#-1aAXG$lP54ujk+U+voRg5!-dw;6mJCNAT#gC^O9^@%_;_{M zq0qKDD-$edh2{cQa4cbSRwg)(usJIetiW+?Z$$@QzzU8hY%X90D;vPloRtYqAicSO z74R2v^#WFK5*1@EUL z%mu9AG^U#iSiw5N=B!Mxp0K%q6>MO)o3k>(#zP>pIV%&KLHW&DnP3x7H<+_B!C5S8 zE?@=UAZ#vR1!ogB7qEhJ2%8I7!Dhnd0#F8JT z0#;1Hw*`*IV%&~NV&{~tKcTW=E7BQGhuV#D!7HPIV%&~%BGtOSHW#e zH)myn+X-C!q+9TccVx1 zvfYr9pS=!#tRTA*b5ddUo9Mlw>@~2SWcF~Rx5_So0#n)PNGbMO^8#0S*JDwvbEdp! zC-kwLy(zDzXZ1SZ0#|u&ik$Si$OW$QZqq?i#S2{J-I-Cv3tZ(rNM6MYT;+ZK0@3vB zO?m&_`nQQPH2TWds9A?usM5EK5RH(bM~fu zIAL@4rhI=&Fv6?&30Sn@#M0(iei4Q4*qWjwCFn{z)+t#+gq;6GLIrEL1wOE(tlE&W zGure?bnLxD^NTu7r3%=fh+4=;Hv0%DsnAp&Eq7Mvo~3}z?F3_a8(Sx9=Yw!1+I#r z=fV+ia;O-_!EEM?idv?cvo{sPIcb=)Hx(l|#@ANz0$0WUmxE?)rji%9D(WcQb(zZh zkY6#9)!&q<cebA8?xGLt%1u`Y5q^(yR#IZL! zs63JN%q6$^K_xG6Rm{5zNMlghn>mLNSr%0C0$0VMyMe3hNtPLu8fve(( z6!vTzgGyfDs#wq)$mXDu7q}{pBI_+dB`jao!9nd4a3qI3oK3nKvp{(55~KWZtMao*n#2*GgXCs#qzG zrduU1a8;aeJ#vz`z{USGJ@JD$dovX{jYshC?2Qb@$B^7czQ`71?^(!Il;i~<$$u@( zCxjf%DWC#ULEA88xj#VaKBiJ|Nku{-U}3|)Hl*Sb_=Rj9AdzhLeonSon-?W(Ee(}u zXs$+Kls?SnYzuQlT0z+w%VHa9D@vXWstQ_(VG@!e>srf+c9WCchVy3|^eK5fXbEXk zEfQ+W-mrwUw;V$7$sko4PHQsR>>uO|usO6qlf&L?quEn!HZ9L&yDeR2vuR|K4VLHF zL>ikZBYq4E1tiGXn~GKJb~$^~rt?!sElNIz?}|5ALMmYWGDmo&Tte`O2zDPld()F{za-sDQzjXvS^2n_W&8o=F3TD1vexA-rEU(d6V zepsghuji=%zD-~yfL{RU^+zSYy^8C5EK+x)96`#)IrbzPMGNdS7) z<+8u8W%jko{yAm8i|lXrKeOx~Bv-bxuu9pF0nn=^m;IiW*$+bq?o=qyDzmF-5LN8* z8^E;ZrN}!E4Evr3pjSKPItyfSF-`84RVix_bW?)Egh0+S6(#S5VfDL{HgbjUUktAO zrT4Fp-tWI^`ATNceb05M+e zwqeNU0yJ$HN~N8v#gQf-f5~YTstH#Z`MBjYF64B9 z62&>a7{*P9J*!nMf%e}*d5j8w4Em{6UgkB`+^`~Law2Go(N@w7G}rXdnf^ep*K~)X zSuU)REk8xAao-tG+C~0JU?iq;d?@UdN)Z><3!7bgnO1YQ5dv@a@`mlyv~>{fYLlLq zs+#H5-k}-0Lt-Or?IW7;)0~W9PdTjKc3J&WGd>SXc*9G?YIX)@z=Ijyjo6rX;I=9ah^v~cjg(0FnPb;|Jirds5 z_dbnZ7$Vxs?{2g=M6~yHU`Bhx;@YdV+Ur5>^;fogXx;Vx=ys~P-=Vl@F5N>lHw1vu z+%_!}YHol3TP#P-9Ska?xjU6AJ}RnD3^gZjk*lp$vKzqxwrCWD!=b|t&~4FpzP|mhNl$W{wD}Tx5NHRDVos6cT59XoMeVwq8ZP3#-1+B^lI1a zzXrt(`Y_PiTePZUQ2~3CQ~R9Mdhc}pXiv{U9lY8HmEug70wcWkCz`P>%<$@7)3lHk ze1|vg>HSgXw+3p9`%9bHDlX|qow6EvRO2U*XZ+%0@RP+mxOGizJ=vRZ9+h10C#w(| zU(R2OU&!Zr6VcX1r12(oBtflRF2f1Q$8VZa<#}Vyl1%a*G@!tn+*bwQavK8rWAH41 zuUyR=c@;?VPDPO^a&kfNDf|WCypb$DJLaV?P%!S{=zQ2tbFi0To6Mxw8uiY>9QsKl;2lR=bpCkQ+{79o4uwQ zQzjf!SNS7Zm}`}LQP{Y)2b9WnN3HU1((OjIKi>?kUO!YiXU}&)bhKiIy+FJaKKhwT&_5k}r*x<2Q@i)wRfA$gS_ugBLc$vAQ@)xk- z9hKR-`RoD$em1=bP0j`|8h?4?@%4q5PirYKFJvt+Z(@}PyoCh^pyQLI#LH52{w?Y~ z1c?V^-ZfLpQOM*6hKBFt>$HXg2>SDqlTp$?fOTNIwTN5KnM6|OKo(oR{!HY~F1{T} zzk!yEzYSpCKmgkSd=o$kDN6aWTYSor@8Y|_yfikSaJpnD7>qd;`CGK9r;rjKzlo_v zq%mgzv?7f$B4s|LuoI_(R7A4nGZbmEi1aWep-4jqsYojUl#s%T6qwi3mL)#~pVse^ z3A3?El(Z?WGUM|`g#HuSq7lTRF3ZrZ&)4Vp+itR1B6@L6C(ZhADonq`GKwXU* zT;R3c4d7M)pbPvSW#z?rWtC;~vVot$&LGj`By@9IFR!ewcx3TZSbM&vBkWm_ z1_?$1|1qm*xW|9Vp7O6%xt~{7T+DJlQt>h?%VY!!6)RdWwVY^)tpbYi{i)?FQPvfF z1|TzCj-sQm`pgV9JWyzCdnN>$fa*;`>#k@`dA>iUm?GJ_E2>ehBRI9mhfMLjwjySM zCCx&vq-iVVYUfA|MYVTwfp!oH0aTXzQA;~!V-4>VmBC}NHh!=6Y#bs?)KwL6)7-9Z zTN2oFbc+&*?gvyQBig;jAKTt&lpF%Tby0o0%f<_H>;|l^6X?pGPD!A>9KJxSqg;gf z6oH0WvX7D~+SfrLLO+KXX#Xgex~@TBomNv2z{~~|W6#TW5A5U*DnAg&{Nh6km;j3$ zBy|lwcasl09E7wX=WX)6M7yoy!F4DLuywY;Fc!cv*iHAm;VA8y(jzP*vfsZLJX;qL ztSk2UZ)7Aj#(~L(I~z(dP~RAl2f$dvhDGXYRG+=t8$DybtU)K!PI|Sk68jzxoon}a z-h`+FFcU_krt~(`OOqT`Kwpz122_26(>|$Sic3zZrWye+9p9e%nC8;s9ps^T6wo}3 zj0dP#=uX@^3@OkCQVbQ_nTe)*vuZq!r_dJ;wH zOT+NETbPeJ?3|`|HvQT1Lr-2W&Lv@fH-v}x@j$(*SX0wL^QFk!R zq{CxG*3SVpJQ9!19-*Vu87})rt%di9O6U3zw`5FRqfONmXpGw`IG2buE3c236CG!L z(0Is5r$UV)eM00(tjAYhGEw=#7TLB*%1_bB%7!S|G&m@Tr>G*7c&gJ=;&`UHwHik< zJ*p1pUZTq2RU&5iVbG`|`jps&W&O=;2n4^PPQJdKHt4`&O`-A*qI1SU8tbFyxgsJI z7U*@iM#FtTofwmH? zfLzx=bH|dL=B^G6&Md4!X6l$4uo{x4=-{JzILK_nAFTWV69|UYj9;| z)|e8FWBLHBj-muCjv~Z*i0Nkh9}vrdqj2{^)U>Qv?BL|U&x(kitTG=&4Et7Cn#EWkrM)Ajo~b}KpEqp{V)8NOJ&7^A_{jX~wy zqEuT0#!`hNP8KQbbnZ3qb`i^m#_o=IGx&AkUE@yw#^y1~ZA&oHqgG<98Qrl&Io1s*Uqwec+7+)birT~A4{Oxz z1KR{g5Dj*?17n}j2E?v&z*|;15wWv`O%_c|Tjy-uh2UZ-hn(T(U@0nZp*zWtrCC7uh>b&jn8v^OJ z30r_M7n2`R6stsvHP~S+gI3oPYT#~61sx(06%Mn=i!@(o40lE(YH*ekSV)Lm(uq+l zO1(>6EjlSr>Zoa1A7#`ycM{4j(7Zz$p498fFfpMsrFJEIca}w|{#z{z%7LE^&A0gg z#LMd4koJNVvpgj140v|`St=G9Doi!bs2&&x3?9UNT0Zh%uJ3@iPa6(AvzAJ3dn#5 ziB@uiTn#HS8sIXDNyD9ox}!nOi8O*dxQ)b0hj27v^=o;L zV?SmeV230p5X>ibNGhsBa*#Yg>gjj@9fO=*bpXc3o;&iI&wci}hgQF$j&V z+xgq^E<&KYeT;c*0iy8`YiDfE#_r$RG((w~E!2Aqi%L5a9oteHJ*23Dvvs!qn60A$ z$6>-1zq7Hgb9Em*3BYt_sW33<2}Z|;4k{TFPvGzx8%z3Xcro5!*6Dn-=&XCcba=Vz z-pcs8w_`M+VqbBTw2VeS+4XlEFoZT^Li)^mqL6jpBT>~kj=$BJQ?c4w$&YXi%Q z_Hv9%%n#=yjoIQTByBa^7{bIIvy~aeHQVMpLx;1Nt%)SV=)y=cjn<7XnR&y+k=2lg zI-?9lhv_4Fn8QEC#LX6HqzR3TicFst$GO3oKjNdIr9&rwFz+)CX5{?g}wBxIxos6Pj!i`K2#ZjWi!?`vVExMWyk$;~o#o65&hwRyd9mj!=9w~{ut?ygKs>*@frzbnFe>cMhF;%J0-T9B3209#ntR-Y zBSOcF$SaF4ma`9xbBD}dd2npUhZ!?w`Dm9~PR!LlUJ-TC{cDiO#6wg+HXb5q^LU7R zECxSmVCLHJBnk&{^jyWBni)%9F{pg&cnsQlyRpK<6uOl0X1_JTX|1>(d+Y?_n{DKm zMNK0Ihv+G1u_?_qSX1p{befHh@PtXuUMn6p#mdhKo8nn;oSg2!oex6~V22hB@~=N? z`L~-7BgaCkx5qXQsXI)7D z#3N_A)MA9yiIx)W;w~_&!Z9yK(-kGdow*zup+RCwWOsCrqCBxfBF4O&vmsdf#n+pL z0+XS!b~5W7r--?Q*mD>P5FHk=0~C=DXa20|grN|H^9Mvrw}HAV(m^cSuNGpftOSo; zt$6IPAv9Q%5F5m?fXF$1JPvCg$EwSMzu*wH3q?(}u~S9)7&i1Hb+&<&Xrw`O>*vNw z#o^%*jFrzQn2%pVCp5O$HwR0UH`_Fhda^!KqNA2UO#c%iKJ=#(9Wf}D99)aIOpa8{ zjVB(!Sf)8U)G5YOO?3&3;BYJEcp%-xiaA&nZ4p*a}3#2J&^Lo4&0DlpIvH4fT2Vqz9ZhsRwZ z-UJg%D4=gVGL|H(C)Zt4`~PUnIR0chzV7)u9xeUTwhzs{TC`+}ySINZPUZT!fBr@q zMiUz}+(xVGq+PmCrNt2Oh{ zT>ny|o`<^^ShQU?fuvc0I5tGAr$jmUNsfh~X3ak=ZnYAWas#ro?BOvQ43iO2LVQi| z4;cABV@+VU5Yh1~yC(Suj-vlx*dxRB#VptvJuH|flt9Z5yE!rBmPM*1&g80l;W9Jo|KW7uj59dhvkDCFta*4d!)dTaQ zlUL68)N`a}Z%}K85$xG*K1=6L?`GD+b5N)SV+Bt@jeerD=Q?K5By)r!n!}^1GS&k) zN5OT)IA^{QAH(yaT9{SY^P=cL3f9t&;7i;H4p_O)439rU6nt@_B6Ko9r#dKlNX}MJ zTpNR%?l1%S0gjE}Xt>qK7OV zCU~ABOn%-!+n9HV4Gra=*6$257ChLxpCOTNvBPPo4n%Q8@n^g`#3g5V zRMHG!y>TOtx9sEI+)0DyKpfX(&z7n-M>(y73mNS=HVl?A_812CH0%=&NO6HY#5c}p z0=pUY9LjQn_5Bm0R?#Wiv+>fD$&mxeSx7Z#DUIyXA7QVJzvN;V=JP zmx^(x89hvC?lk{>j@f;w)BJZ^Dq0VOv6FjU(YlKPjw{0O(`!d`IfKl~krx$pZ}UQ{B&TH%Q~?hv}MiX^4yS5 zlxxZ#9LX$UADbU*=lq!CJ2V^;v7Pf_sNOrg*_!hR*U27fXS)Sv#y-mUP{%`>HK*ex zbN!>Z%tdjR`ERkej&{;5oKF7lK7V%OI~7sjnh|hZ^p5+{w)To>)<)G4Z_j;l-98?6 z`g<>B#zW{%wEeH2O%5$YLW?n5a@{6|!QVKYtYbz!3Ld@5P*68e?TlNA8q1Stj>Ny? zS+o?eCoYUPf_pUE*JxpB9D&&wyUsBMN(OI-T7w=IEfeJWwl1G#K+87TCSVhtJKzx| zr}L6aN_N=|->5@bRA>e(?kC9jMEk{4T4glfTD#$WQUwA%S;-bHoKL{b)9oB^Gh65 zblvK2y@%qTv7-B@Iw%eP#XZsgjuo9V55ufuS0`egimpjV45!u}uD3yaTPzE{#s;@@ zcZGZ;Xp4hP_rkh)h~2$(oE++5*e_=-=dfvh?b5m^tmn)kC_D?mQRF(Uxc78#N{BOz z9SVqP!Z{m2@9M1c;LVKhv_8!GL-+B&b*t{3aU-?de=x0$q5^tO+Z+afLhSn}97pKv zhs_%)R6{W@75ONXG){1`&a2Yi2Ax;o&^WLD{mZ<_%~2cfG7l)1d6Y(1eQ;N~Zjxa@ zrNE9jVipSn8hP=A&yun#*K^6ta*%azxIb9A&NJJ}nv3T7YSj1Lj+NYlq+@g!Ja7JKpiF%<8t{{Ei*@!$5Pf8%)7m-y1$Wz|=2 z-aw!I-EZCqmzOfMy6Y(o4lT@<_DGeE2|PWC)+aFwbsnP7<;E6xaG}=a#tu>7xk>Yt zl5-m^wjIXl+Q7dGb}h)k(`>_RSD?5*!o{QBD%h34|%3SecSg9 zjW-TKcFsl5P%Tt}Z2OM-c=juP+_K@q}^`|4>E>@hk$ z_b)t{t}a1+esnB7*NwOV0a)bU^~gOoHrz=AW5ap&&Y==MgF;lm30yjJMvR%e`i3;k z533t@JHQza;s@NThh{|_J&m%yPa~-DBe=5Tjfue3wyqD^0DHoYiUevO!7J)UR%OiL z#*=kOF|P8m0~>_kU_>y%yeh(dB83s?-cUA?S1SzkVI!|vyIq=x-j54&B{vK6Fdkqh z6_k`IrKPo}dCP(E4DtKO81>FuPwYND=iMg^B!mZdzhs$cH^G$Rub;sUPvQUn=JKN( zbo|#GDs$~KdgyFs5w22Vhsta+jhQFO@ZdrxM2>lVjKL!|YJ(g-_EED~A;-F7+tJ&O znvY4lYE-+&6=XZea)M?E9ftK`yx_@nh@yHqj>BPT&yUDeNUR%kXJIp4^T=&DfNH@m z=Y$zojgiH3`fGMii}T?>^QKlfD$Fj*zP9jRdDJo7gU3-&PNLh>re89%{f~pm|JDHzcW%lu z_}tPnE_wb{i1+Sfop%=Vg`=Sp&AmgNwN!?q~PF+!yzc_O_hDlqbe#Gi^4fMPqFN>`_RZ2 znKg%V4FpF3jF@Yd<>G-HG3(}g^w!C;fdhNPhb+r1|tuy`?Kky2TR*SZ9EvyH*TV@uYN0hLRy##QOspt-AZ#)xdg!-WI~49~jj z3c=nES09O|^=t`=a68<{*33oQjW^3c9L8s*5fYy@E)Hw!NM=R|;l#{18f6GX8LYGh6&9^?z(M~dV4tH|4u|Zkg7}=m~u>@svJ>DFryTk>;N4fqh zW?k@BMj|t<&5e_qFz39;IU|nix_Ug_irQm{5zn=ryoD!RW09b$4@g&=O&^LUzN zd|~{AC!A{h{E{s27DrCi^NxuS<6&KI8r~;v*_#>%THppczRa6Oc4b}{kczuk`$HD! zTRtEyaUSXbEwwe^4FmRGQCchwna$q82p*;m^D`Fzi@j;wEOTEe<34PN-6W3Lw!8Yn zAadWW0p}3CS;Mg`q~i^0#wpmX3@;3+!^FBT%C#=Vaj53OSG4|fiDRPS5P{{%;m)@& zTGtH}K}|O|_hqiuvA4KcQzt&$nHb!oP~yMw`X+j#_*G%2PAH3>RlT}>cbcpcog2b@ z2Bp7o0at3qBb}ZNSLV)xd=3Wbbmqe8db4nXQ#GD+5}hR+s$Do?)%X9{dk^ras;zH4 z=d8)FLzRS3yhXrXNWc!60N(pvH8a6-RhUTt3ouClfh02_2_zvi3B>{lO;MT91)QK1 z3kgjT4BbWoh$tFBtT2I4RQ&(eIx`_4_g?RP-tRts&;O&$Icx8I_St8bwO8K;W(}Fn zqXCTl&&LvIR3X3E)=0YsdN0(Y;6@sv%5xQ1IQNBw#lWQe&IcN5n)a9WT-Ae(6GY7w z8W4W`q0olF`1j!uAfz4;e+rVjx~@XOydn)$~5#p!jRl0+ya<*hV13V z$dfmTM?=cW$3k7pU-Gy-f-ZQ%z>@zQDKhbS3B>3;k11K1WiZKxRThdjMw>j#|L^xZ zy4bGsytu1D11~%4|8;)Fm?n+=jxc!V1;FR`@(WN^2#W@34~~N;IEE+JCESp(ywBs% zU(-1u@5^9qzm8jEpr*zKSklwXN(WI}FkTVAKWKynjCtub6*3&a+aUhM$A{f!tOCTk z3kiCRDgXcGF#3q;kKav@xeF#?=SKTwXby7$wz0Ux9R9Z@L5)cOo>*c8^N%f@FFo5> zSj)S(%(fVwZL!8|Lky7%XIr-m67U88Z~FcJdiohi?;k7C8?$dAD-$-pYM55^fiK;2MLCbWEIk!PyfRRP$@&jPq~2pkPRb#P7pUhrH$*gyt99 zY8dn4B9pYB`CpJ}LTIG(FJu1GU>)vlj0zGM72wFNi^S44nJ>t@Fv=Qcd!s08h8Uz# zq&1d@U$A%mL(8v_aDqa@2~$u+a$bI7KEIB+Lz*=Hm^2?SyY?f_;?eMj_j>$`b!TS8ri~ah+&y?mZ1$bEKYIJEU52NP zaA$W(8R3q7BF&W<_RouC<^)R&PkSOZWze8sS8_+F{(n&uzbw|3Giu0%uM7)&^6|70 zF@wJiol6f{vG7aDtWZvx>edAqE-=EQaSP}}YDzKx5Jz=VXvaDqk z;TxXnPKZsQ3>6cmn>4d>nRGKPEAXMz$6*zC!Y|c+7-pX+1)Q9}xIl43_J!$JYGrhf zig|!?WBx+9c3ew_n~2uQYu*d1x)H#d0v8Iu7pDBEfs~tnyYNqZ!(A-jWlqQI?)RYV zEy_}c`$T@uqTiwoOmKIhtSTfWpn)32{P zsdOq#SygPN4Yg?IYV(XTN{>;oG}`W_VfOfkychs)3Vz&3s>FX9Sfw1RjpBA5w>R^u z(4YglilNM^N*Zi$sLjXOTk=YfT}CR#iwY}esGjmBzxhy6rkfs9R<6{G|78#H9lr2Y zsc?s`keq5)QL9tr33=IuJjHK&9o0EFm1^@{(kU``R%<@`Mhj4jDr#L-)+PSQ8k31m z=PN4;PS%uF>am(@D7p&MR5{D2sd7@YY88bcYv!y>Qc-K`)No`)a#6iA_pSD2k^G%R z%_>kZ9tFK>_}B5&0v~KqZJ(hQR!3a?0E(!lrd8Q0T6Nl{)~ai3CN0N&+K`LsjMu*x zu3}Ey)Ro>M=ZO=lc8To^1!E=uT|y{N-= zysFG`=&3{alnAGEVzVl~4CbFC{`uJK;fwk8vT55W+FFXWTS8xi`P9vNuV@wh+#PuR z!WXTZ+la|w9X7jMR|wBJEU1=!6&-;18JO}XV;~#n{r3uoBglT5=!oiSzhPK#7ggOPlyZ z09EENqS<6dJ8;h}J==uu$7f5WO?;}%E2vB_Fh0>t&Fs|FM>#Iwnxvv(Dp_?;rdGh* zcxqg>On|4ALRZkq(fkz?m7P(c{uMbevu|gNRy$gXy=)ZQE5#Nx6l*1)Rb`ZU+bFYM z%B%~PIYLI6SB*0Jj53R)Oie?XmQv4iqj`pYqhvnM7|q>Y)kGi2t$iz7dTvh>y)%Q0 zdCX~wna6~VOBb&&>ko3)&K$1fJG1_nrl!*$1jB1)zj=pB)vt*{fp4?98_$}JipS^3 z_Ze%-ospn>_&%8Dw3AUq&YTPzkw?);q8u&jpmu}SBkg0 zkAqo$$@*BbW-9$=e)rd-ohZ0MNk{A)%@c2v;+IwiAKD}jRmwvLjQZvUvkpksJgH$@ zu)f!&iegQ_v!SV{W!L#i)BErXpU?N{i!|(UBNS7Y^FZYM$JFKjIoeUko8L$~Hlh+6 zh({sVE~XekQHCf+CLS-Q7(vzz200Dt34a=qdm)Mp&-`yteiu=7LJs4d203d`Z*tFM zGSh?rn3TKhLB4{Nd&Q)+!HyoV#;d3~`@CIjYlf7i(ztxyLynB)nL3Mj3LY8D^wcb3 zy6(tWo>(uEa;>3HHCe0U$8h#p6Bivnh7mrQ^%!h9a!2P(dIC=u&ls+8VmOGqxdqDV zJT?B%{!H)8naHXf1C)u(*Gw|Y-yg%v@*NW=>alj{9Yfab-7t!p360YTw zQ(Q;USgcd5M3O3=8_QLkVQh}P2?G5}T@9CM8jwBi# zP_cNVPWI4=MuSdE6XpgR^qI7w)M(HT0=#52=o+W*^g4>Dtt*TjR=HobTS1TOS8Lvn zQQs?4?n9%#Wl|rySz0$)vJM*cl?m{jNxu~zSes{8k*8IM1B}F}1#k_cDV~i+NH$bu{#`~WtlAj;W!JVIaVs)}y# zQOk;sC~!a~&;pXZZvR*y8|>wP)YaCz91}o4pv-$?8GUUqTDU<5Yy-KtMJd51uIH&I zO?;bbf0ed@cmvoV({{5_OT}2;H#U?0H;tC$`+;Da1;}m1RyaJXF3vGL>EpyQ)Cazz zqj~14MD-M?FNW1h{OX$>Tl(=#_*lN~RdlnLuCmi(m?Vz4lhjPVPE#qLa!DE%Sf=W5 zt;*xYQK@5~R0oB2(^~0`ZMqJf)=* zE)x=fK9f3T>UwvEz7}Y_j-k=%tN<_b6zJlkb73md_I6ip^nB@u@5A&vH2!Rm748^n zR;71oqcSN`MW%b>;vM%MQk{k>TP8)>X_S>Nv(q4Dp-y;fK4!$Bd|t0U4FoY*2LWbl z7RO-+xG0LS>s_NV@uC-H_xdVKn)7@Ce^R05aZjOaC$*@ciUMxI?pSKBO2`$MNx9Xf z!xq!KVfOje)I6~Mgx@g+l9YqNj~p` z`!wv0)USlP+iA2Or#(g>40S4#<{iSf7VSZ6=Lk4ct1Sm`R627O7?)7@cnWce_0CYrhP+!CShnmd%Ws>osWEl5f zb7eHgBn;utIZR-B&5S00&S8}4HQO0@aSVp%i+l_EntS{hiYHIdyR`i~Wm~Y6Yt?#H zmLTmeF~3H2`SxA$aW+T4c$NA}vKsgZWm%|&pAP5N>bJDplAyLbRPQYb`0&IE)V49) zZ>w~S{y33FV{HGVI_ft>*|=Av1vAV%xZlYA^Jc$(ZIt`tfj#yxu{$SM7-BQfsVq7( zRe(fC#%7_hj)7El1DcY{!}3G8eZwY|raEoJia$gfFdeA31y_q>I*lt(F$pR@zHCT* zf+MM4TzovJuUF`XYTAVf`&U%*W)3zIplj?6fF|S$CNSHnte~n#kk|ByKA(ju(JLav|?3v@^$^5oY-tbak0K(-SSVr7Y33FRB) zRUi!hk-Q3Wq@aKch5iv;^Pdtk7ZETQh^5YpvVvqw*zh3P(gn->v>H*qTt&_M3pFpn zlo`R(Bg#Gvw?ldIwDmaR`;{LBIEcYNc^ox|UvVTYD~hE@m=*jQdp;(9OWug=yzAfY z0g{Yt$J>FfcWX^eU65Q@dqRi=p+@AX17(nSs3=AgJ4I}=LbIeS_wxJR6|}KNbA{fx zRuVQMq2}v3w%|R1z5(?s$_)9Jp>-R zsq;%}>ZwaXYgXb-U&%%^Pq){+254^{f7#2r$5B_O+U$y>V_|;!AYZ>;E2Z|eW8E|g z+fA~Iu4aNvd##}BJ@fMz%^l>;qU_&7i_ zm;fPU)lw%F`95}lMU<^9{1bULNx73$tnn{dC8=_nsOdLp`zhBl-0@t^bBPIkFqDk@ zb^X@X)Ev?+e!~)>VGo$3IrGNw>kgPIuD;`H&AYS=ECMF!NcE4Ovt-yi@b8}Cbp?~8_Sp22;pyu{i)Uq#EFzBLiY~GOH zjq+2JXWtX`)YSUP0T3Skc{WI>I&zb9nM7F|4oSv&AV%(a^Vtw?KN3rARiyLGhfh+D z9Ul>Mn0e{KiFcs+k1i%+WDts&q%&>~?4ndQ%M!&K3)PiF{U^gV<6ze?wy3BHclW*%ImKgn&HqT2-T(@P68@27EQ$pv1W&+( zX_AMov7Z0E(U}mB2Ywg>^uXUqdT*Y7FUY!hmoWKvhxxmur`_163_>#1hG)UvF}#B3 zne=Nly$QC-cYr$euu;FuZL)y_9>i!}xaohP*SX|Ic+r;hZ!+qQc=LaiX+a&UT@< zb+N^%=(v<}6-7DL|DkLb{>M*<3^g5-(2TSi1)_X@DXQ) z44V-A+g&>C-v>A&(PZ3o5lG=+a-T3bPzgyDqAHu2=EIPKxCE&lGA$~i_h{- ziJ!^@t=|3YP}T3WYWqA2ugqs&^J7iKSN?px8_)XBG|>3ep11f(l7C3U+}=W`@_jT( zb4}gLwa^dwijj;?Q#FfRzt49n7RW9v;FW)bcUWbk19+%|sycrBcs&(ExE~2V_oMt; zy3B1pI7EbLo-E-5Ny?FG9Y=0AU^mAL)aYk|9tf^UOIw{8Q zq;{WDKnER7Y2Dd6p3;dF6I; zJ^i7YuE2(#YNZYkDR3&KDDEYKR?WD!6fPTTCZskI*?SZ7G`>&g9~PK5$-ow7%S=YY zOY%heI*Ifi%nY3pbTmmsL&kkM#0Sa&_7ZQ{Iu<&qYV^x2Ql7b}h!lTJuys97B_+hq z=IZH~BY6pxnDShmQcFl0_zJPQHNZe#s7=y z`#*eNQjea=ac%?k`3ksE-wE+!P$Qo*9&Mql7Zog)g5yEw>QpFXOMS3l^qHuBNURei zGu03)059=77c$eJ(0}<$1xCTn?&&NCJLPCmOk1su?+fSa5|YTu4}Du z85^Or6oC75lU6I_!RNBD+W$Tmma#QoVqIO54EVSC;YK?@7Egn){K93$+xTPCgHv^y z(mGHp=Y4l$gHFkXKGy2>x}lD>-bGJzjI+hk$Xdu{VmHva9LTw1OUAgp6XToNyveOM7>T6Hxi<+*31TH4QZHtHY+h%jqXAq7QgBhfj z&Ktbm)YyTT*VM}Dop{Ftda`2fJ$+PGkDjr~)HH@%wMmrZuZfFKW8(=swJ5Qb$M>ZO z&uDdT&zs2R8f)9)?J@9*_&B;vMZV*J1hjABZMMwB_{83^G^&DM=l0P$y|&#Q^9OSF zy${?;?P9#P(f7sDebscchaTuiU1Ok>_u44KN&E7c{IDc0dB6PclwnCKyFYdhW%w!D zvm6t?0t+qi?OUPMPAa1)>vzi&9FzfyqMBS*Ff6J=8{2yR7r#SpHnfSQ&efME4jgqW zHLs=!ZG7VFvc&lA1CuDTf}&!K#ECr;yL=VbV-~B+cZYE?S)W$(^am4Xt0*o{P3@Fg zkxzeuuG2!TG@EMEV*nBzc%X!uYKF0avY6AlQ%n0x)G|QLjY0$WKpJ_z%KJhM*g%WN z2BsZSnImWq`Ow5Hl>2+)8PH%!TPebNJa#*l)&4AA`3oXgnzuiT34sL>5Uk^#m)pA$ zda0%{@l+}5zl~CEZI%alni9H55Or5z3=C!{)gJdxak6{(Y|TQ7~-!Keoaz;tVcrb9I54 zRb%@rZdxOgs$W}~HBzema|H5$FNi?8YVGRV(nmtuJit`sEh@m0oCLn_p#rbs9$I9` zY}uj;z*^yOH-p3FtTzidFTu#VgP%#ne2Mm7b?6;ciWO{7j?q{YH2bm4>}-m1mD3Qv zJ0shj?#^|Oa=WwK6zM82r{VrF5Pjihl;7=kQ?v`S8T)TJza@!havCZIW6e`>x$ITD z!g!i47w&#n7*F%%vT1(A3I=yVN|&$HDN}xik(GYcW%YUlChJDokh=dqCu@V%-0x_{h9)WIx-naM$LcsgIN`3* zmfumUW;npaP$qT-&qI}JsG7M2!*?Ykra_REKy*r%*HSLXEK2p!pILWkfy~cIZVRl;=~zArt`ermmygF$VU*Y#JjrBQ6cZ~?VhU*#EvdtJ zVnwskWEdmJKR}9;#q!k0m_@q^TAdL99_FlXG2vkf7+5y~k~$*A&};S5pBpUSFasI&W3z$;bzt=z49>$-xs(?QL=7{BL8GqaoVL(3# z3s&!w>~R`6F=URDD#u9=LPx?4@o4h0bHYS>M3Zz*nlw=hRapo1JPc7nE&fWf=c2`Q z6Zk^@+E?XkcY~8I?H8NWH`bkn#4_e?Vee+VV4D^){*d9j%IH zfGMWi@xLqnpUub5D_SjVl-grAFD)&dPotc;Pz#?jQ6?9S9| z8;cz@bA@@{O^GRGA^_^hOE85edk3C2PG6~x)4*BU(w=jM`RQ}eS_=yF>owg9b4X-d z#u=miN9LAM>ym}AO4tGgZ%S!G5*WGuypdTTO)8C#b3l2(N=M!qU1_lG1!2>Jc7#>M zl{ymQ=?_d&O$aWb>N!+WP~xDD9=ff1+499pm+#*F0qV1}xM3LVk~G>2JHso%@38{0 zUM760=E40B!d;bW6{vI?9$6|Z*bc@z%>#QMNp?(N<#@vV-B~>Uyu1&zIE+C9>Q)G` za=kO@iU8g2n}4Dxqvr@!+9iJYE)}a%CaSjERMey$@5e&XQ@b5WjxO=TRP=OI13m!l znxa*A2XI1`cPVrqsubY&A|{)`BDMFo1O7}TT|SNV5?@Hs`K(8V9-LJ|J4*Rot7Add zK7|5r36d(+Ar=GlLmms!)@n>7K)j#NSI`rh{-w?dYef|v&|pbW2k=<|$3Y>(&@UpP znyka#3s4}>r+2_wo{WHkdYBzl$f`zgf$jF~9+&J@}uXe*r0H4@M z0Q2PIu2gKPz+@NEkrzvt4e5p~K@|R#DOe*u^8)++3#2cTKTrM5ajPu1p`tRscarwV(o z1y@U|`?(_UzdaJ!2xpa>t!ANvX^M@P9;}^rQ;ItUWJ8KOp4=V*TKeVUHZDP^lb;sB zUKxv@DdA%-Lld*Msos~j?~QI2%WQ6{cVVbPpps@-hxBv4>evP}RBat(wczwy!@R~{ zCx6Jrg5x?jW4$>|^;lkNufdEC7!T^-7RLrfPIeP$?iolU zRL3F_Et_Fr)25Ol?W-sm)*+t%VIIAc-93rEO@{=Ynpeo%s>~`Cir|t57J{V*4uW?E zUIYTB;%|MD_R=5xG{i-Ju!3~7PJu)$RdrfjTIfisJl)SRKux4^Eq(DcHv_7*1I?A? zToyf_$t-IXh&6f&DU@w}$`H1dm|^w)7Szh1F!qHx%hi~;@JTx$8*fX*0DVW!l1(tu{>fN|~|g;$oeVq981N_mvm zv1Ltkh4EY~CR4u{r79f#${H`G)X{xRq7BxqcumlH4Hv04f&SA z8h}p;_(KSsAYdQ_772J9V6g5&sr%UZmz`_LZ?7{FvQXiVl2Cs>;j|>2IiGM+5`H>g zM?eyOIiK)@B#ckT7jPTDZOQ%lY50QTrXfn2wWrJ z+7P%}zzrer4FNZXz?A}S4uP);xFrOZ3%ET5E){TB2z*(<4@2Mr0e6SMxdQG9fj$90 z34t#PxDVh7H(Sm<-;!+(HTskbuo1@$DNq{%rwVu^1Wpm~DS*88=M>Jpxh8HBaH@hu z@uSq6nMvoxsmZ=_+h%X6*WpF=KSOVY*PRMgc%}tUl3zmLNdd=U=A!IwV}&j>*6Rlb zw8VgR7*M$ZZ84zb2DHh5UN@k(4d`V9+R)rU>gx@#G6=ro#uwFvTaw;UZQdeJuAfeX zfI#@z6HCP~misZs4vRvg+_zi~UAC?TBc*pT*xYEH z(bcOmu#3j3C$oEOO0!d8n;S~Zx}Uhl^WlY8q1}| zkBk}(;L|KWUb|C_yjH-|MgZ>Pm8KH6*e!f3nC59?Fm{U({wr|VG0|?Z@$#Ew{vS2w z|F?|rj$wrgdME})I35Cu00ct7jM4ns5Wgv}{XtqiEjVNgWym(UWRg_`k0y~0};stRA4Cc%`0<_j{GiMznkgR zX+hW??owRnzpd6}26zNJ zdb>t|y+R)a6TpInQi7Z<_|}U!+XfBE{|2M_Pi>1EI9Fkwxogl^+&8iwxR9Y`v36c) zTAYg1+OsZ{Swz>(kS@`1*R5F)P{X^xVz7_b^$@A0BW{0|8zp_oaxHTR| zx(?0~MnEpnli>v$z75VhPdo8vKaj=(t_5wurJTvHO`|rjodvVv^4Vyy?xFp8o;$O# z+7=IGiRu1mD{qkVhq7(zXVJA(0>=*8ombm^^eyGk(vZ_deh5xG{?*`g48}@zORjTI zqZXE)P{GVkv1RU|oDv%DVGgLaP4dXAgP(Dd){~DmjkUl*wIi-*2H&h7>(8QVl_v`R z7_3ij=|V5WKZv>#6W!@-YO2A;cPmXVaK`UWEu*90q91hDCG|+<2Xb8TxxxCkur-lp zWk-erzHKn;MzuTK40=2x6yf6KiHoar{%mKRiYz>RSSNq@!lFExCJK zZ(5(HoHd_(n7Mx6E;#cg{_UXo#}XRhAl9f6#O8z$bJkEawx3wyxTnrPOXDZIOG<1h7tA16KT0L98MXILLVfIia zU!k6{>bFIq86UufI-RXaNB6?dU(jK8x(b316P+8W-=m#>2v(*Sd>JaaMCYQ$4J_%f zxijPFGQZkN({#H^Oqr^dAq<5}4H=#6ez-SApZ9vtNGA4P*YvxXYFpb%!KbJ-3eZEU zb`Gl*vmB3PsVJ0OIMR-iD>VH9E;*yMPj#d3^D2s$(Ulddl%6)}w`oyR?n{=Q3z${$ zH}{>{)gNZNZ9-KHY}@p26P~ zL^g?XPs6`9C!KhEHI6g}*{-{t)HZH{uRSNJbapi4w_0&)5)54rz*D&a{(`O#RD z+bB3dWBT~lQ|*Ds;8c5Fga7_GEzlMuL7)vBiUUz}P75r*!+A=z1L;KVVRz%A$DI_( z&cZ*7|JX#R`+#F~8tktt+T0V^4EN_mZwQi=O;V5LG2Qzuys@qe&;Ve56o&~tBkjqe znmmJuLI5U+dB8ahwjXn7Xcb*=ag5J?qBna1>=#|)Vx8qqd&FI9v2Ld?VLMI>^;%k) zr>vde!1^egwEcm}=f^S0qbmBSs0U3tX14mCK7xV499ZXnu2oo1(+hBqJ*3$kHmFmc z%eT@|;AXyltNBjY?)o6!T}%r}S<C?}pGVf8^*+d+fkMx{`U@+3O8_RUIS zfk~wDY)Pdb!LSsE`*5|=_;5d+&9&2{a7${Bp?CHtSA{q$(v2u>anO=H4{gkgp|!dT zR|~EcxLUy~RM9V5Ezr$Zc_1J9dgz7<>T9K&ROHcOTBHX?r}ye^Jz1JEoY|w+zQIW_ z;6vzCre84Q>QBW98tZLGcn_YSHG%_epNKxV5j@hQPeC3e8xi)yeV^vdi2_QQxT2y zh_0;KcT-BSyo_Wqo3fF6_FmmJ}Yk6*KxE=KRX=^V{hx31uPc(8mw3ulzlL> z^T2lvy0N2t_Z;8BiizzM=8N&r=j^uzXpUG59W)&6@g(XP2`4Zx1CX|#LNKO6)b)7{7ccQSzst=p?7W&hxVv3SLUbX~ z^t&dH8uqltn^%Lm0`|`fH!>rqQB<07*9LdB*}4`*UxWpsGCRhXmC+}deU%6Un9_wx z^8HzZd-9%fNcI;W_7@#d?Ra_lz>_2&!LkQuMwuqfJ^EG55Dr!F?Ht@>Vfyf{r`p2e z<};JFE10R;n&@tm)*q;Zi=}%|RV#Q}o{UcSvH6c!Ew+OJu8RIsukORUrOz!(oWZV^ z5A)=_4hr2tU?&3b_qABh{LCc(X!`=(;474Y|#9E(`bc-rWbg0S5 zE*Bfzo!}Q2vU4|5ykapto~;4rX#VVn@9XzSeeo;22d)-}GejF<%u+7E4!sISoB=Aq zUV1D)22OB@&DVncg5QpZ=tZwcm?%BVxapi5QViBUgF=m<~ zO+PMXlvBi{^0*ipPZ6VIq;njbXXJ~20Ul+~8I}vfd=l|NQWMA9$nA$w{}6XEDu1fL zQ0vu)u@Ti%5|#uGK3@PZssJDvJatasot)0qAwZ=ETlG+7IRhiFwR2}EmPa9W3nMqb3y&42_%B3uI2$P3U1H7+sHM=>^4!0_M`Or$S%Cfv!*8iNB$ueG)tfPUj#CYH8Ql zDj3wktYrF~X*b@NJg65v?BUvCV<@AVT3IOF3Hy_5nn%FC74=)`i!mb29-+)PNEOS@+81+YCVZEJI69x zw3_TH9+qw`ofP4skyZGZC*eH_x&zLWuPL|qelHWHB!UHT&*9OxBzVwP5GF+kf=L6h z?|@0JKp+`JDXT80%c`j^Pj)c+7Gxrxm@Bb?HtGD0m9iY((d~VfsObLaiJ3Cr5yPmX zL%+J+-fUSxlcdxcoh{)fNP#nY73b4rARRgbvTOn(aqdDGhGn3w7SMJ;P@RCT%=6I_ zViRffr^E>SNq0R8;AbQ9;yAL?OKeU34T5Rb6-OqA4ScbEa0QVc_m!qOS-dO^2OZuUEYlm z{nO(<>Mmb~^gR$NqZ*Jzku-U%iusa$)Omnsfv80K`#O^$Fjm4x<%ksx2>*WWRy=nmJd0)cNEJI{Q(Gk6muqD4+ub1;icmL&` z|9^vFWfMt5S<`r*zi@A7ZOy1&!R`EXnAVoM2ilxzOO+b9)a}frPSsgi_#-B>M#b=t z=6fF8Vp&~3%8ve&ZZAKKXmlXhCxU1E5aNH~88O=J`MDur8CwU0W#kQC9iv4iXlb^B z2Lo-}hyjFCx}eNvjTk_p;WAGng#mmC4B*>f0M~=pdmF6PdS(E7KH~7w8bI$Nbq$!W zD&_#wzUMDFds%XnyVvj zEQs8KE`AviZ};YRq&md=y8n)xk#{}hI~8hi>ciQvHo-PN8f<8UeMl@J$QvR0n;i^f zCVEhHMNqK7ckD^DKdfXWzM12K+&4NS>qZvAvJy(AZAtD@8kYj!LLj4*_^r@E4T8Uk zD(QvM|5W(DIVO8CM-c(*hw<%dr&CZoO@h+v1bO1=Y22J93-f^;K~NOaV`w%!_=fs8 zLdWxYz@I-uBH+~+r9UH7L*t$O1Tzw$Z5}|R0KDUPAOS`Qfk=qrtTe2aW@yS&=T_|z zoH)5}63nrkv;-0lssXRF2(;2Zn0Imt3ej$UZaMBz+X3NW7D@myf}<|8Xp1!9O6=L9 z=1y0&h?mU#8odp=YZF(oqOKAKl_>J2c%rP+Tws0(ekr^cZ(!pF2AKIt=kIDIG}SKA zp2HqOj6t?(wRH~F2Dt{DUInp;!ca{^gO6#J!^oK}lw>+HXSxW$x(`alAIAF_(GIGEgf%cDuX)NzRtpa58P&X&t z?^26~lycY}DnW+ooZ^_1o=Dd~!_ZB|zDV~4xa@TZu1M<(s@$^?0?xC5ehSkEFi-gQ z7;Xk=ng&iz*twb-Fmzz&gq!=DVw^tf_sPu#-7x;kg387y_}@nE4Gdc&!DC}@lE%E- zKUB>Bij5ofKoIXw(phYr^I^?BU z1=V`5c7Gd?R-~@*4pvECHGOW;D~0;4ZMGP9h~^Zfrm3r*xw%YFZJz{eq+&-WZFUp_ z{SY0LT+#T91t&2p$|bW05NvCu7+r%-x%zKG$ABwTYJ zWw9mLhS*el;46aWjxVeEhwY>(0j_Wr-a>aj8^;G_e(FV8P-obci;AI`gOgLPmkg0b#F zfFgK4zgl#nM?Y`TO+8dnQM{VIw_l3t(&xSSDc(B0bKBX|RlFY84hGA??nr#E5H=2u zLYT<>aWLOz+=x2UjCrE-^CZ=rq`x*ozbrm<#@H5jKA9GjH> zr-E*9siD#(H(cB$+i3te1oZkCHsN{J1gm%&%nbPyq2m$bh=tC@0?gxhrhpENVN*5) zGwTnNLWCuc>X{LnnVfzL#8)fLzG#FskAPolIW_gi!e9aqyf1;Sw{qBPxE66%Yd?*O zp#x#CE%oyhfYrHGwEBoz9_M(n27#{}{UG{f7Id*h3E$I%`Mbs0+}#J8*n!qsdBDiQ z^(d3Bb|DHo-N)5m1{MRUk0G^_iyq~-ugqpF{3)W0L(JHb+La*oSk+z*%?52TWtJdl zKaH;4`e`N{eZ<330=c`l9J+U0paC0DL#NhJ(0900HwnKydkH%u(iA7r-|cVoz)m zITqDx+C9Cy#NT#j|1N9Y_w=-Nhh{SdA>=IOHbP*DYOd|*Si3rn4C+DDr%$(UpVm2Su|UZX@?SD8s-|`nsggiG+n~Xy@fDvDyj?5(r3^kcu^T~ zzaEspWM$a#*F(m8dW@)h4hbt)jkur6CXX!16$JW6eVPP27c0L%vJt>w?)FYVc;Nf6 zuug+n)@cZ{`ki285!ElA5WY4hDU-?(*Bq};q3f&M{qo%X$b&6nUl{k^Vu`H3unFiL z1U*4NAOcDgJN=Yr?~8;LBBqNikabEmXsc=j1r69TE7djAKY}Y8 zs%^=9H=-EvmJQRg+Yx!xMGsmj)(*o!WR;211)koxw{j)GsV24!<1Gx4D6H)0D*-F+ zRQ57;&!ZA7{V$UJl%{_MDbFjAAgNx1PNHBHWPlLD8Z8-h}{=7b@^|+_kz+Ul5e18jNnTsb@NRb*8nNvpVO#Z;hX%5Hz(Asu_m+uWb zP-0saP#0>Q8=UEsoG1f%hzMZkC(|vJ8$dfIgJKEXyM7k3vSOIz}U+ zK0;g5FNp2T`xvC(c=jk>DDwmkb+J&G@yES8R=4nrPMh$;QWafB>+>sM7sb2QRCy}E z!c`k>$>;uB77pzMH+O*QtU9fNJ~MJ(Vl2x3kR{kSfb$JI3@DL321E}11%A0Ej)yifL#0=;m0e| zRb=5IYVRK!MZE+4AI^Tbo?9Ss@6;8jccVOxI68MDDCgVR*u^XAGkHi(hy-a0qQuJB zMN~{*!+r5to=7OCg7oH*`YumK>Ur$g{G}g-sg9nr@_dmzKMv=&aBo6lJbe#8|J_&? zc4|}v8kQ?SAbcLar^u*a55jkX#l0Ol&&shZr*#&l7MWB`M$#GRz!M9S;%)cx*-e8j z^hdUb)yz)wes3k6&UV_$>FFjA>jV&{)S;##WZCxVuT6~w^$!boY`e|2+eYQQCBoAiCmd-s6+1H=$U#~lBm{<&)A@dyDmjAysmcQ9(*WXf zr#M(A?`HD9KHEx9VJAJ6Z7rum2q5TyT*yBi-?C6nLjf6y==I>)$!@2smDTa8igmNu z83b-Ih`4+nTUU;ceg}ggm`9J$)_*3H+XevJrYE77GZSm7M8#q))Ma zT@>5NnGjO#xrB0oY)EHvfEef{xG>e`SmWtMvj;aZoKWVbgE^R>{_{mn3F1vGFf-Bhri{T3L?>6BPSo*uEz6Pdsxj!HB|;C?m}MNuUczP@GiK5O zsp2%W$Btom=2JN=W}g{fU&++@s~oxBOIbKvftRU~y^>EUx6` z)XWDBbO*Xw8_fFz{DV%tP$jx!5&KdEGhUQ4dlof;%<9Gb3S~K)K5{;HT)l{~jgFfI z8fmKfi@I&KV~2iSo5G}oiT5Ox-`I;fI4PwHL4r7Pn0{?EUCVyLemtup55e}uPy2Jx zX9=ZWiC(XkHWdnRFrfY$T?2i51Nqru>qw9`W}7d z+ch2Gg(3P1x6>!NIK$~@%=5zJ!Cvagv73wKl$;3&qz~ZZ91p7SOH}!fg{*zmj6@}9P zKe()a0AA>v(X-T@;B`PDS_=gq6gUL;Rr@KFeleT7=bI*2>R(o#gl-Sg4A`lZLtJ~p z7Hy-Z<#Ip}XlMdH)hEO2;%)A)l9jg}!i(*#=y zFJbj3UcHD93~8H>3daC#S=22MQFE*}C4s>a^%zS%wed~_%^nYdU-UFzvN~@2spDP* zQIx&Dg!M!OT_yL%7O1xXyeXDtTXd&;YJQTtPURc}>sjRnneVFe9yx^Y$uLLuQBx*~ z-j%ZNzzS{Li8>X_&92N7cj$2@a3gN~%|b-;<+KCGt-;2`MVs?o5TJNqYr>oTVnNxT z;CYpZPDWq7h5)PteI_GBpTy<dH$mVI)6LYl5i=u1%|;PXQfLS!8D4>(U^nz4}7Ek4<3Qg zNQer->VI^oXDCj`Z)Iy53up&r4C;2fVN=T7&av4+ZfA{R6Hy)9&M64u5Rgg^r2CY& zu@gD|C@PHzR1df#XfE2xM@}a8re(n?0n>6qQwhd=#?4s!s|X+h7>pu+hD0PhX%K@? z8)WcL5$wn?+)iyEGK!}(&@LdilbK|_$^r*vctYy%`{bJ57e()DqPt-09(tufm4rB# z6=M3a4QL)GdA@rnwgE_<#}LJ|X#EhFT^z)BDk*b5xu<0{IPp;<{ik zGKj4ht8I}d-$bY@!a**~_q>N#s9xk$Ngb=T=pMRLDC%q2X`0?}UqV%f}mVeg>r!~JJ@25I`dsML}0mDuWlSm16l#92(} zN)B%h?`ZlSkSLrovx49G-fr2sxk4!VD^qnB>QK`3GUT`2;5e* z7G&8FR~d)3*eOEoQnIg6!imlkONcExNFUVsrU=Wnh(`BKLDYMIsOeR$8s7@SBn&Ke zVF7llZD1>Cp#A!rs5KN-Bds%@o(9joZPdo6PTiXnI|q&^E{gPYq0Y|oa#TFYuueE@ zY)#`08wXggoa4cE#NW$udC)wRTLm-Q+Oh=q5ZD57{O|R8=Qc2rwaZ|>Y#f6XFlsRj z5sm{NFJ=A~+oxdlG8_};V7c5uyYAi$WmK@82=+bhLQtdX`x1q#A zd87<1p8z~W3*=@lf$=1>zPmf^r!IVg`SCyAci^LX8-jP<7 ziC9`V9m`mB&qZR^u>~`e7e5(c2q&Qp^z29<6}PTH2(FSo1t)ED_RRfo;2|81Cn!jOQP_$*Rw^qvO~_} zTqz2O511aKO*t1eayRQ0LXBL96HM@J?=?XqcjfqKqq%~rOeMAT+aNUc_dih%4TJQZ zql{j6aZO&D-b_{XPwLBgBUEylBZYQLPNR-E(p-0-J6YWR9BbG2=X4UImzl%_#N zk%3Y-5-HpCm?Pnv)O>g)q2RHB?`GDZ$aLTOJ1FECF_W@&5TqdN}_&pnBK z`=n$#I0%*Dx0T6vwh;;CdbcRG;%Gd5kl~3-?(2R!c8(Q9|2t?0z5x8OMEc%;-`` zqg3ZD#@vnW=2+w|bSK5a`2rQ98k`o(8*+t^8JlGo*C~jj_GDkQRNlehHY}A7aFQ9G zT7@G_>5FU_Ei|dXc@8BFtlKWIZp=4;S+7zRr_xzq`W=EMx<#eDXbACkj^sVO?lK;YXW7Y^PQuZW=8oc#;JFeUi8n4|RwNd2 zcfjs-&2%i|9|W)RlfM-X=f-_cKTJu%{#BgKfaq-?&*`T#xl_(G=Q;fy4)vQEt~#Dj z?as2wyU~P>uX86*dk;i5I4$YzOxI+3yE)w8?FdQYag@`l<`Ci_GUCQeG;CvY_Uc@j z!4r5#i}UwSY4-Sj@hRSMvFO=26geTJU`-1Su~CHhG&nn>CAcILV*l`079w^O=ASIO z&G47obAENKlFC15A&X!XSi=J0u8K0br@rE3$l0*L%r1bsQ>EBt6#l{nXW+44*q|a<_o$G}$ z1K8BP#u97FJTzosaJ_)gw6o@2g8-EZF6CD%SIr^BsKb~;+|F%6v4e0l$7>I^;L$A0 z;P3ph1uP#|;`HxKu__3T<`MP~#3bWrBrE z=U%k>wlcdA+NieV$m&}IPkD%iAYTv1DUX+xfQEf7b~11%j*v(k%gtq;-HX?9zW zM3{E8h5RzjJ`U>pS#AB>jOe0rvO+8T{cx&5F}FkaQC2mz z^O3Khx*je+etLCifIf}3JVJ|xS`+9%v>lNb>^9mHZ9zN+9QXbSZWa!;;Og0iZbGlH z1XctX3)AES4z`tPQ=eY~QyCLeTKY z!M6S%0W3&k+;OliFSv&;gsFI_vfJ)WjEi^Ew6?yaGTtu=jW-mdXWb6kmZv&i{n=d( zFCuk^{uPC8jFkTvELNRLxhmr~r3h}R#dB^aC->bEIg)QhG{|bov~pzU6DLlbJaK|< z4^U!&?*wf0Lw^kb9R})8&^vhnHT{YDiG7pCC3%bLN)IG2Npd)f%7L-b#~Pg*jvZU> zCPe{_8K>=~V8S3x=ef;!W}5OO6PHr1FbaeL=N{l6kfFhvei_bt>-UjB3G_$bK6MS{ zI!{l!CynhxnnAq)qecEnTY#fVw+w-OP0BeVvAs&^f^gKG68L92KAf|R5(sA4D360y z3wS|V8e6*uGvp<0F7ZrCLz>YDekPQLHZ4SpZ-@CN2>yoJXowT8mDt#=+;=cgNrf4S z^ae+s(0yhCDI6L4`cH>5LVSz+My1}=lcsArN3IYkkB@M9A1N(kfQvVMCLfFPx}O?$&fL2(Tx7rCB|2 zOd(3mPT^I3tUW}Okg=wf(%e++2ONa5VS7K*9)uRa@lteCdkhm^HoX)ffm7&K6`3?H zi$|EvO!~8p%b%H}I^|>tt?dAtYuMBr&-d`yA$^yVH^0w2@Dp>Sg+E>{TJ2(aU~32F;z5?nhZX;U zWk5d;<_3RyIp5EhQpY<03h{8gtiNY5?HjRyWppwXq{#&+Lpx_g4u!8yCpAiBsnTWpKmUM3wSj> z=A;+|Y=TvPfKSW5(uLJQ-CZD!tG7Sws#m$J22l@;fjPbEhPQK11e*sdzGTee!lB&l zg>7AZlT_D6xlP#&MT2gaZBd><{5M3Nj0S_ipQ0Y*UzpR;ElzM^dOXgHeZ01qyKo`g z-ca;-G_XUiaKzJxiXwenTcJnCNlja#xnCjw5@=^ML;`dt=)e&mb|cTiHU95uP*;Md zbXP$J>>El~_$bjnU50g`IK<(Y)xe3G@msLi2jDAqi}KDN?sEY6NX{pH6H5PB6(!VH*JSb>-YFW*72!PCJLLrF8k~`e(;`YH;?zy1 zX!#R^Gkqo~+Wr6!=Kx!xwxcF~>^YICEeU5cB*KIm{c8 zQpX;C;K@W>2MY~0;h8MY*Rx#=TsWStgC-bBebWfCKsNs@6^GR8~B8RLlw zlJRq}GOuL)WMmad)-Uo*p=6vhD)UH2VK^g(U&M0?-k036agtFa89zxh1W!1B%sJ^x zPdH0I&q>cWzAp|JMD(N7R2&}Qg^36S`1~vOnqSIZyQ0@0_ z9>@7jF||!p?Uqq}y(zPx+uXcYzK+ABAk4GShfQiRru3ehNu(uBu{fesOt6x-rIPoJ zN|qRvd?A(iq>?XC$waQ?mnOB_QOOH#MvB!^i9cA!bgAQKqmG{-4?~G5&A1`QUEGi< z&7gSa)7$+@8uA@ZEQZXJWod018gkghkG;}NzGkOU$y%voqg1jMm6UTO`;1D~OC`%M ztmG}JWUo=l9HWwNq>>p@$v3Fv7nlvvL>R5$Yf4@GHJ@=M?>F;TGuGcOSbtMH?0_a( zl`1mpns)p#OH%n`YG7hLZ5XOJ(WZ9G#D<+g@Ri5BCn;%gQW+nV%*F?El9HBU*JyxZ z5l}#4AuLX1T76qPy!Qqdoy)8U_T*F2{t3;c69Spile3!h%a3I8%V)u^;{$I08xhiz zUuJSoKHD7iynuzGBI~!YT~&jq7Z3jUByZ1CA}vWws+IqL+eh8+Iz3P_S$Q&y-yR)L;LIv z@OCTz%u7u)6+b?N-J?Kw6s|2KJUxWGk1s}Of+f36tDR@z#_qw%Gkk9W^3=rI_R%3I z{WaL)n+NyWxZYtXhhf=Uo4OVN=^wmD^~g~2m_ErK?@s<`%ilSD^U%aO=EWmJDFo}u zM$(SI8d^co>KDNQcHVgpJc{()Y-V3Qj6->Mhe@ejGmN$*9z<9i9$vtOB>Y5gUKm38nElnoeH3lfmZ(|-wAH$oXe?I%5_TbQZ=D7=`c(d@Y>2wQHb#_u_5A%7RJDV5!ZnEFc%})z}XN7q1PX z3f&zg`1L``63`yfo+z>T?jWUUZ(@`W29cM2L^oV%JC~9XFlH-G>ve6kZ;W+4dv-yA zz2YFa=tJM9rTL~B3T-n}xGcV5Bl z^_4go-Ul0{!r8Wc)OyIpr|baSJh*};ttTQRU7H6_1pI6E()|kS`A!w@0g7eL(2e$} zE;4U6+9!88mymak+BB-d5*mWj z@!%M)ezIFDnn2-CQJN<=psn!m5|i72qxZWI(Ygm00d?a83fJO$@2zl<{2GeU!56+0 zj{jP0v_W;#vd~9Pnf)-^VxzB_r~Va)QNq(+4t`m&Zz6ev-O_;=5BugNT}gY_KI`xi z!m}sGS`a7%TgDmv3?g&#&q;1VZ^rG*5z2M#l8H(C!+jE+cGr@+r2Wx8I6s^-!?(MW zVmEf-Hci})Kz|2sxj)tnw)gS|z*X2Ai96$9j_X~IO8c|aEr6fkdwE)j9#f`L^Rng7 zidY@cI|d=7m>{mbl#=X0JDp8-Rd>#bLvYaz%K1CTDt7G$r_Xctcl+#_>n^o#T}pl2 ztTs75Ry#8H><1yU4?|-Nus3p^Er@j_msPy07Ap47Z2(Q(LRgG_xi0 zEY5Mf3J3Ff^IInDp^E8XO;G+L5B>Xw=G?&hy}xTDp}d!`e%i*WF)G`4{24gUG5+&MLZiS5%o%!- z0k`CYQ!?yWaTrj3QcEoEI1;<<_%dCO-Dt3w>W(?UxrS+8J%VZO4iFQcXJz71WcX`< zm|i!co3^We8(_UZVvDe=Vrq7T@a{!Me0T(u4fZJ+@wpKl_M&e7B;Fz~FFUsHcmPNb zaE|RGFsorc;~f7nA|D#v;A-+5v2z?QJ;|{){7arQu;|k*|HG#hzwy|>w>rM~pEx2A zjfPY>j5kUK@k=$;eA%$NknkHm`#SPeL|V~(etU9!^u4A0P*O~=$0|(1Wx>w)9I}3`4K!ZmFugvuV0A0u6%;*197Acw?@H&!lhXc zwfBu1GkHSb#Pgl?%L|;UTdP9ft2~d^g7~;MZgj)(uC4|4pDnnw@d2vN^|8t2m=P+R z%kU*Oy!e1#tfm(?;{_c9`*FKdar`MKoD-s$g7b5ZJGA9dx=eH}qGxD&pzpOz#7Elf zn|yu6h>1f~O#=VdO@r$M@fY{|>MG&QcwuQ@=O&`~Fz$YXE$>Xj35P`G*PWZF{8xMx zojrDFn{&pyb}y1|!8QxU*zC58IucW3RqL^U@0ru^%$x?YlwRPETCGRSJ|2F{w@%%{ zhb4QJIO8cV&dUL76?_u zF?*g+zW;Ri-v7J$@E$5Mr=N|Y2t@*kFm%Q~{q7<6s*lt&MH|l4I%0zFI!MoPw3y8~ z{vf+4A750mV;wlxFw!1Qc9p}y=gz=Q1n;FkdGu!t-9X-gOByS_v=cb&3(xXsIFj*7 z-NnuJjWh5)PX-+9+^??+AF9h6Q@RTCFnwHV(7M~oZY%qAdHG~~bZJA*35U-q`_;eA z;e;O*AmO;fr<{Vv%EF>a&ebi>VX4^BPpgV5oj}X=a~BkpepYpx^Lq&I`yA+XgRcVj zY2kquTsQkF<~d8S$9#-)EIu2JwHPf?e#Cb&{S9Y>_<_dRZo~);BJZgWoyTS+I2 zI0;wQ0hPg(6y~NAk;Um93F2dDpMgm8i!W$#&(P)k4Rf6+`7ZbM@{KPS@+kVp|JG3i z(X6TQMRfy&t}zs$E8Eb@|JC!gOB_~Hzj>Nl0)-;oa}9xaTzW<> z1-}lSsE6g_xF2=TaO}?ab$oW&Ip^bCU9VH`%)vOj0@s$nAr$SqWE0=v*j|UV|ML2C z=B%`j+Ud9bP;BNYm`mm>Q!&>F$ zyfOBY-U|>Iw{GO5`?oujLPuSOJ^wy-hy0Fbqo4YAp4zbJnadF#*l{6l;p}X8Ucdyl z1pmKOxzd?*&X~sF7~F??(ipoOd`((FpAz_DDXl54@xe`q&oMHct9=#p9h*K5X~hkS z^hSN#_TTa5t_65}gQwctX{gWxjmA5Dy%*4{ZT#w9^=ccxTIcIsh-1Xq&>nz;;AA&% z@%8naqVxmLR0r{8!mH4_|5M+B{I3i_?>Cn<1@WQ7U;@`t2V>r0XC@hlIMlrvcKwIr z|8$gkJQxlJ5^8R8&)3EyfkoA|wRDv*af_!Q;b_kB6%fxyKSK055Og2vTw4PWgUKCn z$YJV@7vFr*v3C+xeCc_<|M}Z2L)ANldP3%1UQoVgID5vvsUPNN1^e|~RA8Tmeb+QS z?BDSDZY!G;{j`(51=5yygG}P&+%fRGb!@_Y$eUVm-_15`Y~kBA-&=JpCasV7j*9E; zitV@>VH{4^w7?g5Oo4qAZSFmNiQ3$|-|oAdzSepvn|XaXIbpH}uhCC*&EPd0Q2iB- zZQX@iAZf&{U;}V3Uoy9X->%5%`?=lPO*aU`3)JZxe0G)HR@eCw-C!|%9npW2Zm@(e z0ddp29;v@(`1md+seLN`--o5R7oaWNjS-^r=CyxzV5clgqwlBfAF z%Vtox7Eg~ei@4H?VOl>wor7B1&FfZG-ba_`J+94EI)_S`$!2~&2YwN|it_B>{6EQ| zD(>K-e~K#JLiKx@b3VYNU*=aYpFV9m5&6=(eL@E(i8T)<0X6 z{@FxroD+s!4nolV!2HJ# zcthzO>;~fL7FLDt@VBFGQ6Izp3-2t@1xeHwZ{cE0y44ylX}e;t4{bx$znm+C+ptO3 zUd~j$^z~w6yt@QGw!6^JiM>#)4>FPMzMWT0U4I3RJmM0Lwe9)NVfOye^@Zh=x0X-F zQDJBLax6CX!95?e2D!qwt#aJ_RfR}Uk#axu^}T>nuHerR|K5V9sMCJiqGLn9<_sIv zRZ&~`sPsnucJLPFXcJvs73(H`UuAyR`RM%CtNikP3o{+Px{-~z_xQTZ8~N-3yrZg< zujW^~`NGVr`PEbOJ#)6Yp4y+*F3T|j|Mg}B=x_SiZ2ICvnGXKCNGuVm3k7S9&iwDc z9N}A8OOt7bu(NY z-3*uiDcsx>@s;g~bIa&<^#^d5^~;F)pxI2_6+SH85&wXoP^#b^8#ImJ@4FO-lB9JDBF}C^RBlDiaYGTN-@69BUmSmOoRJ0CD_GfrPbb3H z(Tq!n?sA%+bI1w3s)eh$*Fjix%}#qHZA2_@!N>)*9TbZ^got0y5zD(BxC60i!9Lub z4&1zUwA(%zcZI_zbObEEkuw(I20;6u{7!rENc*7Pp8$JVD>cGpj*1QWk`HZP=2TQ3 zjX+1dzAWqOpS5qhaXYRKI&U%Ete2B>#t^JB@tyM((R$h^*vMzNU)WdCeUR@>`R%?H z=fOQc+Bt3J!c&0Ltxj&g!6&y7C|lWkc>&n6zu#vX=$9>h_Aj}C?BAe$er4LH_1?m* z|8dvkF}PxtBYWQD@4elkV(;JKCb*lL0L8r4LUYX{+#m}{R^H=;U$B?^JKYH0+ICuL z%kt7aTW?so3vr*cY5iM16o4b{H1qzJ?{ry@+nWfc_WCKqFLE7!zAyYSc1iDP<+ECr zmk0K2b8$3we`Pw?@7v`x;LUqX>EHJymApKs8$NY> z9e{2UpcO9Ozs7eP+>JZq`GJPe-EjWPi+dQ}&Pewtr0u*z;C*r5ezejUjE?|eX-i%7 zL^HXhpWct-2Y$&n8{mPc{*t!_p5CwGZ+PfsvRlzVNvC^7w1=|(s#zUi*h(~US;9}- z`&^#!es42RP*?7UW7DfA$4*7k9<^<7BZ_;#e)wYAVW0_-zOB7q-`+L$$4hVl;mU`V|CzehR&tyoH}gJ;5&!S z^et`N(&CKIIc1phy<6-9x;t-K^n5)o)WwOPoD+v3#`FE}pZ0HDo9=;YSK1T1?cC9D zHI8xK!KWV(KLvLOPMG!LJ6#j6fI)ISjLgZtHTFe)4;Dd1zRg!R-88Uc&V&N`BJMkU zgnlhh@G(S zZr_=6DqYy-Lx{jS=O(;=gQINra31I<^wx(shkhVwIw)S$@ypn;`In;&3xNKYs`_6Az!TDR^%V>%wjPa6^vLg?Re~A5y%H zK8ZKD!(Nk9H*zxW(prmyNp^sYr!9Qr=f(jQbedcq^6`}$`zgMsRj%r<*+%LiYbpmMXsG_sXX>FY+PQ%at)d>UId+qHwyMNCB9PPh2 z-(EjJl?xgl@l`W-4*(53y>>C_O++FLKpQ%fA3)OEIF*5v6?7<&jvcMSw1F_H3bG;h zRyxP!oPqoNp0!VLCSGz2#zbeMQH#fSp{aOW%7e4ai)YM)$T=Rqq#N$j>uD(rU1K4*Pp z66=uOL!yZ(c=I`bLG{OY118?Q2!$Y$?O+Ol_#J;v^*$W$c^8Lx?OTWLY`zq?gLW-# zZrQ;pqd#^h4lG?m#J@-* z{ud7A{Y(*G$;7WfBy7??LWu9+IN*&cJofPrbH0^{Kg7hhg80*65Pxh~D(81F@ki+t zl5Ic1*e^2is~7dEZ)4fN8MI|s&MCud-vP$&nuyt61d!2Z;^@N=OX~ji(O>=d*{fsN zRfb8I#8sxaQ)*4?LvSlOmz|GO?;Sn#&Ga3(Xcc*H$34!K3zAi*j!7>19LX2{>gg9QR^hP^;DRhXzRc2iAKQW8h$Bz$9I&%zz5NSJ5zc0u z&Ddj~QDGNUz*~irfjadm?Bdc1xx@4AQ3-EyH*tAggRcLrcWd+nljq};>?()$B2r{VL!pKSkRJ7V)kx4?#nDUXx*6JcQ{@C6qK z2WDn}$YR%xMW$vE;e3{7)OI5N&ve0|TCrDA)_nxcTjcVP6chf0xs@rnK#W=BJtwj|Tbp zHEyd#>uueSl+i=HaHAF3(`~5l&wM*^N6{Ah$$_-AJ1ytmhEN^XHItRJ4$Cd-pf#oT zV8mTi%zfYz+~;};h^*pe-B(O-ITQQ}1lPC(p|w9%6rDH`+{?ED;ZD6?`wMuii=UeL zc_lnLaI`F9NAYLFY5nsC{J_{w>Yh_IVb~sM9_QHwjQR&&X5ULE@^{;nqjw|2 zmz?3lfvi`qT9=P|HG^*UW9kkh43 zJ6-VgIu8GQe=uD$i$kIOw0kfu8ql>-h>CK)w4Q1bNGrpP{X_yA@=XXN!w;T{gw;4V=%@J?zsFjB3Z9Po8X-D#G(94;RQMM zxABGoS8VMN_*AgF&_v|#7=mD%QMfW?41Id8LfkMn?1meLl-Z-q#1n%#i#!k$k1`Wa z4JNpkS$JkJIZyCusFAMty-OnYUYN!2#$hC4U&1lLfj!+{j4LZht{OL?sA?WzZO0YV zVCbIxNr(}&yKPv^J< z=TMTycdl?2IrWpD+Kg}`ghrfP!JYHrW;#92Z3|6i^yU@O{%O2Tb zA403F9Juc|Tmn~cMxpLG>El89{JT(L9Ip;25e8bE-#j;{VijhxkAQT*;L?zi*Pz*M0x8TaO(e#Ou=)`Sw zm>CE2_jeMs!#xc^mwjMYCoXQxw}&7i-8uA`s(T9;b=q~?I_;5Yt2NJ5E||M!{k1)} zp(?9lbjiy{xIBPh>dL<|ygEjzc=u%Tb0$e5x`*IYDUJ1M& zzPJ6;Bj}D;*eUgPb;2H*Z(o?GZ!K%Ayt$wtR5k5;vywe)*8=&fAQ64%2rS$2^aLNV zd=y742__Z2^9c5;+{}jsck+vy@xsOz;HdlFID$nE=-X?_oI~vM5jfXbh;JI(Bgq}J zCCHwVzZ^k%UJa7Db`_Dt{1c>3`TFpjLOMhYr_AttJ3J8rIlK!ep!@7&o$lF%&c)7@ zKcZ>qJ2tp>3ZGXf0nvXjH!F_7E-w!EP2BXF-)`-jI&)HIXH{qC3yeU#UwH(ac4(b^ z7`mt1IM-qyJ`s_eD0^=m2NS-4!;^Hpon>`5GxyQqv~`S+Q`Hf7cN`9df$Kh;p+$?& z#s1&8LZ^P2jgbZ8t!>@xbI+aCxqeF7^0hA{=_-eH&RF_HAVS2J^nJRAZuKB_c?%zy z{0zq;Z^P4N_0(+d9Y!M%-wzwP6Xsx#b2{#$I&jO`RUa3=glYJMEwywL7UIkf%CD{* z3s2E%=cLN2$z^ly#TswFEn~=mdZMptS)o$`^aC+GLmyREy@-!i*H)p7O${W9|8Xb{ z`&oL3HQ3Pj@Brl9kP|(ph`i;@PIY_jE5$M;|QRMggR)%kk&a ztuHz!gUat3Nq8To4?OtTYk!hZEv= zqL1mrPhE?alb4$OBh#)-D=t8m@wYFvzmwU=$L=IQvaLm)x)K;8M*AvC$J z=1Kc+Ln?3#Zoe&`BBg^-|DjMj81)~F+QFzDLxBpke>9TzymlyE?R`ey!8x%*5rMpA zwbPSVdH>nYv1d1wZ=SUkbN>f$M8KqkMTwwhwNiPS_uV(|k9iU^S@~rXingA6O>;SJ z^Bdi*?g($3GGW0S=MEI}CC|?*55VN_G+()9^B7#~Ky&pN&i8Db4on}DZy%L!*XG+J zx^P#49oT{oj*P$w0Bm} zMW&M$IRB3S+nh~w!wr8i(zcheW!#0+YW9L|6mYsTaV2ihZo+|9+`x&?9z{$EJK}e_B(M*hI*)`Kc= zd)S5RdN3DOtjEVP@X-wWOiYBMhoEor?UT1mg7=5Iv!K#BXBPx$^rh(YAIE4I{{nYD z*`+&^U>IMtK@B^vL@2^9Fsq`hck9{JaMNKG(6cnjy<1Nl;#s|Y#W@6AtNmaQ%wHsks&Q%s;8JazgzCU2O4=s+@g>JX4DYJ(XH8jJF!t=pvy1Eo(o7%K(*St} zDijY7vp#+9FoJ*19CfoceKDt_ z-0O_|9F^PD!b<2Br+0o49`A17 z*!+ZgT14{j>*1tdkEOtqM>yfh;Z(gxnD&#y$+~=G5h=qrheODwkx%8ME?nVe+Yd3y zR#oIfjI)(_Q7@hyUO}tNpEK5T3hU>L^&DfV7tar`!1gYde2n&@LX(FI`ikX){N^R# z9aFe*%sG>SlQD5)K;VuM-0#(%kKI_Q%Z+q%2`;s;|K5m?m9H3Dk%tQh69k-NKZfg3 zfOsdj)9b37JGq@+SFL#$m-DCL6?8o&Z}LL5E`mt|za*{eDan4_>V0n*Zg)XMY0fDJ zgI;f#8u9sI2xrAkH4=Ur=6&B+hLQb4Dt$!P12$GnzTF@0{=A%0RNn&iUWNLHVL2r} z?EZ~j1)Y^w5nB;mxa-pE@cwD0{UK=Ywr6m zoI3pU2K<&j=a>s{%w$EhXfaM|V3o|7{x}TP8XGH!pJA6^P57h*W9@-`Nq4+hOD5k- zIBbTKr+jwo;UnFvko8^26ps4Z4q&Wf?7uPgj~M&+9&Ej}1KeAIdlln;c_cBucw|$E4i)Y#mkKlpKQ{OvF9MYpUbX|LGogW4OP4+%@gA(vBql_1g{o_R)eQ6OX;E zWdi+*?!A#W06)Nu#~UzWS6)Jz1a~Y?RDJs#_w5b;i~ANq{%!yNb}n`3$ai#y{+K)T zY3|TR(V-8ZLpO4VK5K7N{n?7(`W)+z|6BW0P6ef%HvI2Z&!CXgHo2%)7AWoWn zYEsm4p|@F@pYXEyzzOHOUuKaqcqA$KyK@KvBX`)!2i4F6>hMF`u2eD^CIjaLj>2&m&_T?@T5X}giCym?zP7K%DMnrHvQIzrQy0yUqEB6WSq}@Dj1qi zRDS9621Bdw4gB7RmD!+*>#vKFr)M`GxVSE-yVE(8F9`fveQDrR!a5-FSfBm(AM_2# z`5}tJ2O4mq1*_q59L**-A7TI!t5!M3R64`%yEX0{v(V{`*Q0s-G^byU?*gns&>g-_ z_AWdkxJS)Cq}PtoLcg$jJKYzJC=>o_<%4tt8ZK()upa$Qg~;e@NUKvHpH+`*6Gy=SawvgU`$;^KTXAtsLvS_?vc8z)~Nt;9*U&Tl|4m zY2$qdQ-eFr{P$G)%ePUUIK(O{GNCQRuT zzw{@gwfJOVEtOCcUK9^42`UiBx8hcDaUK^}K7BeV41Y8UKH37|pg#~vHYLDcU1P$U zTReU4j9kl~H`hPjKMpL{A`;6_rzQhokg)>ESS;9-@KeZ?wKy3Jhw({~NIhy9=S=bH z=Ab{=RBMHrLZBaMsteVt<6zKRD5E}9>rW6@jno9xI4B`p-Ik17pbzd9x$4HoV2la2 z#6n1fB^5Me{L~~Cnyx6f2qbHgp)e+6KQ(YP5N-1Z8Wvf8=C(SSh#-`VGDH0}MXY$V zF#x*$#FD1!#-PhF)7PDV9tZ{SF3?aNYVxp%lw=H53MU)U{)kb7MIR$J{Bw)_CAm{) zpjxp2$_g|_Q3S}Krhc?kq5(g_rshyA(qvI<5&v9kJZS)}k1tL(CF+>_Xrv_=i`3OA zBewQ*NF%XCf>W3~!(TkB$XmRBcAkX>PsAeOc%mA8)zFNd3dZnIqX;P}iARG0 zKAd7CuxM^+o~49`Sw^>5g?XiAc{7Cm^x1jE{@jwOrMXneP*Xixz0My^#8{MSlTjrQ zMqV3OD$zGe3_&$q7Xl|Rim3@%DyUjB^9mtsJOM6=G(nC-;UM=6BqSNCRju!@4aMpB zaw3HGYpD(|^2i9p1~Ol5#VKQg%Etssvt+P#Bswq#IV74SaXhpdn&Z(xV{Nciw|k%t z!?Y;~(FinzqAV)WNEq_e7>pznRzt8F0{|SNzbS~%9}h=RdGxDh-X9H<=)!>R#}to= zY96!EWH=sd3DrUhsQ3IdxUHt*{LG3BYjpJ6BdQ?vj zmjxwxWlY`MP@Z<5kz1ZOJ=csX5;$sOt0B@DtPRDirU>f=Q?>G$mBeTb3THfB4AsM* zTT$kpI%7tOtGh4+(Ug2f)SrliX|R#Lu&C!7gHXM-!Y2)Df8kunVItNBm5HvTFR6y*5*CJ|&OCkOsQQtk=8hjZs*cCy zDAYNDGq;i0D6~DqiA7JTDQFESLre#WW(+WNJNg8o1+8gCqEK?s?J^}`kVYd-;71Ky zjMzEQ+!(Ux5-1y%3a!E+byA_CsTCGZry(d6Q%Q9q(PsJU!qxTh@l*`Y7||BeJbu-a zs+CFDS-@CL>LntN)!JY@5DP_77ppd+rW4Eq$tKK6wc{-#+%!WdmG0>n7BIA}76FoU z@6fBE1mj!^mA)1shZfi+zP(}=pWRS3$rLs!OPy{O?+#7MDf&;GOjhaf#yS_DO#`t zgc1#GU3+dGo|aATscF#)2GLQCXbrH8sU;l5Oz%!DxZecRFJ>J+Ijt2UYy^z^Xoxj5 zF-VgJ%MkY!sV=CN+Og_qocbBBeoj+Ar>mbctog+=rk3UMQU?Z5OiU$zoW=>XIL{i5 z)vdY_^vr2mm8~z>7d*YDs%t-~_8OWpwJgH;0CSj-F^pw|P*>@RkH$(9rVW@w)iCm6 zFk8T;sy>Vle_eGbY++c%8+3E2#`UY2NCq(X77I^9byKaHqsaOb@$xIlqN#|cY*GOD zPgvyP;!Z8@?B%ApvS+4562fqGBGAB=U)-8rR_HG+n>xL~UtEkT(7;c)Ga(fXH4#;f z=~dk{cGc96*QBwi;kXN2inGg0i%FA-S^)E8Fp=#E=E>B9RqM*)jJ#5sk7f`8y--#G z*a-&7WFzT855dx40rJNiaK@JUKHL;+g&^U*)^?b;{m5;`lhR>&Mq!m8whs3;ELT5` zaHvAD$a$E7L@T-!4PG6K2T=xos~e%+sFlt<9gHcbC>eSIGDzK;&zU@y$JZUe*7jo>fb>C` z^wWlxXP|Od5Sn)xpv_Q{_5|iZ{s~)SXyP4H6R8<9BN$%FXQD=-EH`c5z zrp=!@lLmYs5ep+LtsN}xsF5UiY`RIctwggQvlnSP7zP%^f$SoYeaqhrs}*Y#t?J2~ zhB8JkpyokXI;t;pr3bSd#EoBRQ1k(2+kQ$rrCm+URikkA{eJ3JZrE@n z62;hw2P z!}Oy`6!bC45>T6D+ZmHNFZz^CS;N*OY8p$>B`R2*Hw7%@Kri)b^Hf7P_!DecD&Vc1NUbNPR z>M^`1g*8x|+7E>^L)lk1dDtSE0b6(_G+{PjFk_;2m#4xdt(+{#E~f0fQdI(gc(fYJ zXDSL~7?Ml+8Dhi+Vq>jU2aSV4LH3VcD{HPux8{{b(NaN_Blf+ z$=?uSIdO%71~E$~sgy8GFAsCbK-Mp_1hFQ?L2E}C$BPTWWX{H zxE%ON>dfl^b3qD?SL7rGF?wHzjm zO03W<106%Nk?;val;5FWiBSj$|3qp1LUoGNL7Q7GN})s=qhTy-YAq}~*{elbm{q1! z)C!Xs5aUs#%;dbe-boiV^#gapxUpu!CSMh?Ln8uQ)WHp=7Jh2>@Rv_5oS#dMBfoMM znXyYVHU=aaL>hJO{IcTtWvBu50J$rm=Um?i4Mq=g-mE!uOO*N46l{TNV)Fs*K_@4< zeJB~3_!&#J02vY<0<@aVEyaomElc(V(Z@8Q3XG_-RU6F6osl;kcC&KiXlC=~5U>4a zV}GEAsezK2>4-Wp!V054>Q2Q_J205opdpV;1cFfq&EvI@SDRmH`?5`vU~Mh8-3ydIs! zUQl>cSqDNhsO3LO)dl(!)j%_B$Aa~Kc1|*f${n>4g6uMBp)UH)<#-j5qjR9+3#t5 zzo*msJ)Pd~>5P6)ERRGMVni>{v7SQ6F$+&P8qSjlBZfSju%Vii?}BU_<^9xaL=YiW z(?TyuJF=g@J_5U(Y{yW9YoXd zj@{Pue(LdKte_3nh9rEpHCL$tx;Szq4~I7$}i9l+f13b%+8$3y_r;1jrf; z&Px<4r=m#7p~oj*Uj$1UPT&u}$I*JhgV$j(v$s@z=(x>mi|}Ye@$Z zt+qCr=wLozh}K6EaQE{yP0i!|rf@-3Z^#>La$~d@xF(svLaHv@W>TmUtsopvMB?-l zALmjRqEKP24b{mwCaQ3C4I`^&09(utmIo9zV2DC(Vq_6D*eW!ow6#^&VDhBghUI8& z$Yg->fY$WKfS8C?H^s4*r)G|g!ynd!l(QxokA}!8VX{%fAS?Eofd})9eq!VC2VF%o zCK*Z84JLz%T``YL9Hglj(!S{Ics2gAhn;?cFrQR!V`0^lIEyy4aOtSqFlcBjg)vi@ zWwZN^gaoLGac4@UO-9p!y0<-YV%kT)s%rW_#v;%HSKcyN2xqTwT+j1UJJh1i{FX$S=x#LPe@(wo$SM&^J@a#J0rHJu*@ z4_L;6=>_Bh@gIy~P z+EJ9d0nq(R$L`*K&wLn%@nl#~%oj^2rZ&1l7 ztXEFp#TJ$fgsYbfNT*5JuR4mnegXIp2pv-*Ed01tS?MQdM=rK+%g8TD#se(nI+*!w zZ8YC;Bf_^HY{fKGlcX`@kGEhOwSo9DsD54-V}n!j!ma`v>X8@ARP|^QuEc(6v>rz> z|ib2?GN%-$6AYwL?DNxi7Nz<44wvV7bMvV|-yLa%A!4@Hu3Q(J$4u;Fwd zUSLzH^6`MZ8PYnzra0UV9yVF|p!-;`&;_(A=9XviML%N(Q9@7j^bRi3Bh#8n(FKZ$ zOXY$A&V!DgK6`2j^TK_^Y+_WQS72(Vw3VNRCp-u+xu_}0t%7ITw8z%5!bO5oxk^rq za44+|-!T?cbo~kHz}kVl2!O~UBU+ff!$Jwd6{JrsP!Z&2tPe+Os>5-sJ_c)?xhJud zs`DUGMeETaa}M82Hr~3eK^p-u?vTd4 zFGIT@2EB!Y2J1Sh5N)6uV7uH%HeTL4J3Vuh9&~4HO;8)S95q|2&DJmeLlmaj+JqcSxuEgbAcRrB=emKIs;}mMM0N;dON*g>*oi zm59S(%H6BxCbFD(Tam7?qyb8PG&6y)9V@emGXM1x1WnReRbsMW_W`fsY0`o+m-&l2 zO~v=madYlr*st(A1jiAdPTpp>1h* z1MXs_6|iIB=ZKk5Qy`|g52hi-5@9En+ZoFc&l6{DK|BX}72)2bMYJvgt;{`&hQJGP z*vnf_z56H8+}A%v)m(Qc)B~<(o-n~5r_onO-3w<_l-x~NN$H|ZV^}d%k$OwNU`Ks* zBO-B_HQFm=nR3l#%Bp6w2=7L?Z#>cv3kI5LD7t1g<|kyP3;Ldy!B%V(qQj6FiD7uE zty_#fu*^O+C{34?a_Fg*sVCX(J4KA7&dsERq;)*kL|4jvs~FIJFw)=dD;mknnVaOY z%M!>teL2VxVdTe zLl=wG0LBcl*i$yiO-kP@v38fuaJFLQ11iM2C#!N&*3o9ZmQK%0%;maiT>dcXp%|2q z5{uNT?ptxhQEzh%xC7kx{S_jxXfMEhtrS@-(ClTA=+HI>G? ztMMKbkFs{x@}m3Q6lUIiOx4rw8%*Qut|7ad12o)MG`di-I1EJV%Cphs28H#7yw=*t zy!7q{xrrYA<0f(|xsMsEoH|pI1}Ae|Yd+z^C`~;Nxm1<0;65we&5GKS2)`FOv)mMy zpw`{)tCV5mzEGmzK8qr9Q<$o2cepRe-axguR)K2xBfPwL$DFBfEo{gBSng!(sYk!L zGN9aaZm}YWZVKV|r)yfmLzUQNUU@hq!-y7Pe;#e%D8qrGfDk+YzcvqF$e2|#o*u0P zwnF#?rN!~bAZQx2R_AFGGHb!n$8&lutZcY_2!DKy6`=X631^lT;fn~ceBlSjvV#c1 z$|W)wbpaI?tcivi8xigsq2Wk-oV4l46##u2_{16LhMI_QT_~a}p({m%Nn#>(amvq= zG72JGDo-jOBZU@9M5-}u(|!+XO#E6@kY7bm)`lpkmX;J;dNNLHbNIXA3Z<|R#gZzO z8%uGI0Y`zRaAsO6o`CT{nlu?|0{=f;U`bkdU}-+y3Lt6~mD2tUY=9Uu&7>*alnfwL zv$$$17^IypJc0%6J5g)Wl%!&SC_mRZ3BMy{s3bAIF~1A4M~AR3=kj?#u_r;$P#~=thjxoyF%FQk-yktbGZ$-n{%`p%mRW=k6&HZ2l-MlH$Qz-%R< z@Hpbw$T9UWN;esrPkXOi?Ls(Mr66S$C^0qVL57mG@WUA_TK7?!N$?or87Pf|WRk6m zW?^$#P-NaQ1?gH*ZD|l_Jcy~}=r0!(Wzg7WUh<^nHm7P3$*Gj6JdvV-l}tk%#t*eB z&(5CLSRv38?exHnQe96=L#47=?v>oC4pFj0K0+9>Fcj2cLud)hB7fXNhG#v^B||f5 zonwT8mln!O2b&1Hr**hQlzP};k&)r$iUrNY6yz;DX!U8HJ=3P3xav3=o)(EDWVA)Z zJ{CmuJ&A{*MNNq)0jzXl(3xhe>#o!@6Xaay&x54(3U2o!_jj0LV9GxbYtLAddva3>*12}2YHUk!rl zB7X4hlBWSL(HBIAH&;DdLs%rRci5C6(q|Gx{h0*lu3*Ajh8jt#u2i1)opgy7UqeLY zVaGBL6O3Z`9lbd{4MSB#Pg3wie0u5pBJ3Q|4|W<++8l4+^e;{id$m9tt9JoB-2?HI zz(lwjMB(=DA5Q~J3rB=rcsQ#>?gw;fp*o<%rcur(3Fy{hlxXUEQsV) z<)Ve@he+b*H1%^jQwA3HThLs3ETp+ESU7st zjfPPV@;H5(BvjjKB}1jy%qb-gDk&hh&NPrv7__SrAoop_r~3E|jxA-)pfwhG?NiFb zu!vBX2Fdp*CckPQgGrswb6YMi9E%}~#X8)P966$PplmTVVJVx8G>pxhLe5}BFH;L9 zgH6~UFler-Lw$%<4l*>aJ>$b)+X7RM$G*D-nCFi-2H36bZF{3<3>}{DfI>QF8ce`q z1jeV%B(TVv>T&)CQ4TFYoJw2jGhua8ou^^@NuA3>pHP34Qn(%5UNkurLS%!nQkcBt zyP*v#c)X38!g`nXI^tGtuGj7EpN#qIk(Hrd>A;a$zchm-DOe4Wd*!d+Ln2 z3xpo37ov~R5+$0mb%-SI)~j|3_yb%-z#l<%&`oM9U-yrCkji6#3NHU9I4in6z*{yt ztH=rVAlWQdG;}Ykhkkvgl5|Jo0ij#GNvzW8Bp`jr6nvtq@D>|o>J7^SO4h7^V;pco z*d@Hisv`6k%q0RSn_me<2@B$H0%~d^>G5jp$u)+;9QjD*FeqTzDTxH~a1S+|Nx$&> zMxq>3TsjxWDoUm9`QSwWy!*Le12S3!PGo(;T^F=-)a7XmYzXs9uI-VOoJ6BVxSJ!kh(V08+F` zq6$OcUhY&?9=P+@CJ;u7*^=Vr_0Ak+;fi92Qsv3}ZlMUSJDt&^#3eYs$}C_53d6Di z0r<4ppxcUC5IkT3-i(~A{b+Kc4^gUC(UR97ikq}Zoi2oVrR+*v6=yV=6O(5$A7_!R z)I`*9Bw#H4!O9HHL4jz*N==)Jvf_52L93*kPGHlFNL`47Ch*r_|B!;C>uOcw;9SSF zLi8%?p$f7ZNNcG6qEnkzl%9>mP(7=0D1pwW>Q)1_CbiqbxuzG+&8QZ z$B64XnqD#QxU3a6DK+KUheMVDEax5_eP z%gv&NRBaNj2bx#WL?Ik|l27W<5n1g8bBltCi(M|>*S>Te?aPYiDE3)O*pG#53s+7jnMvwcxe+3b# zM|^O#a74MRvN)ISEXbpSWO;M=Ko6JCC7UT2g;DGpcaw${f~RQ}Lk-Q`MY5vQ+K>7b z@kTT`s33kRy0okSgt0hLCvDjmq6mS}G~$|hx6S;Gi^f}Y3a*I4X5q~sLycTvh6Zop z@phEFVq*;vb_T^*Z^or1+|8d;FlX+9IhH)ur@*ulXI z7R(r6RFou|%xFaM^wAWc3MYMmfgr;Zo_VTZlL}8@1Ioh6mQPEl4BS`VEJ!BdG)hGF zWYxw^zbf+RG%4h*_hjxrv8iJEj}xjCjpZhoE#92&@Yj`sl%8_cPD+=vZlfiEvicxU6r4t( zuP)*Xk z5;BF=;|+MjunanC3d66`%v? zjDk{^G3?mUrkk2H6<4GNIf17PiYYgf5~fh}j@u7L4n)hio$3)g=8cD!Om4~wP;*-& zO;MhCL9KsGmG#6yn#(g6&@kvfs?i6YB2D)GYTjipt-ahUJyl)_FZYfoNi(xye^eGl z9c$l&5ZD?uC8`t%Gypm;;6ga5Zm{yo@^DLx9~Z{VH132%Ypm6x%WBYBxY!03ID0JM zw?LdRMQvh#6%!ejpyV|auLdbUnEm9W!$vDbilcl0uZHpo=JAq939>U15Z?TtJaBMNyta(0o?8fFflIQJyZGVt5o#q)Z{olL#6p z3Mf*h5ame(4Tu7Ylqp1cy41*Axqu>N3Q?X!&_Gc@kurrSPaIZMqf3;pJ#pdJv;VKLKMxZy6Y%SU{N<{IqCEY z)5GPWV^(-_3M>;GF(R<7yPZl9Skw>UiNuHkA-tbzxj0?-Jf#UN0z!EO76~Cdfkn?` zP#Z{64eb6MHCDk(^ly$exkum*o#wOV3Ajcl4Yc4-wnp^ash=M=*~j(>{H#vm=J+?CX)K?o2Jw)CkvW71M20%|Zch z(@C~oPe@BC5ZqfxBT;?V{q`|Fj(yJPL*G)R?G(~o-{zZwaHF%SobcY6?c9UM#;BGg` zr(1o9>5$?o4PM|TU8liY-K5VZ=q7My3{e3sMp+jNc(F;U(Amt7h}o-JW_(tO^!_P^ zc8P!@5VjS~=`l1kaMu_Gh$xZN24qhG0?RxKGy!G) zBs75!G81U2fCV~<&;-8DMH5hl6QKz#bFkuAo@A7P6#-?yDMZoZqPu}8s#^3kl0-j? z{zX#iU{&N~=!yacV!E|gnmVdgUK!(}sHt`Wi&6$X(ZQ={D}h4N1`R%@e<`QHVg~|E zjK6F3f`ib+&TG^w4ocgi;ZHqjVkF$8jRe9Ic#~^52AMbJ?V6jPBDBygPR4m|wCTXDzDj88=J-s&NJ7+28_v+sa z)1K(sOZ8kw0x9sLdagptzq+~o*ZN83ew8XunRN9e<7%P&qG3nq*+Au&CsCqQzQCor zg%zf>Buy$Qd8$_l`8XyXeX6=wI0JVAFEWEl0Dspc98B82aCd$3D+~4 zft#Tdk(%0xztHxjbf#D59pmb}otxX`X|ztI(JZj1XMrhCuAI9zt4Dl+DZTCKSES05 z^siSBdfEe+(jK0gBQ-kDo_8UmcYzVOQe3wS^_ge zEs>g`mPq~QwRClsEV@viyEnJX(+NgfkL?lo8h3~TQ&wiu0xG{ex$WUl$5&>l!lZI54lgSV0jX4Zl7$BiLs3>@ z*(yv~EO-VdYAfC3QC3LJpsbLZq4SWM+Iga+UUY}&jhGztleiVoQ36WWfK4FEjN_3; zq)MkqgDYHVc2AXnD^>F78>D7n9;vC!f0Nx*=~ig%=5~1!Zwe|Tpr=AWl&4IR=cyzx zGgK0(Qe~-Z7DWrp3>8OehKeIKwc_uj3_07{?`vZ>y`pVxwECNy+vRC{y5mXesu1N# zYR)t>^e<>;s5(+ptIhnL1b1$Ri3MkfBA8DlH;wCPg8kS5O|q8o2+goxD?V zpDQ5GZElyR&vYsTM6|aw3Gg^^I6pbN<%0_d6H)FlFraPAf2Ikkeb>& zUOFO6o(4gV3=M+R3=M)*sjU2_jw7#pta9aJ%jR}@65lK2LqMrI8Ul#&Bn^>8K7g5_ z0g#&70ABgP748-Rr|O(! z#|kX%05p+<-tQF${nup!h|BC7>7zz!Fe~IIskC{bv5uMH4cnu9%RNx?Dn1 zy2H&c_J~*>C~>|vO_FAtYFtn1dJ4qE-63`gk^~f!1;hlDB^R({z2&+<{i#+BGKv(7 zNrR+Rdj?6VQjH`LW%(767DeVA%Oao{qOWakmnRWXuei$aRhaT5LY!qVgQiHW3}2OB zo@e+7?DtZnTJ~i7y%Yz($a%k)BIzQ_{a%V-i){9L zDbgt};(jkBQTE~cHJ>EP-fF*`(gE@-BA7{BR_n+L5&?lvGP^3DQJ%Vg>(8=4Q@0^=Q}zS?r8ms*o%k;SGY;y z;GU*;Zh$4M{@o1=6R;>>l?*Ha8%)x|mP>0S=rpM~rHxIgIi<;Hl_sDv1Rk!NgYf<$_YOx?La8!B`Ak6 zmKHyUxC~*U&6HR!B?|cr(HkG0t5}xW>~Gm046r#ZZAb|27dj6jSyg8DuUHPR=pYA> ztN43PW^#YhI1<`IxL;+#O|>h4`-hw?Y%bO9E43bI_0{O2Tt)#2o^*oGD(m+i4+rZl zo|E0pv{aNSx-@BPaMtyYEVWpo2iiP6cu2womVrWgW|k^M#!03z1GH2XLTKqaWTEJg zMy)sqO<++bGy(;_%GEVp8Z6OU#3*!u23_@&7OFB)*KUUX9c*1R zt%1kN8&NWYQZSB{s=cbUV;VwgFWjZey5E%fgOoDmjVSLyuw%Sj9V<@AIIo^pfOFKw#UCTT$xs`a&bS-hAY!epNo64FAH6nhAMR%frksT z;jY#=KX-8_+nVk%dU}#s8+6P&u94@@W}RO~F>s57jt7lFX-65}+4PgVmuV6-56VVU zc$8@rxC^r3zNrV52t07NWNY`aT3AGhd=swVh;sQRenr`chWRGkEt&@r+;8Gxgcj-v z`uCe~1xHlcH}N384GDHcpM8>PPD#asn8pvAi(hN`5e8mp3?jqWtp z!Vyr4f_bsQ^|?zyDmAqjm6}?}1WkOp{zaQP+2&!v6)w;g0!sGGg)G#>zrj`$6x{K^ z|A>&kN1hTo6?Rx^1v>Pr>-8@xa74BWq~c~Ecf0mji7yZ227j7GH}0eNvcxY8+>Lv( z;7YW@CuaX^e`|1>22IDJ{!Oj&EbWmM$1BQxGh4Y!G_FWYHepM}%g{9MYEmES-+d5b z@MwFFJnq%W2n`lc&J$?N)OrX(LCa9)<9d<&s{Tb)ANw*(6ASKd&5?yPYgQIbEA={? zdhD|-+~;LE~C{czQ{c;&91#!XbR4eI>M96&xTv7am29+Tqj%A1xKQ5fqP>% zseMk<_28bItqrQQn^fGUp!;z)>wkyF{k#4J?v!j+#i82wbe8@FZZsRNEO5oo0o-`D znQ)7yCvGg_H(Q&DkK_`)6aen@Y>Fe*`wQHPY;;rI!ocmy*1oC!V&IO=MpwMX7oDrd z5pdtkCOb)uBW`8jK9#L*cW7MMYXYwGc^3H{IYpH{PXA^b6M6dmLj4Px%d*vLt;TuE zgPTpp#2OPOqi=1;5S%+^@3rn^@78=@kHQ2WJ~Qf+M>W#6vb**}jmd zZQ#z%)^Fn9+~e|aR<`yPoPD%q54u-m!xfxEG;TIIm-iE0np?8b6r3^_w=-MYR%#px zPY17!2kRA=mGVz;ZvQ8|iZepO+q2b4-e2ji4i;zQQ*b0q{+sv|oE@5Ow({k@Sl*zy zJX`sKGe8F_P@iVA+K$#ZV#5RX!fd#LBcbHLt;jat2#$nK0C!3@J3(+HumZRzWUHIt zta0nsnr$3hI7bP^68#IOqkvbKqzVDA(Mfc?b$(BZI9Wn#xye{2pb+p`l>&Ncm1U(B zH?-ynC7E53+v3XgEwHRV00t$f~Yt@AUdx@1~C3cY^Rv}=!Nh%i5ORFM{R=v(3 z1bo*2JFS(PCM0BCHor`2xj9y=B|I$B`E#sjY6n|m^}Bri3uzIs!X#A)c!5sJEGsZ_uVbdqhwb9&^V&c#bD@YlL3 zZ|Yxk`IFhYJYSO$vY2x3)fQtvvdc8y?fMrqpUp<|F^#iB|3VxD+*GWnq74LmLMN%d zm!|{g8N_~k;6cdmGUTfTlw6tmUb4MzvXu$gY`7{FQ207vdt|dq=1w8*a&V1-gIJ^Oa@Dw=pf>NxGb~OnJouPB%&C z3+Q3t#xzn7YW^P9ztp`hg9;jzy|^82aRR<=lG64AQ|n8GNriuAviVcX?>tPU+^m1$ z?i27!lXSj-*B!2~(c;V6kI~gS!|jG;?X&d5rQXCJ>j!BFL{kXpX~1P^4H(pX3zH;r zmEb_w5Dp|=3YGFCJ+;z8SDF?42>1;xe2i|7Y5JF1_-)-FIc{~=wx_a@soyv1s!6$o zBk)fSRSbhI0iQQXRRV6)Nw)O^UynQ-;`W(<(s<~z&zDNeJ)-&cSyci`V*)R|3Y%#NrFEN&D3wf_(O4|tGM$8*5W+q3 zAfo8dV7qR>j1fJO;%Sn*O_NCNQPsQCM356*Rur^SmwL6!kbqB_q=f=X;fNU((8I?S zhL0EBuDPOJ9)4@&tyn-AIz&&u^;F@COjWodtqU*Fd`g?a@D)(T397!VUB-upW3;I* z_EwkUW$kzA2N@QKR}s*|-m*;Wr7N%-HG50VXebr1!z9fYKK`VOh7K0+6O&Xdpl|`K zOSRS!eV1XcW|@{pX$_cGq8N@c9Fzzs%`*@|7MEDZ_6TP(!jL<)OhHW*u2kjV(Xo46 z;S%=#Y=+H3DbuZI+FU2JMKrNi5bzU2$S;JRGHsY9Xpp^BzSCQ$IJI?9mDE;1QYs;- z<(Im)xX-4&$2=G|7up&;R{t_yDzQOnNX@<;$uY$xmaD;1mzb|d9;C6+T&eWs)m4U6 z`9DYb7Hv0A+D<0V{j8-F*zAlvu_v{F^p-D6%?Gc2-o(_BrC3iHpD)c&#^+1L(DRh>`O*w!e7^Ksl(Eqmlb(8PG{&T-jE(IX z%1F23Gt^^4rZP5UDq};YGSXKVyLA^zzmN$h@O-0lN>f`8N;!2+A45=jow;9@D(UzB@bBnyv%^N^vqzvWBQRH;}QI%|sNqEi2&0s^*} zq*4LfbW-LDOwn)4OvW++TTN2AfL>bZE>fYTqrEHyh6w1*nC=dhj8Y3+?IoZ$W4h~e zux9Zj!|HqiC+MWi)s~D$nT%xudNZciQ8FHDGR_mwn=!qPl2Q0W9R>7eOt0fhx}@Km z66Xup;Ztdu>nIubnv7)vdNZciQ8Ml^8RrS;&6r+C$@sp>SR$Y|WA-`@)D^-ox-nY} zyWos+aqrEBJ6q#a>fdZL;syHs#V*a+1G5a{;(b)@I`uC`pMbBMq=f?R)k&(01W}3ixI}MBVu2M;Puh+?5F^{7?yHJ@RCm63PS=E)}9Y zo#i45=w&5cvV@hZ4J-2myiOrGOHks=NBXhIuI4;KF_jdr;-f>eym7b!1hh?fhv%p?`B*Pv7@ zgH`@hUEVgsLbaoFNqIP=ev3|e$-z`(`$} z!lu+4xEr(K3eL+e4^B27y0j*HQ2#~ zZwcvYA-#kWDM6YQ!&5+Sp(Uo!LrtM20!o{z0WVL|te_~Mm%H=<|DLY5l#c-~v`S5( z#R4ucNofOqvnKRs(~#AEjoof?RbQ#Wb#78>pGymj(kPJhpJ$u5h1CidcksShMw@W6 z%*EZ1ZSEE}*Sol{Wy5__m1hkcplX6qAYhS6Di^RpC#ex6Pd|1M1-#!R%@^>=etG37 z->A280q5!@RY+pp9Lyd4$AEm)_-K12>kY?Ddb7Sbelx;W( z_wTv571<^v;bxdF8gxI-MpxLJ;^H2bjqYQ5c)qQFG4uo+u16*80s+V9BNVrpv&ckdbQ$^?|ciIp7gi(!Ur%05FiXHaKofQQ3C=3qKyiO z69y0&9+iLyh=KuBK&CJ$GKruV5#-zFp8s!Gr|O(ezwf(T>&seD|GjI^Rj1BWeXdR4 zC1qQCDZ^GWXR@W=6QC|+Y_jvqeyW2E8JO(6mGY^aJOrJsc;|R6n!s;~RXlxBJj@jv zz;8OM4(zm*&Pr^}b;TO6Q!$;DsbXJ|Vmd2PJVqYN9#?%){oh!Q+&s;(Z>zOc0Jz9m zb>Pin6<2nidM{UN@2-J2IjaTiw3SvCTW7jr4cMueRu;vJT(J+>shCz4#UD!1CSU1q zM|hI*;T3aXs~YeQXAJ@G6f3V9)N3x-1U@hxb3?#CJF5wN-C0AxHGKXxfm=Fj2>4EC zHGz9OYe;E(ljhhUM^eZVYP6xq!iF747P%nQbDls0NFuo))J7g%14u5pAk@x55J+aZ zpl2mOa+7=zYQXO~YY<3=nXQ`VJI7pmccgTT&!(`ik>41qmi1a?N( z=g~0)CJ3bdStxyNsF!>+`he6w7lc~LW9|czPA&*FJqQ9jlS>ahGHI&x<153qPk!=8 zCb!`XF59!$;e%j>rJh9I7uA@h~ zHksUp^(F7hwX7?iWN{$2Rc<&DI!)1Ds@9gB{<3r44EZD*lYPAG5|ivm#blo?lU*pg zH>oW)0OIf6hzg7Iq}3c#3w!I zCXgc9p?_iAk*Kfbp9|^THs?`1yZ8)iZt z5~>TNx+50jNN!XFOVrwlZt2P;_q5lj1W&0o*(s}($WkUsWU>p&WRFwH=Bq6`zf)4G zVK)2AY$Eep*)-Yv%TCG^l!eS>7napvMb&pbwI;h;nJh9hgY29#S;p_sAUml{mLuuh zAp5tnYp2C)?6Yv@ya05t`woCvCF$=g+5b!Jlu6P^`AR*?uP(*1?fSm!Sj{?$wYXp3< z=P(5947lb2f5wMm2zX7$P}JH`{|JIWGR)GbwW0p)15^X<*irXd8)|ni%n-0M-}F{5 z&9{$yf9Cntft~sG735nl%D2z+z0lLB18){9%eSu$Mc#I)1pKS(_5m5>To;OQHeFz6 z3DV1~E0yQ3J>M#DW*DG2GrNL`b1)V`yv@g<3S@{1E`5gN`FkM(Dvet^fghj>e8DS` zJp8>jN+r8AAeXg0mwGrpbM#)R)q;N@ho)U;6B4u6SkKGm=nxW+aWg535-KnVWRhBX zKnBee<2YZ?^7kLLS$g1pkG(~J<21uIx$!FSac8wwRu!gsg{#0Y zfm-QoN!+a}1MgI8r=!KImYkB$l+4%FmYrrFQvYLW?FY2!a{+{wNXVY50nsbi_=FZB z7Ve_5U(_C=u{c+)$u1~MEv}TwR?0S7vtld`c4wB^WfH8UgVXFzDwAcRY!_tTUbcZd zo=BP9va@|W%T4y+vKSWXir^--cD4upN~~<@Yqp^t41&PFEh88oP^pJTk%xwR__KRx z06RUT=hM_ft;j>oJv{CnYQRnp=@~5b&{yQ4&prIkJ@f%PJ)|cH%1g#}bO4|0C~ulP ziX>vsK7gHyX-+5-pFLLvb}E*K%JAEi0Y2-Y9)J088>-V>`gt4TK+0z8;<9V>%If*- z8d7Vnfxp&zozK>I5~hlcBE_`4sbUSq(-ef=B`rPSxrw>U)fC1m8S|X6XFX^Co7{ev zxCg4WQxWiRu|}-KVZWn1-_b$uwG$x51^YniV)kDcEQ>t9cmHhPciXsNEFhG^TQ7`okmY_;yXa ztQg>J#j|Tf;0``N?Gpj-6>(gU1AeAc?u#P6=S*7^Ag&g3f_)V#dsQ=UavRpQQP=R~ zcG1|y^Ng_embxuO*&0;x8_`(0;0i1j$v#?qQZjL$lsnczTg5jjyOu%rS?Sm+9%sQj ziNES$jEMlR^m9yhSyHC>cUNoxI~CJ~9*-}&Vh#9NKbg0HU+)N_)`t2)5CnEQP0zu9 zkh4FlolrTZGXB7g=TW`3C0qa;*U%1~c=GHq_oO*Z>BP1F^?VCB3CfGwcDOEDtK=>a*{{2Y7}uIOc%5KZ(ZFxI)&LOC`RGDD76gHK&IO@D9Lbmy zN7HT9fG0U?2zY_BTEI)4HAGyGI;#cbvHA-35r7>wZKr`Hdth2J@^Lp-1>)KsW8(79 zE;S3=&pWFc7av1syNJh5pasvR=1V%buj2lHV~^|Npb`0< z4BLS)zwAJmt~VZg_&b;;@F8c_fqxP!pXE?ncmhc%nE#;LY5*U0Rtt#1d`?0I^T{EP z`H#D;8W1g8kS`yOD|E2rPjS5}@D^tc62N57ZxA@mS;>?cifm`sUl{+s8y~tt@TR~@ z{SC$bGGlQv-;jmxxTPwVRu5qU*LPMj+lca8ZfF+pDzU~?hKJh_p;WVQxQ<(&6^Dt) z1`@GZSuLBD3$=;l*S<-q34GC6b>Mw^kC@L&C|+k593Ys#$!#@&OP$pMVlbbTP{DjM zD=|;Vc7+ez(|3yu0r%>NzSf3X5Cnl|Eh7jO;z$<8G>$&v*vZWg;PJS?!uGEM3wWoq z`hjPOf~3;|h#VF>l@zTxurC_j>TpK>D z=}QioWh#!v&fpp0k*6(Rll?b)`1S|};$3298`Vf@ai<`I(=Dl66y8IAlvRO5Y)di$ zKPvOaij5l!KeK(1lM#JF2~}js*2w+K)<|U5kgUDVKJv%$6ft^G{a+3?Z`aQjLA*;&GeK~_c=pf> z_#6EOBNGEZBc6!?2{sdp|E1B^i1tx0Mhi%M`A9+$p&imdBDDKGAOV^b@F|bA27Fbl z+ym4KUhWofC9!frC{i^i%g?kg&2*?J)4q0^=}?+!Uz+IYU1MuI>Dd8!=5VYy!i;AYA5c0} zns#LZBpB06KX?3j$)6YWfZrBtjqG)UpxxBu+s{%K3*1+9@PddxT>oZ{}t{1#Bu$VqopX1eU3Emu7%-bz|(W(NsaaQug z@ot@!Hc&R%6a~+4-i$VwtZi`49FFtOl;gxl1ep&Uz?mRNE~8L%aLiK#U-C${O(tS0 zlRlu0WeUEn{E9|pJ=NVVkEX0q@`PePRs9sTCOf-K_A<%b7Gx)tJ24tj`dJ#K<$CFZ?p~o$t|;0 z^Gu1-1c3*795o;zniOzBkOFo_n_k;exPv^}J|H35T1S)wV=UmHd+Y-eOqNq$8|suG z2)snBTre)=t_mr{F+?2LEO?z4e{IZ8-h6nBkGR>~!_amf)GQ#0*=O4q>GNwLvacwn zi`9;^17|hH!3d|>u*f9T! zo38;0%FbBn`^r?W54}}9tO3HoRKa;BHPnwGw6bKjNYgK{4P#r_0U{|WZV7m@H*(XOe zc2|>|j|X=^wgcMeT|7)(_Vl_`PZMkh7Vu%QOf`Mxu!&r47F+^17ptpY5E}nRa@?iH zo3ZhNq8};0q-^KdxKI}=rSGb>ga5^{cQeRd?v+V);!q*xkC~fN_M8dX$I8vEq!Ipz zk93j%li{-xF^{EBt4Mw)0Xr1{-{IfdtOMUAR=y%ZT@nN_7q{_M(b_SeYV59-} z5%30XYmm@zV;2~}VVCLywmYIte;$x}>`y%o;T+HTN(zN@Tm68?dmR11&dk$Q_z(qx zCp*>gX>-9NXI&4)0-r#$LTEN@H%2!1wJ~m+U7x>09f>2xeF3#kFjyN{cD|&lE z44mL`>;vTc3U*GtZWw}a^3@aSxu6XsoLmsaNW)`lV|J3RwCou;cQPT5muznud9+?@^rag#aibEmHcK_F$w1)&I~;Gx$>vhh>5 zH9!JO11mL@ytdy;(mT0U6}ZS*L%>^|)x_Ov&KgSHB@duilJwrLRR=Osw)6w94^p`M zM_{Gyl1r51CH*v&><2liIYlh9%I>plihYoV`on%sU{*!5Q`ibw2~pGi*dG>udgpo zvZ+*Jxq=%Y7KTlHDQg15v68HAsa9XAl_Wby%gRZqHwWZpMT$9qc?##DXwX%*g)~0ZfgL@2Fc7;qYbsXhdKc4beh)m2eSNQ z_fQ2s=d3#L1!q<9INm)bH6@{2rIpnbd`GYZ490!8@~UpU1tgs=l_#{!9~iZ4>rA|; zO;jv=@zXBvfHe=Z4m?Y&;z4|~df)DfRp0_=wSd?vNCvIlTq`-icUKpYnHAvau2lzq z&RL0}IeI5_s#+@m@Y~L+19??dTmWo+!4(_8e>!Ur_?lSxEQZ2E!37n63E+0ORRuod ztmM>kp1OXZHk%pXJ6&xS@ORE?0fX^b@$~sxWZZ@U+mE}UIxrYYhM`-OK`l9PqZUMx zt4AJOe?||bZGeFrd5A6G;bIjJ@M*H~Hdm|ycXd`BxQDZT0UZ9s`tBg12ECctTC!e6flv5i4e+ zhUVwoSaL+nP}gy4$J=($2}?J$uPMSgJ@gFcJ@I7NQ4;&BwOc_TMpiJh@7y4;}0*B4+O5GIJBP z)2pV|Rtexooz(~Yy|V^@4~dmeOQ^lHY0F+(0QoF`E(o==c2=1nu;HvG@Cax10q2NS zd^nKSULJ4*$lolrTN5BrXSNz`sIbFu5J=RyAQXX{Mc^SGa05u-R$*Xg4(W|OIq;{= z?C=HN>uI%sM4g3J^Bn#Y1c57SPv6+evGa!8Pz0W!jVOQE z7_-?j4Bk%1guQwB>F|3+Fo*0g1`^7MoK^&H-m1}izgl}!%0A_VVvYPL{>LJ24syUp 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 diff --git a/buildroot/share/atom/avrdude_5.10_macOS b/buildroot/share/atom/avrdude_5.10_macOS deleted file mode 100644 index dbcfc997e4b38549229131c49f40811eaa561d00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 deleted file mode 100644 index d933567..0000000 --- a/buildroot/share/atom/avrdude_macOS.conf +++ /dev/null @@ -1,15272 +0,0 @@ -# $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 deleted file mode 100644 index 2fea2d5..0000000 --- a/buildroot/share/atom/create_custom_upload_command_CDC.py +++ /dev/null @@ -1,141 +0,0 @@ -# -# Builds custom upload command -# 1) Run platformio as a subprocess to find a COM port -# 2) Build the upload command -# 3) Exit and let upload tool do the work -# -# This script runs between completion of the library/dependencies installation and compilation. -# -# 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() - -env = DefaultEnvironment() - -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: - com_first = '' - com_last = '' - com_CDC = '' - description_first = '' - description_last = '' - 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': - - get_com_port('COM', 'Hardware ID:', 13) - - # avrdude_conf_path = env.get("PIOHOME_DIR") + '\\packages\\toolchain-atmelavr\\etc\\avrdude.conf' - avrdude_conf_path = 'buildroot\\share\\atom\\avrdude.conf' - - avrdude_exe_path = 'buildroot\\share\\atom\\avrdude_5.10.exe' - - # source_path = env.get("PROJECTBUILD_DIR") + '\\' + env.get("PIOENV") + '\\firmware.hex' - source_path = '.pioenvs\\' + env.get("PIOENV") + '\\firmware.hex' - - upload_string = avrdude_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' - - - if current_OS == 'Darwin': # MAC - - get_com_port('usbmodem', 'Description:', 13) - -# avrdude_conf_path = env.get("PIOHOME_DIR") + '/packages/toolchain-atmelavr/etc/avrdude.conf' - avrdude_conf_path = 'buildroot/share/atom/avrdude_macOS.conf' - - - avrdude_exe_path = 'buildroot/share/atom/avrdude_5.10_macOS' - -# 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_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' - print 'upload_string: ', upload_string - - - - if current_OS == 'Linux': - - 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_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_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 - ) diff --git a/buildroot/share/atom/create_custom_upload_command_DFU.py b/buildroot/share/atom/create_custom_upload_command_DFU.py deleted file mode 100644 index 9082699..0000000 --- a/buildroot/share/atom/create_custom_upload_command_DFU.py +++ /dev/null @@ -1,42 +0,0 @@ -# -# Builds custom upload command -# 1) Run platformio as a subprocess to find a COM port -# 2) Build the upload command -# 3) Exit and let upload tool do the work -# -# This script runs between completion of the library/dependencies installation and compilation. -# -# 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() - -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' - - 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' - - 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 - ) diff --git a/buildroot/share/git/mffp b/buildroot/share/git/mffp deleted file mode 100644 index b8b7b37..0000000 --- a/buildroot/share/git/mffp +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash -# -# mffp -# -# Push the given commit (or HEAD) upstream immediately. -# By default: `git push upstream HEAD:bugfix-1.1.x` -# - -[[ $# < 3 && $1 != "-h" && $1 != "--help" ]] || { echo "Usage: `basename $0` [1|2] [commit-id]" 1>&2 ; exit 1; } - -if [[ $1 == '1' || $1 == '2' ]]; then - MFINFO=$(mfinfo "$1") || exit 1 - REF=${2:-HEAD} -else - MFINFO=$(mfinfo) || exit 1 - REF=${1:-HEAD} -fi - -IFS=' ' read -a INFO <<< "$MFINFO" -ORG=${INFO[0]} -TARG=${INFO[3]} - -if [[ $ORG == "MarlinFirmware" ]]; then - git push upstream $REF:$TARG -else - echo "Not a MarlinFirmware working copy."; exit 1 -fi diff --git a/buildroot/share/sublime/MarlinFirmware.sublime-project b/buildroot/share/sublime/MarlinFirmware.sublime-project deleted file mode 100644 index 5074794..0000000 --- a/buildroot/share/sublime/MarlinFirmware.sublime-project +++ /dev/null @@ -1,25 +0,0 @@ -{ - "folders": - [ - { - "file_exclude_patterns": - [ - "Marlin/platformio.ini", - "Marlin/.travis.yml", - "Marlin/.gitignore", - "Marlin/*/platformio.ini", - "Marlin/*/.travis.yml", - "Marlin/*/.gitignore" - ], - "folder_exclude_patterns": - [ - ".pio*", - "Marlin/lib", - "datatmp", - "Marlin/*/src", - ".vscode" - ], - "path": "../../.." - } - ] -} diff --git a/buildroot/share/sublime/auto_build_sublime_menu/000_read_me.txt b/buildroot/share/sublime/auto_build_sublime_menu/000_read_me.txt deleted file mode 100644 index 5853977..0000000 --- a/buildroot/share/sublime/auto_build_sublime_menu/000_read_me.txt +++ /dev/null @@ -1,40 +0,0 @@ -Overview: -1) Install Sublime -2) Install Deviot (?optional?) -3) Install WebDevShell (this will execute the auto-build script) -4) Copy the menu configuration to the proper Sublime directory -5) Add platformio to your path (usually not needed) - - -Sublime with autobuild - Tools - Install Package Control - Tools - Command Palette - Package Control: Install Package - type in deviot and click on it - Tools - Command Palette - Package Control: Install Package - type in WebDevShell and click on it - - in Sublime, open Marlin directory with "platformio.ini" in it - - starting in the top level directory, go to the folder "Buildroot/shared/Sublime" - copy the folder "auto_build_sublime_menu" and contents to: - Windows - \Users\your_user_name\AppData\Roaming\Sublime Text 3\Packages - Linux - /home/your_user_name/.config/sublime-text-3/Packages/User - macOS (Click on the Finder's 'Go' menu and hold down Option to open...) - ~/Library/Application Support/Sublime Text 3/Packages/User - -The menu should now be visible - -If you get an error message that says "file not found" and "subprocess.Popen(['platformio' ... " -then you'll need to add platformio to your path. - macOS - sudo nano /etc/paths - add these to the bottom - /Users/bob/.platformio - /Users/bob/.platformio/penv/bin diff --git a/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu b/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu deleted file mode 100644 index b1c3493..0000000 --- a/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu +++ /dev/null @@ -1,66 +0,0 @@ -[ - - { - "caption": "Auto Build", - "children": [ - { - "caption": "PIO Build", - "command": "webdevshell", - "args": { - "command": "python buildroot/share/atom/auto_build.py build" - } - }, - { - "caption": "PIO Clean", - "command": "webdevshell", - "args": { - "command": "python buildroot/share/atom/auto_build.py clean" - } - }, - { - "caption": "PIO Upload", - "command": "webdevshell", - "args": { - "command": "python buildroot/share/atom/auto_build.py upload" - } - }, - { - "caption": "PIO Upload (traceback)", - "command": "webdevshell", - "args": { - "command": "python buildroot/share/atom/auto_build.py traceback" - } - }, - { - "caption": "PIO Upload using Programmer", - "command": "webdevshell", - "args": { - "command": "python buildroot/share/atom/auto_build.py program" - } - }, - { - "caption": "PIO Test", - "command": "webdevshell", - "args": { - "command": "python buildroot/share/atom/auto_build.py test" - } - }, - { - "caption": "PIO Debug", - "command": "webdevshell", - "args": { - "command": "python buildroot/share/atom/auto_build.py debug" - } - }, - { - "caption": "PIO Remote", - "command": "webdevshell", - "args": { - "command": "python buildroot/share/atom/auto_build.py remote" - } - } - ], - "id": "AutoBuild", - "mnemonic": "A" - } -] \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/.gitignore b/buildroot/share/vscode/AutoBuildMarlin/.gitignore deleted file mode 100644 index 5df8049..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -out -node_modules diff --git a/buildroot/share/vscode/AutoBuildMarlin/.vscodeignore b/buildroot/share/vscode/AutoBuildMarlin/.vscodeignore deleted file mode 100644 index 5ff3c19..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/.vscodeignore +++ /dev/null @@ -1,9 +0,0 @@ -.vscode/** -.vscode-test/** -out/test/** -test/** -src/** -**/*.map -.gitignore -tsconfig.json -vsc-extension-quickstart.md diff --git a/buildroot/share/vscode/AutoBuildMarlin/README.md b/buildroot/share/vscode/AutoBuildMarlin/README.md deleted file mode 100644 index e3e9323..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# Auto Build support for Visual Studio Code -This `Visual Studio Code` extension provides access to the `Auto Build` script. - -## Installation - -Get the MarlinFirmware repository from GitHub. Open the directory `buildroot/share/vscode` and copy the `AutoBuildMarlin` folder to the `Visual Studio Code` extension directory. Relaunch `Visual Studio Code` to complete the installation. - -To find the `Visual Studio Code` extension directory: - -- Windows - Use Windows Explorer's address bar to open `C:/Users/USERNAME/.vscode/extensions`. -- Mac - Use the Finder's `Go` menu to open `~/.vscode/extensions`. -- Linux - In the Terminal type `open ~/.vscode/extensions`. - -### 3. Install the PlatformIO extension -Click on `View` > `Command Palette...` - -![](./resources/view_command_palette.png) - -Find and click on `Extensions: Install Extensions` - -![](./resources/install_extensions.png) - -Type `platformio` into the search box and click on `Install` under `PlatformIO IDE`. - -![](./resources/platformio_install.png) - -## Usage - -This extension adds the Auto Build icon ![](./media/AB.svg) to the Activities bar. - -### 1. Open the Marlin folder -Click on `File` > `Open Folder...` - -![](./resources/Open_Folder.png) - -This brings up the `Open Folder` dialog. Select the folder that has the `platformio.ini` file in it. - -![](./resources/Open_Marlin.png) - -You should see something like the following. If not, click on the Explorer icon in the Activities bar. - -![](./resources/Activity_bar.png) - -### 2. Click on the Auto Build Icon ![](./media/AB.svg) -This brings up the Auto Build menu icon bar. -![](./resources/AB_menu.png) - -### 3. Click on one of the four icons -- ![](./resources/B_small.svg) - Clicking on it starts `PIO Build` -- ![](./resources/C_small.svg) - Clicking on it starts `PIO Clean` -- ![](./resources/U_small.svg) - Clicking on it starts `PIO Upload` -- ![](./resources/Ut_small.svg) - Clicking on it starts `PIO Upload (traceback)` diff --git a/buildroot/share/vscode/AutoBuildMarlin/extension.js b/buildroot/share/vscode/AutoBuildMarlin/extension.js deleted file mode 100644 index 8277517..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/extension.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict'; - -var vscode = require('vscode'); - -function activate(context) { - - console.log('Extension "AutoBuildMarlin" is now active!'); - - var NEXT_TERM_ID = 1; - var pio_build = vscode.commands.registerCommand('piobuild', function () { - const terminal = vscode.window.createTerminal(`#${NEXT_TERM_ID++}`); - terminal.sendText("python buildroot/share/atom/auto_build.py build"); - }); - var pio_clean = vscode.commands.registerCommand('pioclean', function () { - const terminal = vscode.window.createTerminal(`#${NEXT_TERM_ID++}`); - terminal.sendText("python buildroot/share/atom/auto_build.py clean"); - }); - var pio_upload = vscode.commands.registerCommand('pioupload', function () { - const terminal = vscode.window.createTerminal(`#${NEXT_TERM_ID++}`); - terminal.sendText("python buildroot/share/atom/auto_build.py upload"); - }); - var pio_traceback = vscode.commands.registerCommand('piotraceback', function () { - const terminal = vscode.window.createTerminal(`#${NEXT_TERM_ID++}`); - terminal.sendText("python buildroot/share/atom/auto_build.py traceback"); - }); - - context.subscriptions.push(pio_build); - context.subscriptions.push(pio_clean); - context.subscriptions.push(pio_upload); - context.subscriptions.push(pio_traceback); -} -exports.activate = activate; - -// this method is called when your extension is deactivated -function deactivate() { -} -exports.deactivate = deactivate; diff --git a/buildroot/share/vscode/AutoBuildMarlin/media/AB.svg b/buildroot/share/vscode/AutoBuildMarlin/media/AB.svg deleted file mode 100644 index ac6dbb8..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/media/AB.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - VScode view icon - - Layer 2 - AB - - - Layer 1 - - - \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/package-lock.json b/buildroot/share/vscode/AutoBuildMarlin/package-lock.json deleted file mode 100644 index 6933834..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/package-lock.json +++ /dev/null @@ -1,3323 +0,0 @@ -{ - "name": "auto-build", - "version": "0.1.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/mocha": { - "version": "2.2.48", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", - "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", - "dev": true - }, - "@types/node": { - "version": "7.0.65", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.65.tgz", - "integrity": "sha512-iUdyWWikcQnGvIZnYh5ZxnxeREykndA9+iGdo068NGNutibWknDjmmNMq/8cnS1eaTCcgqJsPsFppw3XJWNlUg==", - "dev": true - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "block-stream": { - "version": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "gulp-remote-src-vscode": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz", - "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==", - "dev": true, - "requires": { - "event-stream": "3.3.4", - "node.extend": "1.1.6", - "request": "2.85.0", - "through2": "2.0.3", - "vinyl": "2.1.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "process-nextick-args": "2.0.0", - "readable-stream": "2.3.6" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "dev": true, - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "event-stream": { - "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "0.1.1", - "from": "0.1.7", - "map-stream": "0.1.0", - "pause-stream": "0.0.11", - "split": "0.3.3", - "stream-combiner": "0.0.4", - "through": "2.3.8" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "dev": true, - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" - } - }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "requires": { - "mime-db": "1.33.0" - } - }, - "node.extend": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", - "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", - "dev": true, - "requires": { - "is": "3.2.1" - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "2.3.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "request": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", - "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2.3.8" - } - }, - "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - } - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "0.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - }, - "vinyl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", - "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", - "dev": true, - "requires": { - "clone": "2.1.1", - "clone-buffer": "1.0.0", - "clone-stats": "1.0.0", - "cloneable-readable": "1.1.2", - "remove-trailing-separator": "1.1.0", - "replace-ext": "1.0.0" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - }, - "dependencies": { - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "0.1.1", - "ansi-red": "0.1.1", - "arr-diff": "1.1.0", - "arr-union": "2.1.0", - "extend-shallow": "1.1.4" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-slice": "0.2.3" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tslib": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.2.tgz", - "integrity": "sha512-AVP5Xol3WivEr7hnssHDsaM+lVrVXWUvd1cfXTRkTj80b//6g2wIFEH6hZG0muGZRnHGrfttpdzRk3YlBkWjKw==", - "dev": true - }, - "tslint": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz", - "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "builtin-modules": "1.1.1", - "chalk": "2.4.1", - "commander": "2.15.1", - "diff": "3.5.0", - "glob": "7.1.2", - "js-yaml": "3.12.0", - "minimatch": "3.0.4", - "resolve": "1.7.1", - "semver": "5.5.0", - "tslib": "1.9.2", - "tsutils": "2.27.1" - } - }, - "tsutils": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.1.tgz", - "integrity": "sha512-AE/7uzp32MmaHvNNFES85hhUDHFdFZp6OAiZcd6y4ZKKIg6orJTm8keYWBhIhrJQH3a4LzNKat7ZPXZt5aTf6w==", - "dev": true, - "requires": { - "tslib": "1.9.2" - } - }, - "typescript": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz", - "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==", - "dev": true - }, - "url-parse": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.0.tgz", - "integrity": "sha512-ERuGxDiQ6Xw/agN4tuoCRbmwRuZP0cJ1lJxJubXr5Q/5cDa78+Dc4wfvtxzhzhkm5VvmW6Mf8EVj9SPGN4l8Lg==", - "dev": true, - "requires": { - "querystringify": "2.0.0", - "requires-port": "1.0.0" - } - }, - "vscode": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.17.tgz", - "integrity": "sha512-yNMyrgEua2qyW7+trNNYhA6PeldRrBcwtLtlazkdtzcmkHMKECM/08bPF8HF2ZFuwHgD+8FQsdqd/DvJYQYjJg==", - "dev": true, - "requires": { - "glob": "7.1.2", - "gulp-chmod": "2.0.0", - "gulp-filter": "5.1.0", - "gulp-gunzip": "1.0.0", - "gulp-remote-src-vscode": "0.5.0", - "gulp-symdest": "1.1.0", - "gulp-untar": "0.0.6", - "gulp-vinyl-zip": "2.1.0", - "mocha": "4.1.0", - "request": "2.85.0", - "semver": "5.5.0", - "source-map-support": "0.5.5", - "url-parse": "1.4.0", - "vinyl-source-stream": "1.1.2" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "process-nextick-args": "2.0.0", - "readable-stream": "2.3.6" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "dev": true, - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-assign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", - "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", - "dev": true, - "requires": { - "is-obj": "1.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "duplexify": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", - "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "event-stream": { - "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "0.1.1", - "from": "0.1.7", - "map-stream": "0.1.0", - "pause-stream": "0.0.11", - "split": "0.3.3", - "stream-combiner": "0.0.4", - "through": "2.3.8" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", - "dev": true, - "requires": { - "ansi-gray": "0.1.1", - "color-support": "1.1.3", - "time-stamp": "1.1.0" - } - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "requires": { - "pend": "1.2.0" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - } - }, - "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", - "dev": true, - "requires": { - "extend": "3.0.1", - "glob": "5.0.15", - "glob-parent": "3.1.0", - "micromatch": "2.3.11", - "ordered-read-streams": "0.3.0", - "through2": "0.6.5", - "to-absolute-glob": "0.1.1", - "unique-stream": "2.2.1" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, - "glogg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", - "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", - "dev": true, - "requires": { - "sparkles": "1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "gulp-chmod": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", - "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", - "dev": true, - "requires": { - "deep-assign": "1.0.0", - "stat-mode": "0.2.2", - "through2": "2.0.3" - } - }, - "gulp-filter": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", - "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", - "dev": true, - "requires": { - "multimatch": "2.1.0", - "plugin-error": "0.1.2", - "streamfilter": "1.0.7" - } - }, - "gulp-gunzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", - "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", - "dev": true, - "requires": { - "through2": "0.6.5", - "vinyl": "0.4.6" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "dev": true, - "requires": { - "convert-source-map": "1.5.1", - "graceful-fs": "4.1.11", - "strip-bom": "2.0.0", - "through2": "2.0.3", - "vinyl": "1.2.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "1.0.4", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-symdest": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", - "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", - "dev": true, - "requires": { - "event-stream": "3.3.4", - "mkdirp": "0.5.1", - "queue": "3.1.0", - "vinyl-fs": "2.4.4" - } - }, - "gulp-untar": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.6.tgz", - "integrity": "sha1-1r3v3n6ajgVMnxYjhaB4LEvnQAA=", - "dev": true, - "requires": { - "event-stream": "3.3.4", - "gulp-util": "3.0.8", - "streamifier": "0.1.1", - "tar": "2.2.1", - "through2": "2.0.3" - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "1.0.0", - "array-uniq": "1.0.3", - "beeper": "1.1.1", - "chalk": "1.1.3", - "dateformat": "2.2.0", - "fancy-log": "1.3.2", - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash._reescape": "3.0.0", - "lodash._reevaluate": "3.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "minimist": "1.2.0", - "multipipe": "0.1.2", - "object-assign": "3.0.0", - "replace-ext": "0.0.1", - "through2": "2.0.3", - "vinyl": "0.5.3" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "1.0.4", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-vinyl-zip": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", - "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", - "dev": true, - "requires": { - "event-stream": "3.3.4", - "queue": "4.4.2", - "through2": "2.0.3", - "vinyl": "2.1.0", - "vinyl-fs": "2.4.4", - "yauzl": "2.9.1", - "yazl": "2.4.3" - }, - "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "queue": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz", - "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "vinyl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", - "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", - "dev": true, - "requires": { - "clone": "2.1.1", - "clone-buffer": "1.0.0", - "clone-stats": "1.0.0", - "cloneable-readable": "1.1.2", - "remove-trailing-separator": "1.1.0", - "replace-ext": "1.0.0" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "1.0.1" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "1.0.0" - } - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "dev": true, - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" - } - }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "2.3.6" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "3.0.1" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash._basetostring": "3.0.1", - "lodash._basevalues": "3.0.0", - "lodash._isiterateecall": "3.0.9", - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.restparam": "3.6.1", - "lodash.templatesettings": "3.1.1" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0" - } - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "2.3.6" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } - } - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "requires": { - "mime-db": "1.33.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" - } - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "dev": true, - "requires": { - "is-stream": "1.1.0", - "readable-stream": "2.3.6" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } - } - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "2.3.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "queue": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", - "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "request": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", - "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.5.tgz", - "integrity": "sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA==", - "dev": true, - "requires": { - "buffer-from": "1.0.0", - "source-map": "0.6.1" - } - }, - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2.3.8" - } - }, - "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - } - }, - "stat-mode": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", - "dev": true - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "0.1.1" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamfilter": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", - "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", - "dev": true, - "requires": { - "readable-stream": "2.3.6" - } - }, - "streamifier": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", - "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "1.0.0", - "strip-bom": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "requires": { - "block-stream": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "dev": true, - "requires": { - "through2": "2.0.3", - "xtend": "4.0.1" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1" - } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", - "dev": true, - "requires": { - "json-stable-stringify": "1.0.1", - "through2-filter": "2.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true - }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "0.2.0", - "clone-stats": "0.0.1" - } - }, - "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", - "dev": true, - "requires": { - "duplexify": "3.5.4", - "glob-stream": "5.3.5", - "graceful-fs": "4.1.11", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "0.3.0", - "lazystream": "1.0.0", - "lodash.isequal": "4.5.0", - "merge-stream": "1.0.1", - "mkdirp": "0.5.1", - "object-assign": "4.1.1", - "readable-stream": "2.3.6", - "strip-bom": "2.0.0", - "strip-bom-stream": "1.0.0", - "through2": "2.0.3", - "through2-filter": "2.0.0", - "vali-date": "1.0.0", - "vinyl": "1.2.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "1.0.4", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "vinyl-source-stream": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", - "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", - "dev": true, - "requires": { - "through2": "2.0.3", - "vinyl": "0.4.6" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", - "dev": true, - "requires": { - "buffer-crc32": "0.2.13", - "fd-slicer": "1.0.1" - } - }, - "yazl": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", - "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", - "dev": true, - "requires": { - "buffer-crc32": "0.2.13" - } - } - } - } - } -} diff --git a/buildroot/share/vscode/AutoBuildMarlin/package.json b/buildroot/share/vscode/AutoBuildMarlin/package.json deleted file mode 100644 index 3bff109..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/package.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "name": "auto-build", - "displayName": "Auto Build Marlin", - "description": "Auto Build Marlin for VS code", - "version": "0.1.0", - "publisher": "marlinfirmware", - "engines": { - "vscode": "^1.23.0" - }, - "enableProposedApi": true, - "categories": [ - "Other" - ], - "activationEvents": [ - "onCommand:piobuild", - "onCommand:pioclean", - "onCommand:pioupload", - "onCommand:piotraceback" - ], - "main": "./extension", - "contributes": { - "viewsContainers": { - "activitybar": [ - { - "id": "auto-build", - "title": "Auto Build Marlin", - "icon": "media/AB.svg" - } - ] - }, - "views": { - "auto-build": [ - { - "id": "autobuild", - "name": " " - } - ] - }, - "commands": [ - { - "command": "piobuild", - "title": "PIO Build", - "icon": "resources/B32x32_white.svg" - }, - { - "command": "pioclean", - "title": "PIO Clean", - "icon": "resources/C32x32_white.svg" - }, - { - "command": "pioupload", - "title": "PIO Upload", - "icon": "resources/U32x32_white.svg" - }, - { - "command": "piotraceback", - "title": "PIO Upload (traceback)", - "icon": "resources/Ut32x32_white.svg" - } - ], - "menus": { - "view/title": [ - { - "command": "piobuild", - "group": "navigation@1" - }, - { - "command": "pioclean", - "group": "navigation@2" - }, - { - "command": "pioupload", - "group": "navigation@3" - }, - { - "command": "piotraceback", - "group": "navigation@4" - } - ] - } - }, - "scripts": { - "vscode:prepublish": "npm run compile", - "compile": "tsc -p ./", - "watch": "tsc -watch -p ./", - "postinstall": "node ./node_modules/vscode/bin/install", - "test": "npm run compile && node ./node_modules/vscode/bin/test" - }, - "devDependencies": { - "vscode": "^1.1.17", - "typescript": "^2.6.1", - "tslint": "^5.8.0", - "@types/node": "^7.0.43", - "@types/mocha": "^2.2.42" - } -} diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/AB_menu.png b/buildroot/share/vscode/AutoBuildMarlin/resources/AB_menu.png deleted file mode 100644 index 2cb282c918c61e8271375180897dca8029220959..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23890 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 diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Activity_bar.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Activity_bar.png deleted file mode 100644 index d78e2c82f4c8d2ada061f161b13e6e08a3ab9e61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38031 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

R?Ml8+yJwR*ikSoo<;p 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 diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/B24x24_white.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/B24x24_white.svg deleted file mode 100644 index 1d6c667..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/resources/B24x24_white.svg +++ /dev/null @@ -1 +0,0 @@ -B \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/B32x32_white.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/B32x32_white.svg deleted file mode 100644 index 375b6f5..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/resources/B32x32_white.svg +++ /dev/null @@ -1 +0,0 @@ -B \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/B_small.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/B_small.svg deleted file mode 100644 index c830b27..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/resources/B_small.svg +++ /dev/null @@ -1 +0,0 @@ -B \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Build.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Build.png deleted file mode 100644 index 86ed4782bed61f51c1116e13adfa34f736b10e20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12348 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 XDXgdVsRN1&pee|xN>{yn_5QyBGq&v2 diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/C32x32_white.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/C32x32_white.svg deleted file mode 100644 index 43f93ce..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/resources/C32x32_white.svg +++ /dev/null @@ -1 +0,0 @@ -C \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/C_small.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/C_small.svg deleted file mode 100644 index f8ee33d..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/resources/C_small.svg +++ /dev/null @@ -1 +0,0 @@ -C \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Clean.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Clean.png deleted file mode 100644 index 6ce41877a66c5ac94cdeb7effc1a7183868a64c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3592 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 diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Open_Folder.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Open_Folder.png deleted file mode 100644 index b8ae9ac9026776d8557ed5e327e823acc48d4fd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16455 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 YCQFsBuSrjjtHx85Rg;0gc^mXU03Aiy8~^|S diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Open_Marlin.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Open_Marlin.png deleted file mode 100644 index aa22232a8e5dba724bcf2196261f61e9aaafec3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56824 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 ValjG%8u&NWr3-o*x$4k|{|AQDbSD4+ diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/T32x32_white.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/T32x32_white.svg deleted file mode 100644 index fb3e249..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/resources/T32x32_white.svg +++ /dev/null @@ -1 +0,0 @@ -T \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Traceback.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Traceback.png deleted file mode 100644 index 4ee9f976fb6adc4abed4d0a7c460dc8d1a977f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8485 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 Vxwj;c|Jp!dc*Ruzv#vwL{{rss(%%38 diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/U32x32_white.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/U32x32_white.svg deleted file mode 100644 index 028c9e5..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/resources/U32x32_white.svg +++ /dev/null @@ -1 +0,0 @@ -U \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/U_small.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/U_small.svg deleted file mode 100644 index eb3a431..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/resources/U_small.svg +++ /dev/null @@ -1 +0,0 @@ -U \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Upload.png b/buildroot/share/vscode/AutoBuildMarlin/resources/Upload.png deleted file mode 100644 index 8de383e5d1046500ad04d749f73ef68e94038d70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4297 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 \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/Ut_small.svg b/buildroot/share/vscode/AutoBuildMarlin/resources/Ut_small.svg deleted file mode 100644 index accc458..0000000 --- a/buildroot/share/vscode/AutoBuildMarlin/resources/Ut_small.svg +++ /dev/null @@ -1 +0,0 @@ -Ut \ No newline at end of file diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/install_extensions.png b/buildroot/share/vscode/AutoBuildMarlin/resources/install_extensions.png deleted file mode 100644 index 4904c1d758b87f31a28d6aaf0a9f9fea306a9a34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3341 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 CsiLX? diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/platformio_install.png b/buildroot/share/vscode/AutoBuildMarlin/resources/platformio_install.png deleted file mode 100644 index e1ff7fd3b352ae6d3963148cea6d5e62f36e6c86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25656 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 diff --git a/buildroot/share/vscode/AutoBuildMarlin/resources/view_command_palette.png b/buildroot/share/vscode/AutoBuildMarlin/resources/view_command_palette.png deleted file mode 100644 index 6fa3e9b016298c54e73bad997859c9adc5139058..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10602 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