00001
00033 #include <ioavr.h>
00034
00035 #ifndef __SELF_PROGRAMMING_H
00036 #define __SELF_PROGRAMMING_H
00037
00038
00039
00040
00041
00042
00043 #define __FLASH_RECOVER // This define enables FLASH buffering to avoid
00044
00045 #define ADR_FLASH_BUFFER 0 // Defines the FLASH page address used for buffering
00046
00047 #define ADR_LIMIT_LOW 0 // Defines the low address limit for FLASH write
00048
00049 #define BOOTSECTORSIZE 0x2000 // 4096 words
00050 #define ADR_LIMIT_HIGH FLASHEND-BOOTSECTORSIZE// Defines the high address limit for FLASH write
00051
00052
00053
00054
00055
00056 #if defined(__ATtiny13__) || defined(__AT90Tiny13__) || \
00057 defined(__ATtiny2313__) || defined(__AT90Tiny2313__)
00058 #define PAGESIZE 32
00059 #endif
00060
00061 #if defined(__ATmega88__) || defined(__AT90Mega88__) || \
00062 defined(__ATmega48__) || defined(__AT90Mega48__) || \
00063 defined(__ATmega8__) || defined(__AT90Mega8__) || \
00064 defined(__ATmega8515__) || defined(__AT90Mega8515__) || \
00065 defined(__ATmega8535__) || defined(__AT90Mega8535__)
00066 #define PAGESIZE 64
00067 #endif
00068
00069 #if defined(__ATmega162__) || defined(__AT90Mega162__) || \
00070 defined(__ATmega163__) || defined(__AT90Mega163__) || \
00071 defined(__ATmega168__) || defined(__AT90Mega168__) || \
00072 defined(__ATmega169__) || defined(__AT90Mega169__) || \
00073 defined(__ATmega161__) || defined(__AT90Mega161__) || \
00074 defined(__ATmega16__) || defined(__AT90Mega16__) || \
00075 defined(__ATmega32__) || defined(__AT90Mega32__) || \
00076 defined(__ATmega323__) || defined(__AT90Mega323__) || \
00077 defined(__ATmega329__) || defined(__AT90Mega329__) || \
00078 defined(__ATmega3290__) || defined(__AT90Mega3290__)
00079 #define PAGESIZE 128
00080 #endif
00081
00082 #if defined(__ATmega64__) || defined(__AT90Mega64__) || \
00083 defined(__ATmega640__) || defined(__AT90Mega640__) || \
00084 defined(__ATmega649__) || defined(__AT90Mega649__) || \
00085 defined(__ATmega6490__) || defined(__AT90Mega6490__) || \
00086 defined(__ATmega128__) || defined(__AT90Mega128__) || \
00087 defined(__ATmega1280__) || defined(__AT90Mega1280__) || \
00088 defined(__ATmega1281__) || defined(__AT90Mega1281__) || \
00089 defined(__ATmega2560__) || defined(__AT90Mega2560__) || \
00090 defined(__ATmega2561__) || defined(__AT90Mega2561__)
00091 #define PAGESIZE 256
00092 #endif
00093
00094
00095
00096
00097
00098
00099 #ifdef __HAS_ELPM__
00100 typedef unsigned long MyAddressType;
00101 typedef unsigned char __farflash* MyFlashCharPointer;
00102 typedef unsigned int __farflash* MyFlashIntPointer;
00103 #else
00104 typedef unsigned int MyAddressType;
00105 typedef unsigned char __flash* MyFlashCharPointer;
00106 typedef unsigned int __flash* MyFlashIntPointer;
00107 #endif
00108
00109
00110
00111
00112
00113 #if defined(__ATmega16__) || defined(__AT90Mega16__) || \
00114 defined(__ATmega161__) || defined(__AT90Mega161__) || \
00115 defined(__ATmega162__) || defined(__AT90Mega162__) || \
00116 defined(__ATmega163__) || defined(__AT90Mega163__) || \
00117 defined(__ATmega32__) || defined(__AT90Mega32__) || \
00118 defined(__ATmega323__) || defined(__ATMega323__) || \
00119 defined(__ATmega64__) || defined(__AT90Mega64__) || \
00120 defined(__ATmega8__) || defined(__AT90Mega8__) || \
00121 defined(__ATmega8535__) || defined(__AT90Mega8535__) || \
00122 defined(__ATmega8515__) || defined(__AT90Mega8515__)
00123 #define SPMControllRegister SPMCR
00124 #else
00125 #define SPMControllRegister SPMCSR
00126 #endif
00127
00128
00129
00130
00131
00132 #define FLASH_BUFFER_FULL_ID 0xAA
00133 #define TRUE 1
00134 #define FALSE 0
00135
00136
00137
00138
00139
00140
00141 unsigned char ReadFlashByte(MyAddressType flashAdr);
00142 unsigned char ReadFlashPage(MyAddressType flashStartAdr, unsigned char *dataPage);
00143 unsigned char WriteFlashByte(MyAddressType flashAddr, unsigned char data);
00144 unsigned char WriteFlashPage(MyAddressType flashStartAdr, unsigned char *dataPage);
00145 unsigned char RecoverFlash();
00146
00147
00148 unsigned char AddressCheck(MyAddressType flashAdr);
00149 void WriteBufToFlash(MyAddressType flashStartAdr);
00150 void LpmReplaceSpm(MyAddressType flashAddr, unsigned char data);
00151
00152 #endif