add SHT3X support / new smaller SHT2X (V2)
authorTobias <tm@tm3d.de>
Thu, 23 Feb 2017 08:15:27 +0000 (09:15 +0100)
committerTobias <tm@tm3d.de>
Thu, 23 Feb 2017 08:15:27 +0000 (09:15 +0100)
17 files changed:
DS18B20_VOC_DS2438_SHT/DS18B20_DS2438.c
DS18B20_VOC_DS2438_SHT/DS18B20_VOC_DS2438_SHT.cproj
DS18B20_VOC_DS2438_SHT/Makefile
DS2438_SHT2X/DS2438_SHT2X.c
DS2438_SHT2X/DS2438_SHT2X.cproj
DS2438_SHT2X/Makefile
DS2438_SHT3X/DS2438_SHT3X.atsln [new file with mode: 0644]
DS2438_SHT3X/DS2438_SHT3X.c [new file with mode: 0644]
DS2438_SHT3X/DS2438_SHT3X.cproj [new file with mode: 0644]
DS2438_SHT3X/Makefile [new file with mode: 0644]
common/I2C/CDM7160.c
common/I2C/SHT2xV2.c [new file with mode: 0644]
common/I2C/SHT2xV2.h [new file with mode: 0644]
common/I2C/SHT3x.c [new file with mode: 0644]
common/I2C/SHT3x.h [new file with mode: 0644]
programmer/flash/avrdude.conf
programmer/flash/avrdude.exe

index f097198..a85c988 100644 (file)
@@ -41,7 +41,7 @@
 #include <avr/pgmspace.h>\r
 #include "../common/I2C/USI_TWI_Master.h"\r
 #include "../common/I2C/MAX1164x.h"\r
-#include "../common/I2C/SHT2x.h"\r
+#include "../common/I2C/SHT2xV2.h"\r
 #include "../common/calibr.h"\r
 \r
 extern void OWINIT(void);\r
@@ -51,7 +51,7 @@ extern void EXTERN_SLEEP(void);
 \r
 volatile uint8_t owid1[8]={0x28, 0xA3, 0xD9, 0x84, 0x00, 0x16, 0x05, 0x18};/**/\r
 volatile uint8_t owid2[8]={0x26, 0xA3, 0xD9, 0x84, 0x00, 0x16, 0x05, 0x67};/**/\r
-volatile uint8_t config_info1[26]={0x08,0x01, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x02,17,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};      \r
+volatile uint8_t config_info1[26]={0x08,18, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x02,17,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};        \r
 volatile uint8_t config_info2[26]={0x01,0x06, 0x05,0x08, 0x04,0x07, 11,0x08, 0x02,0x07,0x00,0x07,17,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};        \r
        \r
 #if (owid>128) \r
@@ -276,9 +276,8 @@ int main(void){
 \r
        USI_TWI_Master_Initialise();\r
        \r
-       SHT2x_SoftReset();\r
-       SHT2x_ReadUserRegister(userRegister);\r
-       SHT2x_WriteUserRegister(userRegister); //write changed user reg\r
+       initSHT2x();\r
+       _delay_ms(100);\r
        MAX1164x_config(MAX1164x_S_SEL2|MAX1164x_S_SEL0,CH0_M);//#define MAX1164x_C_CS0\r
        _delay_ms(30); //Internal Referenz start\r
        //2970 -> 1,5V  \r
@@ -334,29 +333,24 @@ int main(void){
                                pack2.r_day_max=0;\r
                        }\r
                        if (startup!=0) startup--;\r
-                       SHT2x_MeasurePoll(HUMIDITY, &sRH);\r
-                       // --- measure temperature with "Polling Mode" (no hold master) ---\r
-                       SHT2x_MeasurePoll(TEMP, &sT);\r
-                       //-- calculate humidity and temperature --\r
-                       temperatureC = SHT2x_CalcTemperatureC(sT);\r
-                       humidityRH = SHT2x_CalcRH(sRH);\r
+                       getSHT2xHumTemp(&temperatureC,&humidityRH);\r
                        ip=interp(temperatureC,humidityRH);\r
                        pack2.ip=ip*1000;\r
-                       humidityRH=calibr_hum(temperatureC,-0.2,humidityRH)*10.0;\r
+                       double RH=calibr_hum(temperatureC,-0.2,humidityRH)*10.0;\r
                        //humidityRH=humidityRH*10.0;\r
-                       temperatureC =temperatureC *10.0-2;\r
+                       double TC =temperatureC *10.0-2;\r
 \r
 \r
                        if (testSW()) {\r
-                                am2302_hum= humidityRH*10.0;\r
-                                am2302_temp=temperatureC*25.6;\r
+                                am2302_hum=RH*10.0;\r
+                                am2302_temp=TC*25.6;\r
                                 //am2302_temp=am2302_temp-45;\r
                                 config_info2[5]=8;     \r
                        }else{\r
-                               hhum=(1.0546-0.000216*temperatureC)*(humidityRH);\r
+                               hhum=(1.0546-0.000216*TC)*(RH);\r
                                //am2302_hum=0.318*hhum +76.0;\r
                                am2302_hum=0.31*hhum +80;\r
-                               am2302_temp=temperatureC*25.6;\r
+                               am2302_temp=TC*25.6;\r
                                config_info2[5]=7;\r
                        }\r
                        //PORTB&=~(1<<PINB1);\r
@@ -410,9 +404,8 @@ int main(void){
                                        pack2.r_day_max=l*100;\r
                                }\r
                        } else if (l<R0) l=R0; //negative Werte am Anfang verhintern\r
-                       l=R0/l;\r
-                       l=log(l);\r
-                       l=l*160*4; //fuer DS18B20\r
+                       l=exp((1-(l/R0))*6.05);// exp((1-($val)/55)*5.75);  (5.75 geht über 125 6.05 geht bis 240... mittlere Linie im Datenblatt)\r
+                       l=l*8; //fuer DS18B20\r
                        wdcounter=0;\r
                        \r
                }\r
index 59f0489..be2930f 100644 (file)
     <eraseonlaunchrule>1</eraseonlaunchrule>\r
     <AsfFrameworkConfig>\r
       <framework-data>\r
-        <options />\r
-        <configurations />\r
-        <files />\r
-        <documentation help="" />\r
-        <offline-documentation help="" />\r
-        <dependencies>\r
-          <content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.22.0" />\r
-        </dependencies>\r
-      </framework-data>\r
+  <options />\r
+  <configurations />\r
+  <files />\r
+  <documentation help="" />\r
+  <offline-documentation help="" />\r
+  <dependencies>\r
+    <content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.28.1" />\r
+  </dependencies>\r
+</framework-data>\r
     </AsfFrameworkConfig>\r
     <avrtool>com.atmel.avrdbg.tool.atmelice</avrtool>\r
     <com_atmel_avrdbg_tool_atmelice>\r
   <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">\r
     <ToolchainSettings>\r
       <AvrGcc>\r
-  <avrgcc.common.Device>-mmcu=attiny84a -B "%24(PackRepoDir)\atmel\ATtiny_DFP\1.0.68\gcc\dev\attiny84a"</avrgcc.common.Device>\r
-  <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>\r
-  <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>\r
-  <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>\r
-  <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>\r
-  <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>\r
-  <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>\r
-  <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>\r
-  <avrgcc.compiler.directories.IncludePaths>\r
-    <ListValues>\r
-      <Value>%24(PackRepoDir)\atmel\ATtiny_DFP\1.0.68\include</Value>\r
-    </ListValues>\r
-  </avrgcc.compiler.directories.IncludePaths>\r
-  <avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>\r
-  <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>\r
-  <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>\r
-  <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>\r
-  <avrgcc.linker.libraries.Libraries>\r
-    <ListValues>\r
-      <Value>libm</Value>\r
-    </ListValues>\r
-  </avrgcc.linker.libraries.Libraries>\r
-  <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>\r
-</AvrGcc>\r
+        <avrgcc.common.Device>-mmcu=attiny84a -B "%24(PackRepoDir)\atmel\ATtiny_DFP\1.0.68\gcc\dev\attiny84a"</avrgcc.common.Device>\r
+        <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>\r
+        <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>\r
+        <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>\r
+        <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>\r
+        <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>\r
+        <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>\r
+        <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>\r
+        <avrgcc.compiler.directories.IncludePaths>\r
+          <ListValues>\r
+            <Value>%24(PackRepoDir)\atmel\ATtiny_DFP\1.0.68\include</Value>\r
+          </ListValues>\r
+        </avrgcc.compiler.directories.IncludePaths>\r
+        <avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>\r
+        <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>\r
+        <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>\r
+        <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>\r
+        <avrgcc.linker.libraries.Libraries>\r
+          <ListValues>\r
+            <Value>libm</Value>\r
+          </ListValues>\r
+        </avrgcc.linker.libraries.Libraries>\r
+        <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>\r
+      </AvrGcc>\r
     </ToolchainSettings>\r
   </PropertyGroup>\r
   <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">\r
       <SubType>compile</SubType>\r
       <Link>calibr.c</Link>\r
     </Compile>\r
-    <Compile Include="..\common\I2C\SHT2x.c">\r
-      <SubType>compile</SubType>\r
-      <Link>SHT2x.c</Link>\r
-    </Compile>\r
     <Compile Include="..\common\I2C\MAX1164x.c">\r
       <SubType>compile</SubType>\r
       <Link>MAX1164x.c</Link>\r
     </Compile>\r
+    <Compile Include="..\common\I2C\SHT2xV2.c">\r
+      <SubType>compile</SubType>\r
+      <Link>SHT2xV2.c</Link>\r
+    </Compile>\r
     <Compile Include="..\common\I2C\USI_TWI_Master.c">\r
       <SubType>compile</SubType>\r
       <Link>USI_TWI_Master.c</Link>\r
index a74fade..18ffb2e 100644 (file)
@@ -8,7 +8,7 @@
 MCU = attiny84
 FORMAT = ihex
 TARGET =DS18B20_VOC_DS2438_SHT
-SRC = ../common/calibr.c ../common/I2C/SHT2x.c ../common/I2C/MAX1164x.c ../common/I2C/USI_TWI_Master.c DS18B20_DS2438.c
+SRC = ../common/calibr.c ../common/I2C/MAX1164x.c ../common/I2C/SHT2xV2.c ../common/I2C/USI_TWI_Master.c DS18B20_DS2438.c
 ASRC = ../common/OWDS18B20_DS2438.S
 
 # Name of this Makefile (used for "make depend").
index eb182ef..632a112 100644 (file)
@@ -39,8 +39,7 @@
 #include <avr/sleep.h>\r
 #include <avr/pgmspace.h>\r
 #include "../common/I2C/USI_TWI_Master.h"\r
-#include "../common/I2C/MAX44009.h"\r
-#include "../common/I2C/SHT2x.h"\r
+#include "../common/I2C/SHT2xV2.h"\r
 #include "../common/calibr.h"\r
 \r
 extern void OWINIT();\r
@@ -86,8 +85,7 @@ volatile int16_t am2302_temp;
 volatile uint16_t am2302_hum;\r
 \r
 uint8_t userRegister[1];\r
-int16_t sRH,sT;\r
-volatile double temperatureC,humidityRH;\r
+double temperatureC,humidityRH;\r
 volatile double l;\r
 \r
 #if  defined(__AVR_ATtiny24__)||defined(__AVR_ATtiny44__)  || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__)  || defined(__AVR_ATtiny84A__)\r
@@ -150,47 +148,31 @@ int main(void){
     for(i=0;i<64;i++) pack.bytes[i]=0;\r
        MCUSR=0;\r
        USI_TWI_Master_Initialise();\r
-       SHT2x_SoftReset();\r
-       SHT2x_ReadUserRegister(userRegister);\r
-       //(userRegister & ~SHT2x_RES_MASK) | SHT2x_RES_10_13BIT;\r
-       SHT2x_WriteUserRegister(userRegister); //write changed user reg\r
-       // --- measure humidity with "Hold Master Mode (HM)" ---\r
-       SHT2x_MeasurePoll(HUMIDITY, &sRH);\r
-       // --- measure temperature with "Polling Mode" (no hold master) ---\r
-       SHT2x_MeasurePoll(TEMP, &sT);\r
-       //-- calculate humidity and temperature --\r
-       temperatureC = SHT2x_CalcTemperatureC(sT);\r
-       humidityRH = SHT2x_CalcRH(sRH);\r
-       \r
+       initSHT2x();\r
+       _delay_ms(100);\r
        sei();\r
        \r
-        while(1)   {\r
+        while(1)   { \r
                 if (gcontrol) {\r
                         wdcounter=3;\r
                         gcontrol=0;\r
                 }\r
                 if (wdcounter>2) {\r
-                        //PORTB|=(1<<PINB1); //Dauer 440ms\r
-                        SHT2x_MeasurePoll(HUMIDITY, &sRH);\r
-                        // --- measure temperature with "Polling Mode" (no hold master) ---\r
-                        SHT2x_MeasurePoll(TEMP, &sT);\r
-                        //-- calculate humidity and temperature --\r
-                        temperatureC = SHT2x_CalcTemperatureC(sT);\r
-                        humidityRH = calibr_hum(temperatureC,-0.2,SHT2x_CalcRH(sRH))*10.0;\r
-                        temperatureC-=0.2;\r
-                        temperatureC*=10.0;\r
+                        getSHT2xHumTemp(&temperatureC,&humidityRH);\r
+                        double RH = humidityRH*10.0;//calibr_hum(temperatureC,-0.2,humidityRH)*10.0;\r
+                        double T=temperatureC;//-0.2;\r
+                        T*=10.0;\r
                         if (testSW()) {\r
-                                am2302_hum= humidityRH;\r
-                                am2302_temp=temperatureC*25.6;\r
-                                //am2302_temp=am2302_temp-45;\r
+                                am2302_hum= RH;\r
+                                am2302_temp=T*25.6;\r
                                 config_info[5]=12;     \r
                                 \r
                         }else{\r
                                 \r
-                               double hhum=(1.0546-0.000216*temperatureC)*(humidityRH);\r
+                               double hhum=(1.0546-0.000216*T)*(RH);\r
                                //am2302_hum=0.318*hhum +76.0;\r
                                am2302_hum=0.31*hhum +80;\r
-                               am2302_temp=temperatureC*25.6;\r
+                               am2302_temp=T*25.6;\r
                                //am2302_temp=am2302_temp-45;\r
                                config_info[5]=7;\r
                         }\r
index 8142d95..34d756a 100644 (file)
     <BootSegment>2</BootSegment>\r
     <eraseonlaunchrule>1</eraseonlaunchrule>\r
     <AsfFrameworkConfig>\r
-      <framework-data xmlns="">\r
+      <framework-data>\r
         <options />\r
         <configurations />\r
         <files />\r
         <documentation help="" />\r
         <offline-documentation help="" />\r
         <dependencies>\r
-          <content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.26.0" />\r
+          <content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.28.1" />\r
         </dependencies>\r
       </framework-data>\r
     </AsfFrameworkConfig>\r
       <SubType>compile</SubType>\r
       <Link>calibr.c</Link>\r
     </Compile>\r
-    <Compile Include="..\common\I2C\SHT2x.c">\r
+    <Compile Include="..\common\I2C\SHT2xV2.c">\r
       <SubType>compile</SubType>\r
-      <Link>SHT2x.c</Link>\r
+      <Link>SHT2xV2.c</Link>\r
     </Compile>\r
     <Compile Include="..\common\I2C\USI_TWI_Master.c">\r
       <SubType>compile</SubType>\r
index 89a88a8..f7edcf0 100644 (file)
@@ -8,7 +8,7 @@
 MCU = attiny84
 FORMAT = ihex
 TARGET =DS2438_SHT2X
-SRC = ../common/calibr.c ../common/I2C/SHT2x.c ../common/I2C/USI_TWI_Master.c DS2438_SHT2X.c
+SRC = ../common/calibr.c ../common/I2C/SHT2xV2.c ../common/I2C/USI_TWI_Master.c DS2438_SHT2X.c
 ASRC = ../common/OWDS2438.S
 
 # Name of this Makefile (used for "make depend").
diff --git a/DS2438_SHT3X/DS2438_SHT3X.atsln b/DS2438_SHT3X/DS2438_SHT3X.atsln
new file mode 100644 (file)
index 0000000..d6bf1ee
--- /dev/null
@@ -0,0 +1,20 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 11.00\r
+# Atmel Studio Solution File, Format Version 11.00\r
+Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "DS2438_SHT3X", "DS2438_SHT3X.cproj", "{91468D4F-8AE2-4C59-8A35-549C49E00934}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|AVR = Debug|AVR\r
+               Release|AVR = Release|AVR\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {91468D4F-8AE2-4C59-8A35-549C49E00934}.Debug|AVR.ActiveCfg = Debug|AVR\r
+               {91468D4F-8AE2-4C59-8A35-549C49E00934}.Debug|AVR.Build.0 = Debug|AVR\r
+               {91468D4F-8AE2-4C59-8A35-549C49E00934}.Release|AVR.ActiveCfg = Release|AVR\r
+               {91468D4F-8AE2-4C59-8A35-549C49E00934}.Release|AVR.Build.0 = Release|AVR\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/DS2438_SHT3X/DS2438_SHT3X.c b/DS2438_SHT3X/DS2438_SHT3X.c
new file mode 100644 (file)
index 0000000..d283508
--- /dev/null
@@ -0,0 +1,200 @@
+// Copyright (c) 2017, Tobias Mueller tm(at)tm3d.de\r
+// All rights reserved.\r
+//\r
+// Redistribution and use in source and binary forms, with or without\r
+// modification, are permitted provided that the following conditions are\r
+// met:\r
+//\r
+//  * Redistributions of source code must retain the above copyright\r
+//    notice, this list of conditions and the following disclaimer.\r
+//  * Redistributions in binary form must reproduce the above copyright\r
+//    notice, this list of conditions and the following disclaimer in the\r
+//    documentation and/or other materials provided with the\r
+//    distribution.\r
+//  * All advertising materials mentioning features or use of this\r
+//    software must display the following acknowledgement: This product\r
+//    includes software developed by tm3d.de and its contributors.\r
+//  * Neither the name of tm3d.de nor the names of its contributors may\r
+//    be used to endorse or promote products derived from this software\r
+//    without specific prior written permission.\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+\r
+\r
+#define F_CPU 8000000UL\r
+#include <avr/io.h>\r
+#include <avr/interrupt.h>\r
+#include <util/delay.h>\r
+#include <avr/wdt.h>\r
+#include <avr/sleep.h>\r
+#include <avr/pgmspace.h>\r
+#include "../common/I2C/USI_TWI_Master.h"\r
+#include "../common/I2C/SHT3x.h"\r
+#include "../common/calibr.h"\r
+\r
+extern void OWINIT();\r
+extern void EXTERN_SLEEP();\r
+\r
+uint8_t owid[8]={0x26, 0xA2, 0xD9, 0x84, 0x00, 0x00, 0x05, 0x16};/**/\r
+uint8_t config_info[26]={0x01,0x06, 0x05,0x08, 0x04,0x07, 0x00,0x00, 0x02,21,0x00,21,0x00,0x00,0x00,0x00, 0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};\r
+       \r
+\r
+extern uint8_t mode;\r
+extern uint8_t gcontrol;\r
+extern uint8_t reset_indicator;\r
+extern uint8_t alarmflag;\r
+\r
+volatile uint8_t wdcounter=5;\r
+\r
+\r
+typedef union {\r
+\r
+       volatile uint8_t bytes[64];\r
+       struct {\r
+               uint8_t status;  //1\r
+               int16_t temp;  //2\r
+               uint16_t voltage;  //4\r
+               uint16_t current;  //6\r
+               uint8_t threshold; //8\r
+               \r
+               uint8_t page1[8]; //9\r
+               uint8_t page2[8]; //17\r
+               uint8_t page3[8]; //25\r
+               uint8_t page4[8];  //33\r
+               uint8_t page5[8];  //41\r
+               uint8_t page6[8];  //49\r
+               uint8_t page7[8];  //57\r
+               //uint8_t crc;  //65\r
+       };\r
+} pack_t;\r
+volatile pack_t pack;\r
+\r
+\r
+\r
+volatile int16_t am2302_temp;\r
+volatile uint16_t am2302_hum;\r
+\r
+uint8_t userRegister[1];\r
+int16_t sRH,sT;\r
+ double temperatureC,humidityRH;\r
+volatile double l;\r
+\r
+#if  defined(__AVR_ATtiny24__)||defined(__AVR_ATtiny44__)  || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny24A__)||defined(__AVR_ATtiny44A__)  || defined(__AVR_ATtiny84A__)\r
+ISR(WATCHDOG_vect) {\r
+#else\r
+ISR(WDT_vect) {\r
+#endif \r
+       wdcounter++;\r
+       if (reset_indicator==1) reset_indicator++;\r
+       else if (reset_indicator==2) mode=0;\r
+\r
+\r
+}\r
+\r
+int testSW(void) {\r
+       uint8_t r;\r
+       DDRB&=~(1<<PORTB0);  //Eingang\r
+        __asm__ __volatile__ ("nop"); \r
+        PORTB|=(1<<PORTB0); //Pullup\r
+        __asm__ __volatile__ ("nop"); \r
+        __asm__ __volatile__ ("nop"); \r
+        __asm__ __volatile__ ("nop"); \r
+        __asm__ __volatile__ ("nop"); \r
+        __asm__ __volatile__ ("nop"); \r
+        r=PINB&(1<<PORTB0);\r
+        __asm__ __volatile__ ("nop"); \r
+        PORTB&=~(1<<PORTB0); \r
+        __asm__ __volatile__ ("nop"); \r
+       DDRB|=(1<<PORTB0);  //Eingang\r
+       return (r==0);\r
+        \r
+        \r
+}\r
+\r
+int main(void){\r
+     PRR|=(1<<PRADC);  // adc for save Power\r
+       PORTA=0xFF;\r
+       PORTB=0xFF-(1<<PORTB0); //Schalter kann gegen Masse sein und zieht dann immer Strom\r
+       DDRB|=(1<<PORTB0); //Als Ausgang und 0\r
+       \r
+       \r
+       OWINIT();\r
+\r
+       ACSR|=(1<<ACD);  //Disable Comparator\r
+       ADCSRB|=(1<<ACME); //Disable Analog multiplexer\r
+       MCUCR &=~(1<<PUD); //All Pins Pullup...\r
+       MCUCR |=(1<<BODS);\r
+\r
+       \r
+       WDTCSR |= ((1<<WDCE) );   // Enable the WD Change Bit//| (1<<WDE)\r
+       WDTCSR |=   (1<<WDIE) |              // Enable WDT Interrupt\r
+       (1<<WDP3) | (1<<WDP0);   // Set Timeout to ~8 seconds\r
+        if (testSW()) {\r
+               config_info[5]=8;\r
+       }else{\r
+               config_info[5]=7;\r
+        }\r
+       \r
+    uint8_t i;\r
+    for(i=0;i<64;i++) pack.bytes[i]=0;\r
+       MCUSR=0;\r
+       USI_TWI_Master_Initialise();\r
+\r
+       \r
+       \r
+       initSHT3x(0);\r
+       _delay_ms(100);\r
+       getSHT3xHumTemp(0,&temperatureC,&humidityRH);\r
+       \r
+       sei();\r
+       \r
+        while(1)   {\r
+                if (gcontrol) {\r
+                        wdcounter=3;\r
+                        gcontrol=0;\r
+                }\r
+                if (wdcounter>2) {\r
+                         getSHT3xHumTemp(0,&temperatureC,&humidityRH);\r
+                         double T=temperatureC*10.0;\r
+                         double RH=humidityRH*10.0;\r
+                        if (testSW()) {\r
+                                am2302_hum= RH;\r
+                                am2302_temp=T*25.6;\r
+                                //am2302_temp=am2302_temp-45;\r
+                                config_info[5]=12;     \r
+                                \r
+                        }else{\r
+                                \r
+                               double hhum=(1.0546-0.000216*T)*(RH);\r
+                               //am2302_hum=0.318*hhum +76.0;\r
+                               am2302_hum=0.31*hhum +80;\r
+                               am2302_temp=T*25.6;\r
+                               //am2302_temp=am2302_temp-45;\r
+                               config_info[5]=7;\r
+                        }\r
+                        //PORTB&=~(1<<PINB1);\r
+                        wdcounter=0;\r
+                }\r
+\r
+               if (((TIMSK0 & (1<<TOIE0))==0)&& (mode==0))       {\r
+                       MCUCR|=(1<<SE)|(1<<SM1);\r
+                       MCUCR&=~(1<<ISC01);\r
+               } else {\r
+                       MCUCR|=(1<<SE);\r
+                       MCUCR&=~(1<<SM1);\r
+               }\r
+               asm("SLEEP");\r
+       }\r
+\r
+\r
+}
\ No newline at end of file
diff --git a/DS2438_SHT3X/DS2438_SHT3X.cproj b/DS2438_SHT3X/DS2438_SHT3X.cproj
new file mode 100644 (file)
index 0000000..5fc62de
--- /dev/null
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <PropertyGroup>\r
+    <SchemaVersion>2.0</SchemaVersion>\r
+    <ProjectVersion>7.0</ProjectVersion>\r
+    <ToolchainName>com.Atmel.AVRGCC8.C</ToolchainName>\r
+    <ProjectGuid>{91468d4f-8ae2-4c59-8a35-549c49e00934}</ProjectGuid>\r
+    <avrdevice>ATtiny84A</avrdevice>\r
+    <avrdeviceseries>none</avrdeviceseries>\r
+    <OutputType>Executable</OutputType>\r
+    <Language>C</Language>\r
+    <OutputFileName>$(MSBuildProjectName)</OutputFileName>\r
+    <OutputFileExtension>.elf</OutputFileExtension>\r
+    <OutputDirectory>$(MSBuildProjectDirectory)\$(Configuration)</OutputDirectory>\r
+    <AssemblyName>DS2438_SHT3X</AssemblyName>\r
+    <Name>DS2438_SHT3X</Name>\r
+    <RootNamespace>DS2438_SHT3X</RootNamespace>\r
+    <ToolchainFlavour>Native</ToolchainFlavour>\r
+    <KeepTimersRunning>true</KeepTimersRunning>\r
+    <OverrideVtor>false</OverrideVtor>\r
+    <CacheFlash>true</CacheFlash>\r
+    <ProgFlashFromRam>true</ProgFlashFromRam>\r
+    <RamSnippetAddress>0x20000000</RamSnippetAddress>\r
+    <UncachedRange />\r
+    <preserveEEPROM>true</preserveEEPROM>\r
+    <OverrideVtorValue>exception_table</OverrideVtorValue>\r
+    <BootSegment>2</BootSegment>\r
+    <eraseonlaunchrule>1</eraseonlaunchrule>\r
+    <AsfFrameworkConfig>\r
+      <framework-data>\r
+  <options />\r
+  <configurations />\r
+  <files />\r
+  <documentation help="" />\r
+  <offline-documentation help="" />\r
+  <dependencies>\r
+    <content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.28.1" />\r
+  </dependencies>\r
+</framework-data>\r
+    </AsfFrameworkConfig>\r
+    <avrtool>com.atmel.avrdbg.tool.atmelice</avrtool>\r
+    <com_atmel_avrdbg_tool_atmelice>\r
+      <ToolOptions>\r
+        <InterfaceProperties>\r
+        </InterfaceProperties>\r
+        <InterfaceName>debugWIRE</InterfaceName>\r
+      </ToolOptions>\r
+      <ToolType>com.atmel.avrdbg.tool.atmelice</ToolType>\r
+      <ToolNumber>J41800000789</ToolNumber>\r
+      <ToolName>Atmel-ICE</ToolName>\r
+    </com_atmel_avrdbg_tool_atmelice>\r
+    <avrtoolinterface>debugWIRE</avrtoolinterface>\r
+    <ExternalProgrammingToolCommand />\r
+    <avrtoolserialnumber>J41800000789</avrtoolserialnumber>\r
+    <avrdeviceexpectedsignature>0x1E930C</avrdeviceexpectedsignature>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">\r
+    <ToolchainSettings>\r
+      <AvrGcc>\r
+        <avrgcc.common.Device>-mmcu=attiny84a -B "%24(PackRepoDir)\atmel\ATtiny_DFP\1.0.68\gcc\dev\attiny84a"</avrgcc.common.Device>\r
+        <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>\r
+        <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>\r
+        <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>\r
+        <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>\r
+        <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>\r
+        <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>\r
+        <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>\r
+        <avrgcc.compiler.symbols.DefSymbols>\r
+          <ListValues>\r
+            <Value>DEBUG</Value>\r
+          </ListValues>\r
+        </avrgcc.compiler.symbols.DefSymbols>\r
+        <avrgcc.compiler.directories.IncludePaths>\r
+          <ListValues>\r
+            <Value>%24(PackRepoDir)\atmel\ATtiny_DFP\1.0.68\include</Value>\r
+          </ListValues>\r
+        </avrgcc.compiler.directories.IncludePaths>\r
+        <avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>\r
+        <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>\r
+        <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>\r
+        <avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>\r
+        <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>\r
+        <avrgcc.linker.libraries.Libraries>\r
+          <ListValues>\r
+            <Value>libm</Value>\r
+          </ListValues>\r
+        </avrgcc.linker.libraries.Libraries>\r
+        <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>\r
+      </AvrGcc>\r
+    </ToolchainSettings>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">\r
+    <ToolchainSettings>\r
+      <AvrGcc>\r
+        <avrgcc.common.Device>-mmcu=attiny84a -B "%24(PackRepoDir)\atmel\ATtiny_DFP\1.0.68\gcc\dev\attiny84a"</avrgcc.common.Device>\r
+        <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>\r
+        <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>\r
+        <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>\r
+        <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>\r
+        <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>\r
+        <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>\r
+        <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>\r
+        <avrgcc.compiler.symbols.DefSymbols>\r
+          <ListValues>\r
+            <Value>DEBUG</Value>\r
+          </ListValues>\r
+        </avrgcc.compiler.symbols.DefSymbols>\r
+        <avrgcc.compiler.directories.IncludePaths>\r
+          <ListValues>\r
+            <Value>%24(PackRepoDir)\atmel\ATtiny_DFP\1.0.68\include</Value>\r
+          </ListValues>\r
+        </avrgcc.compiler.directories.IncludePaths>\r
+        <avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>\r
+        <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>\r
+        <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>\r
+        <avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>\r
+        <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>\r
+        <avrgcc.linker.libraries.Libraries>\r
+          <ListValues>\r
+            <Value>libm</Value>\r
+          </ListValues>\r
+        </avrgcc.linker.libraries.Libraries>\r
+        <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>\r
+      </AvrGcc>\r
+    </ToolchainSettings>\r
+  </PropertyGroup>\r
+  <ItemGroup>\r
+    <Compile Include="..\common\calibr.c">\r
+      <SubType>compile</SubType>\r
+      <Link>calibr.c</Link>\r
+    </Compile>\r
+    <Compile Include="..\common\I2C\SHT3X.c">\r
+      <SubType>compile</SubType>\r
+      <Link>SHT3X.c</Link>\r
+    </Compile>\r
+    <Compile Include="..\common\I2C\USI_TWI_Master.c">\r
+      <SubType>compile</SubType>\r
+      <Link>USI_TWI_Master.c</Link>\r
+    </Compile>\r
+    <Compile Include="..\common\OWDS2438.S">\r
+      <SubType>compile</SubType>\r
+      <Link>OWDS2438.S</Link>\r
+    </Compile>\r
+    <Compile Include="DS2438_SHT3X.c">\r
+      <SubType>compile</SubType>\r
+    </Compile>\r
+  </ItemGroup>\r
+  <Import Project="$(AVRSTUDIO_EXE_PATH)\\Vs\\Compiler.targets" />\r
+</Project>
\ No newline at end of file
diff --git a/DS2438_SHT3X/Makefile b/DS2438_SHT3X/Makefile
new file mode 100644 (file)
index 0000000..1a7fb7a
--- /dev/null
@@ -0,0 +1,202 @@
+# Hey Emacs, this is a -*- makefile -*-
+
+# AVR-GCC Makefile template, derived from the WinAVR template (which
+# is public domain), believed to be neutral to any flavor of "make"
+# (GNU make, BSD make, SysV make)
+
+
+MCU = attiny84
+FORMAT = ihex
+TARGET =DS2438_SHT3X
+SRC = ../common/calibr.c ../common/I2C/SHT3X.c ../common/I2C/USI_TWI_Master.c DS2438_SHT3X.c
+ASRC = ../common/OWDS2438.S
+
+# Name of this Makefile (used for "make depend").
+MAKEFILE = Makefile
+
+
+CFLAGS = -x c -funsigned-char -funsigned-bitfields -I. -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -Wall   -std=gnu99 -MD -MP 
+
+#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs 
+
+
+#Additional libraries.
+
+# Minimalistic printf version
+PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
+
+# Floating point printf version (requires MATH_LIB = -lm below)
+PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
+
+PRINTF_LIB = 
+
+# Minimalistic scanf version
+SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
+
+# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
+SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
+
+SCANF_LIB = 
+
+MATH_LIB = -lm
+
+# External memory options
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# used for variables (.data/.bss) and heap (malloc()).
+#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# only used for heap (malloc()).
+#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
+
+EXTMEMOPTS =
+
+#LDMAP = $(LDFLAGS) -Wl,-Map=$(TARGET).map,--cref
+#LDFLAGS = $(EXTMEMOPTS) $(LDMAP) $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
+LDFLAGS = -Wl,--start-group -Wl,-lm  -Wl,--end-group -Wl,--gc-sections -mmcu=$(MCU)
+
+# Programming support using avrdude. Settings and variables.
+
+#AVRDUDE_PROGRAMMER = stk500
+#AVRDUDE_PORT = /dev/term/a
+
+#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
+#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
+
+
+# Uncomment the following if you want avrdude's erase cycle counter.
+# Note that this counter needs to be initialized first using -Yn,
+# see avrdude manual.
+#AVRDUDE_ERASE_COUNTER = -y
+
+# Uncomment the following if you do /not/ wish a verification to be
+# performed after programming the device.
+#AVRDUDE_NO_VERIFY = -V
+
+# Increase verbosity level.  Please use this when submitting bug
+# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> 
+# to submit bug reports.
+#AVRDUDE_VERBOSE = -v -v
+
+#AVRDUDE_BASIC = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
+#AVRDUDE_FLAGS = $(AVRDUDE_BASIC) $(AVRDUDE_NO_VERIFY) $(AVRDUDE_VERBOSE) $(AVRDUDE_ERASE_COUNTER)
+
+
+CC = avr-gcc
+OBJCOPY = avr-objcopy
+OBJDUMP = avr-objdump
+SIZE = avr-size
+NM = avr-nm
+#AVRDUDE = avrdude
+REMOVE = rm -f
+MV = mv -f
+
+# Define all object files.
+OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) 
+
+# Define all listing files.
+LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
+
+# Combine all necessary flags and optional flags.
+# Add target processor to flags.
+ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
+ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
+
+
+# Default target.
+all: build
+
+build: elf hex eep
+
+elf: $(TARGET).elf
+hex: $(TARGET).hex
+#eep: $(TARGET).eep
+lss: $(TARGET).lss 
+sym: $(TARGET).sym
+
+
+# Program the device.  
+program: $(TARGET).hex $(TARGET).eep
+       $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
+
+
+
+
+# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
+COFFCONVERT=$(OBJCOPY) --debugging \
+--change-section-address .data-0x800000 \
+--change-section-address .bss-0x800000 \
+--change-section-address .noinit-0x800000 \
+--change-section-address .eeprom-0x810000 
+
+
+coff: $(TARGET).elf
+       $(COFFCONVERT) -O coff-avr $(TARGET).elf $(TARGET).cof
+
+
+extcoff: $(TARGET).elf
+       $(COFFCONVERT) -O coff-ext-avr $(TARGET).elf $(TARGET).cof
+
+
+.SUFFIXES: .elf .hex .eep .lss .sym
+
+.elf.hex:
+       $(OBJCOPY) -O $(FORMAT) $< $@
+#      $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
+
+.elf.eep:
+       -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
+       --change-section-lma .eeprom=0 -O $(FORMAT) $< $@
+
+# Create extended listing file from ELF output file.
+.elf.lss:
+       $(OBJDUMP) -h -S $< > $@
+
+# Create a symbol table from ELF output file.
+.elf.sym:
+       $(NM) -n $< > $@
+
+
+
+# Link: create ELF output file from object files.
+$(TARGET).elf: $(OBJ)
+       $(CC)  $(OBJ) --output $@ $(LDFLAGS)
+
+
+# Compile: create object files from C source files.
+.c.o:
+       $(CC) -c $(ALL_CFLAGS) $< -o $@ 
+
+
+# Compile: create assembler files from C source files.
+.c.s:
+       $(CC) -S $(ALL_CFLAGS) $< -o $@
+
+
+# Assemble: create object files from assembler source files.
+.S.o:
+       $(CC) -c $(ALL_ASFLAGS) $< -o $@
+
+
+
+# Target: clean project.
+clean:
+       $(REMOVE) $(TARGET).hex $(TARGET).eep $(TARGET).cof $(TARGET).elf \
+       $(TARGET).map $(TARGET).sym $(TARGET).lss \
+       $(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d)
+
+depend:
+       if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \
+       then \
+               sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \
+                       $(MAKEFILE).$$$$ && \
+               $(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \
+       fi
+       echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \
+               >> $(MAKEFILE); \
+       $(CC) -M -mmcu=$(MCU) $(CDEFS) $(CINCS) $(SRC) $(ASRC) >> $(MAKEFILE)
+
+.PHONY:        all build elf hex eep lss sym program coff extcoff clean depend
+
+
index 65fc393..e82a138 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, Tobias Mueller tm(at)tm3d.de\r
+// Copyright (c) 2017, Tobias Mueller tm(at)tm3d.de\r
 // All rights reserved.\r
 //\r
 // Redistribution and use in source and binary forms, with or without\r
diff --git a/common/I2C/SHT2xV2.c b/common/I2C/SHT2xV2.c
new file mode 100644 (file)
index 0000000..130e85b
--- /dev/null
@@ -0,0 +1,105 @@
+// Copyright (c) 2017, Tobias Mueller tm(at)tm3d.de\r
+// All rights reserved.\r
+//\r
+// Redistribution and use in source and binary forms, with or without\r
+// modification, are permitted provided that the following conditions are\r
+// met:\r
+//\r
+//  * Redistributions of source code must retain the above copyright\r
+//    notice, this list of conditions and the following disclaimer.\r
+//  * Redistributions in binary form must reproduce the above copyright\r
+//    notice, this list of conditions and the following disclaimer in the\r
+//    documentation and/or other materials provided with the\r
+//    distribution.\r
+//  * All advertising materials mentioning features or use of this\r
+//    software must display the following acknowledgement: This product\r
+//    includes software developed by tm3d.de and its contributors.\r
+//  * Neither the name of tm3d.de nor the names of its contributors may\r
+//    be used to endorse or promote products derived from this software\r
+//    without specific prior written permission.\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+\r
+\r
+#define F_CPU 8000000UL\r
+#include <avr/io.h>\r
+#include <util/delay.h>\r
+#include "USI_TWI_Master.h"\r
+#include "SHT2xV2.h"\r
+\r
+uint8_t initSHT2x(){\r
+\r
+       I2c_StartCondition();\r
+       I2c_WriteByte(0b10000000);\r
+       I2c_WriteByte(0xFE);//Softreset \r
+       I2c_StopCondition();\r
+       //Default 12 Bit RH 14 Bit T\r
+       return 1;\r
+}\r
+\r
+uint8_t crcmove(uint8_t crc) {\r
+       uint8_t bit;\r
+       for(bit=8;bit>0;--bit) {\r
+               if (crc&0x80) crc=(crc<<1)^  0x131;\r
+               else crc=(crc<<1);\r
+       }\r
+       return crc;\r
+}\r
+\r
+uint8_t calcCRCSHT2x(uint8_t b1, uint8_t b2) {\r
+       uint8_t crc=0;\r
+       crc^=b1;\r
+       crc=crcmove(crc);\r
+       crc^=b2;\r
+       return crcmove(crc);\r
+       \r
+}\r
+\r
+\r
+\r
+uint8_t getSHT2xHumTemp(double *temp,double *hum) {\r
+       uint8_t ret=1;\r
+       I2c_StartCondition();\r
+       I2c_WriteByte(0b10000000);\r
+       I2c_WriteByte(0xF3); //No Hold Temp\r
+       _delay_us(20);\r
+       I2c_StopCondition();\r
+       _delay_ms(85);\r
+       I2c_StartCondition();\r
+       I2c_WriteByte (0b10000001);\r
+       uint8_t t1 =I2c_ReadByte(ACK);\r
+       uint8_t t2 =I2c_ReadByte(ACK);\r
+       uint8_t tc =I2c_ReadByte(NO_ACK);\r
+       I2c_StopCondition();\r
+\r
+       I2c_StartCondition();\r
+       I2c_WriteByte(0b10000000);\r
+       I2c_WriteByte(0xF5); //No Hold Hum\r
+       _delay_us(20);\r
+       I2c_StopCondition();\r
+       _delay_ms(29);\r
+       I2c_StartCondition();\r
+       I2c_WriteByte (0b10000001);\r
+       uint8_t f1 =I2c_ReadByte(ACK);\r
+       uint8_t f2 =I2c_ReadByte(ACK);\r
+       uint8_t fc =I2c_ReadByte(NO_ACK);\r
+       I2c_StopCondition();\r
+       if (calcCRCSHT2x(t1,t2)==tc)\r
+               *temp=-46.85 + 175.72/65536 *(double)(((uint16_t)t1<<8)|(t2&0xF8));\r
+       else ret=0;\r
+       if (calcCRCSHT2x(f1,f2)==fc)\r
+               *hum=-6.0+125.0/65536*(double)(((uint16_t)f1<<8)|(f2&0xF8));\r
+       else ret=0;\r
+       return ret;\r
+}\r
+\r
diff --git a/common/I2C/SHT2xV2.h b/common/I2C/SHT2xV2.h
new file mode 100644 (file)
index 0000000..4287934
--- /dev/null
@@ -0,0 +1,39 @@
+// Copyright (c) 2017, Tobias Mueller tm(at)tm3d.de\r
+// All rights reserved.\r
+//\r
+// Redistribution and use in source and binary forms, with or without\r
+// modification, are permitted provided that the following conditions are\r
+// met:\r
+//\r
+//  * Redistributions of source code must retain the above copyright\r
+//    notice, this list of conditions and the following disclaimer.\r
+//  * Redistributions in binary form must reproduce the above copyright\r
+//    notice, this list of conditions and the following disclaimer in the\r
+//    documentation and/or other materials provided with the\r
+//    distribution.\r
+//  * All advertising materials mentioning features or use of this\r
+//    software must display the following acknowledgement: This product\r
+//    includes software developed by tm3d.de and its contributors.\r
+//  * Neither the name of tm3d.de nor the names of its contributors may\r
+//    be used to endorse or promote products derived from this software\r
+//    without specific prior written permission.\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+\r
+\r
+#ifndef SHT2xV2_H\r
+#define SHT2xV2_H\r
+uint8_t initSHT2x();\r
+uint8_t getSHT2xHumTemp(double *temp,double *hum);\r
+\r
+#endif\r
diff --git a/common/I2C/SHT3x.c b/common/I2C/SHT3x.c
new file mode 100644 (file)
index 0000000..b20de79
--- /dev/null
@@ -0,0 +1,71 @@
+//==============================================================================\r
+// S E N S I R I O N AG, Laubisruetistr. 50, CH-8712 Staefa, Switzerland\r
+//==============================================================================\r
+// Project : SHT2x Sample Code (V1.2)\r
+// File : SHT2x.c\r
+// Author : MST\r
+// Controller: NEC V850/SG3 (uPD70F3740)\r
+// Compiler : IAR compiler for V850 (3.50A)\r
+// Brief : Sensor layer. Functions for sensor access\r
+//==============================================================================\r
+//---------- Includes ----------------------------------------------------------\r
+#define F_CPU 8000000UL\r
+#include <avr/io.h>\r
+#include <util/delay.h>\r
+#include "USI_TWI_Master.h"\r
+#include "SHT3x.h"\r
+\r
+uint8_t initSHT3x(uint8_t adrline){\r
+       /*I2c_StartCondition();\r
+       I2c_WriteByte(0b10001000|(adrline<<1));\r
+       I2c_WriteByte(0x27);\r
+       I2c_WriteByte(0x37);\r
+       I2c_StopCondition();*/\r
+       return 1;\r
+}\r
+\r
+uint8_t calcCRCSHT3x(uint8_t b1, uint8_t b2) {\r
+       uint8_t bit;\r
+       uint8_t crc=0xFF;\r
+       crc^=b1;\r
+       for(bit=8;bit>0;--bit) {\r
+               if (crc&0x80) crc=(crc<<1)^  0x131;\r
+               else crc=(crc<<1);\r
+       }\r
+       crc^=b2;\r
+       for(bit=8;bit>0;--bit) {\r
+               if (crc&0x80) crc=(crc<<1)^  0x131;\r
+               else crc=(crc<<1);\r
+       }\r
+       return crc;\r
+       \r
+}\r
+\r
+\r
+\r
+uint8_t getSHT3xHumTemp(uint8_t adrline,double *temp,double *hum) {\r
+       uint8_t ret=1;\r
+       I2c_StartCondition();\r
+       I2c_WriteByte(0b10001000|(adrline<<1));\r
+       I2c_WriteByte(0x24);\r
+       I2c_WriteByte(0x00); //NotClock Scr\r
+       I2c_StopCondition();\r
+       _delay_ms(16);\r
+       \r
+       I2c_StartCondition();\r
+       I2c_WriteByte (0b10001001|(adrline<<1));\r
+       volatile uint8_t t1 =I2c_ReadByte(ACK);\r
+       volatile uint8_t t2 =I2c_ReadByte(ACK);\r
+       volatile uint8_t tc =I2c_ReadByte(ACK);\r
+       volatile uint8_t f1 =I2c_ReadByte(ACK);\r
+       volatile uint8_t f2 =I2c_ReadByte(ACK);\r
+       volatile uint8_t fc =I2c_ReadByte(NO_ACK);\r
+       I2c_StopCondition();\r
+       if (calcCRCSHT3x(t1,t2)==tc)\r
+               *temp=175.0f*(double)(((uint16_t)t1<<8)|t2)/65535.0f-45.0f;\r
+       else ret=0;\r
+       if (calcCRCSHT3x(f1,f2)==fc)\r
+               *hum=100.0f*(double)(((uint16_t)f1<<8)|f2)/65535.0f;\r
+       else ret=0;\r
+       return ret;\r
+}\r
diff --git a/common/I2C/SHT3x.h b/common/I2C/SHT3x.h
new file mode 100644 (file)
index 0000000..9843d9f
--- /dev/null
@@ -0,0 +1,39 @@
+// Copyright (c) 2017, Tobias Mueller tm(at)tm3d.de\r
+// All rights reserved.\r
+//\r
+// Redistribution and use in source and binary forms, with or without\r
+// modification, are permitted provided that the following conditions are\r
+// met:\r
+//\r
+//  * Redistributions of source code must retain the above copyright\r
+//    notice, this list of conditions and the following disclaimer.\r
+//  * Redistributions in binary form must reproduce the above copyright\r
+//    notice, this list of conditions and the following disclaimer in the\r
+//    documentation and/or other materials provided with the\r
+//    distribution.\r
+//  * All advertising materials mentioning features or use of this\r
+//    software must display the following acknowledgement: This product\r
+//    includes software developed by tm3d.de and its contributors.\r
+//  * Neither the name of tm3d.de nor the names of its contributors may\r
+//    be used to endorse or promote products derived from this software\r
+//    without specific prior written permission.\r
+//\r
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+\r
+\r
+#ifndef SHT3x_H\r
+#define SHT3x_H\r
+uint8_t initSHT3x(uint8_t adrline);\r
+uint8_t getSHT3xHumTemp(uint8_t adrline,double *temp,double *hum);\r
+\r
+#endif\r
index 4ecdd78..6569357 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: avrdude.conf.in 1012 2011-09-15 14:57:51Z joerg_wunsch $ -*- text -*-
+# $Id: avrdude.conf.in 1371 2016-02-15 20:15:07Z joerg_wunsch $ -*- text -*-
 #
 # AVRDUDE Configuration File
 #
 # identifies which part AVRDUDE is going to be programming and must match
 # one of the parts' "id" parameter.
 #
+# DO NOT MODIFY THIS FILE.  Modifications will be overwritten the next
+# time a "make install" is run.  For user-specific additions, use the
+# "-C +filename" commandline option.
+#
 # Possible entry formats are:
 #
 #   programmer
+#       parent <id>                                 # optional parent
 #       id       = <id1> [, <id2> [, <id3>] ...] ;  # <idN> are quoted strings
 #       desc     = <description> ;                  # 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 | wiring; # programmer type
+#       type     = <type>;                          # programmer type, quoted string
+#                          # supported programmer types can be listed by "-c ?type"
+#       connection_type = parallel | serial | usb
 #       baudrate = <num> ;                          # baudrate for avr910-programmer
 #       vcc      = <num1> [, <num2> ... ] ;         # pin number(s)
+#       buff     = <num1> [, <num2> ... ] ;         # pin number(s)
 #       reset    = <num> ;                          # pin number
 #       sck      = <num> ;                          # pin number
 #       mosi     = <num> ;                          # pin number
 #       rdyled   = <num> ;                          # pin number
 #       pgmled   = <num> ;                          # pin number
 #       vfyled   = <num> ;                          # pin number
-#                      usbvid   = <hexnum>;                                                                                            # USB VID (Vendor ID)
-#       usbpid   = <hexnum>;                                                                                           #       USB PID (Product ID)
-#       usbdev   = <interface>;                                                                                        # USB interface or other device info 
-#       usbvendor = <vendorname>;                                                                              #       USB Vendor Name
-#       usbproduct = <productname>;                                                                    # USB Product Name
+#       usbvid   = <hexnum>;                        # USB VID (Vendor ID)
+#       usbpid   = <hexnum> [, <hexnum> ...]        # USB PID (Product ID) (1)
+#       usbdev   = <interface>;                     # USB interface or other device info 
+#       usbvendor = <vendorname>;                   # USB Vendor Name
+#       usbproduct = <productname>;                 # USB Product Name
 #       usbsn    = <serialno>;                      # USB Serial Number
 #
 #        To invert a bit, use = ~ <num>, the spaces are important.
+#        For a pin list all pins must be inverted.
+#        A single pin can be specified as usual = ~ <num>, for lists
+#        specify it as follows = ~ ( <num> [, <num2> ... ] ) .
+#
+#        (1) Not all programmer types can process a list of PIDs.
 #     ;
 #
 #   part
@@ -53,6 +60,7 @@
 #       stk500_devcode   = <num> ;                # numeric
 #       avr910_devcode   = <num> ;                # numeric
 #       signature        = <num> <num> <num> ;    # signature bytes
+#       usbpid           = <num> ;                # DFU USB PID
 #       chip_erase_delay = <num> ;                # micro-seconds
 #       reset            = dedicated | io;
 #       retry_pulse      = reset | sck;
 #       spmcr            = <num> ;                # mem addr of SPMC[S]R reg.
 #       eecr             = <num> ;                # mem addr of EECR reg.
 #                                                 # (only when != 0x3c)
+#       is_at90s1200     = <yes/no> ;             # AT90S1200 part
 #       is_avr32         = <yes/no> ;             # AVR32 part
 #
 #       memory <memtype>
 # values.  If a required parameter is left empty, AVRDUDE will
 # complain.
 #
+# Parts can also inherit parameters from previously defined parts
+# using the following syntax. In this case specified integer and 
+# string values override parameter values from the parent part. New 
+# memory definitions are added to the definitions inherited from the 
+# parent.
+#
+#   part parent <id>                              # quoted string
+#       id               = <id> ;                 # quoted string
+#       <any set of other parameters from the list above>
+#     ;
+#
 # NOTES:
 #   * 'devicecode' is the device code used by the STK500 (see codes 
 #       listed below)
 #     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
+#         http://www.atmel.com/dyn/resources/prod_documents/doc1280.pdf
 #
 # INSTRUCTION FORMATS
 #
 # section avr061.zip which accompanies the application note
 # AVR061 available from:
 #
-#      http://www.atmel.com/atmel/acrobat/doc2525.pdf
+#      http://www.atmel.com/dyn/resources/prod_documents/doc2525.pdf
 #
 
 #define ATTINY10    0x10  /* the _old_ one that never existed! */
 # ATmega169    0x78
 
 #
-# Overall avrdude defaults
+# Overall avrdude defaults; suitable for ~/.avrduderc
 #
 default_parallel   = "lpt1";
 default_serial     = "com1";
-# default_bitclock = 2.5
+# default_bitclock = 2.5;
+
+# Turn off safemode by default
+#default_safemode  = no;
 
 
 #
@@ -329,13 +352,15 @@ default_serial     = "com1";
 programmer
   id    = "wiring";
   desc  = "Wiring";
-  type  = wiring;
+  type  = "wiring";
+  connection_type = serial;
 ;
 
 programmer
   id    = "arduino";
   desc  = "Arduino";
-  type  = arduino;
+  type  = "arduino";
+  connection_type = serial;
 ;
 # this will interface with the chips on these programmers:
 #
@@ -351,111 +376,278 @@ programmer
 # The drivers will look for a specific device and use the first one found.
 # If you have mulitple devices, then look for unique information (like SN)
 # And fill that in here.
+#
+# Note that the pin numbers for the main ISP signals (reset, sck,
+# mosi, miso) are fixed and cannot be changed, since they must match
+# the way the Multi-Protocol Synchronous Serial Engine (MPSSE) of
+# these FTDI ICs has been designed.
 
 programmer
-  id   = "avrftdi";
-  desc = "FT2232D based generic programmer";
-  type = avrftdi;
+  id         = "avrftdi";
+  desc       = "FT2232D based generic programmer";
+  type       = "avrftdi";
+  connection_type = usb;
   usbvid     = 0x0403;
   usbpid     = 0x6010;
   usbvendor  = "";
   usbproduct = "";
   usbdev     = "A";
   usbsn      = "";
-#ISP-signals - lower ACBUS-Nibble (default)
-  reset  = 4;
-  sck    = 1;
-  mosi   = 2;
-  miso   = 3;
-#LED SIGNALs - higher ACBUS-Nibble
-#  errled = 5;
-#  rdyled = 6;
-#  pgmled = 7;
-#  vfyled = 8;
-#Buffer Signal - ADBUS - Nibble
-#  buff   = 9;
+#ISP-signals - lower ADBUS-Nibble (default)
+  reset  = 3;
+  sck    = 0;
+  mosi   = 1;
+  miso   = 2;
+#LED SIGNALs - higher ADBUS-Nibble
+#  errled = 4;
+#  rdyled = 5;
+#  pgmled = 6;
+#  vfyled = 7;
+#Buffer Signal - ACBUS - Nibble
+#  buff   = 8;
 ;
 # This is an implementation of the above with a buffer IC (74AC244) and
-# 4 LEDs directly attached, active low. The buff and reset pins are
-# understood (by avrdude) to be active low, so there's no
-# need to invert the bits.
+# 4 LEDs directly attached, all active low.
 programmer
-  id   = "2232HIO";
-  desc = "FT2232H based generic programmer";
-  type = avrftdi;
+  id         = "2232HIO";
+  desc       = "FT2232H based generic programmer";
+  type       = "avrftdi";
+  connection_type = usb;
   usbvid     = 0x0403;
 # Note: This PID is reserved for generic H devices and 
 # should be programmed into the EEPROM
 #  usbpid     = 0x8A48;
-   usbpid    = 0x6010;
-  usbdev = "A";
+  usbpid     = 0x6010;
+  usbdev     = "A";
   usbvendor  = "";
   usbproduct = "";
   usbsn      = "";
 #ISP-signals 
-  reset  = 4;
-  sck    = 1;
-  mosi   = 2;
-  miso   = 3;
-  buff   = 5;
+  reset  = 3;
+  sck    = 0;
+  mosi   = 1;
+  miso   = 2;
+  buff   = ~4;
 #LED SIGNALs 
-  errled = ~ 12;
-  rdyled = ~ 15;
-  pgmled = ~ 14;
-  vfyled = ~ 13;
+  errled = ~ 11;
+  rdyled = ~ 14;
+  pgmled = ~ 13;
+  vfyled = ~ 12;
+;
+
+#The FT4232H can be treated as FT2232H, but it has a different USB
+#device ID of 0x6011.
+programmer parent "avrftdi"
+  id         = "4232h";
+  desc       = "FT4232H based generic programmer";
+  usbpid     = 0x6011;
 ;
 
 programmer
-  id    = "jtagkey";
-  desc  = "Amontec JTAGKey, JTAGKey-Tiny and JTAGKey2";
-  type  = avrftdi;
+  id         = "jtagkey";
+  desc       = "Amontec JTAGKey, JTAGKey-Tiny and JTAGKey2";
+  type       = "avrftdi";
+  connection_type = usb;
   usbvid     = 0x0403;
 # Note: This PID is used in all JTAGKey variants
-  usbpid    = 0xCFF8;
-  usbdev = "A";
+  usbpid     = 0xCFF8;
+  usbdev     = "A";
   usbvendor  = "";
   usbproduct = "";
   usbsn      = "";
 #ISP-signals => 20 - Pin connector on JTAGKey
-  reset  = 4; # TMS 7 violet
-  sck    = 1; # TCK 9 white
-  mosi   = 2; # TDI 5 green
-  miso   = 3; # TDO 13 orange
-  buff   = 5;
+  reset  = 3; # TMS 7 violet
+  sck    = 0; # TCK 9 white
+  mosi   = 1; # TDI 5 green
+  miso   = 2; # TDO 13 orange
+  buff   = ~4;
 # VTG           VREF 1 brown with red tip
 # GND           GND 20 black
 # The colors are on the 20 pin breakout cable
 # from Amontec
 ;
 
+# UM232H module from FTDI and Glyn.com.au.
+# See helix.air.net.au for detailed usage information.
+# J1: Connect pin 2 and 3 for USB power.
+# J2: Connect pin 2 and 3 for USB power.
+# J2: Pin 7 is SCK
+#   : Pin 8 is MOSI
+#   : Pin 9 is MISO
+#   : Pin 11 is RST
+#   : Pin 6 is ground
+# Use the -b flag to set the SPI clock rate eg -b 3750000 is the fastest I could get
+# a 16MHz Atmega1280 to program reliably.  The 232H is conveniently 5V tolerant.
+programmer
+  id         = "UM232H";
+  desc       = "FT232H based module from FTDI and Glyn.com.au";
+  type       = "avrftdi";
+  usbvid     = 0x0403;
+# Note: This PID is reserved for generic 232H devices and
+# should be programmed into the EEPROM
+  usbpid     = 0x6014;
+  usbdev     = "A";
+  usbvendor  = "";
+  usbproduct = "";
+  usbsn      = "";
+#ISP-signals
+  sck    = 0;
+  mosi   = 1;
+  miso   = 2;
+  reset  = 3;
+;
+
+# C232HM module from FTDI and Glyn.com.au.
+# : Orange is SCK
+# : Yellow is MOSI
+# : Green is MISO
+# : Brown is RST
+# : Black is ground
+# Use the -b flag to set the SPI clock rate eg -b 3750000 is the fastest I could get
+# a 16MHz Atmega1280 to program reliably.  The 232H is conveniently 5V tolerant.
+programmer
+  id         = "C232HM";
+  desc       = "FT232H based module from FTDI and Glyn.com.au";
+  type       = "avrftdi";
+  usbvid     = 0x0403;
+# Note: This PID is reserved for generic 232H devices and
+# should be programmed into the EEPROM
+  usbpid     = 0x6014;
+  usbdev     = "A";
+  usbvendor  = "";
+  usbproduct = "";
+  usbsn      = "";
+#ISP-signals
+  sck    = 0;
+  mosi   = 1;
+  miso   = 2;
+  reset  = 3;
+;
+
+
+# On the adapter you can read "O-Link". On the PCB is printed "OpenJTAG v3.1"
+# You can find it as "OpenJTAG ARM JTAG USB" in the internet. 
+# (But there are also several projects called Open JTAG, eg. 
+# http://www.openjtag.org, which are completely different.)
+#   http://www.100ask.net/shop/english.html (website seems to be outdated)
+#   http://item.taobao.com/item.htm?id=1559277013
+#   http://www.micro4you.com/store/openjtag-arm-jtag-usb.html (schematics!)
+# some other sources which call it O-Link
+#   http://www.andahammer.com/olink/
+#   http://www.developmentboard.net/31-o-link-debugger.html
+#   http://armwerks.com/catalog/o-link-debugger-copy/
+# or just have a look at ebay ...
+# It is basically the same entry as jtagkey with different usb ids.
+programmer parent "jtagkey"
+  id         = "o-link";
+  desc       = "O-Link, OpenJTAG from www.100ask.net";
+  usbvid     = 0x1457;
+  usbpid     = 0x5118;
+  usbvendor  = "www.100ask.net";
+  usbproduct = "USB<=>JTAG&RS232";
+;
+
+# http://wiki.openmoko.org/wiki/Debug_Board_v3
+programmer
+  id    = "openmoko";
+  desc  = "Openmoko debug board (v3)";
+  type  = "avrftdi";
+  usbvid     = 0x1457;
+  usbpid    = 0x5118;
+  usbdev = "A";
+  usbvendor  = "";
+  usbproduct = "";
+  usbsn      = "";
+  reset  = 3; # TMS 7
+  sck    = 0; # TCK 9
+  mosi   = 1; # TDI 5
+  miso   = 2; # TDO 13
+;
+
+# Only Rev. A boards.
+# Schematic and user manual: http://www.cs.put.poznan.pl/wswitala/download/pdf/811EVBK.pdf
+programmer
+  id         = "lm3s811";
+  desc       = "Luminary Micro LM3S811 Eval Board (Rev. A)";
+  type       = "avrftdi";
+  connection_type = usb;
+  usbvid     = 0x0403;
+  usbpid     = 0xbcd9;
+  usbvendor  = "LMI";
+  usbproduct = "LM3S811 Evaluation Board";
+  usbdev     = "A";
+  usbsn      = "";
+#ISP-signals - lower ACBUS-Nibble (default)
+  reset  = 3;
+  sck    = 0;
+  mosi   = 1;
+  miso   = 2;
+# Enable correct buffers
+  buff   = 7;
+;
+
+# submitted as bug #46020
+programmer
+  id     = "tumpa";
+  desc   = "TIAO USB Multi-Protocol Adapter";
+  type   = "avrftdi";
+  connection_type = usb;
+  usbvid = 0x0403;
+  usbpid = 0x8A98;
+  usbdev = "A";
+  usbvendor = "TIAO";
+  usbproduct = "";
+  usbsn  = "";
+  sck    = 0; # TCK 9
+  mosi   = 1; # TDI 5
+  miso   = 2; # TDO 13
+  reset  = 3; # TMS 7
+;
+
 programmer
   id    = "avrisp";
   desc  = "Atmel AVR ISP";
-  type  = stk500;
+  type  = "stk500";
+  connection_type = serial;
 ;
 
 programmer
   id    = "avrispv2";
   desc  = "Atmel AVR ISP V2";
-  type  =  stk500v2;
+  type  =  "stk500v2";
+  connection_type = serial;
 ;
 
 programmer
   id    = "avrispmkII";
   desc  = "Atmel AVR ISP mkII";
-  type  =  stk500v2;
+  type  =  "stk500v2";
+  connection_type = usb;
 ;
 
-programmer
+programmer parent "avrispmkII"
   id    = "avrisp2";
-  desc  = "Atmel AVR ISP mkII";
-  type  =  stk500v2;
 ;
 
 programmer
   id    = "buspirate";
   desc  = "The Bus Pirate";
-  type  = buspirate;
+  type  = "buspirate";
+  connection_type = serial;
+;
+
+programmer
+  id    = "buspirate_bb";
+  desc  = "The Bus Pirate (bitbang interface, supports TPI)";
+  type  = "buspirate_bb";
+  connection_type = serial;
+  # pins are bits in bitbang byte (numbers are 87654321)
+  # 1|POWER|PULLUP|AUX|MOSI|CLK|MISO|CS
+  reset  = 1;
+  sck    = 3;
+  mosi   = 4;
+  miso   = 2;
+  #vcc    = 7; This is internally set independent of this setting.
 ;
 
 # This is supposed to be the "default" STK500 entry.
@@ -465,158 +657,302 @@ programmer
 programmer
   id    = "stk500";
   desc  = "Atmel STK500";
-  type  = stk500generic;
+  type  = "stk500generic";
+  connection_type = serial;
 ;
 
 programmer
   id    = "stk500v1";
   desc  = "Atmel STK500 Version 1.x firmware";
-  type  = stk500;
+  type  = "stk500";
+  connection_type = serial;
 ;
 
 programmer
   id    = "mib510";
   desc  = "Crossbow MIB510 programming board";
-  type  = stk500;
+  type  = "stk500";
+  connection_type = serial;
 ;
 
 programmer
   id    = "stk500v2";
   desc  = "Atmel STK500 Version 2.x firmware";
-  type  = stk500v2;
+  type  = "stk500v2";
+  connection_type = serial;
 ;
 
 programmer
   id    = "stk500pp";
   desc  = "Atmel STK500 V2 in parallel programming mode";
-  type  = stk500pp;
+  type  = "stk500pp";
+  connection_type = serial;
 ;
 
 programmer
   id    = "stk500hvsp";
   desc  = "Atmel STK500 V2 in high-voltage serial programming mode";
-  type  = stk500hvsp;
+  type  = "stk500hvsp";
+  connection_type = serial;
 ;
 
 programmer
   id    = "stk600";
   desc  = "Atmel STK600";
-  type  = stk600;
+  type  = "stk600";
+  connection_type = usb;
 ;
 
 programmer
   id    = "stk600pp";
   desc  = "Atmel STK600 in parallel programming mode";
-  type  = stk600pp;
+  type  = "stk600pp";
+  connection_type = usb;
 ;
 
 programmer
   id    = "stk600hvsp";
   desc  = "Atmel STK600 in high-voltage serial programming mode";
-  type  = stk600hvsp;
+  type  = "stk600hvsp";
+  connection_type = usb;
 ;
 
 programmer
   id    = "avr910";
   desc  = "Atmel Low Cost Serial Programmer";
-  type  = avr910;
+  type  = "avr910";
+  connection_type = serial;
+;
+
+programmer
+  id    = "ft245r";
+  desc  = "FT245R Synchronous BitBang";
+  type  = "ftdi_syncbb";
+  connection_type = usb;
+  miso  = 1; # D1
+  sck   = 0; # D0
+  mosi  = 2; # D2
+  reset = 4; # D4
+;
+
+programmer
+  id    = "ft232r";
+  desc  = "FT232R Synchronous BitBang";
+  type  = "ftdi_syncbb";
+  connection_type = usb;
+  miso  = 1;  # RxD
+  sck   = 0;  # TxD
+  mosi  = 2;  # RTS
+  reset = 4;  # DTR
+;
+
+# see http://www.bitwizard.nl/wiki/index.php/FTDI_ATmega
+programmer
+  id    = "bwmega";
+  desc  = "BitWizard ftdi_atmega builtin programmer";
+  type  = "ftdi_syncbb";
+  connection_type = usb;
+  miso  = 5;  # DSR
+  sck   = 6;  # DCD
+  mosi  = 3;  # CTS
+  reset = 7;  # RI
+;
+
+# see http://www.geocities.jp/arduino_diecimila/bootloader/index_en.html
+# Note: pins are numbered from 1!
+programmer
+  id    = "arduino-ft232r";
+  desc  = "Arduino: FT232R connected to ISP";
+  type  = "ftdi_syncbb";
+  connection_type = usb;
+  miso  = 3;  # CTS X3(1)
+  sck   = 5;  # DSR X3(2)
+  mosi  = 6;  # DCD X3(3)
+  reset = 7;  # RI  X3(4)
+;
+
+# website mentioned above uses this id
+programmer parent "arduino-ft232r"
+  id    = "diecimila";
+  desc  = "alias for arduino-ft232r";
+;
+
+# There is a ATmega328P kit PCB called "uncompatino".
+# This board allows ISP via its on-board FT232R.
+# This is designed like Arduino Duemilanove but has no standard ICPS header.
+# Its 4 pairs of pins are shorted to enable ftdi_syncbb.
+# http://akizukidenshi.com/catalog/g/gP-07487/
+# http://akizukidenshi.com/download/ds/akizuki/k6096_manual_20130816.pdf
+programmer
+  id    = "uncompatino";
+  desc  = "uncompatino with all pairs of pins shorted";
+  type  = "ftdi_syncbb";
+  connection_type = usb;
+  miso  = 3; # cts
+  sck   = 5; # dsr
+  mosi  = 6; # dcd
+  reset = 7; # ri
+;
+
+# FTDI USB to serial cable TTL-232R-5V with a custom adapter for ICSP
+# http://www.ftdichip.com/Products/Cables/USBTTLSerial.htm
+# http://www.ftdichip.com/Support/Documents/DataSheets/Cables/DS_TTL-232R_CABLES.pdf
+# For ICSP pinout see for example http://www.atmel.com/images/doc2562.pdf
+# (Figure 1. ISP6PIN header pinout and Table 1. Connections required for ISP ...)
+# TTL-232R GND 1 Black  -> ICPS GND   (pin 6)
+# TTL-232R CTS 2 Brown  -> ICPS MOSI  (pin 4)
+# TTL-232R VCC 3 Red    -> ICPS VCC   (pin 2)
+# TTL-232R TXD 4 Orange -> ICPS RESET (pin 5)
+# TTL-232R RXD 5 Yellow -> ICPS SCK   (pin 3)
+# TTL-232R RTS 6 Green  -> ICPS MISO  (pin 1)
+# Except for VCC and GND, you can connect arbitual pairs as long as 
+# the following table is adjusted.
+programmer
+  id    = "ttl232r";
+  desc  = "FTDI TTL232R-5V with ICSP adapter";
+  type  = "ftdi_syncbb";
+  connection_type = usb;
+  miso  = 2; # rts
+  sck   = 1; # rxd
+  mosi  = 3; # cts
+  reset = 0; # txd
 ;
 
 programmer
   id    = "usbasp";
   desc  = "USBasp, http://www.fischl.de/usbasp/";
-  type  = usbasp;
+  type  = "usbasp";
+  connection_type = usb;
+  usbvid     = 0x16C0; # VOTI
+  usbpid     = 0x05DC; # Obdev's free shared PID
+  usbvendor  = "www.fischl.de";
+  usbproduct = "USBasp";
+
+  # following variants are autodetected for id "usbasp"
+
+  # original usbasp from fischl.de
+  # see above "usbasp"
+
+  # old usbasp from fischl.de
+  #usbvid     = 0x03EB; # ATMEL
+  #usbpid     = 0xC7B4; # (unoffical) USBasp
+  #usbvendor  = "www.fischl.de";
+  #usbproduct = "USBasp";
+
+  # NIBObee (only if -P nibobee is given on command line)
+  # see below "nibobee"
+;
+
+programmer
+  id    = "nibobee";
+  desc  = "NIBObee";
+  type  = "usbasp";
+  connection_type = usb;
+  usbvid     = 0x16C0; # VOTI
+  usbpid     = 0x092F; # NIBObee PID
+  usbvendor  = "www.nicai-systems.com";
+  usbproduct = "NIBObee";
+;
+
+programmer
+  id    = "usbasp-clone";
+  desc  = "Any usbasp clone with correct VID/PID";
+  type  = "usbasp";
+  connection_type = usb;
+  usbvid    = 0x16C0; # VOTI
+  usbpid    = 0x05DC; # Obdev's free shared PID
+  #usbvendor  = "";
+  #usbproduct = "";
 ;
 
 programmer
   id    = "usbtiny";
   desc  = "USBtiny simple USB programmer, http://www.ladyada.net/make/usbtinyisp/";
-  type  = usbtiny;
+  type  = "usbtiny";
+  connection_type = usb;
+  usbvid     = 0x1781;
+  usbpid     = 0x0c9f;
 ;
 
 programmer
   id    = "butterfly";
   desc  = "Atmel Butterfly Development Board";
-  type  = butterfly;
+  type  = "butterfly";
+  connection_type = serial;
 ;
 
 programmer
   id    = "avr109";
   desc  = "Atmel AppNote AVR109 Boot Loader";
-  type  = butterfly;
+  type  = "butterfly";
+  connection_type = serial;
 ;
 
 programmer
   id    = "avr911";
   desc  = "Atmel AppNote AVR911 AVROSP";
-  type  = butterfly;
+  type  = "butterfly";
+  connection_type = serial;
 ;
  
 # suggested in http://forum.mikrokopter.de/topic-post48317.html
 programmer
   id    = "mkbutterfly";
   desc  = "Mikrokopter.de Butterfly";
-  type  = butterfly_mk;
+  type  = "butterfly_mk";
+  connection_type = serial;
 ;
 
-programmer
+programmer parent "mkbutterfly"
   id    = "butterfly_mk";
-  desc  = "Mikrokopter.de Butterfly";
-  type  = butterfly_mk;
 ;
 
 programmer
   id    = "jtagmkI";
   desc  = "Atmel JTAG ICE (mkI)";
   baudrate = 115200;    # default is 115200
-  type  = jtagmki;
+  type  = "jtagmki";
+  connection_type = serial;
 ;
 
 # easier to type
-programmer
+programmer parent "jtagmkI"
   id    = "jtag1";
-  desc  = "Atmel JTAG ICE (mkI)";
-  baudrate = 115200;    # default is 115200
-  type  = jtagmki;
 ;
 
 # easier to type
-programmer
+programmer parent "jtag1"
   id    = "jtag1slow";
-  desc  = "Atmel JTAG ICE (mkI)";
   baudrate = 19200;
-  type  = jtagmki;
 ;
 
+# The JTAG ICE mkII has both, serial and USB connectivity.  As it is
+# mostly used through USB these days (AVR Studio 5 only supporting it
+# that way), we make connection_type = usb the default.  Users are
+# still free to use a serial port with the -P option.
+
 programmer
   id    = "jtagmkII";
   desc  = "Atmel JTAG ICE mkII";
   baudrate = 19200;    # default is 19200
-  type  = jtagmkii;
+  type  = "jtagmkii";
+  connection_type = usb;
 ;
 
 # easier to type
-programmer
+programmer parent "jtagmkII"
   id    = "jtag2slow";
-  desc  = "Atmel JTAG ICE mkII";
-  baudrate = 19200;    # default is 19200
-  type  = jtagmkii;
 ;
 
 # JTAG ICE mkII @ 115200 Bd
-programmer
+programmer parent "jtag2slow"
   id    = "jtag2fast";
-  desc  = "Atmel JTAG ICE mkII";
   baudrate = 115200;
-  type  = jtagmkii;
 ;
 
 # make the fast one the default, people will love that
-programmer
+programmer parent "jtag2fast"
   id    = "jtag2";
-  desc  = "Atmel JTAG ICE mkII";
-  baudrate = 115200;
-  type  = jtagmkii;
 ;
 
 # JTAG ICE mkII in ISP mode
@@ -624,7 +960,8 @@ programmer
   id    = "jtag2isp";
   desc  = "Atmel JTAG ICE mkII in ISP mode";
   baudrate = 115200;
-  type  = jtagmkii_isp;
+  type  = "jtagmkii_isp";
+  connection_type = usb;
 ;
 
 # JTAG ICE mkII in debugWire mode
@@ -632,7 +969,8 @@ programmer
   id    = "jtag2dw";
   desc  = "Atmel JTAG ICE mkII in debugWire mode";
   baudrate = 115200;
-  type  = jtagmkii_dw;
+  type  = "jtagmkii_dw";
+  connection_type = usb;
 ;
 
 # JTAG ICE mkII in AVR32 mode
@@ -640,7 +978,8 @@ programmer
   id    = "jtagmkII_avr32";
   desc  = "Atmel JTAG ICE mkII im AVR32 mode";
   baudrate = 115200;
-  type  = jtagmkii_avr32;
+  type  = "jtagmkii_avr32";
+  connection_type = usb;
 ;
 
 # JTAG ICE mkII in AVR32 mode
@@ -648,7 +987,8 @@ programmer
   id    = "jtag2avr32";
   desc  = "Atmel JTAG ICE mkII im AVR32 mode";
   baudrate = 115200;
-  type  = jtagmkii_avr32;
+  type  = "jtagmkii_avr32";
+  connection_type = usb;
 ;
 
 # JTAG ICE mkII in PDI mode
@@ -656,7 +996,8 @@ programmer
   id    = "jtag2pdi";
   desc  = "Atmel JTAG ICE mkII PDI mode";
   baudrate = 115200;
-  type  = jtagmkii_pdi;
+  type  = "jtagmkii_pdi";
+  connection_type = usb;
 ;
 
 # AVR Dragon in JTAG mode
@@ -664,7 +1005,8 @@ programmer
   id    = "dragon_jtag";
   desc  = "Atmel AVR Dragon in JTAG mode";
   baudrate = 115200;
-  type  = dragon_jtag;
+  type  = "dragon_jtag";
+  connection_type = usb;
 ;
 
 # AVR Dragon in ISP mode
@@ -672,7 +1014,8 @@ programmer
   id    = "dragon_isp";
   desc  = "Atmel AVR Dragon in ISP mode";
   baudrate = 115200;
-  type  = dragon_isp;
+  type  = "dragon_isp";
+  connection_type = usb;
 ;
 
 # AVR Dragon in PP mode
@@ -680,7 +1023,8 @@ programmer
   id    = "dragon_pp";
   desc  = "Atmel AVR Dragon in PP mode";
   baudrate = 115200;
-  type  = dragon_pp;
+  type  = "dragon_pp";
+  connection_type = usb;
 ;
 
 # AVR Dragon in HVSP mode
@@ -688,7 +1032,8 @@ programmer
   id    = "dragon_hvsp";
   desc  = "Atmel AVR Dragon in HVSP mode";
   baudrate = 115200;
-  type  = dragon_hvsp;
+  type  = "dragon_hvsp";
+  connection_type = usb;
 ;
 
 # AVR Dragon in debugWire mode
@@ -696,7 +1041,8 @@ programmer
   id    = "dragon_dw";
   desc  = "Atmel AVR Dragon in debugWire mode";
   baudrate = 115200;
-  type  = dragon_dw;
+  type  = "dragon_dw";
+  connection_type = usb;
 ;
 
 # AVR Dragon in PDI mode
@@ -704,13 +1050,125 @@ programmer
   id    = "dragon_pdi";
   desc  = "Atmel AVR Dragon in PDI mode";
   baudrate = 115200;
-  type  = dragon_pdi;
+  type  = "dragon_pdi";
+  connection_type = usb;
+;
+
+programmer
+  id    = "jtag3";
+  desc  = "Atmel AVR JTAGICE3 in JTAG mode";
+  type  = "jtagice3";
+  connection_type = usb;
+  usbpid = 0x2110, 0x2140;
+;
+
+programmer
+  id    = "jtag3pdi";
+  desc  = "Atmel AVR JTAGICE3 in PDI mode";
+  type  = "jtagice3_pdi";
+  connection_type = usb;
+  usbpid = 0x2110, 0x2140;
+;
+
+programmer
+  id    = "jtag3dw";
+  desc  = "Atmel AVR JTAGICE3 in debugWIRE mode";
+  type  = "jtagice3_dw";
+  connection_type = usb;
+  usbpid = 0x2110, 0x2140;
+;
+
+programmer
+  id    = "jtag3isp";
+  desc  = "Atmel AVR JTAGICE3 in ISP mode";
+  type  = "jtagice3_isp";
+  connection_type = usb;
+  usbpid = 0x2110, 0x2140;
+;
+
+programmer
+  id    = "xplainedpro";
+  desc  = "Atmel AVR XplainedPro in JTAG mode";
+  type  = "jtagice3";
+  connection_type = usb;
+  usbpid = 0x2111;
+;
+
+programmer
+  id    = "xplainedmini";
+  desc  = "Atmel AVR XplainedMini in ISP mode";
+  type  = "jtagice3_isp";
+  connection_type = usb;
+  usbpid = 0x2145;
+;
+
+programmer
+  id    = "xplainedmini_dw";
+  desc  = "Atmel AVR XplainedMini in debugWIRE mode";
+  type  = "jtagice3_dw";
+  connection_type = usb;
+  usbpid = 0x2145;
+;
+
+programmer
+  id    = "atmelice";
+  desc  = "Atmel-ICE (ARM/AVR) in JTAG mode";
+  type  = "jtagice3";
+  connection_type = usb;
+  usbpid = 0x2141;
+;
+
+programmer
+  id    = "atmelice_pdi";
+  desc  = "Atmel-ICE (ARM/AVR) in PDI mode";
+  type  = "jtagice3_pdi";
+  connection_type = usb;
+  usbpid = 0x2141;
+;
+
+programmer
+  id    = "atmelice_dw";
+  desc  = "Atmel-ICE (ARM/AVR) in debugWIRE mode";
+  type  = "jtagice3_dw";
+  connection_type = usb;
+  usbpid = 0x2141;
+;
+
+programmer
+  id    = "atmelice_isp";
+  desc  = "Atmel-ICE (ARM/AVR) in ISP mode";
+  type  = "jtagice3_isp";
+  connection_type = usb;
+  usbpid = 0x2141;
 ;
 
+
 programmer
   id    = "pavr";
   desc  = "Jason Kyle's pAVR Serial Programmer";
-  type  = avr910;
+  type  = "avr910";
+  connection_type = serial;
+;
+
+programmer
+  id    = "pickit2";
+  desc  = "MicroChip's PICkit2 Programmer";
+  type  = "pickit2";
+  connection_type = usb;
+;
+
+programmer
+  id    = "flip1";
+  desc  = "FLIP USB DFU protocol version 1 (doc7618)";
+  type  = "flip1";
+  connection_type = usb;
+;
+
+programmer
+  id    = "flip2";
+  desc  = "FLIP USB DFU protocol version 2 (AVR4023)";
+  type  = "flip2";
+  connection_type = usb;
 ;
 
 # Parallel port programmers.
@@ -718,7 +1176,8 @@ programmer
 programmer
   id    = "bsd";
   desc  = "Brian Dean's Programmer, http://www.bsdhome.com/avrdude/";
-  type  = par;
+  type  = "par";
+  connection_type = parallel;
   vcc   = 2, 3, 4, 5;
   reset = 7;
   sck   = 8;
@@ -729,7 +1188,8 @@ programmer
 programmer
   id    = "stk200";
   desc  = "STK200";
-  type  = par;
+  type  = "par";
+  connection_type = parallel;
   buff  = 4, 5;
   sck   = 6;
   mosi  = 7;
@@ -742,63 +1202,33 @@ programmer
 # except that there is a LED indicating that the
 # programming is currently in progress.
 
-programmer
+programmer parent "stk200"
   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;
+  type  = "par";
+  connection_type = parallel;
   reset = 4;
   sck   = 5;
   mosi  = 2;
   miso  = 11;
 ;
 
-programmer
-  id    = "dasaftdi";
-  desc  = "FTDI serial port banging, reset=rts sck=dtr mosi=txd miso=cts";
-  type  = serbb;
-  reset = ~7;
-  sck   = ~4;
-  mosi  = ~3;
-  miso  = ~8;
-;
-
-programmer
-  id    = "dasaftdit1";
-  desc  = "FTDI serial port banging, reset=rts sck=dtr mosi=txd miso=cts";
-  type  = serbb;
-  reset = ~7;
-  sck   = ~4;
-  mosi  = ~3;
-  miso  = ~8;
-;
-
-
-programmer
+programmer parent "dt006"
   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;
+  type   = "par";
+  connection_type = parallel;
   vcc    = 2, 3, 4, 5;
   buff   = 6;
   reset  = 7;
@@ -814,7 +1244,8 @@ programmer
 programmer
   id    = "sp12";
   desc  = "Steve Bolt's Programmer";
-  type  = par;
+  type  = "par";
+  connection_type = parallel;
   vcc   = 4,5,6,7,8;
   reset = 3;
   sck   = 2;
@@ -825,7 +1256,8 @@ programmer
 programmer
   id     = "picoweb";
   desc   = "Picoweb Programming Cable, http://www.picoweb.net/";
-  type   = par;
+  type   = "par";
+  connection_type = parallel;
   reset  = 2;
   sck    = 3;
   mosi   = 4;
@@ -835,7 +1267,8 @@ programmer
 programmer
   id    = "abcmini";
   desc  = "ABCmini Board, aka Dick Smith HOTCHIP";
-  type  = par;
+  type  = "par";
+  connection_type = parallel;
   reset = 4;
   sck   = 3;
   mosi  = 2;
@@ -845,7 +1278,8 @@ programmer
 programmer
   id    = "futurlec";
   desc  = "Futurlec.com programming cable.";
-  type  = par;
+  type  = "par";
+  connection_type = parallel;
   reset = 3;
   sck   = 2;
   mosi  = 1;
@@ -863,7 +1297,8 @@ programmer
 programmer
   id    = "xil";
   desc  = "Xilinx JTAG cable";
-  type  = par;
+  type  = "par";
+  connection_type = parallel;
   mosi  = 2;
   sck   = 3;
   reset = 4;
@@ -876,7 +1311,8 @@ programmer
 programmer
   id = "dapa";
   desc = "Direct AVR Parallel Access cable";
-  type = par;
+  type = "par";
+  connection_type = parallel;
   vcc   = 3;
   reset = 16;
   sck = 1;
@@ -887,7 +1323,8 @@ programmer
 programmer
   id    = "atisp";
   desc  = "AT-ISP V1.1 programming cable for AVR-SDK1 from <http://micro-research.co.th/> micro-research.co.th";
-  type  = par;
+  type  = "par";
+  connection_type = parallel;
   reset = ~6;
   sck   = ~8;
   mosi  = ~7;
@@ -897,7 +1334,8 @@ programmer
 programmer
   id    = "ere-isp-avr";
   desc  = "ERE ISP-AVR <http://www.ere.co.th/download/sch050713.pdf>";
-  type  = par;
+  type  = "par";
+  connection_type = parallel;
   reset = ~4;
   sck   = 3;
   mosi  = 2;
@@ -907,7 +1345,8 @@ programmer
 programmer
   id    = "blaster";
   desc  = "Altera ByteBlaster";
-  type  = par;
+  type  = "par";
+  connection_type = parallel;
   sck   = 2;
   miso  = 11;
   reset = 3;
@@ -916,33 +1355,50 @@ programmer
 ;
 
 # It is almost same as pony-stk200, except vcc on pin 5 to auto
-# disconnect port (download on http://electropol.free.fr)
-programmer
+# disconnect port (download on http://electropol.free.fr/spip/spip.php?article27)
+programmer parent "pony-stk200"
   id    = "frank-stk200";
   desc  = "Frank STK200";
-  type  = par;
+  buff  = ; # delete buff pin assignment
   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;
+  id = "89isp";
+  desc = "Atmel at89isp cable";
+  type = "par";
+  connection_type = parallel;
+  reset = 17;
+  sck = 1;
+  mosi = 2;
+  miso = 10;
 ;
 
 
+#This programmer bitbangs GPIO lines using the Linux sysfs GPIO interface
+#
+#To enable it set the configuration below to match the GPIO lines connected to the
+#relevant ISP header pins and uncomment the entry definition. In case you don't
+#have the required permissions to edit this system wide config file put the
+#entry in a separate <your name>.conf file and use it with -C+<your name>.conf
+#on the command line.
 #
+#To check if your avrdude build has support for the linuxgpio programmer compiled in,
+#use -c?type on the command line and look for linuxgpio in the list. If it's not available
+#you need pass the --enable-linuxgpio=yes option to configure and recompile avrdude.
+#
+#programmer
+#  id    = "linuxgpio";
+#  desc  = "Use the Linux sysfs interface to bitbang GPIO lines";
+#  type  = "linuxgpio";
+#  reset = ?;
+#  sck   = ?;
+#  mosi  = ?;
+#  miso  = ?;
+#;
+
 # some ultra cheap programmers use bitbanging on the 
 # serialport.
 #
@@ -967,7 +1423,8 @@ miso = 10;
 programmer
   id    = "ponyser";
   desc  = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts";
-  type  = serbb;
+  type  = "serbb";
+  connection_type = serial;
   reset = ~3;
   sck   = 7;
   mosi  = 4;
@@ -977,14 +1434,9 @@ programmer
 # Same as above, different name
 # reset=!txd sck=rts mosi=dtr miso=cts
 
-programmer
+programmer parent "ponyser"
   id    = "siprog";
   desc  = "Lancos SI-Prog <http://www.lancos.com/siprogsch.html>";
-  type  = serbb;
-  reset = ~3;
-  sck   = 7;
-  mosi  = 4;
-  miso  = 8;
 ;
 
 # unknown (dasa in uisp)
@@ -993,7 +1445,8 @@ programmer
 programmer
   id    = "dasa";
   desc  = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts";
-  type  = serbb;
+  type  = "serbb";
+  connection_type = serial;
   reset = 7;
   sck   = 4;
   mosi  = 3;
@@ -1006,7 +1459,8 @@ programmer
 programmer
   id    = "dasa3";
   desc  = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts";
-  type  = serbb;
+  type  = "serbb";
+  connection_type = serial;
   reset = ~4;
   sck   = 7;
   mosi  = 3;
@@ -1019,7 +1473,8 @@ programmer
 programmer
   id    = "c2n232i";
   desc  = "serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts";
-  type  = serbb;
+  type  = "serbb";
+  connection_type = serial;
   reset = 4;
   sck   = ~7;
   mosi  = ~3;
@@ -1282,6 +1737,8 @@ part
     programfusepolltimeout = 25;
     programlockpolltimeout = 25;
 
+    ocdrev              = 0;
+
     memory "eeprom"
         size            = 64;
         page_size       = 4;
@@ -2577,7 +3034,7 @@ part
 
 part
     id               = "m103";
-    desc             = "ATMEGA103";
+    desc             = "ATmega103";
     stk500_devcode   = 0xB1;
     avr910_devcode   = 0x41;
     signature        = 0x1e 0x97 0x01;
@@ -2717,7 +3174,7 @@ part
 
 part
     id               = "m64";
-    desc             = "ATMEGA64";
+    desc             = "ATmega64";
     has_jtag         = yes;
     stk500_devcode   = 0xA0;
     avr910_devcode   = 0x45;
@@ -2767,6 +3224,8 @@ part
     spmcr               = 0x68;
     allowfullpagebitstream = yes;
 
+    ocdrev              = 2;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 8;  /* for parallel programming */
@@ -2898,7 +3357,7 @@ part
 
 part
     id               = "m128";
-    desc             = "ATMEGA128";
+    desc             = "ATmega128";
     has_jtag         = yes;
     stk500_devcode   = 0xB2;
     avr910_devcode   = 0x43;
@@ -2949,6 +3408,8 @@ part
     rampz               = 0x3b;
     allowfullpagebitstream = yes;
 
+    ocdrev              = 1;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 8;  /* for parallel programming */
@@ -3128,6 +3589,8 @@ part
     eecr                = 0x3f;
     allowfullpagebitstream = no;
 
+    ocdrev              = 3;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 8;  /* for parallel programming */
@@ -3318,6 +3781,8 @@ part
     eecr                = 0x3f;
     allowfullpagebitstream = no;
 
+    ocdrev              = 3;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 8;  /* for parallel programming */
@@ -3508,6 +3973,8 @@ part
     eecr                = 0x3f;
     allowfullpagebitstream = no;
 
+    ocdrev              = 3;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 8;  /* for parallel programming */
@@ -3647,7 +4114,7 @@ part
 
 part
     id               = "m16";
-    desc             = "ATMEGA16";
+    desc             = "ATmega16";
     has_jtag         = yes;
     stk500_devcode   = 0x82;
     avr910_devcode   = 0x74;
@@ -3697,6 +4164,8 @@ part
     spmcr               = 0x57;
     allowfullpagebitstream = yes;
 
+    ocdrev              = 2;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 4;  /* for parallel programming */
@@ -3823,16 +4292,39 @@ part
 
 # close to ATmega16
 
-part
+part parent "m16"
     id               = "m164p";
-    desc             = "ATMEGA164P";
+    desc             = "ATmega164P";
+    signature        = 0x1e 0x94 0x0a;
+
+    progmodedelay       = 0;
+    latchcycles         = 5;
+    togglevtg           = 1;
+    poweroffdelay       = 15;
+    resetdelayms        = 1;
+    allowfullpagebitstream = no;
+    chip_erase_delay = 55000;
+
+    ocdrev              = 3;
+  ;
+
+
+#------------------------------------------------------------
+# 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 0x94 0x0a;
+    signature        = 0x1e 0x95 0x08;
     pagel            = 0xd7;
     bs2              = 0xa0;
-    chip_erase_delay = 9000;
+    chip_erase_delay = 55000;
     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
                        "x x x x  x x x x    x x x x  x x x x";
 
@@ -3874,21 +4366,23 @@ part
     spmcr               = 0x57;
     allowfullpagebitstream = no;
 
+    ocdrev              = 3;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 4;  /* for parallel programming */
-        size            = 512;
+        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",
+                          "  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   x  a9  a8",
+                          "  0   0   x   x      x a10  a9  a8",
                           " a7  a6  a5  a4     a3  a2  a1  a0", 
                           "  i   i   i   i      i   i   i   i";
 
@@ -3898,7 +4392,7 @@ part
                          "  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",
+                         "  0   0   x   x      x a10  a9  a8",
                          " a7  a6  a5  a4     a3  a2   0   0",
                          "  x   x   x   x      x   x   x   x";
 
@@ -3910,20 +4404,20 @@ part
 
     memory "flash"
         paged           = yes;
-        size            = 16384;
+        size            = 32768;
         page_size       = 128;
-        num_pages       = 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",
+                          "  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   0 a13 a12    a11 a10  a9  a8",
+                          "  0 a14 a13 a12    a11 a10  a9  a8",
                           " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  o   o   o   o      o   o   o   o";
 
@@ -3938,13 +4432,13 @@ part
                           "  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",
+                          "  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       = 128;
+       blocksize       = 256;
        readsize        = 256;
       ;
 
@@ -4009,21 +4503,36 @@ part
 
 
 #------------------------------------------------------------
-# ATmega324P
+# ATmega324PA
 #------------------------------------------------------------
 
-# similar to ATmega164P
+# similar to ATmega324P
+
+part parent "m324p"
+    id               = "m324pa";
+    desc             = "ATmega324PA";
+    signature        = 0x1e 0x95 0x11;
+
+    ocdrev              = 3;
+  ;
+
+
+#------------------------------------------------------------
+# ATmega644
+#------------------------------------------------------------
+
+# similar to ATmega164
 
 part
-    id               = "m324p";
-    desc             = "ATMEGA324P";
+    id               = "m644";
+    desc             = "ATmega644";
     has_jtag         = yes;
     stk500_devcode   = 0x82; # no STK500v1 support, use the ATmega16 one
     avr910_devcode   = 0x74;
-    signature        = 0x1e 0x95 0x08;
+    signature        = 0x1e 0x96 0x09;
     pagel            = 0xd7;
     bs2              = 0xa0;
-    chip_erase_delay = 9000;
+    chip_erase_delay = 55000;
     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
                        "x x x x  x x x x    x x x x  x x x x";
 
@@ -4045,13 +4554,13 @@ part
         0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
         0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
         0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B,
-        0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
+        0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02;
     hventerstabdelay    = 100;
     progmodedelay       = 0;
-    latchcycles         = 5;
-    togglevtg           = 1;
-    poweroffdelay       = 15;
-    resetdelayms        = 1;
+    latchcycles         = 6;
+    togglevtg           = 0;
+    poweroffdelay       = 0;
+    resetdelayms        = 0;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
     chiperasepulsewidth = 0;
@@ -4065,32 +4574,34 @@ part
     spmcr               = 0x57;
     allowfullpagebitstream = no;
 
+    ocdrev              = 3;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
-        page_size       = 4;  /* for parallel programming */
-        size            = 1024;
+        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      x a10  a9  a8",
+                          "  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      x a10  a9  a8",
+                          "  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   0  a1  a0",
+                         "  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  a2   0   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;
@@ -4101,36 +4612,36 @@ part
 
     memory "flash"
         paged           = yes;
-        size            = 32768;
-        page_size       = 128;
+        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",
-                          "  0 a14 a13 a12    a11 a10  a9  a8",
+                          "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",
-                          "  0 a14 a13 a12    a11 a10  a9  a8",
+                          "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   x  a5  a4     a3  a2  a1  a0",
+                          "  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   x  a5  a4     a3  a2  a1  a0",
+                          "  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  a6   x   x      x   x   x   x",
+                          "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;
@@ -4198,23 +4709,38 @@ part
         ;
   ;
 
+#------------------------------------------------------------
+# ATmega644P
+#------------------------------------------------------------
+
+# similar to ATmega164p
+
+part parent "m644"
+    id               = "m644p";
+    desc             = "ATmega644P";
+    signature        = 0x1e 0x96 0x0a;
+
+    ocdrev              = 3;
+  ;
+
+
 
 #------------------------------------------------------------
-# ATmega324PA
+# ATmega1284
 #------------------------------------------------------------
 
-# similar to ATmega324P
+# similar to ATmega164
 
 part
-    id               = "m324pa";
-    desc             = "ATmega324PA";
+    id               = "m1284";
+    desc             = "ATmega1284";
     has_jtag         = yes;
     stk500_devcode   = 0x82; # no STK500v1 support, use the ATmega16 one
     avr910_devcode   = 0x74;
-    signature        = 0x1e 0x95 0x11;
+    signature        = 0x1e 0x97 0x06;
     pagel            = 0xd7;
     bs2              = 0xa0;
-    chip_erase_delay = 9000;
+    chip_erase_delay = 55000;
     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
                        "x x x x  x x x x    x x x x  x x x x";
 
@@ -4230,16 +4756,16 @@ part
     pollvalue          = 0x53;
     predelay           = 1;
     postdelay          = 1;
-    pollmethod         = 0;
+    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;
+        0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02;
     hventerstabdelay    = 100;
     progmodedelay       = 0;
-    latchcycles         = 5;
+    latchcycles         = 6;
     togglevtg           = 1;
     poweroffdelay       = 15;
     resetdelayms        = 1;
@@ -4256,32 +4782,34 @@ part
     spmcr               = 0x57;
     allowfullpagebitstream = no;
 
+    ocdrev              = 3;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
-        page_size       = 4;  /* for parallel programming */
-        size            = 1024;
+        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      x a10  a9  a8",
+                          "  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      x a10  a9  a8",
+                          "  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   0  a1  a0",
+                         "  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  a2   0   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;
@@ -4292,40 +4820,40 @@ part
 
     memory "flash"
         paged           = yes;
-        size            = 32768;
-        page_size       = 128;
-        num_pages       = 256;
+        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",
-                          "  0 a14 a13 a12    a11 a10  a9  a8",
+                          "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",
-                          "  0 a14 a13 a12    a11 a10  a9  a8",
+                          "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   x  a5  a4     a3  a2  a1  a0",
+                          "  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   x  a5  a4     a3  a2  a1  a0",
+                          "  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  a6   x   x      x   x   x   x",
+                          "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;
+       mode            = 0x41;
+       delay           = 10;
        blocksize       = 256;
        readsize        = 256;
       ;
@@ -4390,22 +4918,23 @@ part
   ;
 
 
+
 #------------------------------------------------------------
-# ATmega644
+# ATmega1284P
 #------------------------------------------------------------
 
-# similar to ATmega164
+# similar to ATmega164p
 
 part
-    id               = "m644";
-    desc             = "ATMEGA644";
+    id               = "m1284p";
+    desc             = "ATmega1284P";
     has_jtag         = yes;
     stk500_devcode   = 0x82; # no STK500v1 support, use the ATmega16 one
     avr910_devcode   = 0x74;
-    signature        = 0x1e 0x96 0x09;
+    signature        = 0x1e 0x97 0x05;
     pagel            = 0xd7;
     bs2              = 0xa0;
-    chip_erase_delay = 9000;
+    chip_erase_delay = 55000;
     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
                        "x x x x  x x x x    x x x x  x x x x";
 
@@ -4421,7 +4950,7 @@ part
     pollvalue          = 0x53;
     predelay           = 1;
     postdelay          = 1;
-    pollmethod         = 0;
+    pollmethod         = 1;
 
     pp_controlstack     =
         0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
@@ -4431,9 +4960,9 @@ part
     hventerstabdelay    = 100;
     progmodedelay       = 0;
     latchcycles         = 6;
-    togglevtg           = 0;
-    poweroffdelay       = 0;
-    resetdelayms        = 0;
+    togglevtg           = 1;
+    poweroffdelay       = 15;
+    resetdelayms        = 1;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
     chiperasepulsewidth = 0;
@@ -4447,10 +4976,12 @@ part
     spmcr               = 0x57;
     allowfullpagebitstream = no;
 
+    ocdrev              = 3;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 8;  /* for parallel programming */
-        size            = 2048;
+        size            = 4096;
         min_write_delay = 9000;
         max_write_delay = 9000;
         readback_p1     = 0xff;
@@ -4483,9 +5014,9 @@ part
 
     memory "flash"
         paged           = yes;
-        size            = 65536;
+        size            = 131072;
         page_size       = 256;
-        num_pages       = 256;
+        num_pages       = 512;
         min_write_delay = 4500;
         max_write_delay = 4500;
         readback_p1     = 0xff;
@@ -4515,8 +5046,8 @@ part
                           " a7   x   x   x      x   x   x   x",
                           "  x   x   x   x      x   x   x   x";
 
-       mode            = 0x21;
-       delay           = 6;
+       mode            = 0x41;
+       delay           = 10;
        blocksize       = 256;
        readsize        = 256;
       ;
@@ -4580,28 +5111,76 @@ part
         ;
   ;
 
+
+
 #------------------------------------------------------------
-# ATmega644P
+# ATmega162
 #------------------------------------------------------------
 
-# similar to ATmega164p
-
 part
-    id               = "m644p";
-    desc             = "ATMEGA644P";
+    id               = "m162";
+    desc             = "ATmega162";
     has_jtag         = yes;
-    stk500_devcode   = 0x82; # no STK500v1 support, use the ATmega16 one
-    avr910_devcode   = 0x74;
-    signature        = 0x1e 0x96 0x0a;
+    stk500_devcode   = 0x83;
+    avr910_devcode   = 0x63;
+    signature        = 0x1e 0x94 0x04;
+    chip_erase_delay = 9000;
     pagel            = 0xd7;
     bs2              = 0xa0;
-    chip_erase_delay = 9000;
+
+    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";
 
+    ocdrev              = 2;
+
+    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;
@@ -4617,7 +5196,7 @@ part
         0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 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;
+        0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
     hventerstabdelay    = 100;
     progmodedelay       = 0;
     latchcycles         = 6;
@@ -4633,319 +5212,248 @@ part
     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;
+        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    a11 a10  a9  a8",
+
+                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    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                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  a2  a1  a0",
+                         "  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    a11 a10  a9  a8",
-                         " a7  a6  a5  a4     a3   0   0   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;
+       delay           = 20;
+       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   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";
+    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";
-        min_write_delay = 9000;
-        max_write_delay = 9000;
-      ;
+        ;
 
     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";
-        min_write_delay = 9000;
-        max_write_delay = 9000;
-      ;
+        ;
 
     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";
-        min_write_delay = 9000;
-        max_write_delay = 9000;
       ;
 
+    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   x  x  x  x   x  x  x  x",
+
+        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 0 x  x x x x",
+        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";
         ;
-  ;
+;
 
 
 
 #------------------------------------------------------------
-# ATmega1284P
+# ATmega163
 #------------------------------------------------------------
 
-# 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;
+    id               = "m163";
+    desc             = "ATmega163";
+    stk500_devcode   = 0x81;
+    avr910_devcode   = 0x64;
+    signature        = 0x1e 0x94 0x02;
+    chip_erase_delay = 32000;
     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",
+    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;
+    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;
+        0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
     hventerstabdelay    = 100;
     progmodedelay       = 0;
-    latchcycles         = 6;
-    togglevtg           = 1;
-    poweroffdelay       = 15;
-    resetdelayms        = 1;
+    latchcycles         = 0;
+    togglevtg           = 0;
+    poweroffdelay       = 0;
+    resetdelayms        = 0;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
     chiperasepulsewidth = 0;
-    chiperasepolltimeout = 10;
+    chiperasepolltimeout = 30;
     programfusepulsewidth = 0;
-    programfusepolltimeout = 5;
+    programfusepolltimeout = 2;
     programlockpulsewidth = 0;
-    programlockpolltimeout = 5;
+    programlockpolltimeout = 2;
 
-    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;
+   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",
-                          "  0   0   x   x    a11 a10  a9  a8",
+                          "  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",
-                          "  0   0   x   x    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          "  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  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;
+        mode            = 0x41;
+        delay           = 20;
+        blocksize       = 4;
+        readsize        = 256;
       ;
 
     memory "flash"
         paged           = yes;
-        size            = 131072;
-        page_size       = 256;
-        num_pages       = 512;
-        min_write_delay = 4500;
-        max_write_delay = 4500;
+        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",
-                          "a15 a14 a13 a12    a11 a10  a9  a8",
+                          "  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",
-                          "a15 a14 a13 a12    a11 a10  a9  a8",
+                          "  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",
-                          "  0   0   x   x      x   x   x   x",
-                          "  x  a6  a5  a4     a3  a2  a1  a0",
+                          "  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",
-                          "  0   0   x   x      x   x   x   x",
-                          "  x  a6  a5  a4     a3  a2  a1  a0",
+                          "  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   x   x   x      x   x   x   x",
+                          "  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           = 10;
-       blocksize       = 256;
+       mode            = 0x11;
+       delay           = 20;
+       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;
+        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";
+                          "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 i i  i i i i";
-        min_write_delay = 9000;
-        max_write_delay = 9000;
+                          "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   o o o o  o o o o";
+                          "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   i i i i  i i i i";
-        min_write_delay = 9000;
-        max_write_delay = 9000;
+                          "x x x x  x x x x   1 1 1 1  1 i i i";
       ;
 
-    memory "efuse"
+    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";
 
-        read            = "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;
+        write           = "1 0 1 0  1 1 0 0   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"
@@ -4956,80 +5464,28 @@ part
 
     memory "calibration"
         size            = 1;
-
-        read            = "0 0 1 1  1 0 0 0   0 0 0 x  x x x x",
+        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";
-        ;
+      ;
   ;
 
-
-
 #------------------------------------------------------------
-# ATmega162
+# ATmega169
 #------------------------------------------------------------
 
 part
-    id               = "m162";
-    desc             = "ATMEGA162";
+    id               = "m169";
+    desc             = "ATmega169";
     has_jtag         = yes;
-    stk500_devcode   = 0x83;
-    avr910_devcode   = 0x63;
-    signature        = 0x1e 0x94 0x04;
+    stk500_devcode   = 0x85;
+    avr910_devcode   = 0x78;
+    signature        = 0x1e 0x94 0x05;
     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",
+    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 "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;
@@ -5039,7 +5495,7 @@ part
     pollvalue          = 0x53;
     predelay           = 1;
     postdelay          = 1;
-    pollmethod         = 0;
+    pollmethod         = 1;
 
     pp_controlstack     =
         0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
@@ -5048,10 +5504,10 @@ part
         0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
     hventerstabdelay    = 100;
     progmodedelay       = 0;
-    latchcycles         = 6;
-    togglevtg           = 0;
-    poweroffdelay       = 0;
-    resetdelayms        = 0;
+    latchcycles         = 5;
+    togglevtg           = 1;
+    poweroffdelay       = 15;
+    resetdelayms        = 1;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
     chiperasepulsewidth = 0;
@@ -5061,7 +5517,12 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
-    memory "eeprom"
+    idr                 = 0x31;
+    spmcr               = 0x57;
+
+    ocdrev              = 2;
+
+   memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 4;  /* for parallel programming */
         size            = 512;
@@ -5069,15 +5530,14 @@ part
         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",
+       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",
-                          "  0   0   x   x      x   x  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0",
+       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",
@@ -5086,7 +5546,7 @@ part
                          "  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",
+                         "  0   0   x   x      x   x   x  a8",
                          " a7  a6  a5  a4     a3  a2   0   0",
                          "  x   x   x   x      x   x   x   x";
 
@@ -5094,142 +5554,6 @@ part
        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"
@@ -5237,8 +5561,8 @@ part
         size            = 16384;
         page_size       = 128;
         num_pages       = 128;
-        min_write_delay = 16000;
-        max_write_delay = 16000;
+        min_write_delay = 4500;
+        max_write_delay = 4500;
         readback_p1     = 0xff;
         readback_p2     = 0xff;
         read_lo         = "  0   0   1   0      0   0   0   0",
@@ -5266,8 +5590,8 @@ part
                           " a7  a6   x   x      x   x   x   x",
                           "  x   x   x   x      x   x   x   x";
 
-       mode            = 0x11;
-       delay           = 20;
+       mode            = 0x41;
+       delay           = 6;
        blocksize       = 128;
        readsize        = 256;
       ;
@@ -5277,10 +5601,10 @@ part
         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";
+                          "x x x x  x 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 1 1  i i i i";
+                          "x x x x  x x x x   i i i i  i i i i";
       ;
 
     memory "hfuse"
@@ -5288,10 +5612,19 @@ part
         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";
+                          "x x x x  x 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   1 1 1 1  1 i i i";
+                          "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"
@@ -5299,7 +5632,7 @@ part
         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";
+                          "x x x x  x x x x   x x o o  o o o o";
 
         write           = "1 0 1 0  1 1 0 0   1 1 1 x  x x x x",
                           "x x x x  x x x x   1 1 i i  i i i i";
@@ -5307,28 +5640,29 @@ part
 
     memory "signature"
         size            = 3;
-        read            = "0  0  1  1   0  0  0  0   x  x  x  x   x  x  x  x",
+        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   x x x x  x x x x",
+        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";
       ;
   ;
 
 #------------------------------------------------------------
-# ATmega169
+# ATmega329
 #------------------------------------------------------------
 
 part
-    id               = "m169";
-    desc             = "ATMEGA169";
+    id               = "m329";
+    desc             = "ATmega329";
     has_jtag         = yes;
-    stk500_devcode   = 0x85;
-    avr910_devcode   = 0x78;
-    signature        = 0x1e 0x94 0x05;
+#    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";
@@ -5369,22 +5703,24 @@ part
     idr                 = 0x31;
     spmcr               = 0x57;
 
+    ocdrev              = 3;
+
    memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 4;  /* for parallel programming */
-        size            = 512;
+        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   x  a8",
+                          "  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   x  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          "  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",
@@ -5393,32 +5729,32 @@ part
                          "  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",
+                         "  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;
+       blocksize       = 8;
        readsize        = 256;
       ;
 
     memory "flash"
         paged           = yes;
-        size            = 16384;
+        size            = 32768;
         page_size       = 128;
-        num_pages       = 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   x   x a12    a11 a10  a9  a8",
+                          "  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   x   x a12    a11 a10  a9  a8",
+                          "  x a14 a13 a12    a11 a10  a9  a8",
                           " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  o   o   o   o      o   o   o   o";
 
@@ -5439,14 +5775,14 @@ part
 
        mode            = 0x41;
        delay           = 6;
-       blocksize       = 128;
+       blocksize       = 256;
        readsize        = 256;
       ;
 
     memory "lfuse"
         size            = 1;
-        min_write_delay = 2000;
-        max_write_delay = 2000;
+        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";
 
@@ -5456,8 +5792,8 @@ part
 
     memory "hfuse"
         size            = 1;
-        min_write_delay = 2000;
-        max_write_delay = 2000;
+        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";
 
@@ -5467,17 +5803,19 @@ part
 
     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";
+        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";
 
-        read            = "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 = 2000;
-        max_write_delay = 2000;
+        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";
 
@@ -5499,17 +5837,58 @@ part
   ;
 
 #------------------------------------------------------------
-# ATmega329
+# ATmega329P
+#------------------------------------------------------------
+# Identical to ATmega329 except of the signature
+
+part parent "m329"
+    id               = "m329p";
+    desc             = "ATmega329P";
+    signature        = 0x1e 0x95 0x0b;
+
+    ocdrev              = 3;
+  ;
+
+#------------------------------------------------------------
+# ATmega3290
+#------------------------------------------------------------
+
+# identical to ATmega329
+
+part parent "m329"
+    id               = "m3290";
+    desc             = "ATmega3290";
+    signature        = 0x1e 0x95 0x04;
+
+    ocdrev              = 3;
+  ;
+
+#------------------------------------------------------------
+# ATmega3290P
+#------------------------------------------------------------
+
+# identical to ATmega3290 except of the signature
+
+part parent "m3290"
+    id               = "m3290p";
+    desc             = "ATmega3290P";
+    signature        = 0x1e 0x95 0x0c;
+
+    ocdrev              = 3;
+  ;
+
+#------------------------------------------------------------
+# ATmega649
 #------------------------------------------------------------
 
 part
-    id               = "m329";
-    desc             = "ATMEGA329";
+    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 0x95 0x03;
+    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";
@@ -5550,32 +5929,34 @@ part
     idr                 = 0x31;
     spmcr               = 0x57;
 
+    ocdrev              = 3;
+
    memory "eeprom"
         paged           = no; /* leave this "no" */
-        page_size       = 4;  /* for parallel programming */
-        size            = 1024;
+        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   x  a9  a8",
+                          "  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   x  a9  a8",
+                          "  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   0  a1  a0",
+                         "  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  a2   0   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;
@@ -5586,36 +5967,36 @@ part
 
     memory "flash"
         paged           = yes;
-        size            = 32768;
-        page_size       = 128;
+        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",
+                          "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",
-                          "  x a14 a13 a12    a11 a10  a9  a8",
+                          "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",
+                          "  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   x  a5  a4     a3  a2  a1  a0",
+                          "  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  a6   x   x      x   x   x   x",
+                          " a7   x   x   x      x   x   x   x",
                           "  x   x   x   x      x   x   x   x";
 
        mode            = 0x41;
@@ -5682,19 +6063,34 @@ part
   ;
 
 #------------------------------------------------------------
-# ATmega329P
+# ATmega6490
+#------------------------------------------------------------
+
+# identical to ATmega649
+
+part parent "m649"
+    id               = "m6490";
+    desc             = "ATmega6490";
+    signature        = 0x1e 0x96 0x04;
+
+    ocdrev              = 3;
+  ;
+
+#------------------------------------------------------------
+# ATmega32
 #------------------------------------------------------------
-# Identical to ATmega329 except of the signature
 
 part
-    id               = "m329p";
-    desc             = "ATMEGA329P";
+    id               = "m32";
+    desc             = "ATmega32";
     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;
+    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";
 
@@ -5709,7 +6105,7 @@ part
     pollvalue          = 0x53;
     predelay           = 1;
     postdelay          = 1;
-    pollmethod         = 1;
+    pollmethod         = 0;
 
     pp_controlstack     =
         0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
@@ -5718,10 +6114,10 @@ part
         0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
     hventerstabdelay    = 100;
     progmodedelay       = 0;
-    latchcycles         = 5;
-    togglevtg           = 1;
-    poweroffdelay       = 15;
-    resetdelayms        = 1;
+    latchcycles         = 6;
+    togglevtg           = 0;
+    poweroffdelay       = 0;
+    resetdelayms        = 0;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
     chiperasepulsewidth = 0;
@@ -5733,22 +6129,25 @@ part
 
     idr                 = 0x31;
     spmcr               = 0x57;
+    allowfullpagebitstream = yes;
+
+    ocdrev              = 2;
 
    memory "eeprom"
-        paged           = no; /* leave this "no" */
-        page_size       = 4;  /* for parallel programming */
+        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",
+        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",
-                          "  x   x   x   x      x   x  a9  a8",
+        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";
 
@@ -5762,9 +6161,9 @@ part
                          " a7  a6  a5  a4     a3  a2   0   0",
                          "  x   x   x   x      x   x   x   x";
 
-       mode            = 0x41;
-       delay           = 20;
-       blocksize       = 8;
+       mode            = 0x04;
+       delay           = 10;
+       blocksize       = 64;
        readsize        = 256;
       ;
 
@@ -5778,40 +6177,40 @@ part
         readback_p1     = 0xff;
         readback_p2     = 0xff;
         read_lo         = "  0   0   1   0      0   0   0   0",
-                          "  x a14 a13 a12    a11 a10  a9  a8",
+                          "  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",
-                          "  x a14 a13 a12    a11 a10  a9  a8",
+                          "  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",
-                          "  x   x   x   x      x   x   x   x",
+                          "  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",
-                          "  x   x   x   x      x   x   x   x",
+                          "  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",
-                          "  x   x   x a12    a11 a10  a9  a8",
+                          "  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;
+       mode            = 0x21;
        delay           = 6;
-       blocksize       = 256;
+       blocksize       = 64;
        readsize        = 256;
       ;
 
     memory "lfuse"
         size            = 1;
-        min_write_delay = 4500;
-        max_write_delay = 4500;
+        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";
 
@@ -5821,8 +6220,8 @@ part
 
     memory "hfuse"
         size            = 1;
-        min_write_delay = 4500;
-        max_write_delay = 4500;
+        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";
 
@@ -5830,21 +6229,10 @@ part
                           "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;
+        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";
 
@@ -5854,32 +6242,30 @@ part
 
     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";
+        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";
+        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";
       ;
   ;
 
 #------------------------------------------------------------
-# ATmega3290
+# ATmega161
 #------------------------------------------------------------
 
-# 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;
+    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";
 
@@ -5894,7 +6280,7 @@ part
     pollvalue          = 0x53;
     predelay           = 1;
     postdelay          = 1;
-    pollmethod         = 1;
+    pollmethod         = 0;
 
     pp_controlstack     =
         0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
@@ -5903,72 +6289,57 @@ part
         0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
     hventerstabdelay    = 100;
     progmodedelay       = 0;
-    latchcycles         = 5;
-    togglevtg           = 1;
-    poweroffdelay       = 15;
-    resetdelayms        = 1;
+    latchcycles         = 0;
+    togglevtg           = 0;
+    poweroffdelay       = 0;
+    resetdelayms        = 0;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
     chiperasepulsewidth = 0;
-    chiperasepolltimeout = 10;
+    chiperasepolltimeout = 30;
     programfusepulsewidth = 0;
-    programfusepolltimeout = 5;
+    programfusepolltimeout = 2;
     programlockpulsewidth = 0;
-    programlockpolltimeout = 5;
-
-    idr                 = 0x31;
-    spmcr               = 0x57;
+    programlockpolltimeout = 2;
 
    memory "eeprom"
-        paged           = no; /* leave this "no" */
-        page_size       = 4;  /* for parallel programming */
-        size            = 1024;
-        min_write_delay = 9000;
-        max_write_delay = 9000;
+        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  a9  a8",
+                          "  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  a9  a8",
+                          "  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  a9  a8",
-                         " a7  a6  a5  a4     a3  a3   0   0",
-                         "  x   x   x   x      x   x   x   x";
-
-       mode            = 0x41;
-       delay           = 20;
-       blocksize       = 8;
+       mode            = 0x04;
+       delay           = 5;
+       blocksize       = 128;
        readsize        = 256;
       ;
 
     memory "flash"
         paged           = yes;
-        size            = 32768;
+        size            = 16384;
         page_size       = 128;
-        num_pages       = 256;
-        min_write_delay = 4500;
-        max_write_delay = 4500;
+        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 a14 a13 a12    a11 a10  a9  a8",
+                          "  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 a14 a13 a12    a11 a10  a9  a8",
+                          "  x   x   x a12    a11 a10  a9  a8",
                           " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  o   o   o   o      o   o   o   o";
 
@@ -5987,89 +6358,60 @@ part
                           " a7  a6   x   x      x   x   x   x",
                           "  x   x   x   x      x   x   x   x";
 
-       mode            = 0x41;
-       delay           = 6;
-       blocksize       = 256;
+       mode            = 0x21;
+       delay           = 16;
+       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"
+    memory "fuse"
         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";
+        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 0  0 1 0 0",
-                          "x x x x  x x x x   x x x x  x i i i";
+        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 = 4500;
-        max_write_delay = 4500;
+        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",
+        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";
-      ;
   ;
 
+
 #------------------------------------------------------------
-# ATmega3290P
+# ATmega8
 #------------------------------------------------------------
 
-# 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;
+    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 0  0 0 0 0",
+    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;
@@ -6079,21 +6421,22 @@ part
     pollvalue          = 0x53;
     predelay           = 1;
     postdelay          = 1;
-    pollmethod         = 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;
+       0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
+       0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 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;
+    resetdelayms        = 2;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
+    resetdelay          = 15;
     chiperasepulsewidth = 0;
     chiperasepolltimeout = 10;
     programfusepulsewidth = 0;
@@ -6101,87 +6444,72 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
-    idr                 = 0x31;
-    spmcr               = 0x57;
-
-   memory "eeprom"
-        paged           = no; /* leave this "no" */
-        page_size       = 4;  /* for parallel programming */
-        size            = 1024;
+    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",
-                          "  x   x   x   x      x   x  a9  a8",
+                          "  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",
-                          "  x   x   x   x      x   x  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0",
+                          "  0   0   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  a9  a8",
-                         " a7  a6  a5  a4     a3  a3   0   0",
-                         "  x   x   x   x      x   x   x   x";
-
-       mode            = 0x41;
+       mode            = 0x04;
        delay           = 20;
-       blocksize       = 8;
+       blocksize       = 128;
        readsize        = 256;
       ;
-
     memory "flash"
         paged           = yes;
-        size            = 32768;
-        page_size       = 128;
-        num_pages       = 256;
+        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 a14 a13 a12    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0",
-                          "  o   o   o   o      o   o   o   o";
+        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",
-                          "  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",
+                          "  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",
-                          "  x   x   x   x      x   x   x   x",
-                          "  x   x  a5  a4     a3  a2  a1  a0",
+                          "  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",
-                          "  x   x   x   x      x   x   x   x",
-                          "  x   x  a5  a4     a3  a2  a1  a0",
+                          "  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",
-                          "  x   x   x a12    a11 a10  a9  a8",
-                          " a7  a6   x   x      x   x   x   x",
+                          "  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       = 256;
+       mode            = 0x21;
+       delay           = 10;
+       blocksize       = 64;
        readsize        = 256;
       ;
 
     memory "lfuse"
         size            = 1;
-        min_write_delay = 4500;
-        max_write_delay = 4500;
+        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";
 
@@ -6191,8 +6519,8 @@ part
 
     memory "hfuse"
         size            = 1;
-        min_write_delay = 4500;
-        max_write_delay = 4500;
+        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";
 
@@ -6200,21 +6528,10 @@ part
                           "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;
+        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";
 
@@ -6222,37 +6539,38 @@ part
                           "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   0  0  0  x   x  x  x  x",
+        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";
-      ;
   ;
 
+
+
 #------------------------------------------------------------
-# ATmega649
+# ATmega8515
 #------------------------------------------------------------
 
 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;
+    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 0  0 0 0 0",
+    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;
@@ -6262,7 +6580,7 @@ part
     pollvalue          = 0x53;
     predelay           = 1;
     postdelay          = 1;
-    pollmethod         = 1;
+    pollmethod         = 0;
 
     pp_controlstack     =
         0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
@@ -6271,10 +6589,10 @@ part
         0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
     hventerstabdelay    = 100;
     progmodedelay       = 0;
-    latchcycles         = 5;
-    togglevtg           = 1;
-    poweroffdelay       = 15;
-    resetdelayms        = 1;
+    latchcycles         = 6;
+    togglevtg           = 0;
+    poweroffdelay       = 0;
+    resetdelayms        = 0;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
     chiperasepulsewidth = 0;
@@ -6284,80 +6602,64 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
-    idr                 = 0x31;
-    spmcr               = 0x57;
-
-   memory "eeprom"
-        paged           = no; /* leave this "no" */
-        page_size       = 8;  /* for parallel programming */
-        size            = 2048;
+    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",
-                          "  x   x   x   x      x a10  a9  a8",
+ 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",
-                          "  x   x   x   x      x a10  a9  a8",
+ 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";
 
-       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;
+       mode            = 0x04;
        delay           = 20;
-       blocksize       = 8;
+       blocksize       = 128;
        readsize        = 256;
       ;
-
     memory "flash"
         paged           = yes;
-        size            = 65536;
-        page_size       = 256;
-        num_pages       = 256;
+        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",
-                          "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_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",
-                          "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",
+                          "  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",
-                          "  x   x   x   x      x   x   x   x",
-                          "  x  a6  a5  a4     a3  a2  a1  a0",
+                          "  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",
-                          "  x   x   x   x      x   x   x   x",
-                          "  x  a6  a5  a4     a3  a2  a1  a0",
+                          "  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",
-                          "  x   x   x a12    a11 a10  a9  a8",
-                          " a7   x   x   x      x   x   x   x",
+                          "  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;
+       mode            = 0x21;
        delay           = 6;
-       blocksize       = 256;
+       blocksize       = 64;
        readsize        = 256;
       ;
 
@@ -6383,17 +6685,6 @@ part
                           "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;
@@ -6405,39 +6696,41 @@ part
                           "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   0  0  0  x   x  x  x  x",
+        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";
-      ;
   ;
 
+
+
+
 #------------------------------------------------------------
-# ATmega6490
+# ATmega8535
 #------------------------------------------------------------
 
-# 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;
+    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 0  0 0 0 0",
+    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;
@@ -6447,7 +6740,7 @@ part
     pollvalue          = 0x53;
     predelay           = 1;
     postdelay          = 1;
-    pollmethod         = 1;
+    pollmethod         = 0;
 
     pp_controlstack     =
         0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
@@ -6456,10 +6749,10 @@ part
         0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
     hventerstabdelay    = 100;
     progmodedelay       = 0;
-    latchcycles         = 5;
-    togglevtg           = 1;
-    poweroffdelay       = 15;
-    resetdelayms        = 1;
+    latchcycles         = 6;
+    togglevtg           = 0;
+    poweroffdelay       = 0;
+    resetdelayms        = 0;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
     chiperasepulsewidth = 0;
@@ -6469,97 +6762,71 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
-    idr                 = 0x31;
-    spmcr               = 0x57;
-
-   memory "eeprom"
-        paged           = no; /* leave this "no" */
-        page_size       = 8;  /* for parallel programming */
-        size            = 2048;
+    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",
-                          "  x   x   x   x      x a10  a9  a8",
+                          "  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",
-                          "  x   x   x   x      x a10  a9  a8",
+                          "  0   0   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  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;
+       mode            = 0x04;
        delay           = 20;
-       blocksize       = 8;
+       blocksize       = 128;
        readsize        = 256;
       ;
-
     memory "flash"
         paged           = yes;
-        size            = 65536;
-        page_size       = 256;
-        num_pages       = 256;
+        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",
-                          "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_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",
-                          "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",
+                          "  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",
-                          "  x   x   x   x      x   x   x   x",
-                          "  x  a6  a5  a4     a3  a2  a1  a0",
+                          "  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",
-                          "  x   x   x   x      x   x   x   x",
-                          "  x  a6  a5  a4     a3  a2  a1  a0",
+                          "  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",
-                          "  x   x   x a12    a11 a10  a9  a8",
-                          " a7   x   x   x      x   x   x   x",
+                          "  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;
+       mode            = 0x21;
        delay           = 6;
-       blocksize       = 256;
+       blocksize       = 64;
        readsize        = 256;
       ;
 
     memory "lfuse"
         size            = 1;
-        min_write_delay = 4500;
-        max_write_delay = 4500;
+        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";
 
@@ -6569,8 +6836,8 @@ part
 
     memory "hfuse"
         size            = 1;
-        min_write_delay = 4500;
-        max_write_delay = 4500;
+        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";
 
@@ -6578,21 +6845,10 @@ part
                           "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;
+        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";
 
@@ -6600,39 +6856,39 @@ part
                           "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   0  0  0  x   x  x  x  x",
+        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";
-      ;
   ;
 
+
 #------------------------------------------------------------
-# ATmega32
+# ATtiny26
 #------------------------------------------------------------
 
 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";
+    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";
 
-    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;
@@ -6645,16 +6901,16 @@ part
     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;
+        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         = 6;
-    togglevtg           = 0;
-    poweroffdelay       = 0;
-    resetdelayms        = 0;
+    latchcycles         = 5;
+    togglevtg           = 1;
+    poweroffdelay       = 15;
+    resetdelayms        = 2;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
     chiperasepulsewidth = 0;
@@ -6664,148 +6920,138 @@ part
     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;
+    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",
-                          "  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";
+        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";
 
-       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";
+        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            = 32768;
-        page_size       = 128;
-        num_pages       = 256;
+        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 a13 a12    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0",
-                          "  o   o   o   o      o   o   o   o";
+        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",
-                          "  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",
+                          "  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",
-                          "  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_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",
-                          "  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",
+                          "  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",
-                          "  0   0 a13 a12    a11 a10  a9  a8",
-                          " a7  a6   x   x      x   x   x   x",
-                          "  x   x   x   x      x   x   x   x";
+        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       = 64;
+       blocksize       = 16;
        readsize        = 256;
-      ;
+    ;
 
-    memory "lfuse"
+    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;
-        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";
+        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 0 1 0  0 0 0 0",
-                          "x x x x  x x x x   i i i i  i i i i";
-      ;
+        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 "hfuse"
+    memory "lfuse"
         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  0 0 0 0",
+                          "x x x x  x x x x  i i i i  i i i i";
 
-        write           = "1 0 1 0  1 1 0 0   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  0 0 0 0  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 "lock"
+    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  0 0 0 0",
-                          "x x x x  x x x x   x x o o  o o o o";
-
-        write           = "1 0 1 0  1 1 0 0   1 1 1 x  x x x x",
-                          "x x x x  x x x x   1 1 i i  i i i i";
-      ;
+        write           = "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";
 
-    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";
+        read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
+                          "x 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            = 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";
-      ;
-  ;
+        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";
+    ;
+
+;
+
 
 #------------------------------------------------------------
-# ATmega161
+# ATtiny261
 #------------------------------------------------------------
+# Close to ATtiny26
 
 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";
+    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";
 
-    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;
@@ -6818,134 +7064,184 @@ part
     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;
+        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         = 0;
-    togglevtg           = 0;
-    poweroffdelay       = 0;
-    resetdelayms        = 0;
+    latchcycles         = 5;
+    togglevtg           = 1;
+    poweroffdelay       = 15;
+    resetdelayms        = 2;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
     chiperasepulsewidth = 0;
-    chiperasepolltimeout = 30;
+    chiperasepolltimeout = 10;
     programfusepulsewidth = 0;
-    programfusepolltimeout = 2;
+    programfusepolltimeout = 5;
     programlockpulsewidth = 0;
-    programlockpolltimeout = 2;
+    programlockpolltimeout = 5;
 
-   memory "eeprom"
-        size            = 512;
-        min_write_delay = 3400;
-        max_write_delay = 3400;
+    ocdrev              = 1;
+
+    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  a8",
-                          " a7  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";
+        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";
 
-       mode            = 0x04;
-       delay           = 5;
-       blocksize       = 128;
+        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            = 16384;
-        page_size       = 128;
-        num_pages       = 128;
-        min_write_delay = 14000;
-        max_write_delay = 14000;
+        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 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";
+        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";
 
-        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";
+        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_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";
+        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";
 
-        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";
+        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";
 
-       mode            = 0x21;
-       delay           = 16;
-       blocksize       = 128;
+        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 "fuse"
+    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;
-        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";
+        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 0 1 x  x x x x",
-                          "x x x x  x x x x   1 i 1 i  i i i i";
+        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 "lock"
+    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  0 0 0 0",
-                          "x x 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 0  1 0 0 0",
+                          "x x x x  x x x x  i i i i  i i i i";
 
-        write           = "1 0 1 0  1 1 0 0   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  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 "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 "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 = 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";
+    ;
+
+;
 
 
 #------------------------------------------------------------
-# ATmega8
+# ATtiny461
 #------------------------------------------------------------
+# Close to ATtiny261
 
 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";
+    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;
 
-    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";
+    pgm_enable          = "1 0 1 0  1 1 0 0   0 1 0 1  0 0 1 1",
+                          "x x x x  x 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;
@@ -6959,10 +7255,10 @@ part
     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;
+        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;
@@ -6971,7 +7267,6 @@ part
     resetdelayms        = 2;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
-    resetdelay          = 15;
     chiperasepulsewidth = 0;
     chiperasepolltimeout = 10;
     programfusepulsewidth = 0;
@@ -6979,132 +7274,165 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
+    ocdrev              = 1;
+
     memory "eeprom"
-        size            = 512;
+        paged           = no;
+        size            = 256;
         page_size       = 4;
-        min_write_delay = 9000;
-        max_write_delay = 9000;
+        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",
-                          "  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";
+        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";
 
-       mode            = 0x04;
-       delay           = 20;
-       blocksize       = 128;
+        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            = 8192;
+        size            = 4096;
         page_size       = 64;
-        num_pages       = 128;
+        num_pages       = 64;
         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";
+        readback_p2     = 0xff;
 
-        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";
+        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";
 
-        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";
+        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_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";
+        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";
 
-        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";
+        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";
 
-       mode            = 0x21;
-       delay           = 10;
+        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;
-        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";
 
-        write           = "1 0 1 0  1 1 0 0   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;
-        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";
 
-        write           = "1 0 1 0  1 1 0 0   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 "lock"
+    memory "efuse"
         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 0 1 0  0 1 0 0",
+                          "x x x x  x x x x   x x x x  x x x i";
 
-        write           = "1 0 1 0  1 1 0 0   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  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 = 4500;
+        max_write_delay = 4500;
       ;
 
     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";
-      ;
-  ;
+        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";
+    ;
 
+;
 
 
 #------------------------------------------------------------
-# ATmega8515
+# ATtiny861
 #------------------------------------------------------------
+# Close to ATtiny461
 
 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";
+    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;
 
-    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";
+    pgm_enable          = "1 0 1 0  1 1 0 0   0 1 0 1  0 0 1 1",
+                          "x x x x  x 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;
@@ -7118,16 +7446,16 @@ part
     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;
+        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         = 6;
-    togglevtg           = 0;
-    poweroffdelay       = 0;
-    resetdelayms        = 0;
+    latchcycles         = 5;
+    togglevtg           = 1;
+    poweroffdelay       = 15;
+    resetdelayms        = 2;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
     chiperasepulsewidth = 0;
@@ -7137,27 +7465,40 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
+    ocdrev              = 1;
+
     memory "eeprom"
+        paged           = no;
         size            = 512;
-        min_write_delay = 9000;
-        max_write_delay = 9000;
+        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",
-                          "  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";
+        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";
 
-       mode            = 0x04;
-       delay           = 20;
-       blocksize       = 128;
+        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;
@@ -7167,99 +7508,175 @@ part
         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";
+        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";
 
-        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";
+        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_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";
+        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";
 
-        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";
+        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";
 
-       mode            = 0x21;
+        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 "lfuse"
+    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;
-        read            = "0 1 0 1  0 0 0 0   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"
+    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;
-        read            = "0 1 0 1  1 0 0 0   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"
+    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;
-        read            = "0 1 0 1  1 0 0 0   0 0 0 0  0 0 0 0",
-                          "x x x x  x x x x   x x o o  o o o o";
+      ;
 
-        write           = "1 0 1 0  1 1 0 0   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 "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 = 4500;
+        max_write_delay = 4500;
       ;
 
     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";
-      ;
+        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";
+    ;
+
+;
+
+
+#------------------------------------------------------------
+# ATtiny28
+#------------------------------------------------------------
+
+# This is an HVPP-only device.
+
+part
+    id                  = "t28";
+    desc                = "ATtiny28";
+    stk500_devcode      = 0x22;
+    avr910_devcode      = 0x5c;
+    signature           = 0x1e 0x91 0x07;
+
+    pp_controlstack     =
+        0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
+        0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 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 = 0;
+    chiperasepolltimeout = 10;
+    programfusepulsewidth = 0;
+    programfusepolltimeout = 5;
+    programlockpulsewidth = 0;
+    programlockpolltimeout = 5;
+
+    memory "flash"
+        size            = 2048;
+        page_size       = 2;
+        readsize        = 256;
+        delay           = 5;
+    ;
 
     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 "lock"
+        size            = 1;
+    ;
+
+    memory "calibration"
+        size            = 1;
+    ;
 
+    memory "fuse"
+        size            = 1;
+    ;
+;
 
 
 
 #------------------------------------------------------------
-# ATmega8535
+# ATmega48
 #------------------------------------------------------------
 
 part
-    id               = "m8535";
-    desc             = "ATMEGA8535";
-    stk500_devcode   = 0x64;
-    avr910_devcode   = 0x69;
-    signature        = 0x1e 0x93 0x08;
+    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              = 0xa0;
-    chip_erase_delay = 9000;
+    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";
 
@@ -7275,21 +7692,22 @@ part
     pollvalue          = 0x53;
     predelay           = 1;
     postdelay          = 1;
-    pollmethod         = 0;
+    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;
+       0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
+       0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 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;
+    latchcycles         = 5;
+    togglevtg           = 1;
+    poweroffdelay       = 15;
+    resetdelayms        = 1;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
+    resetdelay          = 15;
     chiperasepulsewidth = 0;
     chiperasepolltimeout = 10;
     programfusepulsewidth = 0;
@@ -7297,62 +7715,76 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
+    ocdrev              = 1;
+
     memory "eeprom"
-        size            = 512;
-        min_write_delay = 9000;
-        max_write_delay = 9000;
+        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   x   x      x   x   x  a8",
+                          "  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   x   x      x   x   x  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0",
+                          "  0   0   0   x      x   x   x   x",
+                          " a7  a6  a5  a4     a3  a2  a1  a0", 
                           "  i   i   i   i      i   i   i   i";
 
-       mode            = 0x04;
+       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           = 20;
-       blocksize       = 128;
+       blocksize       = 4;
        readsize        = 256;
       ;
     memory "flash"
         paged           = yes;
-        size            = 8192;
+        size            = 4096;
         page_size       = 64;
-        num_pages       = 128;
+        num_pages       = 64;
         min_write_delay = 4500;
         max_write_delay = 4500;
-        readback_p1     = 0xff;
-        readback_p2     = 0xff;
+        readback_p1     = 0x00;
+        readback_p2     = 0x00;
         read_lo         = "  0   0   1   0    0   0   0   0",
-                          "  0   0   0   0  a11 a10  a9  a8",
+                          "  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  a11 a10  a9  a8",
+                          "  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   0      x   x   x   x",
+                          "  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   0      x   x   x   x",
+                          "  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",
+                          "  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            = 0x21;
+       mode            = 0x41;
        delay           = 6;
        blocksize       = 64;
        readsize        = 256;
@@ -7360,8 +7792,8 @@ part
 
     memory "lfuse"
         size            = 1;
-        min_write_delay = 2000;
-        max_write_delay = 2000;
+        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";
 
@@ -7371,8 +7803,8 @@ part
 
     memory "hfuse"
         size            = 1;
-        min_write_delay = 2000;
-        max_write_delay = 2000;
+        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";
 
@@ -7380,10 +7812,21 @@ part
                           "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 x x i";
+      ;
+
     memory "lock"
         size            = 1;
-        min_write_delay = 2000;
-        max_write_delay = 2000;
+        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";
 
@@ -7392,37 +7835,65 @@ part
       ;
 
     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";
+        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",
+        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";
       ;
   ;
 
+#------------------------------------------------------------
+# ATmega48P
+#------------------------------------------------------------
+
+part parent "m48"
+    id               = "m48p";
+    desc             = "ATmega48P";
+    signature        = 0x1e 0x92 0x0a;
+
+    ocdrev              = 1;
+  ;
 
 #------------------------------------------------------------
-# ATtiny26
+# ATmega48PB
+#------------------------------------------------------------
+
+part parent "m48"
+    id               = "m48pb";
+    desc             = "ATmega48PB";
+    signature        = 0x1e 0x92 0x10;
+
+    ocdrev              = 1;
+  ;
+
+#------------------------------------------------------------
+# ATmega88
 #------------------------------------------------------------
 
 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";
+    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";
+    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;
@@ -7433,21 +7904,22 @@ part
     pollvalue          = 0x53;
     predelay           = 1;
     postdelay          = 1;
-    pollmethod         = 0;
+    pollmethod         = 1;
 
     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;
+       0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
+       0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 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;
+    resetdelayms        = 1;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
+    resetdelay          = 15;
     chiperasepulsewidth = 0;
     chiperasepolltimeout = 10;
     programfusepulsewidth = 0;
@@ -7455,162 +7927,211 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
+    ocdrev              = 1;
+
     memory "eeprom"
-        size            = 128;
-        min_write_delay = 9000;
-        max_write_delay = 9000;
+        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    x x x x  x x x x",
-                          "x a6 a5 a4  a3 a2 a1 a0    o o o o  o o o o";
+       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    x x x x  x x x x",
-                          "x a6 a5 a4  a3 a2 a1 a0    i i i i  i i i i";
+       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";
 
-       mode            = 0x04;
-       delay           = 10;
-       blocksize       = 64;
-       readsize        = 256;
-    ;
+       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            = 2048;
-        page_size       = 32;
-        num_pages       = 64;
+        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   x  x a9 a8",
-                          " a7 a6 a5 a4  a3 a2 a1 a0",
-                          "  o  o  o  o   o  o  o  o";
+        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",
-                          "  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",
+                          "  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",
-                          "  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_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",
-                          "  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",
+                          "  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",
-                          "  x  x  x  x   x  x a9 a8",
-                          " a7 a6 a5 a4   x  x  x  x",
-                          "  x  x  x  x   x  x  x  x";
+        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;
+       mode            = 0x41;
        delay           = 6;
-       blocksize       = 16;
+       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 "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";
 
-    memory "lock"
+        write           = "1 0 1 0  1 1 0 0   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;
-        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";
+        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 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;
-    ;
+        write           = "1 0 1 0  1 1 0 0   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 "lfuse"
+    memory "efuse"
         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";
+        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";
 
-        read            = "0 1 0 1  0 0 0 0  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;
+        write           = "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 "hfuse"
+    memory "lock"
         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";
+        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";
 
-        read            = "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;
+        write           = "1 0 1 0  1 1 0 0   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    x x x x  x x x x",
-                          "0  0  0  0   0  0 a1 a0    o o o o  o o o o";
-    ;
+        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";
+      ;
+  ;
+
+#------------------------------------------------------------
+# ATmega88P
+#------------------------------------------------------------
+
+part parent "m88"
+    id               = "m88p";
+    desc             = "ATmega88P";
+    signature        = 0x1e 0x93 0x0f;
 
+    ocdrev              = 1;
+  ;
 
 #------------------------------------------------------------
-# ATtiny261
+# ATmega88PB
+#------------------------------------------------------------
+
+part parent "m88"
+    id               = "m88pb";
+    desc             = "ATmega88PB";
+    signature        = 0x1e 0x93 0x16;
+
+    ocdrev              = 1;
+  ;
+
+#------------------------------------------------------------
+# ATmega168
 #------------------------------------------------------------
-# Close to ATtiny26
 
 part
-    id                  = "t261";
-    desc                = "ATTINY261";
+    id              = "m168";
+    desc            = "ATmega168";
      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";
+     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";
+    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;
+    timeout         = 200;
+    stabdelay       = 100;
+    cmdexedelay     = 25;
+    synchloops      = 32;
+    bytedelay       = 0;
+    pollindex       = 3;
+    pollvalue       = 0x53;
+    predelay        = 1;
+    postdelay       = 1;
+    pollmethod      = 1;
 
     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;
+       0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
+       0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 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;
+    resetdelayms        = 1;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
+    resetdelay          = 15;
     chiperasepulsewidth = 0;
     chiperasepolltimeout = 10;
     programfusepulsewidth = 0;
@@ -7618,21 +8139,25 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
+    ocdrev              = 1;
+
     memory "eeprom"
         paged           = no;
-        size            = 128;
         page_size       = 4;
-        num_pages       = 32;
-        min_write_delay = 4000;
-        max_write_delay = 4000;
+        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    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";
+        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",
@@ -7640,141 +8165,161 @@ part
                          "  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",
+                         "  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;
+       delay           = 20;
        blocksize       = 4;
        readsize        = 256;
-    ;
+        ;
 
     memory "flash"
         paged           = yes;
-        size            = 2048;
-        page_size       = 32;
-        num_pages       = 64;
+        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";
 
-        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;
-    ;
+        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 = 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;
-        write           = "1 0 1 0  1 1 0 0  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;
-      ;
-
+        read            = "0 1 0 1 1 0 0 0 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  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;
-      ;
-
+        read            = "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 "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";
-    ;
+        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";
+        ;
+;
+
+#------------------------------------------------------------
+# ATmega168P
+#------------------------------------------------------------
+
+part parent "m168"
+    id              = "m168p";
+    desc            = "ATmega168P";
+    signature       = 0x1e 0x94 0x0b;
 
+    ocdrev              = 1;
 ;
 
+#------------------------------------------------------------
+# ATmega168PB
+#------------------------------------------------------------
+
+part parent "m168"
+    id              = "m168pb";
+    desc            = "ATmega168PB";
+    signature       = 0x1e 0x94 0x15;
+
+    ocdrev              = 1;
+;
 
 #------------------------------------------------------------
-# ATtiny461
+# ATtiny88
 #------------------------------------------------------------
-# Close to ATtiny261
 
 part
-    id                  = "t461";
-    desc                = "ATTINY461";
+    id               = "t88";
+    desc             = "ATtiny88";
      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";
+     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";
+    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;
@@ -7785,21 +8330,22 @@ part
     pollvalue          = 0x53;
     predelay           = 1;
     postdelay          = 1;
-    pollmethod         = 0;
+    pollmethod         = 1;
 
     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;
+       0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
+       0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 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;
+    resetdelayms        = 1;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
+    resetdelay          = 15;
     chiperasepulsewidth = 0;
     chiperasepolltimeout = 10;
     programfusepulsewidth = 0;
@@ -7807,21 +8353,25 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
+    ocdrev              = 1;
+
     memory "eeprom"
         paged           = no;
-        size            = 256;
         page_size       = 4;
-        num_pages       = 64;
-        min_write_delay = 4000;
-        max_write_delay = 4000;
+        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";
 
-        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";
+       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",
@@ -7830,327 +8380,355 @@ part
 
        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  a6  a5  a4     a3  a2   0   0",
                          "  x   x   x   x      x   x   x   x";
 
        mode            = 0x41;
-       delay           = 10;
+       delay           = 20;
        blocksize       = 4;
-       readsize        = 256;
-    ;
-
+       readsize        = 64;
+      ;
     memory "flash"
         paged           = yes;
-        size            = 4096;
+        size            = 8192;
         page_size       = 64;
-        num_pages       = 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_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";
+        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",
-                          "  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_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",
-                          "  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",
+                          "  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",
-                          "  x  x  x  x   x a10 a9 a8",
-                          " a7 a6 a5  x   x   x  x  x",
-                          "  x  x  x  x   x   x  x  x";
+        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    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;
+        read            = "0 1 0 1  0 0 0 0   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;
-        write           = "1 0 1 0  1 1 0 0  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;
+        read            = "0 1 0 1  1 0 0 0   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 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";
+    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    x x x x  x x x x",
-                          "0  0  0  0   0  0  0  0    o o o o  o o o o";
-    ;
-
-;
+        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";
+      ;
+  ;
 
 #------------------------------------------------------------
-# ATtiny861
+# ATmega328
 #------------------------------------------------------------
-# 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";
+    id                 = "m328";
+    desc               = "ATmega328";
+    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 0x14;
+    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";
+    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;
+    timeout    = 200;
+    stabdelay  = 100;
+    cmdexedelay        = 25;
+    synchloops = 32;
+    bytedelay  = 0;
+    pollindex  = 3;
+    pollvalue  = 0x53;
+    predelay   = 1;
+    postdelay  = 1;
+    pollmethod = 1;
 
-    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;
+    pp_controlstack =
+       0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
+       0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 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;
-        size            = 512;
-        num_pages       = 128;
-        page_size       = 4;
-        min_write_delay = 4000;
-        max_write_delay = 4000;
-        readback_p1     = 0xff;
-        readback_p2     = 0xff;
+    ocdrev              = 1;
 
-        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";
+    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    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 = " 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";
+       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";
+       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;
+       delay           = 20;
        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";
+       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",
-                          "  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",
+                 " 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",
-                          "  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_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",
-                          "  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",
+                     " 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",
-                          "  x  x  x  x a11 a10 a9 a8",
-                          " a7 a6 a5  x   x   x  x  x",
-                          "  x  x  x  x   x   x  x  x";
+       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       = 64;
+       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 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";
+       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";
 
-        read            = "0 1 0 1  0 0 0 0  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;
-      ;
+       write = "1 0 1 0 1 1 0 0 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;
-        write           = "1 0 1 0  1 1 0 0  1 0 1 0  1 0 0 0",
-                          "x x x x  x x x x  i i i i  i i i i";
+       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";
 
-        read            = "0 1 0 1  1 0 0 0  0 0 0 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;
-      ;
+       write = "1 0 1 0 1 1 0 0 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  x x x i";
+       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";
 
-        read            = "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;
-      ;
+       write = "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    x x x x  x x x x",
-                          "0  0  0  0   0  0  0  0    o o o o  o o o o";
+       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";
+    ;
 ;
 
+part parent "m328"
+    id                 = "m328p";
+    desc               = "ATmega328P";
+    signature          = 0x1e 0x95 0x0F;
+
+    ocdrev              = 1;
+;
 
 #------------------------------------------------------------
-# ATmega48
+# ATmega32m1
+#------------------------------------------------------------
+
+part parent "m328"
+    id              = "m32m1";
+    desc            = "ATmega32M1";
+    # stk500_devcode   = 0x;
+    # avr910_devcode   = 0x;
+    signature       = 0x1e 0x95 0x84;
+    bs2             = 0xe2;
+
+    memory "efuse"
+        read            = "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 i i i i i i";
+    ;
+;
+
+#------------------------------------------------------------
+# ATtiny2313
 #------------------------------------------------------------
 
 part
-    id               = "m48";
-    desc             = "ATMEGA48";
+     id            = "t2313";
+     desc          = "ATtiny2313";
      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";
+     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;
 
-    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";
+     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
+                        "x x x x  x 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;
@@ -8164,10 +8742,10 @@ part
     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;
+        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;
@@ -8176,7 +8754,6 @@ part
     resetdelayms        = 1;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
-    resetdelay          = 15;
     chiperasepulsewidth = 0;
     chiperasepolltimeout = 10;
     programfusepulsewidth = 0;
@@ -8184,23 +8761,21 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
-    memory "eeprom"
+    ocdrev              = 0;
+
+     memory "eeprom"
+         size            = 128;
         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";
+         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",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
-                          "  i   i   i   i      i   i   i   i";
+         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",
@@ -8209,135 +8784,140 @@ part
 
        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  a6  a5  a4     a3  a2   0   0",
                          "  x   x   x   x      x   x   x   x";
 
        mode            = 0x41;
-       delay           = 20;
+       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     = 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";
+       ;
+     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 a10  a9  a8",
-                          " a7  a6  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  a4     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_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  a4     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";
 
-        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";
+# 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       = 64;
+       blocksize       = 32;
        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";
+       ;
+#   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;
+       ;
 
-        write           = "1 0 1 0  1 1 0 0   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 "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";
 
-    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";
+         read            = "0 1 0 1  0 0 0 0  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;
+       ;
 
-        write           = "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 "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";
 
-    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";
+         read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
+                           "x x x x  x x x x  o o o o  o o o o";
+        min_write_delay = 9000;
+        max_write_delay = 9000;
+       ;
 
-        write           = "1 0 1 0  1 1 0 0   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 "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";
 
-    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";
-      ;
+         read            = "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 "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            = 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";
+     ;
   ;
 
-
 #------------------------------------------------------------
-# ATmega88
+# ATtiny4313
 #------------------------------------------------------------
 
 part
-    id               = "m88";
-    desc             = "ATMEGA88";
+     id            = "t4313";
+     desc          = "ATtiny4313";
      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";
+     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 0x92 0x0d;
+     pagel            = 0xD4;
+     bs2              = 0xD6;
+     reset            = io;
+     chip_erase_delay = 9000;
 
-    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";
+     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
+                        "x x x x  x 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;
@@ -8351,10 +8931,10 @@ part
     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;
+        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;
@@ -8363,7 +8943,6 @@ part
     resetdelayms        = 1;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
-    resetdelay          = 15;
     chiperasepulsewidth = 0;
     chiperasepolltimeout = 10;
     programfusepulsewidth = 0;
@@ -8371,23 +8950,21 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
-    memory "eeprom"
+    ocdrev              = 0;
+
+     memory "eeprom"
+         size            = 256;
         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";
+         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  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
-                          "  i   i   i   i      i   i   i   i";
+         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",
@@ -8395,146 +8972,146 @@ part
                          "  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",
+                         "  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           = 20;
+       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";
+       ;
+     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  a11 a10  a9  a8",
-                          " a7  a6  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_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";
+         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";
+         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;
+       blocksize       = 32;
        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";
+       ;
+#   ATtiny4313 has Signature Bytes: 0x1E 0x92 0x0D.
+     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;
+       ;
 
-        write           = "1 0 1 0  1 1 0 0   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 "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";
 
-    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";
+         read            = "0 1 0 1  0 0 0 0  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;
+       ;
 
-        write           = "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 "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";
 
-    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";
+         read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
+                           "x x x x  x x x x  o o o o  o o o o";
+        min_write_delay = 9000;
+        max_write_delay = 9000;
+       ;
 
-        write           = "1 0 1 0  1 1 0 0   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 "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";
 
-    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";
-      ;
+         read            = "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 "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            = 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";
+     ;
   ;
 
 #------------------------------------------------------------
-# ATmega88P
+# AT90PWM2
 #------------------------------------------------------------
 
 part
-    id               = "m88p";
-    desc             = "ATMEGA88P";
+     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   = 0x73;
-#    avr910_devcode   = 0x;
-    signature        = 0x1e 0x93 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";
+                    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;
 
-    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";
+     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
+                        "x x x x  x x x x    x x x 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;
+     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,
@@ -8549,7 +9126,6 @@ part
     resetdelayms        = 1;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
-    resetdelay          = 15;
     chiperasepulsewidth = 0;
     chiperasepolltimeout = 10;
     programfusepulsewidth = 0;
@@ -8557,226 +9133,180 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
-    memory "eeprom"
+     memory "eeprom"
+         size            = 512;
         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";
+         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";
+         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";
+       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";
+       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           = 20;
-        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";
+       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";
+         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_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";
+         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";
+         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;
-      ;
+       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";
 
-    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";
+         read            = "0 1 0 1  1 0 0 0  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;
+       ;
 
-        write           = "1 0 1 0  1 1 0 0   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 "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";
 
-    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";
+         read            = "0 1 0 1  0 0 0 0  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;
+       ;
 
-        write           = "1 0 1 0  1 1 0 0   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 "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";
 
-    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";
+         read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
+                           "x x x x  x x x x  o o o o  o o o o";
+        min_write_delay = 9000;
+        max_write_delay = 9000;
+       ;
 
-        write           = "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 "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";
 
-    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";
+         read            = "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;
+     ;
 
-        write           = "1 0 1 0  1 1 0 0   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 "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
+#------------------------------------------------------------
 
-    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";
-      ;
-  ;
+# Completely identical to AT90PWM2 (including the signature!)
 
+part parent "pwm2"
+     id            = "pwm3";
+     desc          = "AT90PWM3";
+  ;
 
 #------------------------------------------------------------
-# ATmega168
+# AT90PWM2B
 #------------------------------------------------------------
+# Same as AT90PWM2 but different signature.
 
-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";
+part parent "pwm2"
+     id            = "pwm2b";
+     desc          = "AT90PWM2B";
+     signature     = 0x1e 0x93 0x83;
 
-    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";
+    ocdrev              = 1;
+  ;
 
-    timeout         = 200;
-    stabdelay       = 100;
-    cmdexedelay     = 25;
-    synchloops      = 32;
-    bytedelay       = 0;
-    pollindex       = 3;
-    pollvalue       = 0x53;
-    predelay        = 1;
-    postdelay       = 1;
-    pollmethod      = 1;
+#------------------------------------------------------------
+# AT90PWM3B
+#------------------------------------------------------------
 
-    pp_controlstack     =
-       0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
-       0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 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;
+# Completely identical to AT90PWM2B (including the signature!)
 
-    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";
+part parent "pwm2b"
+     id            = "pwm3b";
+     desc          = "AT90PWM3B";
 
-       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";
+    ocdrev              = 1;
+  ;
 
-       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";
+#------------------------------------------------------------
+# AT90PWM316
+#------------------------------------------------------------
 
-       mode            = 0x41;
-       delay           = 20;
-       blocksize       = 4;
-       readsize        = 256;
-        ;
+# Similar to AT90PWM3B, but with 16 kiB flash, 512 B EEPROM, and 1024 B SRAM.
+
+part parent "pwm3b"
+     id            = "pwm316";
+     desc          = "AT90PWM316";
+     signature     = 0x1e 0x94 0x83;
+
+    ocdrev              = 1;
 
     memory "flash"
         paged           = yes;
@@ -8787,2123 +9317,55 @@ part
         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";
+        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";
 
-        mode        = 0x41;
-        delay       = 6;
-        blocksize   = 128;
-        readsize    = 256;
+        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";
 
-        ;
-        
-    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";
-        ;
-;
-
-#------------------------------------------------------------
-# ATmega168P
-#------------------------------------------------------------
-
-part
-    id              = "m168p";
-    desc            = "ATMEGA168P";
-     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 0x0b;
-    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           = 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",
-                          " 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           = 20;
-       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           = 20;
-       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";
-     ;
-  ;
-
-#------------------------------------------------------------
-# ATtiny4313
-#------------------------------------------------------------
-
-part
-     id            = "t4313";
-     desc          = "ATtiny4313";
-     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 0x92 0x0d;
-     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            = 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",
-                         " 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;
-       ;
-#   ATtiny4313 has Signature Bytes: 0x1E 0x92 0x0D.
-     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;
-     ;
-
-     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_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   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   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  0  0   0 a10 a9 a8",
-                           " a7 a6 a5  x   x  x  x  x",
-                           "  x  x  x  x   x  x  x  x";
+        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;
+       mode            = 0x21;
        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";
-     ;
+       blocksize       = 128;
+       readsize        = 256;
+      ;
   ;
 
 #------------------------------------------------------------
-# ATtiny85
+# AT90PWM216
+#------------------------------------------------------------
+# Completely identical to AT90PWM316 (including the signature!)
+
+part parent "pwm316"
+     id = "pwm216";
+     desc = "AT90PWM216";
+  ; 
+
+#------------------------------------------------------------
+# ATtiny25
 #------------------------------------------------------------
 
 part
-     id            = "t85";
-     desc          = "ATtiny85";
+     id            = "t25";
+     desc          = "ATtiny25";
      has_debugwire = yes;
      flash_instr   = 0xB4, 0x02, 0x12;
      eeprom_instr  = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D,
@@ -10914,7 +9376,7 @@ part
 ##  avr910_devcode   = ?;
 ##  Try the AT90S2313 devcode:
      avr910_devcode   = 0x20;
-     signature        = 0x1e 0x93 0x0b;
+     signature        = 0x1e 0x91 0x08;
      reset            = io;
      chip_erase_delay = 4500;
 
@@ -10955,19 +9417,21 @@ part
     programfusepolltimeout = 25;
     programlockpolltimeout = 25;
 
+    ocdrev              = 1;
+
      memory "eeprom"
-         size            = 512;
+         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 a8",
-                           "a7 a6 a5 a4  a3 a2 a1 a0   o o o o  o o o o";
+         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 a8",
-                           "a7 a6 a5 a4  a3 a2 a1 a0   i i i i  i i i i";
+         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",
@@ -10975,8 +9439,8 @@ part
                          "  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",
+                         "  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;
@@ -10986,36 +9450,36 @@ part
        ;
      memory "flash"
          paged           = yes;
-         size            = 8192;
-         page_size       = 64;
-         num_pages       = 128;
+         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  a11 a10  a9  a8",
+                           "  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  a11 a10  a9  a8",
+                           "  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  a4   a3  a2  a1  a0",
+                           "  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  a4   a3  a2  a1  a0",
+                           "  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  a11 a10 a9 a8",
-                           " a7 a6 a5  x   x  x  x  x",
+         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;
@@ -11023,7 +9487,7 @@ part
        blocksize       = 32;
        readsize        = 256;
        ;
-#   ATtiny85 has Signature Bytes: 0x1E 0x93 0x08.
+#   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",
@@ -11033,6 +9497,8 @@ part
          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",
+                           "0 0 0 0  0 0 0 0  o o o o  o o o o";
         min_write_delay = 9000;
         max_write_delay = 9000;
        ;
@@ -11071,221 +9537,37 @@ part
      ;
 
      memory "calibration"
-         size            = 2;
+         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";
      ;
   ;
 
 #------------------------------------------------------------
-# ATmega640
+# ATtiny45
 #------------------------------------------------------------
-# 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
-#------------------------------------------------------------
+     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;
 
-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";
+     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
+                        "x x x x  x 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";
+     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;
@@ -11298,183 +9580,178 @@ part
     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;
+    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;
-    latchcycles         = 5;
+    hvspcmdexedelay     = 0;
+    synchcycles         = 6;
+    latchcycles         = 1;
     togglevtg           = 1;
-    poweroffdelay       = 15;
+    poweroffdelay       = 25;
     resetdelayms        = 1;
     resetdelayus        = 0;
-    hvleavestabdelay    = 15;
-    chiperasepulsewidth = 0;
-    chiperasepolltimeout = 10;
-    programfusepulsewidth = 0;
-    programfusepolltimeout = 5;
-    programlockpulsewidth = 0;
-    programlockpolltimeout = 5;
+    hvleavestabdelay    = 100;
+    resetdelay          = 25;
+    chiperasepolltimeout = 40;
+    chiperasetime       = 0;
+    programfusepolltimeout = 25;
+    programlockpolltimeout = 25;
 
-    idr                 = 0x31;
-    spmcr               = 0x57;
-    rampz               = 0x3b;
-    allowfullpagebitstream = no;
+    ocdrev              = 1;
 
-    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";
+     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",
-                          "  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           = "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  a2  a1  a0",
+                         "  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    a11 a10  a9  a8",
-                         " a7  a6  a5  a4     a3   0   0   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       = 8;
+       delay           = 6;
+       blocksize       = 4;
        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";
+       ;
+     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",
-                          "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",
+                           "  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",
-                          "  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     = "  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",
-                          "  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",
+                           "  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",
-                          "a15 a14 a13 a12    a11 a10  a9  a8",
-                          " a7   x   x   x      x   x   x   x",
-                          "  x   x   x   x      x   x   x   x";
+         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           = 10;
-       blocksize       = 256;
+       delay           = 6;
+       blocksize       = 32;
        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";
+       ;
+#   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";
+         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 "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";
+     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  1 0 0 0  0 0 0 0  1 0 0 0",
-                          "x x x x  x x x x  o o o o  o o o o";
+         read            = "0 1 0 1  0 0 0 0  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 "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";
+     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  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";
+         read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
+                           "x 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";
+     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";
 
-        write           = "1 0 1 0  1 1 0 0   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  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    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";
-      ;
+     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";
+     ;
   ;
 
 #------------------------------------------------------------
-# ATmega1281
+# ATtiny85
 #------------------------------------------------------------
-# 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";
+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 0  0 0 0 0",
-                       "x x x x  x 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;
@@ -11487,170 +9764,161 @@ part
     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;
+    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;
-    latchcycles         = 5;
+    hvspcmdexedelay     = 0;
+    synchcycles         = 6;
+    latchcycles         = 1;
     togglevtg           = 1;
-    poweroffdelay       = 15;
+    poweroffdelay       = 25;
     resetdelayms        = 1;
     resetdelayus        = 0;
-    hvleavestabdelay    = 15;
-    chiperasepulsewidth = 0;
-    chiperasepolltimeout = 10;
-    programfusepulsewidth = 0;
-    programfusepolltimeout = 5;
-    programlockpulsewidth = 0;
-    programlockpolltimeout = 5;
+    hvleavestabdelay    = 100;
+    resetdelay          = 25;
+    chiperasepolltimeout = 40;
+    chiperasetime       = 0;
+    programfusepolltimeout = 25;
+    programlockpolltimeout = 25;
 
-    idr                 = 0x31;
-    spmcr               = 0x57;
-    rampz               = 0x3b;
-    allowfullpagebitstream = no;
+    ocdrev              = 1;
 
-    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";
+     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",
-                          "  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           = "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  a2  a1  a0",
+                         "  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    a11 a10  a9  a8",
-                         " a7  a6  a5  a4     a3   0   0   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       = 8;
+       delay           = 6;
+       blocksize       = 4;
        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";
+       ;
+     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",
-                          "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",
+                           "  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",
-                          "  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     = "  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",
-                          "  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",
+                           "  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",
-                          "a15 a14 a13 a12    a11 a10  a9  a8",
-                          " a7   x   x   x      x   x   x   x",
-                          "  x   x   x   x      x   x   x   x";
+         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           = 10;
-       blocksize       = 256;
+       delay           = 6;
+       blocksize       = 32;
        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";
+       ;
+#   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";
+         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 "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";
+     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  1 0 0 0  0 0 0 0  1 0 0 0",
-                          "x x x x  x x x x  o o o o  o o o o";
+         read            = "0 1 0 1  0 0 0 0  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 "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";
+     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  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";
+         read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
+                           "x 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";
+     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";
 
-        write           = "1 0 1 0  1 1 0 0   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  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    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";
-      ;
+     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";
+     ;
   ;
 
 #------------------------------------------------------------
-# ATmega2560
+# ATmega640
 #------------------------------------------------------------
+# Almost same as ATmega1280, except for different memory sizes
 
 part
-    id               = "m2560";
-    desc             = "ATMEGA2560";
-    signature        = 0x1e 0x98 0x01;
+    id               = "m640";
+    desc             = "ATmega640";
+    signature        = 0x1e 0x96 0x08;
     has_jtag         = yes;
 #    stk500_devcode   = 0xB2;
 #    avr910_devcode   = 0x43;
@@ -11679,7 +9947,7 @@ part
         0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 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;
+        0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
     hventerstabdelay    = 100;
     progmodedelay       = 0;
     latchcycles         = 5;
@@ -11700,6 +9968,8 @@ part
     rampz               = 0x3b;
     allowfullpagebitstream = no;
 
+    ocdrev              = 3;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 8;  /* for parallel programming */
@@ -11736,20 +10006,20 @@ part
 
     memory "flash"
         paged           = yes;
-        size            = 262144;
+        size            = 65536;
         page_size       = 256;
-        num_pages       = 1024;
+        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",
-                          "a15 a14 a13 a12    a11 a10  a9  a8",
+                          "  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",
-                          "a15 a14 a13 a12    a11 a10  a9  a8",
+                          "  0 a14 a13 a12    a11 a10  a9  a8",
                           " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  o   o   o   o      o   o   o   o";
 
@@ -11764,15 +10034,10 @@ part
                           "  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",
+                          "  0 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;
@@ -11837,13 +10102,13 @@ part
   ;
 
 #------------------------------------------------------------
-# ATmega2561
+# ATmega1280
 #------------------------------------------------------------
 
 part
-    id               = "m2561";
-    desc             = "ATMEGA2561";
-    signature        = 0x1e 0x98 0x02;
+    id               = "m1280";
+    desc             = "ATmega1280";
+    signature        = 0x1e 0x97 0x03;
     has_jtag         = yes;
 #    stk500_devcode   = 0xB2;
 #    avr910_devcode   = 0x43;
@@ -11872,7 +10137,7 @@ part
         0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 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;
+        0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
     hventerstabdelay    = 100;
     progmodedelay       = 0;
     latchcycles         = 5;
@@ -11893,6 +10158,8 @@ part
     rampz               = 0x3b;
     allowfullpagebitstream = no;
 
+    ocdrev              = 3;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 8;  /* for parallel programming */
@@ -11929,9 +10196,9 @@ part
 
     memory "flash"
         paged           = yes;
-        size            = 262144;
+        size            = 131072;
         page_size       = 256;
-        num_pages       = 1024;
+        num_pages       = 512;
         min_write_delay = 4500;
         max_write_delay = 4500;
         readback_p1     = 0x00;
@@ -11961,11 +10228,6 @@ part
                           " 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;
@@ -12030,20 +10292,32 @@ part
   ;
 
 #------------------------------------------------------------
-# ATmega128RFA1
+# ATmega1281
+#------------------------------------------------------------
+# Identical to ATmega1280
+
+part parent "m1280"
+    id               = "m1281";
+    desc             = "ATmega1281";
+    signature        = 0x1e 0x97 0x04;
+
+    ocdrev              = 3;
+  ;
+
+#------------------------------------------------------------
+# ATmega2560
 #------------------------------------------------------------
-# Identical to ATmega2561 but half the ROM
 
 part
-    id               = "m128rfa1";
-    desc             = "ATMEGA128RFA1";
-    signature        = 0x1e 0xa7 0x01;
+    id               = "m2560";
+    desc             = "ATmega2560";
+    signature        = 0x1e 0x98 0x01;
     has_jtag         = yes;
-#    stk500_devcode   = 0xB2;
+    stk500_devcode   = 0xB2;
 #    avr910_devcode   = 0x43;
-    chip_erase_delay = 55000;
+    chip_erase_delay = 9000;
     pagel            = 0xD7;
-    bs2              = 0xE2;
+    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";
@@ -12087,12 +10361,14 @@ part
     rampz               = 0x3b;
     allowfullpagebitstream = no;
 
+    ocdrev              = 4;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 8;  /* for parallel programming */
         size            = 4096;
-        min_write_delay = 50000;
-        max_write_delay = 50000;
+        min_write_delay = 9000;
+        max_write_delay = 9000;
         readback_p1     = 0x00;
         readback_p2     = 0x00;
         read            = "  1   0   1   0      0   0   0   0",
@@ -12123,11 +10399,11 @@ part
 
     memory "flash"
         paged           = yes;
-        size            = 131072;
+        size            = 262144;
         page_size       = 256;
-        num_pages       = 512;
-        min_write_delay = 50000;
-        max_write_delay = 50000;
+        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",
@@ -12155,8 +10431,13 @@ part
                           " 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           = 20;
+       delay           = 10;
        blocksize       = 256;
        readsize        = 256;
       ;
   ;
 
 #------------------------------------------------------------
-# ATtiny24
+# ATmega2561
 #------------------------------------------------------------
 
-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;
+part parent "m2560"
+    id               = "m2561";
+    desc             = "ATmega2561";
+    signature        = 0x1e 0x98 0x02;
 
-     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
-                        "x x x x  x x x x    x x x x  x x x x";
+    ocdrev              = 4;
+  ;
 
-     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";
+#------------------------------------------------------------
+# ATmega128RFA1
+#------------------------------------------------------------
+# Identical to ATmega2561 but half the ROM
 
-    timeout            = 200;
-    stabdelay          = 100;
-    cmdexedelay                = 25;
-    synchloops         = 32;
-    bytedelay          = 0;
-    pollindex          = 3;
-    pollvalue          = 0x53;
-    predelay           = 1;
-    postdelay          = 1;
-    pollmethod         = 1;
+part parent "m2561"
+    id               = "m128rfa1";
+    desc             = "ATmega128RFA1";
+    signature        = 0x1e 0xa7 0x01;
+    chip_erase_delay = 55000;
+    bs2              = 0xE2;
 
-    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;
+    ocdrev              = 3;
 
-     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";
+    memory "flash"
+        paged           = yes;
+        size            = 131072;
+        page_size       = 256;
+        num_pages       = 512;
+        min_write_delay = 50000;
+        max_write_delay = 50000;
+        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";
 
-         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";
+        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     = "  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";
+        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";
 
-       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";
+        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       = 4;
+       delay           = 20;
+       blocksize       = 256;
        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";
+#------------------------------------------------------------
+# ATmega256RFR2
+#------------------------------------------------------------
 
-         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";
+part parent "m2561"
+    id               = "m256rfr2";
+    desc             = "ATmega256RFR2";
+    signature        = 0x1e 0xa8 0x02;
+    chip_erase_delay = 18500;
+    bs2              = 0xE2;
 
-         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";
+    memory "eeprom"
+        paged           = no; /* leave this "no" */
+        page_size       = 8;  /* for parallel programming */
+        size            = 8192;
+        min_write_delay = 13000;
+        max_write_delay = 13000;
+        readback_p1     = 0x00;
+        readback_p2     = 0x00;
+        read            = "  1   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";
 
-         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";
+        write           = "  1   1   0   0      0   0   0   0",
+                          "  x   x   x a12    a11 a10  a9  a8",
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
+                          "  i   i   i   i      i   i   i   i";
 
-       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;
-       ;
+       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";
 
-     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";
+       writepage       = "  1   1   0   0      0   0   1   0",
+                         "  0   0   x a12    a11 a10  a9  a8",
+                         " a7  a6  a5  a4     a3   0   0   0",
+                         "  x   x   x   x      x   x   x   x";
 
-         read            = "0 1 0 1  0 0 0 0  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;
-       ;
+       mode            = 0x41;
+       delay           = 10;
+       blocksize       = 8;
+       readsize        = 256;
+      ;
 
-     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;
-       ;
+    ocdrev              = 4;
+  ;
 
-     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";
+#------------------------------------------------------------
+# ATmega128RFR2
+#------------------------------------------------------------
 
-         read            = "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;
-     ;
+part parent "m128rfa1"
+    id               = "m128rfr2";
+    desc             = "ATmega128RFR2";
+    signature        = 0x1e 0xa7 0x02;
 
-     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";
-     ;
+
+    ocdrev              = 3;
   ;
 
 #------------------------------------------------------------
-# ATtiny44
+# ATmega64RFR2
 #------------------------------------------------------------
 
-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";
+part parent "m128rfa1"
+    id               = "m64rfr2";
+    desc             = "ATmega64RFR2";
+    signature        = 0x1e 0xa6 0x02;
 
-     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;
+    ocdrev              = 3;
 
-    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 "flash"
+        paged           = yes;
+        size            = 65536;
+        page_size       = 256;
+        num_pages       = 256;
+        min_write_delay = 50000;
+        max_write_delay = 50000;
+        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";
 
-     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";
+        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";
 
-         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     = "  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_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";
+        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       = "  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";
+        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       = 4;
+       delay           = 20;
+       blocksize       = 256;
        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";
+    memory "eeprom"
+        paged           = no; /* leave this "no" */
+        page_size       = 8;  /* for parallel programming */
+        size            = 2048;
+        min_write_delay = 13000;
+        max_write_delay = 13000;
+        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";
 
-         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";
+        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_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";
+       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       = "  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";
+       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           = 6;
-       blocksize       = 32;
+       delay           = 10;
+       blocksize       = 8;
        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";
+#------------------------------------------------------------
+# ATmega2564RFR2
+#------------------------------------------------------------
 
-         read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
-                           "x x x x  x x x x  o o o o  o o o o";
-        min_write_delay = 9000;
-        max_write_delay = 9000;
-       ;
+part parent "m256rfr2"
+    id               = "m2564rfr2";
+    desc             = "ATmega2564RFR2";
+    signature        = 0x1e 0xa8 0x03;
+  ;
 
-     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";
+#------------------------------------------------------------
+# ATmega1284RFR2
+#------------------------------------------------------------
 
-         read            = "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;
-     ;
+part parent "m128rfr2"
+    id               = "m1284rfr2";
+    desc             = "ATmega1284RFR2";
+    signature        = 0x1e 0xa7 0x03;
+  ;
 
-     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";
-     ;
+#------------------------------------------------------------
+# ATmega644RFR2
+#------------------------------------------------------------
+
+part parent "m64rfr2"
+    id               = "m644rfr2";
+    desc             = "ATmega644RFR2";
+    signature        = 0x1e 0xa6 0x03;
   ;
 
 #------------------------------------------------------------
-# ATtiny84
+# ATtiny24
 #------------------------------------------------------------
 
 part
-     id            = "t84";
-     desc          = "ATtiny84";
+     id            = "t24";
+     desc          = "ATtiny24";
      has_debugwire = yes;
      flash_instr   = 0xB4, 0x07, 0x17;
      eeprom_instr  = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D,
@@ -12599,7 +10764,7 @@ part
 ##  avr910_devcode   = ?;
 ##  Try the AT90S2313 devcode:
      avr910_devcode   = 0x20;
-     signature        = 0x1e 0x93 0x0c;
+     signature        = 0x1e 0x91 0x0b;
      reset            = io;
      chip_erase_delay = 4500;
 
@@ -12640,19 +10805,21 @@ part
     programfusepolltimeout = 25;
     programlockpolltimeout = 25;
 
+    ocdrev              = 1;
+
      memory "eeprom"
-         size            = 512;
+         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 a8",
-                           "a7 a6 a5 a4  a3 a2 a1 a0   o o o o  o o o o";
+         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 a8",
-                           "a7 a6 a5 a4  a3 a2 a1 a0   i i i i  i i i i";
+         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",
@@ -12671,36 +10838,36 @@ part
        ;
      memory "flash"
          paged           = yes;
-         size            = 8192;
-         page_size       = 64;
-         num_pages       = 128;
+         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  a11 a10  a9  a8",
+                           "  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  a11 a10  a9  a8",
+                           "  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  a4   a3  a2  a1  a0",
+                           "  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  a4   a3  a2  a1  a0",
+                           "  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  a11 a10 a9 a8",
-                           " a7 a6 a5  x   x  x  x  x",
+         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;
@@ -12708,13 +10875,12 @@ part
        blocksize       = 32;
        readsize        = 256;
        ;
-#   ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C.
+#   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",
@@ -12766,213 +10932,31 @@ part
   ;
 
 #------------------------------------------------------------
-# 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
+# ATtiny44
 #------------------------------------------------------------
 
 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";
+     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;
 
-    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";
+     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
+                        "x x x x  x 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;
     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;
+    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;
-    progmodedelay       = 0;
-    latchcycles         = 5;
+    hvspcmdexedelay     = 0;
+    synchcycles         = 6;
+    latchcycles         = 1;
     togglevtg           = 1;
-    poweroffdelay       = 15;
-    resetdelayms        = 1;
-    resetdelayus        = 0;
-    hvleavestabdelay    = 15;
-    chiperasepulsewidth = 0;
-    chiperasepolltimeout = 10;
-    programfusepulsewidth = 0;
-    programfusepolltimeout = 5;
-    programlockpulsewidth = 0;
-    programlockpolltimeout = 5;
+    poweroffdelay       = 25;
+    resetdelayms        = 0;
+    resetdelayus        = 70;
+    hvleavestabdelay    = 100;
+    resetdelay          = 25;
+    chiperasepolltimeout = 40;
+    chiperasetime       = 0;
+    programfusepolltimeout = 25;
+    programlockpolltimeout = 25;
 
-    idr                 = 0x31;
-    spmcr               = 0x57;
-    rampz               = 0x3b;
-    allowfullpagebitstream = no;
+    ocdrev              = 1;
 
-    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";
+     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",
-                          "  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           = "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  a2  a1  a0",
+                         "  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   0   0   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       = 8;
+       delay           = 6;
+       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     = 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";
+       ;
+     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 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   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",
-                          "  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     = "  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",
-                          "  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",
+                           "  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 a14 a13 a12    a11 a10  a9  a8",
-                          " a7   x   x   x      x   x   x   x",
-                          "  x   x   x   x      x   x   x   x";
+         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       = 256;
+       blocksize       = 32;
        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";
+       ;
+#   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 "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";
+     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  1 0 0 0  0 0 0 0  1 0 0 0",
-                          "x x x x  x x x x  o o o o  o o o o";
+         read            = "0 1 0 1  0 0 0 0  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 "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";
+     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  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";
+         read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
+                           "x 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";
+     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";
 
-        write           = "1 0 1 0  1 1 0 0   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  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    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";
-      ;
+     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";
+     ;
   ;
 
 #------------------------------------------------------------
-# AT90USB647
+# ATtiny84
 #------------------------------------------------------------
-# 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";
+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 0  0 0 0 0",
-                       "x x x x  x 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;
     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;
+    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;
-    progmodedelay       = 0;
-    latchcycles         = 5;
+    hvspcmdexedelay     = 0;
+    synchcycles         = 6;
+    latchcycles         = 1;
     togglevtg           = 1;
-    poweroffdelay       = 15;
-    resetdelayms        = 1;
-    resetdelayus        = 0;
-    hvleavestabdelay    = 15;
-    chiperasepulsewidth = 0;
-    chiperasepolltimeout = 10;
-    programfusepulsewidth = 0;
-    programfusepolltimeout = 5;
-    programlockpulsewidth = 0;
-    programlockpolltimeout = 5;
+    poweroffdelay       = 25;
+    resetdelayms        = 0;
+    resetdelayus        = 70;
+    hvleavestabdelay    = 100;
+    resetdelay          = 25;
+    chiperasepolltimeout = 40;
+    chiperasetime       = 0;
+    programfusepolltimeout = 25;
+    programlockpolltimeout = 25;
 
-    idr                 = 0x31;
-    spmcr               = 0x57;
-    rampz               = 0x3b;
-    allowfullpagebitstream = no;
+    ocdrev              = 1;
 
-    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";
+     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",
-                          "  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           = "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  a2  a1  a0",
+                         "  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   0   0   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       = 8;
+       delay           = 6;
+       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     = 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";
+       ;
+     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 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   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",
-                          "  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     = "  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",
-                          "  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",
+                           "  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 a14 a13 a12    a11 a10  a9  a8",
-                          " a7   x   x   x      x   x   x   x",
-                          "  x   x   x   x      x   x   x   x";
+         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       = 256;
+       blocksize       = 32;
        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";
+       ;
+#   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";
+       ;
 
-        read            = "0 1 0 1  0 0 0 0  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 "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 "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";
+     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  1 0 0 0  0 0 0 0  1 0 0 0",
-                          "x x x x  x x x x  o o o o  o o o o";
+         read            = "0 1 0 1  0 0 0 0  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 "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";
+     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  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";
+         read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
+                           "x 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";
+     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";
 
-        write           = "1 0 1 0  1 1 0 0   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  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    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";
-      ;
+     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";
+     ;
   ;
 
 #------------------------------------------------------------
-# AT90USB1286
+# ATtiny43U
 #------------------------------------------------------------
 
-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";
+part
+    id            = "t43u";
+    desc          = "ATtiny43u";
+    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;
+    stk500_devcode   = 0x14;
+##  avr910_devcode   = ?;
+##  Try the AT90S2313 devcode:
+    avr910_devcode   = 0x20;
+    signature        = 0x1e 0x92 0x0C;
+    reset            = io;
+    chip_erase_delay = 1000;
 
-    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";
+    pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
+                        "x x x x  x x x x    x x x 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;
+    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";
 
-    pp_controlstack     =
-        0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
-        0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
-        0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B,
-        0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
+    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, 0x06, 0x16, 0x46, 0x56,
+                                         0x0A, 0x1A, 0x4A, 0x5A, 0x1E, 0x7C, 0x00, 0x01, 0x00, 0x00,
+                                         0x00, 0x00;
     hventerstabdelay    = 100;
     progmodedelay       = 0;
+    hvspcmdexedelay     = 0;
     latchcycles         = 5;
     togglevtg           = 1;
-    poweroffdelay       = 15;
+    poweroffdelay       = 20;
     resetdelayms        = 1;
     resetdelayus        = 0;
     hvleavestabdelay    = 15;
+    resetdelay          = 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;
-      ;
-
+                size            = 64;
+                paged                   = yes;
+                page_size       = 4;
+                num_pages               = 16;
+                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",
+                                   "0  0 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",
+                                   "0  0 a5 a4  a3 a2 a1 a0   i i i i  i i i 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",
+                                  "  0   0  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            = 131072;
-        page_size       = 256;
-        num_pages       = 512;
+        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",
-                          "a15 a14 a13 a12    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0",
-                          "  o   o   o   o      o   o   o   o";
+        readback_p1     = 0xff;
+        readback_p2     = 0xff;
 
-        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";
+        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";
 
-        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";
+        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_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";
+        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";
 
-        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";
+        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";
 
-       mode            = 0x41;
-       delay           = 6;
-       blocksize       = 256;
-       readsize        = 256;
-      ;
+        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           = 10;
+                blocksize       = 64;
+                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;
+        write           = "1 0 1 0  1 1 0 0  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 = 4500;
+        max_write_delay = 4500;
+    ;
 
     memory "lfuse"
         size            = 1;
@@ -13468,9 +11446,9 @@ part
 
         read            = "0 1 0 1  0 0 0 0  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;
-      ;
+        min_write_delay = 4500;
+        max_write_delay = 4500;
+        ;
 
     memory "hfuse"
         size            = 1;
@@ -13479,54 +11457,37 @@ part
 
         read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
                           "x x x x  x x x x  o o o o  o o o o";
-        min_write_delay = 9000;
-        max_write_delay = 9000;
-      ;
+        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  i i i i";
+                          "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 "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;
-      ;
+        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";
-      ;
-
-    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";
-      ;
-  ;
+        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";
+    ;
+;
 
 #------------------------------------------------------------
-# AT90USB1287
+# ATmega32u4
 #------------------------------------------------------------
-# identical to AT90USB1286
 
 part
-    id               = "usb1287";
-    desc             = "AT90USB1287";
-    signature        = 0x1e 0x97 0x82;
+    id               = "m32u4";
+    desc             = "ATmega32U4";
+    signature        = 0x1e 0x95 0x87;
+    usbpid           = 0x2ff4;
     has_jtag         = yes;
 #    stk500_devcode   = 0xB2;
 #    avr910_devcode   = 0x43;
@@ -13576,21 +11537,23 @@ part
     rampz               = 0x3b;
     allowfullpagebitstream = no;
 
+    ocdrev              = 3;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
-        page_size       = 8;  /* for parallel programming */
-        size            = 4096;
+        page_size       = 4;  /* 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    a11 a10  a9  a8",
+                          "  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    a11 a10  a9  a8",
+                          "  x   x   x   x      x a10  a9  a8",
                           " a7  a6  a5  a4     a3  a2  a1  a0", 
                           "  i   i   i   i      i   i   i   i";
 
@@ -13605,48 +11568,48 @@ part
                          "  x   x   x   x      x   x   x   x";
 
        mode            = 0x41;
-       delay           = 10;
-       blocksize       = 8;
+       delay           = 20;
+       blocksize       = 4;
        readsize        = 256;
       ;
 
     memory "flash"
         paged           = yes;
-        size            = 131072;
-        page_size       = 256;
-        num_pages       = 512;
+        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",
-                          "a15 a14 a13 a12    a11 a10  a9  a8",
+                          "  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",
-                          "a15 a14 a13 a12    a11 a10  a9  a8",
+                          "  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",
+                          "  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  a6  a5  a4     a3  a2  a1  a0",
+                          "  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   x   x   x      x   x   x   x",
+                          " 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       = 256;
+       blocksize       = 128;
        readsize        = 256;
       ;
 
@@ -13707,25 +11670,27 @@ part
       ;
   ;
 
-
 #------------------------------------------------------------
-# AT90USB162
+# AT90USB646
 #------------------------------------------------------------
 
 part
-    id               = "usb162";
-    desc             = "AT90USB162";
-    has_jtag         = no;
-    has_debugwire    = yes;
-    signature        = 0x1e 0x94 0x82;
+    id               = "usb646";
+    desc             = "AT90USB646";
+    signature        = 0x1e 0x96 0x82;
+    usbpid           = 0x2ff9;
+    has_jtag         = yes;
+#    stk500_devcode   = 0xB2;
+#    avr910_devcode   = 0x43;
     chip_erase_delay = 9000;
-    reset            = io;
+    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",
+
+    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";
-    pagel            = 0xD7;
-    bs2              = 0xC6;
 
     timeout            = 200;
     stabdelay          = 100;
@@ -13737,6 +11702,7 @@ part
     predelay           = 1;
     postdelay          = 1;
     pollmethod         = 1;
+
     pp_controlstack     =
         0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
         0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
@@ -13757,78 +11723,84 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
+    idr                 = 0x31;
+    spmcr               = 0x57;
+    rampz               = 0x3b;
+    allowfullpagebitstream = no;
+
+    ocdrev              = 3;
+
     memory "eeprom"
-        paged           = no; /* leave this "no" */
-        page_size       = 4;  /* for parallel programming */
-        size            = 512;
-        num_pages       = 128;
+        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",
-                          "  0   0   0   0    a11 a10  a9  a8",
+                          "  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",
-                          "  0   0   0   0    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0",
+                          "  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   0  a1  a0",
+                         "  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    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2   0   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       = 4;
+       delay           = 10;
+       blocksize       = 8;
        readsize        = 256;
       ;
 
     memory "flash"
         paged           = yes;
-        size            = 16384;
-        page_size       = 128;
-        num_pages       = 128;
+        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",
-                          "a15 a14 a13 a12    a11 a10  a9  a8",
+                          "  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",
-                          "a15 a14 a13 a12    a11 a10  a9  a8",
+                          "  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",
+                          "  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   x  a5  a4     a3  a2  a1  a0",
+                          "  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  a6   x   x      x   x   x   x",
+                          "  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       = 128;
+       blocksize       = 256;
        readsize        = 256;
       ;
 
@@ -13857,7 +11829,7 @@ part
     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";
+                          "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";
@@ -13878,38 +11850,51 @@ part
 
     memory "calibration"
         size            = 1;
-        read            = "0 0 1 1  1 0 0 0    0 0 0 x  x x x x",
+        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   0  0  0  x   x  x  x  x",
+        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";
       ;
   ;
 
 #------------------------------------------------------------
-# AT90USB82
+# AT90USB647
+#------------------------------------------------------------
+# identical to AT90USB646
+
+part parent "usb646"
+    id               = "usb647";
+    desc             = "AT90USB647";
+    signature        = 0x1e 0x96 0x82;
+
+    ocdrev              = 3;
+  ;
+
+#------------------------------------------------------------
+# AT90USB1286
 #------------------------------------------------------------
-# 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;
+    id               = "usb1286";
+    desc             = "AT90USB1286";
+    signature        = 0x1e 0x97 0x82;
+    usbpid           = 0x2ffb;
+    has_jtag         = yes;
+#    stk500_devcode   = 0xB2;
+#    avr910_devcode   = 0x43;
     chip_erase_delay = 9000;
-    reset            = io;
+    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",
+
+    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";
-    pagel            = 0xD7;
-    bs2              = 0xC6;
 
     timeout            = 200;
     stabdelay          = 100;
@@ -13921,6 +11906,7 @@ part
     predelay           = 1;
     postdelay          = 1;
     pollmethod         = 1;
+
     pp_controlstack     =
         0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
         0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
@@ -13941,46 +11927,52 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
+    idr                 = 0x31;
+    spmcr               = 0x57;
+    rampz               = 0x3b;
+    allowfullpagebitstream = no;
+
+    ocdrev              = 3;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
-        page_size       = 4;  /* for parallel programming */
-        size            = 512;
-        num_pages       = 128;
+        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",
-                          "  0   0   0   0    a11 a10  a9  a8",
+                          "  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",
-                          "  0   0   0   0    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0",
+                          "  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   0  a1  a0",
+                         "  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    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2   0   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       = 4;
+       delay           = 10;
+       blocksize       = 8;
        readsize        = 256;
       ;
 
     memory "flash"
         paged           = yes;
-        size            = 8192;
-        page_size       = 128;
-        num_pages       = 64;
+        size            = 131072;
+        page_size       = 256;
+        num_pages       = 512;
         min_write_delay = 4500;
         max_write_delay = 4500;
         readback_p1     = 0x00;
@@ -13997,22 +11989,22 @@ part
 
         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",
+                          "  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   x  a5  a4     a3  a2  a1  a0",
+                          "  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  a6   x   x      x   x   x   x",
+                          " a7   x   x   x      x   x   x   x",
                           "  x   x   x   x      x   x   x   x";
 
        mode            = 0x41;
        delay           = 6;
-       blocksize       = 128;
+       blocksize       = 256;
        readsize        = 256;
       ;
 
@@ -14041,7 +12033,7 @@ part
     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";
+                          "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";
@@ -14062,32 +12054,41 @@ part
 
     memory "calibration"
         size            = 1;
-        read            = "0 0 1 1  1 0 0 0    0 0 0 x  x x x x",
+        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   0  0  0  x   x  x  x  x",
+        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";
       ;
   ;
 
 #------------------------------------------------------------
-# ATmega32U2
+# AT90USB1287
 #------------------------------------------------------------
-# Changes against AT90USB162 (beside IDs)
-#    memory "flash"
-#        size            = 32768;
-#        num_pages       = 256;
-#    memory "eeprom"
-#        size            = 1024;
-#        num_pages       = 256;
+# identical to AT90USB1286
+
+part parent "usb1286"
+    id               = "usb1287";
+    desc             = "AT90USB1287";
+    signature        = 0x1e 0x97 0x82;
+
+    ocdrev              = 3;
+  ;
+
+#------------------------------------------------------------
+# AT90USB162
+#------------------------------------------------------------
+
 part
-    id               = "m32u2";
-    desc             = "ATmega32U2";
+    id               = "usb162";
+    desc             = "AT90USB162";
     has_jtag         = no;
     has_debugwire    = yes;
-    signature        = 0x1e 0x95 0x8a;
+    signature        = 0x1e 0x94 0x82;
+    usbpid           = 0x2ffa;
     chip_erase_delay = 9000;
     reset            = io;
     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
@@ -14127,11 +12128,13 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
+    ocdrev              = 1;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 4;  /* for parallel programming */
-        size            = 1024;
-        num_pages       = 256;
+        size            = 512;
+        num_pages       = 128;
         min_write_delay = 9000;
         max_write_delay = 9000;
         readback_p1     = 0x00;
@@ -14164,9 +12167,9 @@ part
 
     memory "flash"
         paged           = yes;
-        size            = 32768;
+        size            = 16384;
         page_size       = 128;
-        num_pages       = 256;
+        num_pages       = 128;
         min_write_delay = 4500;
         max_write_delay = 4500;
         readback_p1     = 0x00;
@@ -14257,22 +12260,22 @@ part
                           "x  x  x  x   x  x a1 a0   o  o  o  o   o  o  o  o";
       ;
   ;
+
 #------------------------------------------------------------
-# ATmega16U2
+# AT90USB82
 #------------------------------------------------------------
-# Changes against ATmega32U2 (beside IDs)
+# Changes against AT90USB162 (beside IDs)
 #    memory "flash"
-#        size            = 16384;
-#        num_pages       = 128;
-#    memory "eeprom"
-#        size            = 512;
-#        num_pages       = 128;
+#        size            = 8192;
+#        num_pages       = 64;
+
 part
-    id               = "m16u2";
-    desc             = "ATmega16U2";
+    id               = "usb82";
+    desc             = "AT90USB82";
     has_jtag         = no;
     has_debugwire    = yes;
-    signature        = 0x1e 0x94 0x89;
+    signature        = 0x1e 0x93 0x82;
+    usbpid           = 0x2ff7;
     chip_erase_delay = 9000;
     reset            = io;
     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
@@ -14312,6 +12315,8 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
+    ocdrev              = 1;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 4;  /* for parallel programming */
@@ -14349,9 +12354,9 @@ part
 
     memory "flash"
         paged           = yes;
-        size            = 16384;
+        size            = 8192;
         page_size       = 128;
-        num_pages       = 128;
+        num_pages       = 64;
         min_write_delay = 4500;
         max_write_delay = 4500;
         readback_p1     = 0x00;
@@ -14444,20 +12449,22 @@ part
   ;
 
 #------------------------------------------------------------
-# ATmega8U2
+# ATmega32U2
 #------------------------------------------------------------
-# Changes against ATmega16U2 (beside IDs)
+# Changes against AT90USB162 (beside IDs)
 #    memory "flash"
-#        size            = 8192;
-#        page_size       = 64;
-#        blocksize       = 64;
-
+#        size            = 32768;
+#        num_pages       = 256;
+#    memory "eeprom"
+#        size            = 1024;
+#        num_pages       = 256;
 part
-    id               = "m8u2";
-    desc             = "ATmega8U2";
+    id               = "m32u2";
+    desc             = "ATmega32U2";
     has_jtag         = no;
     has_debugwire    = yes;
-    signature        = 0x1e 0x93 0x89;
+    signature        = 0x1e 0x95 0x8a;
+    usbpid           = 0x2ff0;
     chip_erase_delay = 9000;
     reset            = io;
     pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
@@ -14497,11 +12504,13 @@ part
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
+    ocdrev              = 1;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 4;  /* for parallel programming */
-        size            = 512;
-        num_pages       = 128;
+        size            = 1024;
+        num_pages       = 256;
         min_write_delay = 9000;
         max_write_delay = 9000;
         readback_p1     = 0x00;
@@ -14534,9 +12543,9 @@ part
 
     memory "flash"
         paged           = yes;
-        size            = 8192;
-        page_size       = 64;
-        num_pages       = 128;
+        size            = 32768;
+        page_size       = 128;
+        num_pages       = 256;
         min_write_delay = 4500;
         max_write_delay = 4500;
         readback_p1     = 0x00;
@@ -14568,7 +12577,7 @@ part
 
        mode            = 0x41;
        delay           = 6;
-       blocksize       = 64;
+       blocksize       = 128;
        readsize        = 256;
       ;
 
@@ -14628,37 +12637,41 @@ part
       ;
   ;
 #------------------------------------------------------------
-# ATmega325
+# ATmega16U2
 #------------------------------------------------------------
+# Changes against ATmega32U2 (beside IDs)
+#    memory "flash"
+#        size            = 16384;
+#        num_pages       = 128;
+#    memory "eeprom"
+#        size            = 512;
+#        num_pages       = 128;
+part
+    id               = "m16u2";
+    desc             = "ATmega16U2";
+    has_jtag         = no;
+    has_debugwire    = yes;
+    signature        = 0x1e 0x94 0x89;
+    usbpid           = 0x2fef;
+    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;
 
-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;
-
+    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,
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
-    idr                 = 0x31;
-    spmcr               = 0x57;
-    allowfullpagebitstream = no;
+    ocdrev              = 1;
 
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 4;  /* for parallel programming */
-        size            = 1024;
+        size            = 512;
+        num_pages       = 128;
         min_write_delay = 9000;
         max_write_delay = 9000;
-        readback_p1     = 0xff;
-        readback_p2     = 0xff;
+        readback_p1     = 0x00;
+        readback_p2     = 0x00;
         read            = "  1   0   1   0      0   0   0   0",
-                          "  0   0   0   0      0   0  a9  a8",
+                          "  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      0   0  a9  a8",
+                          "  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";
+       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",
+       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";
+                         "  x   x   x   x      x   x   x   x";
 
-        mode            = 0x41;
-        delay           = 10;
-        blocksize       = 4;
-        readsize        = 256;
+       mode            = 0x41;
+       delay           = 20;
+       blocksize       = 4;
+       readsize        = 256;
       ;
 
     memory "flash"
         paged           = yes;
-        size            = 32768;
+        size            = 16384;
         page_size       = 128;
-        num_pages       = 256;
+        num_pages       = 128;
         min_write_delay = 4500;
         max_write_delay = 4500;
-        readback_p1     = 0xff;
-        readback_p2     = 0xff;
+        readback_p1     = 0x00;
+        readback_p2     = 0x00;
         read_lo         = "  0   0   1   0      0   0   0   0",
-                          "  0 a14 a13 a12    a11 a10  a9  a8",
+                          "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",
-                          "  0 a14 a13 a12    a11 a10  a9  a8",
+                          "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",
+                          "  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",
-                          "  0   0   0   0      0   0   0   0",
-                          " a7  a6  a5  a4     a3  a2  a1  a0",
+                          "  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",
-                          "  0 a14 a13 a12    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0",
+                          "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           = 10;
-        blocksize       = 128;
-        readsize        = 256;
+       mode            = 0x41;
+       delay           = 6;
+       blocksize       = 128;
+       readsize        = 256;
       ;
 
-    memory "lock"
+    memory "lfuse"
         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 0 1 0  0 0 0 0",
+                          "x x x x  x x x x  i i i i  i i i i";
 
-        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";
+        read            = "0 1 0 1  0 0 0 0  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 "lfuse"
+    memory "hfuse"
         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  1 0 0 0",
+                          "x x x x  x x x x  i i i i  i i i i";
 
-        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";
+        read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
+                          "x 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"
+    memory "efuse"
         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  0 1 0 0",
+                          "x x x x  x x x x  i i i i  i i i i";
 
-        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";
+        read            = "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 "efuse"
+    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";
 
-        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";
+        write           = "1 0 1 0  1 1 0 0   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  0   0  0  0  0",
-                          "0  0  0  0   0  0 a1 a0   o  o  o  o   o  o  o  o";
+        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 0  0 0 0 0",
-                          "0 0 0 0  0 0 0 0   o o o o  o o o o";
-        ;
   ;
 
 #------------------------------------------------------------
-# ATmega645
+# ATmega8U2
 #------------------------------------------------------------
+# Changes against ATmega16U2 (beside IDs)
+#    memory "flash"
+#        size            = 8192;
+#        page_size       = 64;
+#        blocksize       = 64;
 
 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;
+    id               = "m8u2";
+    desc             = "ATmega8U2";
+    has_jtag         = no;
+    has_debugwire    = yes;
+    signature        = 0x1e 0x93 0x89;
+    usbpid           = 0x2fee;
     chip_erase_delay = 9000;
+    reset            = io;
     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;
+                       "x x x x  x 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,
     programlockpulsewidth = 0;
     programlockpolltimeout = 5;
 
-    idr                 = 0x31;
-    spmcr               = 0x57;
-    allowfullpagebitstream = no;
+    ocdrev              = 1;
 
     memory "eeprom"
         paged           = no; /* leave this "no" */
-        page_size       = 8;  /* for parallel programming */
-        size            = 2048;
+        page_size       = 4;  /* for parallel programming */
+        size            = 512;
+        num_pages       = 128;
         min_write_delay = 9000;
         max_write_delay = 9000;
-        readback_p1     = 0xff;
-        readback_p2     = 0xff;
+        readback_p1     = 0x00;
+        readback_p2     = 0x00;
         read            = "  1   0   1   0      0   0   0   0",
-                          "  0   0   0   0      0 a10  a9  a8",
+                          "  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      0 a10  a9  a8",
+                          "  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  a2  a1  a0",
-                          "  i   i   i   i      i   i   i   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 a10  a9  a8",
-                          " a7  a6  a5  a4     a3   0   0   0",
-                          "  x   x   x   x      x   x   x   x";
+       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           = 10;
-        blocksize       = 8;
-        readsize        = 256;
+       mode            = 0x41;
+       delay           = 20;
+       blocksize       = 4;
+       readsize        = 256;
       ;
 
     memory "flash"
         paged           = yes;
-        size            = 65536;
-        page_size       = 256;
-        num_pages       = 256;
+        size            = 8192;
+        page_size       = 128;
+        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",
-                          " a15 a14 a13 a12    a11 a10  a9  a8",
-                          "  a7  a6  a5  a4     a3  a2  a1  a0",
-                          "   o   o   o   o      o   o   o   o";
+        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";
+        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",
+                          "  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",
-                          "  0   0   0   0      0   0   0   0",
-                          "  a7 a6  a5  a4     a3  a2  a1  a0",
+                          "  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  a5  a4     a3  a2  a1  a0",
-                          "   0   0   0   0      0   0   0   0";
+        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           = 10;
-        blocksize       = 128;
-        readsize        = 256;
+       mode            = 0x41;
+       delay           = 6;
+       blocksize       = 128;
+       readsize        = 256;
       ;
 
-    memory "lock"
+    memory "lfuse"
         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 0 1 0  0 0 0 0",
+                          "x x x x  x x x x  i i i i  i i i i";
 
-        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";
+        read            = "0 1 0 1  0 0 0 0  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 "lfuse"
+    memory "hfuse"
         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  1 0 0 0",
+                          "x x x x  x x x x  i i i i  i i i i";
 
-        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";
+        read            = "0 1 0 1  1 0 0 0  0 0 0 0  1 0 0 0",
+                          "x 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"
+    memory "efuse"
         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  0 1 0 0",
+                          "x x x x  x x x x  i i i i  i i i i";
 
-        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";
+        read            = "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 "efuse"
+    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";
 
-        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";
+        write           = "1 0 1 0  1 1 0 0   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  0   0  0  0  0",
-                          "0  0  0  0   0  0 a1 a0   o  o  o  o   o  o  o  o";
+        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 0  0 0 0 0",
-                          "0 0 0 0  0 0 0 0   o o o o  o o o o";
-        ;
   ;
-
 #------------------------------------------------------------
-# ATmega3250
+# ATmega325
 #------------------------------------------------------------
 
 part
-    id               = "m3250";
-    desc             = "ATMEGA3250";
-    signature        = 0x1E 0x95 0x06;
+    id               = "m325";
+    desc             = "ATmega325";
+    signature        = 0x1e 0x95 0x05;
     has_jtag         = yes;
 #   stk500_devcode   = 0x??; # No STK500v1 support?
 #   avr910_devcode   = 0x??; # Try the ATmega16 one
@@ -15061,6 +13068,8 @@ part
     spmcr               = 0x57;
     allowfullpagebitstream = no;
 
+    ocdrev              = 3;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 4;  /* for parallel programming */
@@ -15195,13 +13204,13 @@ part
   ;
 
 #------------------------------------------------------------
-# ATmega6450
+# ATmega645
 #------------------------------------------------------------
 
 part
-    id               = "m6450";
-    desc             = "ATMEGA6450";
-    signature        = 0x1E 0x96 0x06;
+    id               = "m645";
+    desc             = "ATmega645";
+    signature        = 0x1E 0x96 0x05;
     has_jtag         = yes;
 #   stk500_devcode   = 0x??; # No STK500v1 support?
 #   avr910_devcode   = 0x??; # Try the ATmega16 one
@@ -15250,6 +13259,8 @@ part
     spmcr               = 0x57;
     allowfullpagebitstream = no;
 
+    ocdrev              = 3;
+
     memory "eeprom"
         paged           = no; /* leave this "no" */
         page_size       = 8;  /* for parallel programming */
@@ -15280,7 +13291,7 @@ part
 
         mode            = 0x41;
         delay           = 10;
-        blocksize       = 4;
+        blocksize       = 8;
         readsize        = 256;
       ;
 
 
         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;
-    ;
+        blocksize       = 128;
+        readsize        = 256;
+      ;
 
     memory "lock"
-        size           = 1;
-        offset         = 0x8f0027;
-    ;
-;
-
-#------------------------------------------------------------
-# ATXMEGA128A1
-#------------------------------------------------------------
+        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";
 
-part
-    id         = "x128a1";
-    desc       = "ATXMEGA128A1";
-    signature  = 0x1e 0x97 0x4c;
-    has_jtag   = yes;
-    has_pdi    = yes;
-    nvm_base   = 0x01c0;
+        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 "eeprom"
-        size           = 0x0800;
-        offset         = 0x08c0000;
-        page_size      = 0x20;
-        readsize       = 0x100;
-    ;
+    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";
 
-    memory "application"
-        size           = 0x00020000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
+        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 "apptable"
-        size           = 0x00002000;
-        offset         = 0x0081e000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
+    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";
 
-    memory "boot"
-        size           = 0x00002000;
-        offset         = 0x00820000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
+        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 "flash"
-        size           = 0x00022000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
+    memory "efuse"
+        size            = 1;
 
-    memory "prodsig"
-        size           = 0x200;
-        offset         = 0x8e0200;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
+        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";
 
-    memory "usersig"
-        size           = 0x200;
-        offset         = 0x8e0400;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
+        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;
-        offset         = 0x1000090;
-    ;
+        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 "fuse0"
-        size           = 1;
-        offset         = 0x8f0020;
-    ;
+    memory "calibration"
+        size            = 1;
 
-    memory "fuse1"
-        size           = 1;
-        offset         = 0x8f0021;
-    ;
+        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";
+        ;
+  ;
 
-    memory "fuse2"
-        size           = 1;
-        offset         = 0x8f0022;
-    ;
+#------------------------------------------------------------
+# ATmega3250
+#------------------------------------------------------------
 
-    memory "fuse4"
-        size           = 1;
-        offset         = 0x8f0024;
-    ;
+part parent "m325"
+    id               = "m3250";
+    desc             = "ATmega3250";
+    signature        = 0x1E 0x95 0x06;
 
-    memory "fuse5"
-        size           = 1;
-        offset         = 0x8f0025;
-    ;
+    ocdrev              = 3;
+  ;
 
-    memory "lock"
-        size           = 1;
-        offset         = 0x8f0027;
-    ;
-;
+#------------------------------------------------------------
+# ATmega6450
+#------------------------------------------------------------
+
+part parent "m645"
+    id               = "m6450";
+    desc             = "ATmega6450";
+    signature        = 0x1E 0x96 0x06;
+
+    ocdrev              = 3;
+  ;
 
 #------------------------------------------------------------
-# ATXMEGA128A1REVD
+# AVR XMEGA family common values
 #------------------------------------------------------------
 
 part
-    id         = "x128a1d";
-    desc       = "ATXMEGA128A1REVD";
-    signature  = 0x1e 0x97 0x41;
-    has_jtag   = yes;
+    id         = ".xmega";
+    desc       = "AVR XMEGA family common values";
     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;
-    ;
+    mcu_base   = 0x0090;
 
     memory "signature"
         size           = 3;
         offset         = 0x1000090;
     ;
 
-    memory "fuse0"
-        size           = 1;
-        offset         = 0x8f0020;
+    memory "prodsig"
+        size           = 0x32;
+        offset         = 0x8e0200;
+        page_size      = 0x32;
+        readsize       = 0x32;
     ;
 
     memory "fuse1"
         size           = 1;
         offset         = 0x8f0027;
     ;
+
+    memory "data"
+        # SRAM, only used to supply the offset
+        offset         = 0x1000000;
+    ;
 ;
 
 #------------------------------------------------------------
-# ATXMEGA192A1
+# ATxmega16A4U
 #------------------------------------------------------------
 
-part
-    id         = "x192a1";
-    desc       = "ATXMEGA192A1";
-    signature  = 0x1e 0x97 0x4e;
-    has_jtag   = yes;
-    has_pdi    = yes;
-    nvm_base   = 0x01c0;
+part parent ".xmega"
+    id         = "x16a4u";
+    desc       = "ATxmega16A4U";
+    signature  = 0x1e 0x94 0x41;
+    usbpid     = 0x2fe3;
 
     memory "eeprom"
-        size           = 0x0800;
-        offset         = 0x08c0000;
+        size           = 0x400;
+        offset         = 0x8c0000;
         page_size      = 0x20;
         readsize       = 0x100;
     ;
 
     memory "application"
-        size           = 0x00030000;
-        offset         = 0x0800000;
+        size           = 0x4000;
+        offset         = 0x800000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "apptable"
-        size           = 0x00002000;
-        offset         = 0x0082e000;
+        size           = 0x1000;
+        offset         = 0x803000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "boot"
-        size           = 0x00002000;
-        offset         = 0x00830000;
+        size           = 0x1000;
+        offset         = 0x804000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "flash"
-        size           = 0x00032000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
-
-    memory "prodsig"
-        size           = 0x200;
-        offset         = 0x8e0200;
+        size           = 0x5000;
+        offset         = 0x800000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "usersig"
-        size           = 0x200;
+        size           = 0x100;
         offset         = 0x8e0400;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
+;
 
-    memory "signature"
-        size           = 3;
-        offset         = 0x1000090;
-    ;
+#------------------------------------------------------------
+# ATxmega16C4
+#------------------------------------------------------------
 
-    memory "fuse0"
-        size           = 1;
-        offset         = 0x8f0020;
-    ;
+part parent "x16a4u"
+    id         = "x16c4";
+    desc       = "ATxmega16C4";
+    signature  = 0x1e 0x95 0x44;
+;
 
-    memory "fuse1"
-        size           = 1;
-        offset         = 0x8f0021;
-    ;
+#------------------------------------------------------------
+# ATxmega16D4
+#------------------------------------------------------------
 
-    memory "fuse2"
-        size           = 1;
-        offset         = 0x8f0022;
-    ;
+part parent "x16a4u"
+    id         = "x16d4";
+    desc       = "ATxmega16D4";
+    signature  = 0x1e 0x94 0x42;
+;
 
-    memory "fuse4"
-        size           = 1;
-        offset         = 0x8f0024;
-    ;
+#------------------------------------------------------------
+# ATxmega16A4
+#------------------------------------------------------------
 
-    memory "fuse5"
-        size           = 1;
-        offset         = 0x8f0025;
-    ;
+part parent "x16a4u"
+    id         = "x16a4";
+    desc       = "ATxmega16A4";
+    signature  = 0x1e 0x94 0x41;
+    has_jtag   = yes;
 
-    memory "lock"
+    memory "fuse0"
         size           = 1;
-        offset         = 0x8f0027;
+        offset         = 0x8f0020;
     ;
 ;
 
 #------------------------------------------------------------
-# ATXMEGA256A1
+# ATxmega32A4U
 #------------------------------------------------------------
 
-part
-    id         = "x256a1";
-    desc       = "ATXMEGA256A1";
-    signature  = 0x1e 0x98 0x46;
-    has_jtag   = yes;
-    has_pdi    = yes;
-    nvm_base   = 0x01c0;
+part parent ".xmega"
+    id         = "x32a4u";
+    desc       = "ATxmega32A4U";
+    signature  = 0x1e 0x95 0x41;
+    usbpid     = 0x2fe4;
 
     memory "eeprom"
-        size           = 0x1000;
-        offset         = 0x08c0000;
+        size           = 0x400;
+        offset         = 0x8c0000;
         page_size      = 0x20;
         readsize       = 0x100;
     ;
 
     memory "application"
-        size           = 0x00040000;
-        offset         = 0x0800000;
+        size           = 0x8000;
+        offset         = 0x800000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "apptable"
-        size           = 0x00002000;
-        offset         = 0x0083e000;
+        size           = 0x1000;
+        offset         = 0x807000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "boot"
-        size           = 0x00002000;
-        offset         = 0x00840000;
+        size           = 0x1000;
+        offset         = 0x808000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "flash"
-        size           = 0x00042000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
-
-    memory "prodsig"
-        size           = 0x200;
-        offset         = 0x8e0200;
+        size           = 0x9000;
+        offset         = 0x800000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "usersig"
-        size           = 0x200;
+        size           = 0x100;
         offset         = 0x8e0400;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
+;
 
-    memory "signature"
-        size           = 3;
-        offset         = 0x1000090;
-    ;
+#------------------------------------------------------------
+# ATxmega32C4
+#------------------------------------------------------------
 
-    memory "fuse0"
-        size           = 1;
-        offset         = 0x8f0020;
-    ;
+part parent "x32a4u"
+    id         = "x32c4";
+    desc       = "ATxmega32C4";
+    signature  = 0x1e 0x94 0x43;
+;
 
-    memory "fuse1"
-        size           = 1;
-        offset         = 0x8f0021;
-    ;
+#------------------------------------------------------------
+# ATxmega32D4
+#------------------------------------------------------------
 
-    memory "fuse2"
-        size           = 1;
-        offset         = 0x8f0022;
-    ;
+part parent "x32a4u"
+    id         = "x32d4";
+    desc       = "ATxmega32D4";
+    signature  = 0x1e 0x95 0x42;
+;
 
-    memory "fuse4"
-        size           = 1;
-        offset         = 0x8f0024;
-    ;
+#------------------------------------------------------------
+# ATxmega32A4
+#------------------------------------------------------------
 
-    memory "fuse5"
-        size           = 1;
-        offset         = 0x8f0025;
-    ;
+part parent "x32a4u"
+    id         = "x32a4";
+    desc       = "ATxmega32A4";
+    signature  = 0x1e 0x95 0x41;
+    has_jtag   = yes;
 
-    memory "lock"
+    memory "fuse0"
         size           = 1;
-        offset         = 0x8f0027;
+        offset         = 0x8f0020;
     ;
 ;
 
 #------------------------------------------------------------
-# ATXMEGA64A3
+# ATxmega64A4U
 #------------------------------------------------------------
 
-part
-    id         = "x64a3";
-    desc       = "ATXMEGA64A3";
-    signature  = 0x1e 0x96 0x42;
-    has_jtag   = yes;
-    has_pdi    = yes;
-    nvm_base   = 0x01c0;
+part parent ".xmega"
+    id         = "x64a4u";
+    desc       = "ATxmega64A4U";
+    signature  = 0x1e 0x96 0x46;
+    usbpid     = 0x2fe5;
 
     memory "eeprom"
-        size           = 0x0800;
-        offset         = 0x08c0000;
+        size           = 0x800;
+        offset         = 0x8c0000;
         page_size      = 0x20;
         readsize       = 0x100;
     ;
 
     memory "application"
-        size           = 0x00010000;
-        offset         = 0x0800000;
+        size           = 0x10000;
+        offset         = 0x800000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "apptable"
-        size           = 0x00001000;
-        offset         = 0x0080f000;
+        size           = 0x1000;
+        offset         = 0x80f000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "boot"
-        size           = 0x00001000;
-        offset         = 0x00810000;
+        size           = 0x1000;
+        offset         = 0x810000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "flash"
-        size           = 0x00011000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
-
-    memory "prodsig"
-        size           = 0x200;
-        offset         = 0x8e0200;
+        size           = 0x11000;
+        offset         = 0x800000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "usersig"
-        size           = 0x200;
+        size           = 0x100;
         offset         = 0x8e0400;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
+;
 
-    memory "signature"
-        size           = 3;
-        offset         = 0x1000090;
-    ;
+#------------------------------------------------------------
+# ATxmega64C3
+#------------------------------------------------------------
+
+part parent "x64a4u"
+    id         = "x64c3";
+    desc       = "ATxmega64C3";
+    signature  = 0x1e 0x96 0x49;
+    usbpid     = 0x2fd6;
+;
+
+#------------------------------------------------------------
+# ATxmega64D3
+#------------------------------------------------------------
+
+part parent "x64a4u"
+    id         = "x64d3";
+    desc       = "ATxmega64D3";
+    signature  = 0x1e 0x96 0x4a;
+;
+
+#------------------------------------------------------------
+# ATxmega64D4
+#------------------------------------------------------------
+
+part parent "x64a4u"
+    id         = "x64d4";
+    desc       = "ATxmega64D4";
+    signature  = 0x1e 0x96 0x47;
+;
+
+#------------------------------------------------------------
+# ATxmega64A1
+#------------------------------------------------------------
+
+part parent "x64a4u"
+    id         = "x64a1";
+    desc       = "ATxmega64A1";
+    signature  = 0x1e 0x96 0x4e;
+    has_jtag   = yes;
 
     memory "fuse0"
         size           = 1;
         offset         = 0x8f0020;
     ;
+;
 
-    memory "fuse1"
-        size           = 1;
-        offset         = 0x8f0021;
-    ;
+#------------------------------------------------------------
+# ATxmega64A1U
+#------------------------------------------------------------
 
-    memory "fuse2"
-        size           = 1;
-        offset         = 0x8f0022;
-    ;
+part parent "x64a1"
+    id         = "x64a1u";
+    desc       = "ATxmega64A1U";
+    signature  = 0x1e 0x96 0x4e;
+    usbpid     = 0x2fe8;
+;
 
-    memory "fuse4"
-        size           = 1;
-        offset         = 0x8f0024;
-    ;
+#------------------------------------------------------------
+# ATxmega64A3
+#------------------------------------------------------------
 
-    memory "fuse5"
-        size           = 1;
-        offset         = 0x8f0025;
-    ;
+part parent "x64a1"
+    id         = "x64a3";
+    desc       = "ATxmega64A3";
+    signature  = 0x1e 0x96 0x42;
+;
 
-    memory "lock"
-        size           = 1;
-        offset         = 0x8f0027;
-    ;
+#------------------------------------------------------------
+# ATxmega64A3U
+#------------------------------------------------------------
+
+part parent "x64a1"
+    id         = "x64a3u";
+    desc       = "ATxmega64A3U";
+    signature  = 0x1e 0x96 0x42;
+    usbpid     = 0x2fe5;
 ;
 
 #------------------------------------------------------------
-# ATXMEGA128A3
+# ATxmega64A4
 #------------------------------------------------------------
 
-part
-    id         = "x128a3";
-    desc       = "ATXMEGA128A3";
-    signature  = 0x1e 0x97 0x42;
-    has_jtag   = yes;
-    has_pdi    = yes;
-    nvm_base   = 0x01c0;
+part parent "x64a1"
+    id         = "x64a4";
+    desc       = "ATxmega64A4";
+    signature  = 0x1e 0x96 0x46;
+;
+
+#------------------------------------------------------------
+# ATxmega64B1
+#------------------------------------------------------------
+
+part parent "x64a1"
+    id         = "x64b1";
+    desc       = "ATxmega64B1";
+    signature  = 0x1e 0x96 0x52;
+    usbpid     = 0x2fe1;
+;
+
+#------------------------------------------------------------
+# ATxmega64B3
+#------------------------------------------------------------
+
+part parent "x64a1"
+    id         = "x64b3";
+    desc       = "ATxmega64B3";
+    signature  = 0x1e 0x96 0x51;
+    usbpid     = 0x2fdf;
+;
+
+#------------------------------------------------------------
+# ATxmega128C3
+#------------------------------------------------------------
+
+part parent ".xmega"
+    id         = "x128c3";
+    desc       = "ATxmega128C3";
+    signature  = 0x1e 0x97 0x52;
+    usbpid     = 0x2fd7;
 
     memory "eeprom"
-        size           = 0x0800;
-        offset         = 0x08c0000;
+        size           = 0x800;
+        offset         = 0x8c0000;
         page_size      = 0x20;
         readsize       = 0x100;
     ;
 
     memory "application"
-        size           = 0x00020000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
+        size           = 0x20000;
+        offset         = 0x800000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "apptable"
-        size           = 0x00002000;
-        offset         = 0x0081e000;
-        page_size      = 0x100;
+        size           = 0x2000;
+        offset         = 0x81e000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "boot"
-        size           = 0x00002000;
-        offset         = 0x00820000;
-        page_size      = 0x100;
+        size           = 0x2000;
+        offset         = 0x820000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "flash"
-        size           = 0x00022000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
-
-    memory "prodsig"
-        size           = 0x200;
-        offset         = 0x8e0200;
-        page_size      = 0x100;
+        size           = 0x22000;
+        offset         = 0x800000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "usersig"
         size           = 0x200;
         offset         = 0x8e0400;
-        page_size      = 0x100;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
+;
 
-    memory "signature"
-        size           = 3;
-        offset         = 0x1000090;
-    ;
+#------------------------------------------------------------
+# ATxmega128D3
+#------------------------------------------------------------
+
+part parent "x128c3"
+    id         = "x128d3";
+    desc       = "ATxmega128D3";
+    signature  = 0x1e 0x97 0x48;
+;
+
+#------------------------------------------------------------
+# ATxmega128D4
+#------------------------------------------------------------
+
+part parent "x128c3"
+    id         = "x128d4";
+    desc       = "ATxmega128D4";
+    signature  = 0x1e 0x97 0x47;
+;
+
+#------------------------------------------------------------
+# ATxmega128A1
+#------------------------------------------------------------
+
+part parent "x128c3"
+    id         = "x128a1";
+    desc       = "ATxmega128A1";
+    signature  = 0x1e 0x97 0x4c;
+    has_jtag   = yes;
 
     memory "fuse0"
         size           = 1;
         offset         = 0x8f0020;
     ;
+;
 
-    memory "fuse1"
-        size           = 1;
-        offset         = 0x8f0021;
+#------------------------------------------------------------
+# ATxmega128A1 revision D
+#------------------------------------------------------------
+
+part parent "x128a1"
+    id         = "x128a1d";
+    desc       = "ATxmega128A1revD";
+    signature  = 0x1e 0x97 0x41;
+;
+
+#------------------------------------------------------------
+# ATxmega128A1U
+#------------------------------------------------------------
+
+part parent "x128a1"
+    id         = "x128a1u";
+    desc       = "ATxmega128A1U";
+    signature  = 0x1e 0x97 0x4c;
+    usbpid     = 0x2fed;
+;
+
+#------------------------------------------------------------
+# ATxmega128A3
+#------------------------------------------------------------
+
+part parent "x128a1"
+    id         = "x128a3";
+    desc       = "ATxmega128A3";
+    signature  = 0x1e 0x97 0x42;
+;
+
+#------------------------------------------------------------
+# ATxmega128A3U
+#------------------------------------------------------------
+
+part parent "x128a1"
+    id         = "x128a3u";
+    desc       = "ATxmega128A3U";
+    signature  = 0x1e 0x97 0x42;
+    usbpid     = 0x2fe6;
+;
+
+#------------------------------------------------------------
+# ATxmega128A4
+#------------------------------------------------------------
+
+part parent ".xmega"
+    id         = "x128a4";
+    desc       = "ATxmega128A4";
+    signature  = 0x1e 0x97 0x46;
+    has_jtag   = yes;
+
+    memory "eeprom"
+        size           = 0x800;
+        offset         = 0x8c0000;
+        page_size      = 0x20;
+        readsize       = 0x100;
     ;
 
-    memory "fuse2"
-        size           = 1;
-        offset         = 0x8f0022;
+    memory "application"
+        size           = 0x20000;
+        offset         = 0x800000;
+        page_size      = 0x200;
+        readsize       = 0x100;
     ;
 
-    memory "fuse4"
-        size           = 1;
-        offset         = 0x8f0024;
+    memory "apptable"
+        size           = 0x1000;
+        offset         = 0x81f000;
+        page_size      = 0x200;
+        readsize       = 0x100;
     ;
 
-    memory "fuse5"
-        size           = 1;
-        offset         = 0x8f0025;
+    memory "boot"
+        size           = 0x2000;
+        offset         = 0x820000;
+        page_size      = 0x200;
+        readsize       = 0x100;
+    ;
+
+    memory "flash"
+        size           = 0x22000;
+        offset         = 0x800000;
+        page_size      = 0x200;
+        readsize       = 0x100;
+    ;
+
+    memory "usersig"
+        size           = 0x200;
+        offset         = 0x8e0400;
+        page_size      = 0x200;
+        readsize       = 0x100;
     ;
 
-    memory "lock"
+    memory "fuse0"
         size           = 1;
-        offset         = 0x8f0027;
+        offset         = 0x8f0020;
     ;
 ;
 
 #------------------------------------------------------------
-# ATXMEGA192A3
+# ATxmega128A4U
 #------------------------------------------------------------
 
-part
-    id         = "x192a3";
-    desc       = "ATXMEGA192A3";
-    signature  = 0x1e 0x97 0x44;
-    has_jtag   = yes;
-    has_pdi    = yes;
-    nvm_base   = 0x01c0;
+part parent ".xmega"
+    id         = "x128a4u";
+    desc       = "ATxmega128A4U";
+    signature  = 0x1e 0x97 0x46;
+    usbpid     = 0x2fde;
 
     memory "eeprom"
-        size           = 0x0800;
-        offset         = 0x08c0000;
+        size           = 0x800;
+        offset         = 0x8c0000;
         page_size      = 0x20;
         readsize       = 0x100;
     ;
 
     memory "application"
-        size           = 0x00030000;
-        offset         = 0x0800000;
+        size           = 0x20000;
+        offset         = 0x800000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "apptable"
-        size           = 0x00002000;
-        offset         = 0x0082e000;
+        size           = 0x1000;
+        offset         = 0x81f000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "boot"
-        size           = 0x00002000;
-        offset         = 0x00830000;
+        size           = 0x2000;
+        offset         = 0x820000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "flash"
-        size           = 0x00032000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
-
-    memory "prodsig"
-        size           = 0x200;
-        offset         = 0x8e0200;
+        size           = 0x22000;
+        offset         = 0x800000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "usersig"
-        size           = 0x200;
+        size           = 0x100;
         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
+# ATxmega128B1
 #------------------------------------------------------------
 
-part
-    id         = "x256a3";
-    desc       = "ATXMEGA256A3";
-    signature  = 0x1e 0x98 0x42;
+part parent ".xmega"
+    id         = "x128b1";
+    desc       = "ATxmega128B1";
+    signature  = 0x1e 0x97 0x4d;
+    usbpid     = 0x2fea;
     has_jtag   = yes;
-    has_pdi    = yes;
-    nvm_base   = 0x01c0;
 
     memory "eeprom"
-        size           = 0x1000;
-        offset         = 0x08c0000;
+        size           = 0x800;
+        offset         = 0x8c0000;
         page_size      = 0x20;
         readsize       = 0x100;
     ;
 
     memory "application"
-        size           = 0x00040000;
-        offset         = 0x0800000;
+        size           = 0x20000;
+        offset         = 0x800000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "apptable"
-        size           = 0x00002000;
-        offset         = 0x0083e000;
+        size           = 0x2000;
+        offset         = 0x81e000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "boot"
-        size           = 0x00002000;
-        offset         = 0x00840000;
+        size           = 0x2000;
+        offset         = 0x820000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "flash"
-        size           = 0x00042000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
-
-    memory "prodsig"
-        size           = 0x200;
-        offset         = 0x8e0200;
+        size           = 0x22000;
+        offset         = 0x800000;
         page_size      = 0x100;
         readsize       = 0x100;
     ;
 
     memory "usersig"
-        size           = 0x200;
+        size           = 0x100;
         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;
-    ;
+#------------------------------------------------------------
+# ATxmega128B3
+#------------------------------------------------------------
 
-    memory "lock"
-        size           = 1;
-        offset         = 0x8f0027;
-    ;
+part parent "x128b1"
+    id         = "x128b3";
+    desc       = "ATxmega128B3";
+    signature  = 0x1e 0x97 0x4b;
+    usbpid     = 0x2fe0;
 ;
 
 #------------------------------------------------------------
-# ATXMEGA256A3B
+# ATxmega192C3
 #------------------------------------------------------------
 
-part
-    id         = "x256a3b";
-    desc       = "ATXMEGA256A3B";
-    signature  = 0x1e 0x98 0x43;
-    has_jtag   = yes;
-    has_pdi    = yes;
-    nvm_base   = 0x01c0;
+part parent ".xmega"
+    id         = "x192c3";
+    desc       = "ATxmega192C3";
+    signature  = 0x1e 0x97 0x51;
+    # usbpid   = 0x2f??;
 
     memory "eeprom"
-        size           = 0x1000;
-        offset         = 0x08c0000;
+        size           = 0x800;
+        offset         = 0x8c0000;
         page_size      = 0x20;
         readsize       = 0x100;
     ;
 
     memory "application"
-        size           = 0x00040000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
+        size           = 0x30000;
+        offset         = 0x800000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "apptable"
-        size           = 0x00002000;
-        offset         = 0x0083e000;
-        page_size      = 0x100;
+        size           = 0x2000;
+        offset         = 0x82e000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "boot"
-        size           = 0x00002000;
-        offset         = 0x00840000;
-        page_size      = 0x100;
+        size           = 0x2000;
+        offset         = 0x830000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "flash"
-        size           = 0x00042000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
-
-    memory "prodsig"
-        size           = 0x200;
-        offset         = 0x8e0200;
-        page_size      = 0x100;
+        size           = 0x32000;
+        offset         = 0x800000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "usersig"
         size           = 0x200;
         offset         = 0x8e0400;
-        page_size      = 0x100;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
+;
 
-    memory "signature"
-        size           = 3;
-        offset         = 0x1000090;
-    ;
+#------------------------------------------------------------
+# ATxmega192D3
+#------------------------------------------------------------
+
+part parent "x192c3"
+    id         = "x192d3";
+    desc       = "ATxmega192D3";
+    signature  = 0x1e 0x97 0x49;
+;
+
+#------------------------------------------------------------
+# ATxmega192A1
+#------------------------------------------------------------
+
+part parent "x192c3"
+    id         = "x192a1";
+    desc       = "ATxmega192A1";
+    signature  = 0x1e 0x97 0x4e;
+    has_jtag   = yes;
 
     memory "fuse0"
         size           = 1;
         offset         = 0x8f0020;
     ;
+;
 
-    memory "fuse1"
-        size           = 1;
-        offset         = 0x8f0021;
-    ;
-
-    memory "fuse2"
-        size           = 1;
-        offset         = 0x8f0022;
-    ;
+#------------------------------------------------------------
+# ATxmega192A3
+#------------------------------------------------------------
 
-    memory "fuse4"
-        size           = 1;
-        offset         = 0x8f0024;
-    ;
+part parent "x192a1"
+    id         = "x192a3";
+    desc       = "ATxmega192A3";
+    signature  = 0x1e 0x97 0x44;
+;
 
-    memory "fuse5"
-        size           = 1;
-        offset         = 0x8f0025;
-    ;
+#------------------------------------------------------------
+# ATxmega192A3U
+#------------------------------------------------------------
 
-    memory "lock"
-        size           = 1;
-        offset         = 0x8f0027;
-    ;
+part parent "x192a1"
+    id         = "x192a3u";
+    desc       = "ATxmega192A3U";
+    signature  = 0x1e 0x97 0x44;
+    usbpid     = 0x2fe7;
 ;
 
 #------------------------------------------------------------
-# ATXMEGA16A4
+# ATxmega256C3
 #------------------------------------------------------------
 
-part
-    id         = "x16a4";
-    desc       = "ATXMEGA16A4";
-    signature  = 0x1e 0x94 0x41;
-    has_jtag   = yes;
-    has_pdi    = yes;
-    nvm_base   = 0x01c0;
+part parent ".xmega"
+    id         = "x256c3";
+    desc       = "ATxmega256C3";
+    signature  = 0x1e 0x98 0x46;
+    usbpid     = 0x2fda;
 
     memory "eeprom"
-        size           = 0x0400;
-        offset         = 0x08c0000;
+        size           = 0x1000;
+        offset         = 0x8c0000;
         page_size      = 0x20;
         readsize       = 0x100;
     ;
 
     memory "application"
-        size           = 0x00004000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
+        size           = 0x40000;
+        offset         = 0x800000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "apptable"
-        size           = 0x00001000;
-        offset         = 0x00803000;
-        page_size      = 0x100;
+        size           = 0x2000;
+        offset         = 0x83e000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "boot"
-        size           = 0x00001000;
-        offset         = 0x00804000;
-        page_size      = 0x100;
+        size           = 0x2000;
+        offset         = 0x840000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "flash"
-        size           = 0x00005000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
-
-    memory "prodsig"
-        size           = 0x200;
-        offset         = 0x8e0200;
-        page_size      = 0x100;
+        size           = 0x42000;
+        offset         = 0x800000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "usersig"
         size           = 0x200;
         offset         = 0x8e0400;
-        page_size      = 0x100;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
+;
 
-    memory "signature"
-        size           = 3;
-        offset         = 0x1000090;
-    ;
+#------------------------------------------------------------
+# ATxmega256D3
+#------------------------------------------------------------
+
+part parent "x256c3"
+    id         = "x256d3";
+    desc       = "ATxmega256D3";
+    signature  = 0x1e 0x98 0x44;
+;
+
+#------------------------------------------------------------
+# ATxmega256A1
+#------------------------------------------------------------
+
+part parent "x256c3"
+    id         = "x256a1";
+    desc       = "ATxmega256A1";
+    signature  = 0x1e 0x98 0x46;
+    has_jtag   = yes;
 
     memory "fuse0"
         size           = 1;
         offset         = 0x8f0020;
     ;
+;
 
-    memory "fuse1"
-        size           = 1;
-        offset         = 0x8f0021;
-    ;
+#------------------------------------------------------------
+# ATxmega256A3
+#------------------------------------------------------------
 
-    memory "fuse2"
-        size           = 1;
-        offset         = 0x8f0022;
-    ;
+part parent "x256a1"
+    id         = "x256a3";
+    desc       = "ATxmega256A3";
+    signature  = 0x1e 0x98 0x42;
+;
 
-    memory "fuse4"
-        size           = 1;
-        offset         = 0x8f0024;
-    ;
+#------------------------------------------------------------
+# ATxmega256A3U
+#------------------------------------------------------------
 
-    memory "fuse5"
-        size           = 1;
-        offset         = 0x8f0025;
-    ;
+part parent "x256a1"
+    id         = "x256a3u";
+    desc       = "ATxmega256A3U";
+    signature  = 0x1e 0x98 0x42;
+    usbpid     = 0x2fec;
+;
+
+#------------------------------------------------------------
+# ATxmega256A3B
+#------------------------------------------------------------
+
+part parent "x256a1"
+    id         = "x256a3b";
+    desc       = "ATxmega256A3B";
+    signature  = 0x1e 0x98 0x43;
+;
+
+#------------------------------------------------------------
+# ATxmega256A3BU
+#------------------------------------------------------------
 
-    memory "lock"
-        size           = 1;
-        offset         = 0x8f0027;
-    ;
+part parent "x256a1"
+    id         = "x256a3bu";
+    desc       = "ATxmega256A3BU";
+    signature  = 0x1e 0x98 0x43;
+    usbpid     = 0x2fe2;
 ;
 
 #------------------------------------------------------------
-# ATXMEGA32A4
+# ATxmega384C3
 #------------------------------------------------------------
 
-part
-    id         = "x32a4";
-    desc       = "ATXMEGA32A4";
-    signature  = 0x1e 0x95 0x41;
-    has_jtag   = yes;
-    has_pdi    = yes;
-    nvm_base   = 0x01c0;
+part parent ".xmega"
+    id         = "x384c3";
+    desc       = "ATxmega384C3";
+    signature  = 0x1e 0x98 0x45;
+    usbpid     = 0x2fdb;
 
     memory "eeprom"
-        size           = 0x0400;
-        offset         = 0x08c0000;
+        size           = 0x1000;
+        offset         = 0x8c0000;
         page_size      = 0x20;
         readsize       = 0x100;
     ;
 
     memory "application"
-        size           = 0x00008000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
+        size           = 0x60000;
+        offset         = 0x800000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "apptable"
-        size           = 0x00001000;
-        offset         = 0x00807000;
-        page_size      = 0x100;
+        size           = 0x2000;
+        offset         = 0x85e000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "boot"
-        size           = 0x00001000;
-        offset         = 0x00808000;
-        page_size      = 0x100;
+        size           = 0x2000;
+        offset         = 0x860000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "flash"
-        size           = 0x00009000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
-
-    memory "prodsig"
-        size           = 0x200;
-        offset         = 0x8e0200;
-        page_size      = 0x100;
+        size           = 0x62000;
+        offset         = 0x800000;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
 
     memory "usersig"
         size           = 0x200;
         offset         = 0x8e0400;
-        page_size      = 0x100;
+        page_size      = 0x200;
         readsize       = 0x100;
     ;
+;
 
-    memory "signature"
-        size           = 3;
-        offset         = 0x1000090;
-    ;
+#------------------------------------------------------------
+# ATxmega384D3
+#------------------------------------------------------------
 
-    memory "fuse0"
-        size           = 1;
-        offset         = 0x8f0020;
+part parent "x384c3"
+    id         = "x384d3";
+    desc       = "ATxmega384D3";
+    signature  = 0x1e 0x98 0x47;
+;
+
+#------------------------------------------------------------
+# ATxmega8E5
+#------------------------------------------------------------
+
+part parent ".xmega"
+    id         = "x8e5";
+    desc       = "ATxmega8E5";
+    signature  = 0x1e 0x93 0x41;
+
+    memory "eeprom"
+        size           = 0x0200;
+        offset         = 0x08c0000;
+        page_size      = 0x20;
+        readsize       = 0x100;
     ;
 
-    memory "fuse1"
-        size           = 1;
-        offset         = 0x8f0021;
+    memory "application"
+        size           = 0x2000;
+        offset         = 0x0800000;
+        page_size      = 0x80;
+        readsize       = 0x100;
     ;
 
-    memory "fuse2"
-        size           = 1;
-        offset         = 0x8f0022;
+    memory "apptable"
+        size           = 0x800;
+        offset         = 0x00801800;
+        page_size      = 0x80;
+        readsize       = 0x100;
     ;
 
-    memory "fuse4"
-        size           = 1;
-        offset         = 0x8f0024;
+    memory "boot"
+        size           = 0x800;
+        offset         = 0x00802000;
+        page_size      = 0x80;
+        readsize       = 0x100;
     ;
 
-    memory "fuse5"
-        size           = 1;
-        offset         = 0x8f0025;
+    memory "flash"
+        size           = 0x2800;
+        offset         = 0x0800000;
+        page_size      = 0x80;
+        readsize       = 0x100;
     ;
 
-    memory "lock"
-        size           = 1;
-        offset         = 0x8f0027;
+    memory "usersig"
+        size            = 0x80;
+        offset          = 0x8e0400;
+        page_size       = 0x80;
+        readsize       = 0x100;
     ;
 ;
 
 #------------------------------------------------------------
-# ATXMEGA64A4
+# ATxmega16E5
 #------------------------------------------------------------
 
-part
-    id         = "x64a4";
-    desc       = "ATXMEGA64A4";
-    signature  = 0x1e 0x96 0x46;
-    has_jtag   = yes;
-    has_pdi    = yes;
-    nvm_base   = 0x01c0;
+part parent ".xmega"
+    id         = "x16e5";
+    desc       = "ATxmega16E5";
+    signature  = 0x1e 0x94 0x45;
 
     memory "eeprom"
-        size           = 0x0800;
+        size           = 0x0200;
         offset         = 0x08c0000;
         page_size      = 0x20;
         readsize       = 0x100;
     ;
 
     memory "application"
-        size           = 0x00010000;
+        size           = 0x4000;
         offset         = 0x0800000;
-        page_size      = 0x100;
+        page_size      = 0x80;
         readsize       = 0x100;
     ;
 
     memory "apptable"
-        size           = 0x00001000;
-        offset         = 0x0080f000;
-        page_size      = 0x100;
+        size           = 0x1000;
+        offset         = 0x00803000;
+        page_size      = 0x80;
         readsize       = 0x100;
     ;
 
     memory "boot"
-        size           = 0x00001000;
-        offset         = 0x00810000;
-        page_size      = 0x100;
+        size           = 0x1000;
+        offset         = 0x00804000;
+        page_size      = 0x80;
         readsize       = 0x100;
     ;
 
     memory "flash"
-        size           = 0x00011000;
+        size           = 0x5000;
         offset         = 0x0800000;
-        page_size      = 0x100;
+        page_size      = 0x80;
         readsize       = 0x100;
     ;
 
-    memory "prodsig"
-        size           = 0x200;
-        offset         = 0x8e0200;
-        page_size      = 0x100;
+    memory "usersig"
+        size            = 0x80;
+        offset          = 0x8e0400;
+        page_size       = 0x80;
         readsize       = 0x100;
     ;
+;
 
-    memory "usersig"
-        size           = 0x200;
-        offset         = 0x8e0400;
-        page_size      = 0x100;
+#------------------------------------------------------------
+# ATxmega32E5
+#------------------------------------------------------------
+
+part parent ".xmega"
+    id         = "x32e5";
+    desc       = "ATxmega32E5";
+    signature  = 0x1e 0x95 0x4c;
+
+    memory "eeprom"
+        size           = 0x0400;
+        offset         = 0x08c0000;
+        page_size      = 0x20;
         readsize       = 0x100;
     ;
 
-    memory "signature"
-        size           = 3;
-        offset         = 0x1000090;
+    memory "application"
+        size           = 0x8000;
+        offset         = 0x0800000;
+        page_size      = 0x80;
+        readsize       = 0x100;
     ;
 
-    memory "fuse0"
-        size           = 1;
-        offset         = 0x8f0020;
+    memory "apptable"
+        size           = 0x1000;
+        offset         = 0x00807000;
+        page_size      = 0x80;
+        readsize       = 0x100;
     ;
 
-    memory "fuse1"
-        size           = 1;
-        offset         = 0x8f0021;
+    memory "boot"
+        size           = 0x1000;
+        offset         = 0x00808000;
+        page_size      = 0x80;
+        readsize       = 0x100;
     ;
 
-    memory "fuse2"
-        size           = 1;
-        offset         = 0x8f0022;
+    memory "flash"
+        size           = 0x9000;
+        offset         = 0x0800000;
+        page_size      = 0x80;
+        readsize       = 0x100;
     ;
 
-    memory "fuse4"
-        size           = 1;
-        offset         = 0x8f0024;
+    memory "usersig"
+        size            = 0x80;
+        offset          = 0x8e0400;
+        page_size       = 0x80;
+        readsize       = 0x100;
     ;
+;
 
-    memory "fuse5"
-        size           = 1;
-        offset         = 0x8f0025;
-    ;
+#------------------------------------------------------------
+# AVR32UC3A0512
+#------------------------------------------------------------
 
-    memory "lock"
-        size           = 1;
-        offset         = 0x8f0027;
+part
+    id         = "uc3a0512";
+    desc       = "AT32UC3A0512";
+    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;
     ;
 ;
 
+part parent "uc3a0512"
+    id         = "ucr2";
+    desc       = "deprecated, use 'uc3a0512'";
+;
+
 #------------------------------------------------------------
-# ATXMEGA128A4
+# ATtiny1634.
 #------------------------------------------------------------
 
 part
-    id         = "x128a4";
-    desc       = "ATXMEGA128A4";
-    signature  = 0x1e 0x97 0x46;
-    has_jtag   = yes;
-    has_pdi    = yes;
-    nvm_base   = 0x01c0;
+    id              = "t1634";
+    desc            = "ATtiny1634";
+     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 0x12;
+    pagel           = 0xB3;
+    bs2             = 0xB1;
+    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         = 0;
+    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"
-        size           = 0x0800;
-        offset         = 0x08c0000;
-        page_size      = 0x20;
-        readsize       = 0x100;
-    ;
+        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 a8",
+                          " a7 a6 a5 a4 a3 a2 a1 a0",
+                          " o o o o o o o o";
 
-    memory "application"
-        size           = 0x00020000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
+        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";
 
-    memory "apptable"
-        size           = 0x00002000;
-        offset         = 0x0081e000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
+   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       = 32;
+        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",
+                          " 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";
 
-    memory "boot"
-        size           = 0x00002000;
-        offset         = 0x00820000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
+        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";
 
-    memory "flash"
-        size           = 0x00022000;
-        offset         = 0x0800000;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
+        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";
 
-    memory "prodsig"
-        size           = 0x200;
-        offset         = 0x8e0200;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
+        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";
 
-    memory "usersig"
-        size           = 0x200;
-        offset         = 0x8e0400;
-        page_size      = 0x100;
-        readsize       = 0x100;
-    ;
+        mode        = 0x41;
+        delay       = 6;
+        blocksize   = 128;
+        readsize    = 256;
 
-    memory "signature"
-        size           = 3;
-        offset         = 0x1000090;
-    ;
+        ;
 
-    memory "fuse0"
-        size           = 1;
-        offset         = 0x8f0020;
-    ;
+    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";
 
-    memory "fuse1"
-        size           = 1;
-        offset         = 0x8f0021;
-    ;
+        write           = "1 0 1 0 1 1 0 0 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 "fuse2"
-        size           = 1;
-        offset         = 0x8f0022;
-    ;
+    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";
 
-    memory "fuse4"
-        size           = 1;
-        offset         = 0x8f0024;
-    ;
+        write           = "1 0 1 0 1 1 0 0 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 "fuse5"
-        size           = 1;
-        offset         = 0x8f0025;
-    ;
+    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";
 
-    memory "lock"
-        size           = 1;
-        offset         = 0x8f0027;
-    ;
-;
+        write           = "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 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 x x x x o o";
 
-#------------------------------------------------------------
-# AVR32UC3A0512
-#------------------------------------------------------------
+        write           = "1 0 1 0 1 1 0 0 1 1 1 x x x x x",
+                          "x x x x x x x x 1 1 1 1 1 1 i i";
+        ;
 
-part
-    id         = "ucr2";
-    desc       = "32UC3A0512";
-    signature  = 0xED 0xC0 0x3F;
-    has_jtag   = yes;
-    is_avr32    = yes;
+    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 "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;
-    ;
+    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";
+        ;
 ;
 
 #------------------------------------------------------------
-# ATtiny4
+# Common values for reduced core tinys (4/5/9/10/20/40)
 #------------------------------------------------------------
 
 part
-    id         = "t4";
-    desc       = "ATtiny4";
-    signature  = 0x1e 0x8f 0x0a;
+    id         = ".reduced_core_tiny";
+    desc       = "Common values for reduced core tinys";
     has_tpi    = yes;
 
-    memory "flash"
-        size           = 512;
-        offset         = 0x4000;
-        page_size      = 16;
-        blocksize      = 128;
-    ;
-
     memory "signature"
         size           = 3;
         offset         = 0x3fc0;
@@ -16806,16 +14816,14 @@ part
     ;
 ;
 
-
 #------------------------------------------------------------
-# ATtiny5
+# ATtiny4
 #------------------------------------------------------------
 
-part
-    id         = "t5";
-    desc       = "ATtiny5";
-    signature  = 0x1e 0x8f 0x09;
-    has_tpi    = yes;
+part parent ".reduced_core_tiny"
+    id         = "t4";
+    desc       = "ATtiny4";
+    signature  = 0x1e 0x8f 0x0a;
 
     memory "flash"
         size           = 512;
@@ -16823,43 +14831,26 @@ part
         page_size      = 16;
         blocksize      = 128;
     ;
+;
 
-    memory "signature"
-        size           = 3;
-        offset         = 0x3fc0;
-        page_size      = 16;
-    ;
-
-    memory "fuse"
-        size           = 1;
-        offset         = 0x3f40;
-        page_size      = 16;
-       blocksize       = 4;
-    ;
-
-    memory "calibration"
-        size           = 1;
-        offset         = 0x3f80;
-        page_size      = 16;
-    ;
+#------------------------------------------------------------
+# ATtiny5
+#------------------------------------------------------------
 
-    memory "lockbits"
-        size           = 1;
-        offset         = 0x3f00;
-        page_size      = 16;
-    ;
+part parent "t4"
+    id         = "t5";
+    desc       = "ATtiny5";
+    signature  = 0x1e 0x8f 0x09;
 ;
 
-
 #------------------------------------------------------------
 # ATtiny9
 #------------------------------------------------------------
 
-part
+part parent ".reduced_core_tiny"
     id         = "t9";
     desc       = "ATtiny9";
     signature  = 0x1e 0x90 0x08;
-    has_tpi    = yes;
 
     memory "flash"
         size           = 1024;
@@ -16867,74 +14858,114 @@ part
         page_size      = 16;
         blocksize      = 128;
     ;
+;
 
-    memory "signature"
-        size           = 3;
-        offset         = 0x3fc0;
-        page_size      = 16;
-    ;
+#------------------------------------------------------------
+# ATtiny10
+#------------------------------------------------------------
 
-    memory "fuse"
-        size           = 1;
-        offset         = 0x3f40;
-        page_size      = 16;
-       blocksize       = 4;
-    ;
+part parent "t9"
+    id         = "t10";
+    desc       = "ATtiny10";
+    signature  = 0x1e 0x90 0x03;
+;
 
-    memory "calibration"
-        size           = 1;
-        offset         = 0x3f80;
-        page_size      = 16;
-    ;
+#------------------------------------------------------------
+# ATtiny20
+#------------------------------------------------------------
 
-    memory "lockbits"
-        size           = 1;
-        offset         = 0x3f00;
-        page_size      = 16;
+part parent ".reduced_core_tiny"
+    id          = "t20";
+    desc        = "ATtiny20";
+    signature   = 0x1e 0x91 0x0F;
+
+    memory "flash"
+        size            = 2048;
+        offset          = 0x4000;
+        page_size       = 16;
+        blocksize       = 128;
     ;
 ;
 
-
 #------------------------------------------------------------
-# ATtiny10
+# ATtiny40
 #------------------------------------------------------------
 
-part
-    id         = "t10";
-    desc       = "ATtiny10";
-    signature  = 0x1e 0x90 0x03;
-    has_tpi    = yes;
+part parent ".reduced_core_tiny"
+    id         = "t40";
+    desc       = "ATtiny40";
+    signature  = 0x1e 0x92 0x0E;
 
     memory "flash"
-        size           = 1024;
+        size           = 4096;
         offset         = 0x4000;
-        page_size      = 16;
+        page_size      = 64;
         blocksize      = 128;
     ;
+;
 
-    memory "signature"
-        size           = 3;
-        offset         = 0x3fc0;
-        page_size      = 16;
+#------------------------------------------------------------
+# ATmega406
+#------------------------------------------------------------
+
+part
+    id                         = "m406";
+    desc                       = "ATMEGA406";
+    has_jtag                   = yes;
+    signature                  = 0x1e 0x95 0x07;
+
+    # STK500 parameters (parallel programming IO lines)
+    pagel                      = 0xa7;
+    bs2                                = 0xa0;
+    serial                     = no;
+    parallel                   = yes;
+
+    # STK500v2 HV programming parameters, from XML
+    pp_controlstack            = 0x0e, 0x1e, 0x0f, 0x1f, 0x2e, 0x3e, 0x2f, 0x3f,
+                                 0x4e, 0x5e, 0x4f, 0x5f, 0x6e, 0x7e, 0x6f, 0x7f,
+                                 0x66, 0x76, 0x67, 0x77, 0x6a, 0x7a, 0x6b, 0x7b,
+                                 0xbe, 0xfd, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00;
+
+    # JTAG ICE mkII parameters, also from XML files
+    allowfullpagebitstream     = no;
+    enablepageprogramming      = yes;
+    idr                                = 0x51;
+    rampz                      = 0x00;
+    spmcr                      = 0x57;
+    eecr                       = 0x3f;
+
+    memory "eeprom"
+        paged          = no;
+        size           = 512;
+        page_size      = 4;
+        blocksize      = 4;
+       readsize        = 4;
+        num_pages      = 128;
     ;
 
-    memory "fuse"
-        size           = 1;
-        offset         = 0x3f40;
-        page_size      = 16;
-       blocksize       = 4;
+    memory "flash"
+        paged          = yes;
+        size           = 40960;
+        page_size      = 128;
+        blocksize      = 128;
+       readsize        = 128;
+        num_pages      = 320;
     ;
 
-    memory "calibration"
-        size           = 1;
-        offset         = 0x3f80;
-        page_size      = 16;
+    memory "hfuse"
+        size            = 1;
+    ;
+
+    memory "lfuse"
+        size            = 1;
     ;
 
     memory "lockbits"
         size           = 1;
-        offset         = 0x3f00;
-        page_size      = 16;
+    ;
+
+    memory "signature"
+        size            = 3;
     ;
 ;
 
index bcdf2f4..09962b1 100644 (file)
Binary files a/programmer/flash/avrdude.exe and b/programmer/flash/avrdude.exe differ