├── Makefile ├── README ├── avr_cpunames.h ├── avrinterruptnames.h ├── command.h ├── goodHexFiles └── stk500boot_v2_mega2560.hex ├── stk500boot.c └── test └── bigprogram └── bigprogram.ino /Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arduino/Arduino-stk500v2-bootloader/06ebf3701162b7b7c557dd64bc10796507dbada5/Makefile -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arduino/Arduino-stk500v2-bootloader/06ebf3701162b7b7c557dd64bc10796507dbada5/README -------------------------------------------------------------------------------- /avr_cpunames.h: -------------------------------------------------------------------------------- 1 | //************************************************************************************************** 2 | //* 3 | //* Atmel AVR CPU name strings 4 | //* 5 | //************************************************************************************************** 6 | //* Sep 19, 2010 Started on avr_cpunames.h 7 | //************************************************************************************************** 8 | 9 | //#include "avr_cpunames.h" 10 | 11 | //************************************************************************************************** 12 | 13 | 14 | #if defined (__AVR_AT94K__) 15 | #define _AVR_CPU_NAME_ "AT94k" 16 | #elif defined (__AVR_AT43USB320__) 17 | #elif defined (__AVR_AT43USB355__) 18 | #elif defined (__AVR_AT76C711__) 19 | #elif defined (__AVR_AT86RF401__) 20 | #elif defined (__AVR_AT90PWM1__) 21 | #elif defined (__AVR_AT90PWM2__) 22 | #elif defined (__AVR_AT90PWM2B__) 23 | #elif defined (__AVR_AT90PWM3__) 24 | #elif defined (__AVR_AT90PWM3B__) 25 | #elif defined (__AVR_AT90PWM216__) 26 | #elif defined (__AVR_AT90PWM316__) 27 | #elif defined (__AVR_ATmega32C1__) 28 | #elif defined (__AVR_ATmega32M1__) 29 | #elif defined (__AVR_ATmega32U4__) 30 | #define _AVR_CPU_NAME_ "ATmega32U4" 31 | #elif defined (__AVR_ATmega32U6__) 32 | #define _AVR_CPU_NAME_ "ATmega32U6" 33 | #elif defined (__AVR_ATmega128__) 34 | #define _AVR_CPU_NAME_ "Atmega128" 35 | #elif defined (__AVR_ATmega1280__) 36 | #define _AVR_CPU_NAME_ "ATmega1280" 37 | #elif defined (__AVR_ATmega1281__) 38 | #define _AVR_CPU_NAME_ "ATmega1281" 39 | #elif defined (__AVR_ATmega1284P__) 40 | #define _AVR_CPU_NAME_ "ATmega1284" 41 | #elif defined (__AVR_ATmega128RFA1__) 42 | #define _AVR_CPU_NAME_ "ATmega128RFA1" 43 | #elif defined (__AVR_ATmega2560__) 44 | #define _AVR_CPU_NAME_ "ATmega2560" 45 | #elif defined (__AVR_ATmega2561__) 46 | #define _AVR_CPU_NAME_ "ATmega2561" 47 | #elif defined (__AVR_AT90CAN32__) 48 | #define _AVR_CPU_NAME_ "AT90CAN32" 49 | #elif defined (__AVR_AT90CAN64__) 50 | #define _AVR_CPU_NAME_ "AT90CAN64" 51 | #elif defined (__AVR_AT90CAN128__) 52 | #define _AVR_CPU_NAME_ "AT90CAN128" 53 | #elif defined (__AVR_AT90USB82__) 54 | #define _AVR_CPU_NAME_ "AT90USB82" 55 | #elif defined (__AVR_AT90USB162__) 56 | #define _AVR_CPU_NAME_ "AT90USB162" 57 | #elif defined (__AVR_AT90USB646__) 58 | #define _AVR_CPU_NAME_ "AT90USB646" 59 | #elif defined (__AVR_AT90USB647__) 60 | #define _AVR_CPU_NAME_ "AT90USB647" 61 | #elif defined (__AVR_AT90USB1286__) 62 | #define _AVR_CPU_NAME_ "AT90USB1286" 63 | #elif defined (__AVR_AT90USB1287__) 64 | #define _AVR_CPU_NAME_ "AT90USB1287" 65 | #elif defined (__AVR_ATmega64__) 66 | #define _AVR_CPU_NAME_ "ATmega64" 67 | #elif defined (__AVR_ATmega640__) 68 | #define _AVR_CPU_NAME_ "ATmega640" 69 | #elif defined (__AVR_ATmega644__) 70 | #define _AVR_CPU_NAME_ "ATmega644" 71 | #elif defined (__AVR_ATmega644P__) 72 | #define _AVR_CPU_NAME_ "ATmega644P" 73 | #elif defined (__AVR_ATmega645__) 74 | #define _AVR_CPU_NAME_ "ATmega645" 75 | #elif defined (__AVR_ATmega6450__) 76 | #define _AVR_CPU_NAME_ "ATmega6450" 77 | #elif defined (__AVR_ATmega649__) 78 | #define _AVR_CPU_NAME_ "ATmega649" 79 | #elif defined (__AVR_ATmega6490__) 80 | #define _AVR_CPU_NAME_ "ATmega6490" 81 | #elif defined (__AVR_ATmega103__) 82 | #define _AVR_CPU_NAME_ "ATmega103" 83 | #elif defined (__AVR_ATmega32__) 84 | #define _AVR_CPU_NAME_ "Atmega32" 85 | #elif defined (__AVR_ATmega323__) 86 | #define _AVR_CPU_NAME_ "ATmega323" 87 | #elif defined (__AVR_ATmega324P__) 88 | #define _AVR_CPU_NAME_ "ATmega324P" 89 | #elif defined (__AVR_ATmega325__) 90 | #define _AVR_CPU_NAME_ "ATmega325" 91 | #elif defined (__AVR_ATmega325P__) 92 | #define _AVR_CPU_NAME_ "ATmega325P" 93 | #elif defined (__AVR_ATmega3250__) 94 | #define _AVR_CPU_NAME_ "ATmega3250" 95 | #elif defined (__AVR_ATmega3250P__) 96 | #define _AVR_CPU_NAME_ "ATmega3250P" 97 | #elif defined (__AVR_ATmega328P__) 98 | #define _AVR_CPU_NAME_ "ATmega328P" 99 | #elif defined (__AVR_ATmega329__) 100 | #define _AVR_CPU_NAME_ "ATmega329" 101 | #elif defined (__AVR_ATmega329P__) 102 | #define _AVR_CPU_NAME_ "ATmega329P" 103 | #elif defined (__AVR_ATmega3290__) 104 | #define _AVR_CPU_NAME_ "ATmega3290" 105 | #elif defined (__AVR_ATmega3290P__) 106 | #define _AVR_CPU_NAME_ "ATmega3290P" 107 | #elif defined (__AVR_ATmega32HVB__) 108 | #define _AVR_CPU_NAME_ "ATmega32HVB" 109 | #elif defined (__AVR_ATmega406__) 110 | #define _AVR_CPU_NAME_ "ATmega406" 111 | #elif defined (__AVR_ATmega16__) 112 | #define _AVR_CPU_NAME_ "Atmega16" 113 | #elif defined (__AVR_ATmega161__) 114 | #define _AVR_CPU_NAME_ "ATmega161" 115 | #elif defined (__AVR_ATmega162__) 116 | #define _AVR_CPU_NAME_ "ATmega162" 117 | #elif defined (__AVR_ATmega163__) 118 | #define _AVR_CPU_NAME_ "ATmega163" 119 | #elif defined (__AVR_ATmega164P__) 120 | #define _AVR_CPU_NAME_ "ATmega164P" 121 | #elif defined (__AVR_ATmega165__) 122 | #define _AVR_CPU_NAME_ "ATmega165" 123 | #elif defined (__AVR_ATmega165P__) 124 | #define _AVR_CPU_NAME_ "ATmega165P" 125 | #elif defined (__AVR_ATmega168__) 126 | #define _AVR_CPU_NAME_ "ATmega168" 127 | #elif defined (__AVR_ATmega168P__) 128 | #define _AVR_CPU_NAME_ "ATmega168P" 129 | #elif defined (__AVR_ATmega169__) 130 | #define _AVR_CPU_NAME_ "Atmega169" 131 | #elif defined (__AVR_ATmega169P__) 132 | #define _AVR_CPU_NAME_ "ATmega169P" 133 | #elif defined (__AVR_ATmega8HVA__) 134 | #define _AVR_CPU_NAME_ "ATmega8HVA" 135 | #elif defined (__AVR_ATmega16HVA__) 136 | #define _AVR_CPU_NAME_ "ATmega16HVA" 137 | #elif defined (__AVR_ATmega8__) 138 | #define _AVR_CPU_NAME_ "ATmega8" 139 | #elif defined (__AVR_ATmega48__) 140 | #define _AVR_CPU_NAME_ "ATmega48" 141 | #elif defined (__AVR_ATmega48P__) 142 | #define _AVR_CPU_NAME_ "ATmega48P" 143 | #elif defined (__AVR_ATmega88__) 144 | #define _AVR_CPU_NAME_ "ATmega88" 145 | #elif defined (__AVR_ATmega88P__) 146 | #define _AVR_CPU_NAME_ "ATmega88P" 147 | #elif defined (__AVR_ATmega8515__) 148 | #define _AVR_CPU_NAME_ "ATmega8515" 149 | #elif defined (__AVR_ATmega8535__) 150 | #define _AVR_CPU_NAME_ "ATmega8535" 151 | #elif defined (__AVR_AT90S8535__) 152 | #elif defined (__AVR_AT90C8534__) 153 | #elif defined (__AVR_AT90S8515__) 154 | #elif defined (__AVR_AT90S4434__) 155 | #elif defined (__AVR_AT90S4433__) 156 | #elif defined (__AVR_AT90S4414__) 157 | #elif defined (__AVR_ATtiny22__) 158 | #elif defined (__AVR_ATtiny26__) 159 | #elif defined (__AVR_AT90S2343__) 160 | #elif defined (__AVR_AT90S2333__) 161 | #elif defined (__AVR_AT90S2323__) 162 | #elif defined (__AVR_AT90S2313__) 163 | #elif defined (__AVR_ATtiny2313__) 164 | #define _AVR_CPU_NAME_ "ATtiny2313" 165 | #elif defined (__AVR_ATtiny13__) 166 | #elif defined (__AVR_ATtiny13A__) 167 | #elif defined (__AVR_ATtiny25__) 168 | #elif defined (__AVR_ATtiny45__) 169 | #elif defined (__AVR_ATtiny85__) 170 | #elif defined (__AVR_ATtiny24__) 171 | #elif defined (__AVR_ATtiny44__) 172 | #elif defined (__AVR_ATtiny84__) 173 | #elif defined (__AVR_ATtiny261__) 174 | #elif defined (__AVR_ATtiny461__) 175 | #elif defined (__AVR_ATtiny861__) 176 | #elif defined (__AVR_ATtiny43U__) 177 | #elif defined (__AVR_ATtiny48__) 178 | #elif defined (__AVR_ATtiny88__) 179 | #elif defined (__AVR_ATtiny167__) 180 | #elif defined (__AVR_ATmega8U2__) 181 | #define _AVR_CPU_NAME_ "ATmega8U2" 182 | #else 183 | #error cpu not defined 184 | #endif 185 | 186 | 187 | #if !defined (_AVR_CPU_NAME_) 188 | // #define _AVR_CPU_NAME_ "UNKNOWN" 189 | #endif 190 | -------------------------------------------------------------------------------- /avrinterruptnames.h: -------------------------------------------------------------------------------- 1 | //************************************************************************************************** 2 | //* 3 | //* interrupt vector names 4 | //* 5 | //* It is important to note that the vector numbers listed here 6 | //* are the ATMEL documentation numbers. The Arduino numbers are 1 less 7 | //* This is because the Atmel docs start numbering the interrupts at 1 8 | //* when it is actually vector #0 in the table. 9 | //************************************************************************************************** 10 | //* Jun 1, 2010 Added support for ATmega1281 11 | //* Jun 30, 2010 Putting in more ifdefs to conserve space 12 | //* Jul 3, 2010 More #ifdefs to conserve space and testing on most of my boards 13 | //* Jul 4, 2010 Started using vector defs for #ifdefs as defined in 14 | //* Jul 13, 2010 Added support for __AVR_ATmega128__ 15 | //* Aug 26, 2010 Added support for __AVR_ATmega2561__ 16 | //* Sep 13, 2010 Added support for __AVR_AT90CAN32__ __AVR_AT90CAN64__ __AVR_AT90CAN128__ 17 | //************************************************************************************************** 18 | 19 | //#include "avrinterruptnames.h" 20 | 21 | //************************************************************************************************** 22 | //* this defines the interrupt vectors and allows us to compile ONLY those strings that are actually 23 | //* in the target CPU. This way we do not have to keep making changes based on cpu, it will be 24 | //* automatic even if we add a new CPU 25 | #ifndef _AVR_IO_H_ 26 | #include 27 | #endif 28 | //************************************************************************************************** 29 | 30 | #ifdef __MWERKS__ 31 | #define prog_char char 32 | #define PGM_P char * 33 | #endif 34 | 35 | prog_char gAvrInt_RESET[] PROGMEM = "RESET"; 36 | #ifdef INT0_vect 37 | prog_char gAvrInt_INT0[] PROGMEM = "INT0"; 38 | #endif 39 | #ifdef INT1_vect 40 | prog_char gAvrInt_INT1[] PROGMEM = "INT1"; 41 | #endif 42 | #ifdef INT2_vect 43 | prog_char gAvrInt_INT2[] PROGMEM = "INT2"; 44 | #endif 45 | #ifdef INT3_vect 46 | prog_char gAvrInt_INT3[] PROGMEM = "INT3"; 47 | #endif 48 | #ifdef INT4_vect 49 | prog_char gAvrInt_INT4[] PROGMEM = "INT4"; 50 | #endif 51 | #ifdef INT5_vect 52 | prog_char gAvrInt_INT5[] PROGMEM = "INT5"; 53 | #endif 54 | #ifdef INT6_vect 55 | prog_char gAvrInt_INT6[] PROGMEM = "INT6"; 56 | #endif 57 | #ifdef INT7_vect 58 | prog_char gAvrInt_INT7[] PROGMEM = "INT7"; 59 | #endif 60 | #ifdef PCINT0_vect 61 | prog_char gAvrInt_PCINT0[] PROGMEM = "PCINT0"; 62 | #endif 63 | #ifdef PCINT1_vect 64 | prog_char gAvrInt_PCINT1[] PROGMEM = "PCINT1"; 65 | #endif 66 | #ifdef PCINT2_vect 67 | prog_char gAvrInt_PCINT2[] PROGMEM = "PCINT2"; 68 | #endif 69 | #ifdef PCINT3_vect 70 | prog_char gAvrInt_PCINT3[] PROGMEM = "PCINT3"; 71 | #endif 72 | #ifdef WDT_vect 73 | prog_char gAvrInt_WDT[] PROGMEM = "WDT"; 74 | #endif 75 | #ifdef TIMER0_COMP_vect 76 | prog_char gAvrInt_TIMER0_COMP[] PROGMEM = "TIMER0 COMP"; 77 | #endif 78 | #ifdef TIMER0_COMPA_vect 79 | prog_char gAvrInt_TIMER0_COMPA[] PROGMEM = "TIMER0 COMPA"; 80 | #endif 81 | #ifdef TIMER0_COMPB_vect 82 | prog_char gAvrInt_TIMER0_COMPB[] PROGMEM = "TIMER0 COMPB"; 83 | #endif 84 | #ifdef TIMER0_OVF_vect 85 | prog_char gAvrInt_TIMER0_OVF[] PROGMEM = "TIMER0 OVF"; 86 | #endif 87 | #ifdef TIMER1_CAPT_vect 88 | prog_char gAvrInt_TIMER1_CAPT[] PROGMEM = "TIMER1 CAPT"; 89 | #endif 90 | #ifdef TIMER1_COMPA_vect 91 | prog_char gAvrInt_TIMER1_COMPA[] PROGMEM = "TIMER1 COMPA"; 92 | #endif 93 | #ifdef TIMER1_COMPB_vect 94 | prog_char gAvrInt_TIMER1_COMPB[] PROGMEM = "TIMER1 COMPB"; 95 | #endif 96 | #ifdef TIMER1_COMPC_vect 97 | prog_char gAvrInt_TIMER1_COMPC[] PROGMEM = "TIMER1 COMPC"; 98 | #endif 99 | #ifdef TIMER1_OVF_vect 100 | prog_char gAvrInt_TIMER1_OVF[] PROGMEM = "TIMER1 OVF"; 101 | #endif 102 | #ifdef TIMER2_COMP_vect 103 | prog_char gAvrInt_TIMER2_COMP[] PROGMEM = "TIMER2 COMP"; 104 | #endif 105 | #ifdef TIMER2_COMPA_vect 106 | prog_char gAvrInt_TIMER2_COMPA[] PROGMEM = "TIMER2 COMPA"; 107 | #endif 108 | #ifdef TIMER2_COMPB_vect 109 | prog_char gAvrInt_TIMER2_COMPB[] PROGMEM = "TIMER2 COMPB"; 110 | #endif 111 | #ifdef TIMER2_OVF_vect 112 | prog_char gAvrInt_TIMER2_OVF[] PROGMEM = "TIMER2 OVF"; 113 | #endif 114 | #ifdef TIMER3_CAPT_vect 115 | prog_char gAvrInt_TIMER3_CAPT[] PROGMEM = "TIMER3 CAPT"; 116 | #endif 117 | #ifdef TIMER3_COMPA_vect 118 | prog_char gAvrInt_TIMER3_COMPA[] PROGMEM = "TIMER3 COMPA"; 119 | #endif 120 | #ifdef TIMER3_COMPB_vect 121 | prog_char gAvrInt_TIMER3_COMPB[] PROGMEM = "TIMER3 COMPB"; 122 | #endif 123 | #ifdef TIMER3_COMPC_vect 124 | prog_char gAvrInt_TIMER3_COMPC[] PROGMEM = "TIMER3 COMPC"; 125 | #endif 126 | #ifdef TIMER3_OVF_vect 127 | prog_char gAvrInt_TIMER3_OVF[] PROGMEM = "TIMER3 OVF"; 128 | #endif 129 | #ifdef TIMER4_CAPT_vect 130 | prog_char gAvrInt_TIMER4_CAPT[] PROGMEM = "TIMER4 CAPT"; 131 | #endif 132 | #ifdef TIMER4_COMPA_vect 133 | prog_char gAvrInt_TIMER4_COMPA[] PROGMEM = "TIMER4 COMPA"; 134 | #endif 135 | #ifdef TIMER4_COMPB_vect 136 | prog_char gAvrInt_TIMER4_COMPB[] PROGMEM = "TIMER4 COMPB"; 137 | #endif 138 | #ifdef TIMER4_COMPC_vect 139 | prog_char gAvrInt_TIMER4_COMPC[] PROGMEM = "TIMER4 COMPC"; 140 | #endif 141 | #ifdef TIMER4_COMPD_vect 142 | prog_char gAvrInt_TIMER4_COMPD[] PROGMEM = "TIMER4 COMPD"; 143 | #endif 144 | #ifdef TIMER4_OVF_vect 145 | prog_char gAvrInt_TIMER4_OVF[] PROGMEM = "TIMER4 OVF"; 146 | #endif 147 | #ifdef TIMER4_FPF_vect 148 | prog_char gAvrInt_TIMER4_FPF[] PROGMEM = "TIMER4 Fault Protection"; 149 | #endif 150 | #ifdef TIMER5_CAPT_vect 151 | prog_char gAvrInt_TIMER5_CAPT[] PROGMEM = "TIMER5 CAPT"; 152 | #endif 153 | #ifdef TIMER5_COMPA_vect 154 | prog_char gAvrInt_TIMER5_COMPA[] PROGMEM = "TIMER5 COMPA"; 155 | #endif 156 | #ifdef TIMER5_COMPB_vect 157 | prog_char gAvrInt_TIMER5_COMPB[] PROGMEM = "TIMER5 COMPB"; 158 | #endif 159 | #ifdef TIMER5_COMPC_vect 160 | prog_char gAvrInt_TIMER5_COMPC[] PROGMEM = "TIMER5 COMPC"; 161 | #endif 162 | #ifdef TIMER5_OVF_vect 163 | prog_char gAvrInt_TIMER5_OVF[] PROGMEM = "TIMER5 OVF"; 164 | #endif 165 | 166 | //* when there is only 1 usart 167 | #if defined(USART_RX_vect) || defined(USART_RXC_vect) 168 | prog_char gAvrInt_USART_RX[] PROGMEM = "USART RX"; 169 | #endif 170 | #if defined(USART_UDRE_vect) 171 | prog_char gAvrInt_USART_UDRE[] PROGMEM = "USART UDRE"; 172 | #endif 173 | #if defined(USART_TX_vect) || defined(USART_TXC_vect) 174 | prog_char gAvrInt_USART_TX[] PROGMEM = "USART TX"; 175 | #endif 176 | 177 | 178 | //* usart 0 179 | #if defined(USART0_RX_vect) 180 | prog_char gAvrInt_USART0_RX[] PROGMEM = "USART0 RX"; 181 | #endif 182 | #if defined(USART0_UDRE_vect) 183 | prog_char gAvrInt_USART0_UDRE[] PROGMEM = "USART0 UDRE"; 184 | #endif 185 | #if defined(USART0_TX_vect) 186 | prog_char gAvrInt_USART0_TX[] PROGMEM = "USART0 TX"; 187 | #endif 188 | 189 | 190 | //* usart 1 191 | #ifdef USART1_RX_vect 192 | prog_char gAvrInt_USART1_RX[] PROGMEM = "USART1 RX"; 193 | #endif 194 | #ifdef USART1_UDRE_vect 195 | prog_char gAvrInt_USART1_UDRE[] PROGMEM = "USART1 UDRE"; 196 | #endif 197 | #ifdef USART1_TX_vect 198 | prog_char gAvrInt_USART1_TX[] PROGMEM = "USART1 TX"; 199 | #endif 200 | 201 | //* usart 2 202 | #ifdef USART2_RX_vect 203 | prog_char gAvrInt_USART2_RX[] PROGMEM = "USART2 RX"; 204 | #endif 205 | #ifdef USART2_UDRE_vect 206 | prog_char gAvrInt_USART2_UDRE[] PROGMEM = "USART2 UDRE"; 207 | #endif 208 | #ifdef USART2_TX_vect 209 | prog_char gAvrInt_USART2_TX[] PROGMEM = "USART2 TX"; 210 | #endif 211 | 212 | //* usart 3 213 | #ifdef USART3_RX_vect 214 | prog_char gAvrInt_USART3_RX[] PROGMEM = "USART3 RX"; 215 | #endif 216 | #ifdef USART3_UDRE_vect 217 | prog_char gAvrInt_USART3_UDRE[] PROGMEM = "USART3 UDRE"; 218 | #endif 219 | #ifdef USART3_TX_vect 220 | prog_char gAvrInt_USART3_TX[] PROGMEM = "USART3 TX"; 221 | #endif 222 | #ifdef SPI_STC_vect 223 | prog_char gAvrInt_SPI_STC[] PROGMEM = "SPI STC"; 224 | #endif 225 | #ifdef ADC_vect 226 | prog_char gAvrInt_ADC[] PROGMEM = "ADC"; 227 | #endif 228 | #if defined(ANALOG_COMP_vect) || defined(ANA_COMP_vect) 229 | prog_char gAvrInt_ANALOG_COMP[] PROGMEM = "ANALOG COMP"; 230 | #endif 231 | #if defined(EE_READY_vect) || defined(EE_RDY_vect) 232 | prog_char gAvrInt_EE_READY[] PROGMEM = "EE READY"; 233 | #endif 234 | #ifdef TWI_vect 235 | prog_char gAvrInt_TWI[] PROGMEM = "TWI"; 236 | #endif 237 | #if defined(SPM_READY_vect) || defined(SPM_RDY_vect) 238 | prog_char gAvrInt_SPM_READY[] PROGMEM = "SPM READY"; 239 | #endif 240 | #ifdef USI_START_vect 241 | prog_char gAvrInt_USI_START[] PROGMEM = "USI START"; 242 | #endif 243 | #ifdef USI_OVERFLOW_vect 244 | prog_char gAvrInt_USI_OVERFLOW[] PROGMEM = "USI OVERFLOW"; 245 | #endif 246 | #ifdef USB_GEN_vect 247 | prog_char gAvrInt_USB_General[] PROGMEM = "USB General"; 248 | #endif 249 | #ifdef USB_COM_vect 250 | prog_char gAvrInt_USB_Endpoint[] PROGMEM = "USB Endpoint"; 251 | #endif 252 | 253 | #ifdef LCD_vect 254 | prog_char gAvrInt_LCD_StartFrame[] PROGMEM = "LCD Start of Frame"; 255 | #endif 256 | 257 | //* these are for the chips with CAN bus support 258 | #ifdef CANIT_vect 259 | prog_char gAvrInt_CAN_TrafnsferCE[] PROGMEM = "CAN Transfer Complete or Error"; 260 | #endif 261 | #ifdef OVRIT_vect 262 | prog_char gAvrInt_CAN_TimerOverRun[] PROGMEM = "CAN Timer Overrun"; 263 | #endif 264 | 265 | //* these are for __AVR_ATmega128RFA1__ 266 | #ifdef TRX24_PLL_LOCK_vect 267 | prog_char gAvrInt_TRN_PLL_LOCK[] PROGMEM = "TRX24_PLL_LOCK"; 268 | #endif 269 | #ifdef TRX24_PLL_UNLOCK_vect 270 | prog_char gAvrInt_TRN_PLL_UNLOCK[] PROGMEM = "TRX24_PLL_UNLOCK"; 271 | #endif 272 | #ifdef TRX24_RX_START_vect 273 | prog_char gAvrInt_TRN_RX_START[] PROGMEM = "TRX24_RX_START"; 274 | #endif 275 | #ifdef TRX24_RX_END_vect 276 | prog_char gAvrInt_TRN_RX_END[] PROGMEM = "TRX24_RX_END"; 277 | #endif 278 | #ifdef TRX24_CCA_ED_DONE_vect 279 | prog_char gAvrInt_TRN_CAAED_DONE[] PROGMEM = "TRX24_CCA_ED_DONE"; 280 | #endif 281 | #ifdef TRX24_XAH_AMI_vect 282 | prog_char gAvrInt_TRN_FRAME_MATCH[] PROGMEM = "TRX24_FRAME_ADDRESS_MATCH"; 283 | #endif 284 | #ifdef TRX24_TX_END_vect 285 | prog_char gAvrInt_TRN_TX_END[] PROGMEM = "TRX24_TX_END"; 286 | #endif 287 | #ifdef TRX24_AWAKE_vect 288 | prog_char gAvrInt_TRN_AWAKE[] PROGMEM = "TRX24_AWAKE"; 289 | #endif 290 | #ifdef SCNT_CMP1_vect 291 | prog_char gAvrInt_SCNT_CMP1[] PROGMEM = "SCNT_CMP1"; 292 | #endif 293 | #ifdef SCNT_CMP2_vect 294 | prog_char gAvrInt_SCNT_CMP2[] PROGMEM = "SCNT_CMP2"; 295 | #endif 296 | #ifdef SCNT_CMP3_vect 297 | prog_char gAvrInt_SCNT_CMP3[] PROGMEM = "SCNT_CMP3"; 298 | #endif 299 | #ifdef SCNT_OVFL_vect 300 | prog_char gAvrInt_SCNT_OVFL[] PROGMEM = "SCNT_OVFL"; 301 | #endif 302 | #ifdef SCNT_BACKOFF_vect 303 | prog_char gAvrInt_SCNT_BACKOFF[] PROGMEM = "SCNT_BACKOFF"; 304 | #endif 305 | #ifdef AES_READY_vect 306 | prog_char gAvrInt_AES_READY[] PROGMEM = "AES_READY"; 307 | #endif 308 | #ifdef BAT_LOW_vect 309 | prog_char gAvrInt_BAT_LOW[] PROGMEM = "BAT_LOW"; 310 | #endif 311 | 312 | 313 | 314 | //************************************************************************************************** 315 | //* these do not have vector defs and have to be done by CPU type 316 | #if defined(__AVR_ATmega645__ ) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) 317 | prog_char gAvrInt_NOT_USED[] PROGMEM = "NOT_USED"; 318 | #endif 319 | #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega128RFA1__) 320 | prog_char gAvrInt_RESERVED[] PROGMEM = "Reserved"; 321 | #endif 322 | 323 | prog_char gAvrInt_END[] PROGMEM = "*"; 324 | 325 | 326 | 327 | 328 | 329 | //************************************************************************************************** 330 | #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) 331 | #pragma mark __AVR_ATmega168__ / __AVR_ATmega328P__ 332 | 333 | #define _INTERRUPT_NAMES_DEFINED_ 334 | 335 | PGM_P gInterruptNameTable[] PROGMEM = 336 | { 337 | 338 | gAvrInt_RESET, // 1 339 | gAvrInt_INT0, // 2 340 | gAvrInt_INT1, // 3 341 | gAvrInt_PCINT0, // 4 342 | gAvrInt_PCINT1, // 5 343 | gAvrInt_PCINT2, // 6 344 | gAvrInt_WDT, // 7 345 | gAvrInt_TIMER2_COMPA, // 8 346 | gAvrInt_TIMER2_COMPB, // 9 347 | gAvrInt_TIMER2_OVF, // 10 348 | gAvrInt_TIMER1_CAPT, // 11 349 | gAvrInt_TIMER1_COMPA, // 12 350 | gAvrInt_TIMER1_COMPB, // 13 351 | gAvrInt_TIMER1_OVF, // 14 352 | gAvrInt_TIMER0_COMPA, // 15 353 | gAvrInt_TIMER0_COMPB, // 16 354 | gAvrInt_TIMER0_OVF, // 17 355 | gAvrInt_SPI_STC, // 18 356 | gAvrInt_USART_RX, // 19 357 | gAvrInt_USART_UDRE, // 20 358 | gAvrInt_USART_TX, // 21 359 | gAvrInt_ADC, // 22 360 | gAvrInt_EE_READY, // 23 361 | gAvrInt_ANALOG_COMP, // 24 362 | gAvrInt_TWI, // 25 363 | gAvrInt_SPM_READY, // 26 364 | }; 365 | 366 | #endif 367 | 368 | //************************************************************************************************** 369 | #if defined(__AVR_ATmega169__) 370 | #pragma mark __AVR_ATmega169__ 371 | 372 | #define _INTERRUPT_NAMES_DEFINED_ 373 | 374 | PGM_P gInterruptNameTable[] PROGMEM = 375 | { 376 | 377 | gAvrInt_RESET, // 1 378 | gAvrInt_INT0, // 2 379 | gAvrInt_PCINT0, // 3 380 | gAvrInt_PCINT1, // 4 381 | gAvrInt_TIMER2_COMP, // 5 382 | gAvrInt_TIMER2_OVF, // 6 383 | gAvrInt_TIMER1_CAPT, // 7 384 | gAvrInt_TIMER1_COMPA, // 8 385 | gAvrInt_TIMER1_COMPB, // 9 386 | gAvrInt_TIMER1_OVF, // 10 387 | gAvrInt_TIMER0_COMP, // 11 388 | gAvrInt_TIMER0_OVF, // 12 389 | gAvrInt_SPI_STC, // 13 390 | gAvrInt_USART0_RX, // 14 391 | gAvrInt_USART0_UDRE, // 15 392 | gAvrInt_USART0_TX, // 16 393 | gAvrInt_USI_START, // 17 394 | gAvrInt_USI_OVERFLOW, // 18 395 | gAvrInt_ANALOG_COMP, // 19 396 | gAvrInt_ADC, // 20 397 | gAvrInt_EE_READY, // 21 398 | gAvrInt_SPM_READY, // 22 399 | gAvrInt_LCD_StartFrame, // 23 400 | 401 | }; 402 | 403 | #endif 404 | 405 | 406 | //************************************************************************************************** 407 | #if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) 408 | #pragma mark __AVR_ATmega640__ __AVR_ATmega1280__ __AVR_ATmega1281__ __AVR_ATmega2560__ __AVR_ATmega2561__ 409 | 410 | #define _INTERRUPT_NAMES_DEFINED_ 411 | 412 | PGM_P gInterruptNameTable[] PROGMEM = 413 | { 414 | 415 | gAvrInt_RESET, // 1 416 | gAvrInt_INT0, // 2 417 | gAvrInt_INT1, // 3 418 | gAvrInt_INT2, // 4 419 | gAvrInt_INT3, // 5 420 | gAvrInt_INT4, // 6 421 | gAvrInt_INT5, // 7 422 | gAvrInt_INT6, // 8 423 | gAvrInt_INT7, // 9 424 | gAvrInt_PCINT0, // 10 425 | gAvrInt_PCINT1, // 11 426 | #if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) 427 | gAvrInt_PCINT2, // 12 428 | #else 429 | gAvrInt_NOT_USED, // 12 430 | #endif 431 | gAvrInt_WDT, // 13 432 | gAvrInt_TIMER2_COMPA, // 14 433 | gAvrInt_TIMER2_COMPB, // 15 434 | gAvrInt_TIMER2_OVF, // 16 435 | gAvrInt_TIMER1_CAPT, // 17 436 | gAvrInt_TIMER1_COMPA, // 18 437 | gAvrInt_TIMER1_COMPB, // 19 438 | gAvrInt_TIMER1_COMPC, // 20 439 | gAvrInt_TIMER1_OVF, // 21 440 | gAvrInt_TIMER0_COMPA, // 22 441 | gAvrInt_TIMER0_COMPB, // 23 442 | gAvrInt_TIMER0_OVF, // 24 443 | gAvrInt_SPI_STC, // 25 444 | 445 | gAvrInt_USART0_RX, // 26 446 | gAvrInt_USART0_UDRE, // 27 447 | gAvrInt_USART0_TX, // 28 448 | gAvrInt_ANALOG_COMP, // 29 449 | gAvrInt_ADC, // 30 450 | gAvrInt_EE_READY, // 31 451 | 452 | gAvrInt_TIMER3_CAPT, // 32 453 | gAvrInt_TIMER3_COMPA, // 33 454 | gAvrInt_TIMER3_COMPB, // 34 455 | gAvrInt_TIMER3_COMPC, // 35 456 | gAvrInt_TIMER3_OVF, // 36 457 | 458 | gAvrInt_USART1_RX, // 37 459 | gAvrInt_USART1_UDRE, // 38 460 | gAvrInt_USART1_TX, // 39 461 | gAvrInt_TWI, // 40 462 | gAvrInt_SPM_READY, // 41 463 | #if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) 464 | gAvrInt_TIMER4_CAPT, // 42 465 | #else 466 | gAvrInt_NOT_USED, // 42 467 | #endif 468 | gAvrInt_TIMER4_COMPA, // 43 469 | gAvrInt_TIMER4_COMPB, // 44 470 | gAvrInt_TIMER4_COMPC, // 45 471 | gAvrInt_TIMER4_OVF, // 46 472 | #if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) 473 | gAvrInt_TIMER5_CAPT, // 47 474 | #else 475 | gAvrInt_NOT_USED, // 47 476 | #endif 477 | gAvrInt_TIMER5_COMPA, // 48 478 | gAvrInt_TIMER5_COMPB, // 49 479 | gAvrInt_TIMER5_COMPC, // 50 480 | gAvrInt_TIMER5_OVF, // 51 481 | 482 | #if defined(__AVR_ATmega640__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) 483 | gAvrInt_USART2_RX, // 52 484 | gAvrInt_USART2_UDRE, // 53 485 | gAvrInt_USART2_TX, // 54 486 | 487 | gAvrInt_USART3_RX, // 55 488 | gAvrInt_USART3_UDRE, // 56 489 | gAvrInt_USART3_TX, // 57 490 | #endif 491 | 492 | }; 493 | 494 | #endif 495 | 496 | 497 | 498 | //************************************************************************************************** 499 | #if defined(__AVR_ATmega324P__ ) || defined(__AVR_ATmega644__ ) || defined(__AVR_ATmega644P__) 500 | #pragma mark __AVR_ATmega324P__ __AVR_ATmega644__ __AVR_ATmega644P__ 501 | 502 | #define _INTERRUPT_NAMES_DEFINED_ 503 | 504 | PGM_P gInterruptNameTable[] PROGMEM = 505 | { 506 | 507 | gAvrInt_RESET, // 1 508 | gAvrInt_INT0, // 2 509 | gAvrInt_INT1, // 3 510 | gAvrInt_INT2, // 4 511 | gAvrInt_PCINT0, // 5 512 | gAvrInt_PCINT1, // 6 513 | gAvrInt_PCINT2, // 7 514 | gAvrInt_PCINT3, // 8 515 | gAvrInt_WDT, // 9 516 | gAvrInt_TIMER2_COMPA, // 10 517 | gAvrInt_TIMER2_COMPB, // 11 518 | gAvrInt_TIMER2_OVF, // 12 519 | gAvrInt_TIMER1_CAPT, // 13 520 | gAvrInt_TIMER1_COMPA, // 14 521 | gAvrInt_TIMER1_COMPB, // 15 522 | gAvrInt_TIMER1_OVF, // 16 523 | gAvrInt_TIMER0_COMPA, // 17 524 | gAvrInt_TIMER0_COMPB, // 18 525 | gAvrInt_TIMER0_OVF, // 19 526 | gAvrInt_SPI_STC, // 20 527 | gAvrInt_USART0_RX, // 21 528 | gAvrInt_USART0_UDRE, // 22 529 | gAvrInt_USART0_TX, // 23 530 | gAvrInt_ANALOG_COMP, // 24 531 | gAvrInt_ADC, // 25 532 | gAvrInt_EE_READY, // 26 533 | gAvrInt_TWI, // 27 534 | gAvrInt_SPM_READY, // 28 535 | 536 | #if defined(__AVR_ATmega324P__ ) || defined(__AVR_ATmega644P__) 537 | gAvrInt_USART1_RX, // 29 538 | gAvrInt_USART1_UDRE, // 30 539 | gAvrInt_USART1_TX, // 31 540 | #endif 541 | 542 | }; 543 | 544 | 545 | #endif 546 | 547 | //************************************************************************************************** 548 | #if defined(__AVR_ATmega1284P__ ) 549 | #pragma mark __AVR_ATmega1284P__ 550 | 551 | #define _INTERRUPT_NAMES_DEFINED_ 552 | 553 | PGM_P gInterruptNameTable[] PROGMEM = 554 | { 555 | 556 | gAvrInt_RESET, // 1 557 | gAvrInt_INT0, // 2 558 | gAvrInt_INT1, // 3 559 | gAvrInt_INT2, // 4 560 | gAvrInt_PCINT0, // 5 561 | gAvrInt_PCINT1, // 6 562 | gAvrInt_PCINT2, // 7 563 | gAvrInt_PCINT3, // 8 564 | gAvrInt_WDT, // 9 565 | gAvrInt_TIMER2_COMPA, // 10 566 | gAvrInt_TIMER2_COMPB, // 11 567 | gAvrInt_TIMER2_OVF, // 12 568 | gAvrInt_TIMER1_CAPT, // 13 569 | gAvrInt_TIMER1_COMPA, // 14 570 | gAvrInt_TIMER1_COMPB, // 15 571 | gAvrInt_TIMER1_OVF, // 16 572 | gAvrInt_TIMER0_COMPA, // 17 573 | gAvrInt_TIMER0_COMPB, // 18 574 | gAvrInt_TIMER0_OVF, // 19 575 | gAvrInt_SPI_STC, // 20 576 | gAvrInt_USART0_RX, // 21 577 | gAvrInt_USART0_UDRE, // 22 578 | gAvrInt_USART0_TX, // 23 579 | gAvrInt_ANALOG_COMP, // 24 580 | gAvrInt_ADC, // 25 581 | gAvrInt_EE_READY, // 26 582 | gAvrInt_TWI, // 27 583 | gAvrInt_SPM_READY, // 28 584 | 585 | gAvrInt_USART1_RX, // 29 586 | gAvrInt_USART1_UDRE, // 30 587 | gAvrInt_USART1_TX, // 31 588 | //* these are NOT documented in doc8272.pdf 589 | //* they are in iom1284p.h 590 | gAvrInt_TIMER3_CAPT, // 32 591 | gAvrInt_TIMER3_COMPA, // 33 592 | gAvrInt_TIMER3_COMPB, // 34 593 | gAvrInt_TIMER3_OVF, // 35 594 | 595 | 596 | }; 597 | 598 | 599 | #endif 600 | 601 | 602 | //************************************************************************************************** 603 | #if defined(__AVR_ATmega645__ ) 604 | #pragma mark __AVR_ATmega645__ 605 | 606 | #define _INTERRUPT_NAMES_DEFINED_ 607 | 608 | PGM_P gInterruptNameTable[] PROGMEM = 609 | { 610 | 611 | gAvrInt_RESET, // 1 612 | gAvrInt_INT0, // 2 613 | gAvrInt_PCINT0, // 3 614 | gAvrInt_PCINT1, // 4 615 | gAvrInt_TIMER2_COMP, // 5 616 | gAvrInt_TIMER2_OVF, // 6 617 | gAvrInt_TIMER1_CAPT, // 7 618 | gAvrInt_TIMER1_COMPA, // 8 619 | gAvrInt_TIMER1_COMPB, // 9 620 | gAvrInt_TIMER1_OVF, // 10 621 | gAvrInt_TIMER0_COMP, // 11 622 | gAvrInt_TIMER0_OVF, // 12 623 | gAvrInt_SPI_STC, // 13 624 | gAvrInt_USART0_RX, // 14 625 | gAvrInt_USART0_UDRE, // 15 626 | gAvrInt_USART0_TX, // 16 627 | gAvrInt_USI_START, // 17 628 | gAvrInt_USI_OVERFLOW, // 18 629 | gAvrInt_ANALOG_COMP, // 19 630 | gAvrInt_ADC, // 20 631 | gAvrInt_EE_READY, // 21 632 | gAvrInt_SPM_READY, // 22 633 | gAvrInt_NOT_USED, // 23 634 | 635 | #if defined(__AVR_ATmega3250__) || defined(__AVR_ATmega6450__) 636 | gAvrInt_PCINT2, // 24 637 | gAvrInt_PCINT3, // 25 638 | #endif 639 | }; 640 | 641 | 642 | #endif 643 | 644 | //************************************************************************************************** 645 | #if defined(__AVR_ATmega16__ ) 646 | #pragma mark __AVR_ATmega16__ 647 | 648 | #define _INTERRUPT_NAMES_DEFINED_ 649 | 650 | PGM_P gInterruptNameTable[] PROGMEM = 651 | { 652 | 653 | gAvrInt_RESET, // 1 654 | gAvrInt_INT0, // 2 655 | gAvrInt_INT1, // 3 656 | gAvrInt_TIMER2_COMP, // 4 657 | gAvrInt_TIMER2_OVF, // 5 658 | gAvrInt_TIMER1_CAPT, // 6 659 | gAvrInt_TIMER1_COMPA, // 7 660 | gAvrInt_TIMER1_COMPB, // 8 661 | gAvrInt_TIMER1_OVF, // 9 662 | gAvrInt_TIMER0_OVF, // 10 663 | gAvrInt_SPI_STC, // 11 664 | gAvrInt_USART_RX, // 12 665 | gAvrInt_USART_UDRE, // 13 666 | gAvrInt_USART_TX, // 14 667 | gAvrInt_ADC, // 15 668 | gAvrInt_EE_READY, // 16 669 | gAvrInt_ANALOG_COMP, // 17 670 | gAvrInt_TWI, // 18 671 | gAvrInt_INT2, // 19 672 | gAvrInt_TIMER0_COMP, // 20 673 | gAvrInt_SPM_READY, // 21 674 | 675 | }; 676 | 677 | 678 | #endif 679 | 680 | //************************************************************************************************** 681 | #if defined(__AVR_ATmega32__ ) 682 | #pragma mark __AVR_ATmega32__ 683 | 684 | #define _INTERRUPT_NAMES_DEFINED_ 685 | 686 | PGM_P gInterruptNameTable[] PROGMEM = 687 | { 688 | 689 | gAvrInt_RESET, // 1 690 | gAvrInt_INT0, // 2 691 | gAvrInt_INT1, // 3 692 | gAvrInt_INT2, // 4 693 | gAvrInt_TIMER2_COMP, // 5 694 | gAvrInt_TIMER2_OVF, // 6 695 | gAvrInt_TIMER1_CAPT, // 7 696 | gAvrInt_TIMER1_COMPA, // 8 697 | gAvrInt_TIMER1_COMPB, // 9 698 | gAvrInt_TIMER1_OVF, // 10 699 | gAvrInt_TIMER0_COMP, // 11 700 | gAvrInt_TIMER0_OVF, // 12 701 | gAvrInt_SPI_STC, // 13 702 | gAvrInt_USART_RX, // 14 703 | gAvrInt_USART_UDRE, // 15 704 | gAvrInt_USART_TX, // 16 705 | gAvrInt_ADC, // 17 706 | gAvrInt_EE_READY, // 18 707 | gAvrInt_ANALOG_COMP, // 19 708 | gAvrInt_TWI, // 20 709 | gAvrInt_SPM_READY, // 21 710 | 711 | }; 712 | 713 | 714 | #endif 715 | 716 | //************************************************************************************************** 717 | #if defined(__AVR_ATmega32U4__) 718 | #pragma mark __AVR_ATmega32U4__ 719 | //* teensy 2.0 720 | //* http://www.pjrc.com/teensy/pinout.html 721 | #define _INTERRUPT_NAMES_DEFINED_ 722 | 723 | 724 | PGM_P gInterruptNameTable[] PROGMEM = 725 | { 726 | 727 | gAvrInt_RESET, // 1 728 | gAvrInt_INT0, // 2 729 | gAvrInt_INT1, // 3 730 | gAvrInt_INT2, // 4 731 | gAvrInt_INT3, // 5 732 | gAvrInt_RESERVED, // 6 733 | gAvrInt_RESERVED, // 7 734 | gAvrInt_INT6, // 8 735 | gAvrInt_RESERVED, // 9 736 | gAvrInt_PCINT0, // 10 737 | gAvrInt_USB_General, // 11 738 | gAvrInt_USB_Endpoint, // 12 739 | gAvrInt_WDT, // 13 740 | gAvrInt_RESERVED, // 14 741 | gAvrInt_RESERVED, // 15 742 | gAvrInt_RESERVED, // 16 743 | gAvrInt_TIMER1_CAPT, // 17 744 | gAvrInt_TIMER1_COMPA, // 18 745 | gAvrInt_TIMER1_COMPB, // 19 746 | gAvrInt_TIMER1_COMPC, // 20 747 | gAvrInt_TIMER1_OVF, // 21 748 | gAvrInt_TIMER0_COMPA, // 22 749 | gAvrInt_TIMER0_COMPB, // 23 750 | gAvrInt_TIMER0_OVF, // 24 751 | gAvrInt_SPI_STC, // 25 752 | 753 | gAvrInt_USART1_RX, // 26 754 | gAvrInt_USART1_UDRE, // 27 755 | gAvrInt_USART1_TX, // 28 756 | gAvrInt_ANALOG_COMP, // 29 757 | 758 | gAvrInt_ADC, // 30 759 | gAvrInt_EE_READY, // 31 760 | 761 | gAvrInt_TIMER3_CAPT, // 32 762 | gAvrInt_TIMER3_COMPA, // 33 763 | gAvrInt_TIMER3_COMPB, // 34 764 | gAvrInt_TIMER3_COMPC, // 35 765 | gAvrInt_TIMER3_OVF, // 36 766 | gAvrInt_TWI, // 37 767 | gAvrInt_SPM_READY, // 38 768 | 769 | gAvrInt_TIMER4_COMPA, // 39 770 | gAvrInt_TIMER4_COMPB, // 40 771 | gAvrInt_TIMER4_COMPD, // 41 772 | gAvrInt_TIMER4_OVF, // 42 773 | gAvrInt_TIMER4_FPF, // 43 774 | }; 775 | 776 | #endif 777 | 778 | //************************************************************************************************** 779 | #if defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) 780 | #pragma mark __AVR_AT90USB1286__ 781 | //* teensy++ 2.0 782 | //* http://www.pjrc.com/teensy/pinout.html 783 | #define _INTERRUPT_NAMES_DEFINED_ 784 | 785 | 786 | PGM_P gInterruptNameTable[] PROGMEM = 787 | { 788 | 789 | gAvrInt_RESET, // 1 790 | gAvrInt_INT0, // 2 791 | gAvrInt_INT1, // 3 792 | gAvrInt_INT2, // 4 793 | gAvrInt_INT3, // 5 794 | gAvrInt_INT4, // 6 795 | gAvrInt_INT5, // 7 796 | gAvrInt_INT6, // 8 797 | gAvrInt_INT7, // 9 798 | gAvrInt_PCINT0, // 10 799 | gAvrInt_USB_General, // 11 800 | gAvrInt_USB_Endpoint, // 12 801 | gAvrInt_WDT, // 13 802 | gAvrInt_TIMER2_COMPA, // 14 803 | gAvrInt_TIMER2_COMPB, // 15 804 | gAvrInt_TIMER2_OVF, // 16 805 | gAvrInt_TIMER1_CAPT, // 17 806 | gAvrInt_TIMER1_COMPA, // 18 807 | gAvrInt_TIMER1_COMPB, // 19 808 | gAvrInt_TIMER1_COMPC, // 20 809 | gAvrInt_TIMER1_OVF, // 21 810 | gAvrInt_TIMER0_COMPA, // 22 811 | gAvrInt_TIMER0_COMPB, // 23 812 | gAvrInt_TIMER0_OVF, // 24 813 | gAvrInt_SPI_STC, // 25 814 | 815 | gAvrInt_USART1_RX, // 26 816 | gAvrInt_USART1_UDRE, // 27 817 | gAvrInt_USART1_TX, // 28 818 | gAvrInt_ANALOG_COMP, // 29 819 | 820 | gAvrInt_ADC, // 30 821 | gAvrInt_EE_READY, // 31 822 | 823 | gAvrInt_TIMER3_CAPT, // 32 824 | gAvrInt_TIMER3_COMPA, // 33 825 | gAvrInt_TIMER3_COMPB, // 34 826 | gAvrInt_TIMER3_COMPC, // 35 827 | gAvrInt_TIMER3_OVF, // 36 828 | gAvrInt_TWI, // 37 829 | gAvrInt_SPM_READY, // 38 830 | 831 | }; 832 | 833 | #endif 834 | 835 | 836 | 837 | 838 | //************************************************************************************************** 839 | #if defined(__AVR_ATmega128__) || defined(__AVR_ATmega64__) 840 | #pragma mark __AVR_ATmega64__ __AVR_ATmega128__ 841 | #define _INTERRUPT_NAMES_DEFINED_ 842 | 843 | 844 | PGM_P gInterruptNameTable[] PROGMEM = 845 | { 846 | 847 | gAvrInt_RESET, // 1 848 | gAvrInt_INT0, // 2 849 | gAvrInt_INT1, // 3 850 | gAvrInt_INT2, // 4 851 | gAvrInt_INT3, // 5 852 | gAvrInt_INT4, // 6 853 | gAvrInt_INT5, // 7 854 | gAvrInt_INT6, // 8 855 | gAvrInt_INT7, // 9 856 | gAvrInt_TIMER2_COMP, // 10 857 | gAvrInt_TIMER2_OVF, // 11 858 | gAvrInt_TIMER1_CAPT, // 12 859 | gAvrInt_TIMER1_COMPA, // 13 860 | gAvrInt_TIMER1_COMPB, // 14 861 | gAvrInt_TIMER1_OVF, // 15 862 | gAvrInt_TIMER0_COMP, // 16 863 | gAvrInt_TIMER0_OVF, // 17 864 | gAvrInt_SPI_STC, // 18 865 | gAvrInt_USART0_RX, // 19 866 | gAvrInt_USART0_UDRE, // 20 867 | gAvrInt_USART0_TX, // 21 868 | gAvrInt_ADC, // 22 869 | gAvrInt_EE_READY, // 23 870 | gAvrInt_ANALOG_COMP, // 24 871 | gAvrInt_TIMER1_COMPC, // 25 872 | gAvrInt_TIMER3_CAPT, // 26 873 | gAvrInt_TIMER3_COMPA, // 27 874 | gAvrInt_TIMER3_COMPB, // 28 875 | gAvrInt_TIMER3_COMPC, // 29 876 | gAvrInt_TIMER3_OVF, // 30 877 | gAvrInt_USART1_RX, // 31 878 | gAvrInt_USART1_UDRE, // 32 879 | gAvrInt_USART1_TX, // 33 880 | gAvrInt_TWI, // 34 881 | gAvrInt_SPM_READY, // 35 882 | 883 | }; 884 | 885 | #endif 886 | 887 | //************************************************************************************************** 888 | #if defined(__AVR_AT90CAN32__) || defined(__AVR_AT90CAN64__) || defined(__AVR_AT90CAN128__) 889 | #pragma mark __AVR_AT90CAN32__ __AVR_AT90CAN64__ __AVR_AT90CAN128__ 890 | 891 | #define _INTERRUPT_NAMES_DEFINED_ 892 | 893 | PGM_P gInterruptNameTable[] PROGMEM = 894 | { 895 | 896 | gAvrInt_RESET, // 1 897 | gAvrInt_INT0, // 2 898 | gAvrInt_INT1, // 3 899 | gAvrInt_INT2, // 4 900 | gAvrInt_INT3, // 5 901 | gAvrInt_INT4, // 6 902 | gAvrInt_INT5, // 7 903 | gAvrInt_INT6, // 8 904 | gAvrInt_INT7, // 9 905 | gAvrInt_TIMER2_COMP, // 10 906 | gAvrInt_TIMER2_OVF, // 11 907 | gAvrInt_TIMER1_CAPT, // 12 908 | gAvrInt_TIMER1_COMPA, // 13 909 | gAvrInt_TIMER1_COMPB, // 14 910 | gAvrInt_TIMER1_COMPC, // 15 911 | gAvrInt_TIMER1_OVF, // 16 912 | gAvrInt_TIMER0_COMP, // 17 913 | gAvrInt_TIMER0_OVF, // 18 914 | gAvrInt_CAN_TrafnsferCE, // 19 915 | gAvrInt_CAN_TimerOverRun, // 20 916 | gAvrInt_SPI_STC, // 21 917 | gAvrInt_USART0_RX, // 22 918 | gAvrInt_USART0_UDRE, // 23 919 | gAvrInt_USART0_TX, // 24 920 | gAvrInt_ANALOG_COMP, // 25 921 | gAvrInt_ADC, // 26 922 | gAvrInt_EE_READY, // 27 923 | gAvrInt_TIMER3_CAPT, // 28 924 | gAvrInt_TIMER3_COMPA, // 29 925 | gAvrInt_TIMER3_COMPB, // 30 926 | gAvrInt_TIMER3_COMPC, // 31 927 | gAvrInt_TIMER3_OVF, // 32 928 | gAvrInt_USART1_RX, // 33 929 | gAvrInt_USART1_UDRE, // 34 930 | gAvrInt_USART1_TX, // 35 931 | gAvrInt_TWI, // 36 932 | gAvrInt_SPM_READY, // 37 933 | }; 934 | 935 | #endif 936 | 937 | //************************************************************************************************** 938 | #if defined (__AVR_ATmega128RFA1__) 939 | #pragma mark __AVR_ATmega128RFA1__ 940 | #define _INTERRUPT_NAMES_DEFINED_ 941 | 942 | PGM_P gInterruptNameTable[] PROGMEM = 943 | { 944 | //* Atmel changed the number scheme for interrupt vectors 945 | gAvrInt_RESET, // 0 946 | gAvrInt_INT0, // 1 947 | gAvrInt_INT1, // 2 948 | gAvrInt_INT2, // 3 949 | gAvrInt_INT3, // 4 950 | gAvrInt_INT4, // 5 951 | gAvrInt_INT5, // 6 952 | gAvrInt_INT6, // 7 953 | gAvrInt_INT7, // 8 954 | gAvrInt_PCINT0, // 9 955 | gAvrInt_PCINT1, // 10 956 | gAvrInt_PCINT2, // 11 957 | gAvrInt_WDT, // 12 958 | gAvrInt_TIMER2_COMPA, // 13 959 | gAvrInt_TIMER2_COMPB, // 14 960 | gAvrInt_TIMER2_OVF, // 15 961 | gAvrInt_TIMER1_CAPT, // 16 962 | gAvrInt_TIMER1_COMPA, // 17 963 | gAvrInt_TIMER1_COMPB, // 18 964 | gAvrInt_TIMER1_COMPC, // 19 965 | gAvrInt_TIMER1_OVF, // 20 966 | gAvrInt_TIMER0_COMPA, // 21 967 | gAvrInt_TIMER0_COMPB, // 22 968 | gAvrInt_TIMER0_OVF, // 23 969 | gAvrInt_SPI_STC, // 24 970 | gAvrInt_USART0_RX, // 25 971 | gAvrInt_USART0_UDRE, // 26 972 | gAvrInt_USART0_TX, // 27 973 | gAvrInt_ANALOG_COMP, // 28 974 | gAvrInt_ADC, // 29 975 | gAvrInt_EE_READY, // 30 976 | gAvrInt_TIMER3_CAPT, // 31 977 | gAvrInt_TIMER3_COMPA, // 32 978 | gAvrInt_TIMER3_COMPB, // 33 979 | gAvrInt_TIMER3_COMPC, // 34 980 | gAvrInt_TIMER3_OVF, // 35 981 | gAvrInt_USART1_RX, // 36 982 | gAvrInt_USART1_UDRE, // 37 983 | gAvrInt_USART1_TX, // 38 984 | gAvrInt_TWI, // 39 985 | gAvrInt_SPM_READY, // 40 986 | gAvrInt_TIMER4_CAPT, // 41 987 | gAvrInt_TIMER4_COMPA, // 42 988 | gAvrInt_TIMER4_COMPB, // 43 989 | gAvrInt_TIMER4_COMPC, // 44 990 | gAvrInt_TIMER4_OVF, // 45 991 | gAvrInt_TIMER5_CAPT, // 46 992 | gAvrInt_TIMER5_COMPA, // 47 993 | gAvrInt_TIMER5_COMPB, // 48 994 | gAvrInt_TIMER5_COMPC, // 49 995 | gAvrInt_TIMER5_OVF, // 50 996 | #if 1 997 | gAvrInt_RESERVED, // 51 998 | gAvrInt_RESERVED, // 52 999 | gAvrInt_RESERVED, // 53 1000 | 1001 | gAvrInt_RESERVED, // 54 1002 | gAvrInt_RESERVED, // 55 1003 | gAvrInt_RESERVED, // 56 1004 | 1005 | #else 1006 | gAvrInt_USART2_RX, // 51 1007 | gAvrInt_USART2_UDRE, // 52 1008 | gAvrInt_USART2_TX, // 53 1009 | 1010 | gAvrInt_USART3_RX, // 54 1011 | gAvrInt_USART3_UDRE, // 55 1012 | gAvrInt_USART3_TX, // 56 1013 | #endif 1014 | gAvrInt_TRN_PLL_LOCK, // 57 1015 | gAvrInt_TRN_PLL_UNLOCK, // 58 1016 | gAvrInt_TRN_RX_START, // 59 1017 | gAvrInt_TRN_RX_END, // 60 1018 | gAvrInt_TRN_CAAED_DONE, // 61 1019 | gAvrInt_TRN_FRAME_MATCH,// 62 1020 | gAvrInt_TRN_TX_END, // 63 1021 | gAvrInt_TRN_AWAKE, // 64 1022 | 1023 | gAvrInt_SCNT_CMP1, // 65 1024 | gAvrInt_SCNT_CMP2, // 66 1025 | gAvrInt_SCNT_CMP3, // 67 1026 | gAvrInt_SCNT_OVFL, // 68 1027 | gAvrInt_SCNT_BACKOFF, // 69 1028 | gAvrInt_AES_READY, // 70 1029 | gAvrInt_BAT_LOW, // 71 1030 | 1031 | 1032 | }; 1033 | 1034 | #endif 1035 | 1036 | 1037 | #if !defined(_INTERRUPT_NAMES_DEFINED_) 1038 | #warning No interrupt string defs for this cpu 1039 | #endif 1040 | 1041 | -------------------------------------------------------------------------------- /command.h: -------------------------------------------------------------------------------- 1 | //**** ATMEL AVR - A P P L I C A T I O N N O T E ************************ 2 | //* 3 | //* Title: AVR068 - STK500 Communication Protocol 4 | //* Filename: command.h 5 | //* Version: 1.0 6 | //* Last updated: 31.01.2005 7 | //* 8 | //* Support E-mail: avr@atmel.com 9 | //* 10 | //************************************************************************** 11 | 12 | // *****************[ STK message constants ]*************************** 13 | 14 | #define MESSAGE_START 0x1B //= ESC = 27 decimal 15 | #define TOKEN 0x0E 16 | 17 | // *****************[ STK general command constants ]************************** 18 | 19 | #define CMD_SIGN_ON 0x01 20 | #define CMD_SET_PARAMETER 0x02 21 | #define CMD_GET_PARAMETER 0x03 22 | #define CMD_SET_DEVICE_PARAMETERS 0x04 23 | #define CMD_OSCCAL 0x05 24 | #define CMD_LOAD_ADDRESS 0x06 25 | #define CMD_FIRMWARE_UPGRADE 0x07 26 | 27 | 28 | // *****************[ STK ISP command constants ]****************************** 29 | 30 | #define CMD_ENTER_PROGMODE_ISP 0x10 31 | #define CMD_LEAVE_PROGMODE_ISP 0x11 32 | #define CMD_CHIP_ERASE_ISP 0x12 33 | #define CMD_PROGRAM_FLASH_ISP 0x13 34 | #define CMD_READ_FLASH_ISP 0x14 35 | #define CMD_PROGRAM_EEPROM_ISP 0x15 36 | #define CMD_READ_EEPROM_ISP 0x16 37 | #define CMD_PROGRAM_FUSE_ISP 0x17 38 | #define CMD_READ_FUSE_ISP 0x18 39 | #define CMD_PROGRAM_LOCK_ISP 0x19 40 | #define CMD_READ_LOCK_ISP 0x1A 41 | #define CMD_READ_SIGNATURE_ISP 0x1B 42 | #define CMD_READ_OSCCAL_ISP 0x1C 43 | #define CMD_SPI_MULTI 0x1D 44 | 45 | // *****************[ STK PP command constants ]******************************* 46 | 47 | #define CMD_ENTER_PROGMODE_PP 0x20 48 | #define CMD_LEAVE_PROGMODE_PP 0x21 49 | #define CMD_CHIP_ERASE_PP 0x22 50 | #define CMD_PROGRAM_FLASH_PP 0x23 51 | #define CMD_READ_FLASH_PP 0x24 52 | #define CMD_PROGRAM_EEPROM_PP 0x25 53 | #define CMD_READ_EEPROM_PP 0x26 54 | #define CMD_PROGRAM_FUSE_PP 0x27 55 | #define CMD_READ_FUSE_PP 0x28 56 | #define CMD_PROGRAM_LOCK_PP 0x29 57 | #define CMD_READ_LOCK_PP 0x2A 58 | #define CMD_READ_SIGNATURE_PP 0x2B 59 | #define CMD_READ_OSCCAL_PP 0x2C 60 | 61 | #define CMD_SET_CONTROL_STACK 0x2D 62 | 63 | // *****************[ STK HVSP command constants ]***************************** 64 | 65 | #define CMD_ENTER_PROGMODE_HVSP 0x30 66 | #define CMD_LEAVE_PROGMODE_HVSP 0x31 67 | #define CMD_CHIP_ERASE_HVSP 0x32 68 | #define CMD_PROGRAM_FLASH_HVSP ` 0x33 69 | #define CMD_READ_FLASH_HVSP 0x34 70 | #define CMD_PROGRAM_EEPROM_HVSP 0x35 71 | #define CMD_READ_EEPROM_HVSP 0x36 72 | #define CMD_PROGRAM_FUSE_HVSP 0x37 73 | #define CMD_READ_FUSE_HVSP 0x38 74 | #define CMD_PROGRAM_LOCK_HVSP 0x39 75 | #define CMD_READ_LOCK_HVSP 0x3A 76 | #define CMD_READ_SIGNATURE_HVSP 0x3B 77 | #define CMD_READ_OSCCAL_HVSP 0x3C 78 | 79 | // *****************[ STK status constants ]*************************** 80 | 81 | // Success 82 | #define STATUS_CMD_OK 0x00 83 | 84 | // Warnings 85 | #define STATUS_CMD_TOUT 0x80 86 | #define STATUS_RDY_BSY_TOUT 0x81 87 | #define STATUS_SET_PARAM_MISSING 0x82 88 | 89 | // Errors 90 | #define STATUS_CMD_FAILED 0xC0 91 | #define STATUS_CKSUM_ERROR 0xC1 92 | #define STATUS_CMD_UNKNOWN 0xC9 93 | 94 | // *****************[ STK parameter constants ]*************************** 95 | #define PARAM_BUILD_NUMBER_LOW 0x80 96 | #define PARAM_BUILD_NUMBER_HIGH 0x81 97 | #define PARAM_HW_VER 0x90 98 | #define PARAM_SW_MAJOR 0x91 99 | #define PARAM_SW_MINOR 0x92 100 | #define PARAM_VTARGET 0x94 101 | #define PARAM_VADJUST 0x95 102 | #define PARAM_OSC_PSCALE 0x96 103 | #define PARAM_OSC_CMATCH 0x97 104 | #define PARAM_SCK_DURATION 0x98 105 | #define PARAM_TOPCARD_DETECT 0x9A 106 | #define PARAM_STATUS 0x9C 107 | #define PARAM_DATA 0x9D 108 | #define PARAM_RESET_POLARITY 0x9E 109 | #define PARAM_CONTROLLER_INIT 0x9F 110 | 111 | // *****************[ STK answer constants ]*************************** 112 | 113 | #define ANSWER_CKSUM_ERROR 0xB0 114 | 115 | -------------------------------------------------------------------------------- /goodHexFiles/stk500boot_v2_mega2560.hex: -------------------------------------------------------------------------------- 1 | :020000023000CC 2 | :10E000000D9489F10D94B2F10D94B2F10D94B2F129 3 | :10E010000D94B2F10D94B2F10D94B2F10D94B2F1F0 4 | :10E020000D94B2F10D94B2F10D94B2F10D94B2F1E0 5 | :10E030000D94B2F10D94B2F10D94B2F10D94B2F1D0 6 | :10E040000D94B2F10D94B2F10D94B2F10D94B2F1C0 7 | :10E050000D94B2F10D94B2F10D94B2F10D94B2F1B0 8 | :10E060000D94B2F10D94B2F10D94B2F10D94B2F1A0 9 | :10E070000D94B2F10D94B2F10D94B2F10D94B2F190 10 | :10E080000D94B2F10D94B2F10D94B2F10D94B2F180 11 | :10E090000D94B2F10D94B2F10D94B2F10D94B2F170 12 | :10E0A0000D94B2F10D94B2F10D94B2F10D94B2F160 13 | :10E0B0000D94B2F10D94B2F10D94B2F10D94B2F150 14 | :10E0C0000D94B2F10D94B2F10D94B2F10D94B2F140 15 | :10E0D0000D94B2F10D94B2F10D94B2F10D94B2F130 16 | :10E0E0000D94B2F141546D656761323536300041AF 17 | :10E0F000726475696E6F206578706C6F72657220DE 18 | :10E1000073746B3530305632206279204D4C530099 19 | :10E11000426F6F746C6F616465723E004875683F52 20 | :10E1200000436F6D70696C6564206F6E203D200048 21 | :10E130004350552054797065202020203D20005FF9 22 | :10E140005F4156525F415243485F5F3D2000415658 23 | :10E1500052204C696243205665723D20004743437C 24 | :10E160002056657273696F6E203D20004350552024 25 | :10E1700049442020202020203D20004C6F7720663D 26 | :10E18000757365202020203D20004869676820665F 27 | :10E190007573652020203D200045787420667573D6 28 | :10E1A00065202020203D20004C6F636B2066757336 29 | :10E1B000652020203D20004D61792020382032301C 30 | :10E1C000313200312E362E3700342E332E330056A6 31 | :10E1D00023202020414444522020206F7020636F70 32 | :10E1E00064652020202020696E73747275637469E1 33 | :10E1F0006F6E2061646472202020496E74657272B3 34 | :10E20000757074006E6F20766563746F7200726A49 35 | :10E210006D702020006A6D70200057686174207056 36 | :10E220006F72743A00506F7274206E6F7420737541 37 | :10E2300070706F72746564004D7573742062652030 38 | :10E2400061206C6574746572002000577269747483 39 | :10E25000696E672045450052656164696E672045B7 40 | :10E26000450045452065727220636E743D00504F35 41 | :10E27000525400303D5A65726F2061646472003FF1 42 | :10E280003D43505520737461747300403D454550C3 43 | :10E29000524F4D207465737400423D426C696E6B41 44 | :10E2A000204C454400453D44756D70204545505215 45 | :10E2B0004F4D00463D44756D7020464C415348001B 46 | :10E2C000483D48656C70004C3D4C69737420492F83 47 | :10E2D0004F20506F72747300513D51756974005234 48 | :10E2E0003D44756D702052414D00563D73686F7707 49 | :10E2F00020696E7465727275707420566563746FF0 50 | :10E30000727300593D506F727420626C696E6B00BD 51 | :10E310002A0011241FBECFEFD1E2DEBFCDBF01E046 52 | :10E320000CBF12E0A0E0B2E0EAE0FDEF03E00BBFBB 53 | :10E3300002C007900D92A030B107D9F712E0A0E01B 54 | :10E34000B2E001C01D92AE30B107E1F70F9464F363 55 | :10E350000D9483FE01E20EBF0FEF0DBF11241FBE0F 56 | :10E360000D9464F30D9400F020E030E040ED57E0B0 57 | :10E3700005C0FA013197F1F72F5F3F4F2817390792 58 | :10E38000C0F308959C01442737FD4095542FDA01CE 59 | :10E39000C901860F911DA11DB11DABBFFC01879165 60 | :10E3A000882369F08093C6008091C00086FFFCCF6F 61 | :10E3B0008091C00080648093C0006F5FE8CF0895B3 62 | :10E3C0008DE08093C6008091C00086FFFCCF8091D5 63 | :10E3D000C00080648093C0008AE08093C600809172 64 | :10E3E000C00086FFFCCF8091C00080648093C00095 65 | :10E3F00008950F94C2F10F94E0F10895FC0190810B 66 | :10E40000992359F09093C6008091C00086FFFCCFFD 67 | :10E410008091C00080648093C0003196992379F781 68 | :10E420000895282F982F92959F70892F805D8A33A9 69 | :10E4300008F0895F8093C6008091C00086FFFCCF02 70 | :10E440008091C00080648093C000822F8F70982FCD 71 | :10E45000905D9A3308F0995F9093C6008091C00058 72 | :10E4600086FFFCCF8091C00080648093C000089537 73 | :10E470009C01FB01853691051CF46330710594F015 74 | :10E48000C90164E670E00F9424FE605D7F4F6093E5 75 | :10E49000C6008091C00086FFFCCF8091C0008064E0 76 | :10E4A0008093C0002B30310514F43297B4F0C901C9 77 | :10E4B00064E670E00F9424FE6AE070E00F9424FE9E 78 | :10E4C000605D7F4F6093C6008091C00086FFFCCFE7 79 | :10E4D0008091C00080648093C000C9016AE070E050 80 | :10E4E0000F9424FEC0968093C6008091C00086FFE2 81 | :10E4F000FCCF8091C00080648093C00008951F937A 82 | :10E50000182F8EE692EE60E00F94C2F11093C600D1 83 | :10E510008091C00086FFFCCF8091C0008064809312 84 | :10E52000C0000F94E0F11F9108952F923F924F92F7 85 | :10E530005F926F927F928F929F92AF92BF92CF9293 86 | :10E54000DF92EF92FF920F931F93DF93CF93CDB79C 87 | :10E55000DEB762970FB6F894DEBF0FBECDBF382E80 88 | :10E56000622ECA01DB015C016D01772420E2222EBC 89 | :10E570002E010894411C511C8BC081E0A81680E03C 90 | :10E58000B80681E0C80680E0D80628F0C601AA27B0 91 | :10E59000BB270F9411F2BB27AD2D9C2D8B2D0F9413 92 | :10E5A00011F28A2D0F9411F22092C6008091C000C2 93 | :10E5B00086FFFCCF8091C00080648093C0009DE204 94 | :10E5C0009093C6008091C00086FFFCCF8091C00070 95 | :10E5D00080648093C0002092C6008091C00086FFB6 96 | :10E5E000FCCF8091C00080648093C00019828601B6 97 | :10E5F000750188249924A1E03A1651F03A1620F0CA 98 | :10E60000B2E03B1661F409C00BBFF701779007C079 99 | :10E61000C7010F946DFE782E02C0F7017080872D20 100 | :10E620000F9411F22092C6008091C00086FFFCCFAB 101 | :10E630008091C00080648093C000872D8052F401D7 102 | :10E64000EF70F0708F3520F4E40DF51D708204C07A 103 | :10E65000E40DF51D8EE280830894E11CF11C011D80 104 | :10E66000111D0894811C911C90E18916910409F0F8 105 | :10E67000C2CF80E190E0A0E0B0E0A80EB91ECA1EB3 106 | :10E68000DB1E198AC2010F94FEF10F94E0F16A9427 107 | :10E69000662009F072CF62960FB6F894DEBF0FBE07 108 | :10E6A000CDBFCF91DF911F910F91FF90EF90DF9041 109 | :10E6B000CF90BF90AF909F908F907F906F905F9022 110 | :10E6C0004F903F902F9008952F923F924F925F92DC 111 | :10E6D0006F927F928F929F92AF92BF92CF92DF9272 112 | :10E6E000EF92FF920F931F93DF93CF93CDB7DEB7D7 113 | :10E6F000CD53D1400FB6F894DEBF0FBECDBF01E2BF 114 | :10E700000EBF0FEF0DBF94B7F894A89514BE80917B 115 | :10E71000600088618093600010926000789493FF9D 116 | :10E7200005C0E0910002F09101021995279A2F9AF5 117 | :10E730008091C00082608093C00080E18093C4001B 118 | :10E7400088E18093C1000000EE24FF24870194E05B 119 | :10E75000A92EB12CCC24DD2424C0C5010197F1F7EA 120 | :10E760000894E11CF11C011D111D21E2E2162EE4AA 121 | :10E77000F20620E0020720E0120718F081E0C82E20 122 | :10E78000D12CC801B70127EC3BE140E050E00F94E9 123 | :10E7900037FE611571058105910519F485B1805821 124 | :10E7A00085B98091C00087FD03C0C114D104A9F2CE 125 | :10E7B000A6014F5F5F4FC25EDE4F59834883CE5143 126 | :10E7C000D140C25EDE4F88819981CE51D140019700 127 | :10E7D00011F00D9406FEC05DDE4F19821882C05301 128 | :10E7E000D14060E0C15DDE4F1882CF52D140AA24F3 129 | :10E7F000BB24C35DDE4F19821882CD52D140C05E6A 130 | :10E80000DE4F188219821A821B82C052D140CE5C20 131 | :10E81000DE4F188219821A821B82C253D140EE2425 132 | :10E82000FF2487010BBFF70107911691C45CDE4FEF 133 | :10E8300019830883CC53D1400D9401FEC25EDE4F94 134 | :10E8400028813981CE51D1402130310509F52091FF 135 | :10E85000C600C25EDE4F19821882CE51D14022C05E 136 | :10E860002F5F3F4F4F4F5F4F213082E138078AE7DC 137 | :10E87000480780E0580780F0C45CDE4FE881F981EA 138 | :10E88000CC53D140EF5FFF4F19F0EE27FF270994DB 139 | :10E8900020E030E040E050E08091C00087FFE0CF12 140 | :10E8A0002091C600C35DDE4F48815981CD52D140D1 141 | :10E8B0004F5F5F4FC35DDE4F59834883CD52D140D8 142 | :10E8C000213209F067C64A30510508F063C6089442 143 | :10E8D000A11CB11C53E0A516B10409F05DC600E00F 144 | :10E8E00010E018C081E28093C6008091C00086FFCE 145 | :10E8F000FCCF8091C00080648093C0002F5F3F4FA9 146 | :10E900002931310579F70F94E0F10F5F1F4F053082 147 | :10E91000110519F020E030E0E5CF10920A021092C4 148 | :10E920000B0210920C0210920D021092060210922D 149 | :10E93000070210920802109209021092020210922D 150 | :10E94000030210920402109205028FEE90EE60E036 151 | :10E950000F94F9F180E191EE60E00F94C2F18091A3 152 | :10E96000C00087FFFCCF9091C600903608F09F75DD 153 | :10E970009032B8F09093C6008091C00086FFFCCF23 154 | :10E980008091C00080648093C000A0E2A093C60084 155 | :10E990008091C00086FFFCCF8091C000806480938E 156 | :10E9A000C000983409F4DBC19934B8F4923409F406 157 | :10E9B0005DC1933458F4903319F1903308F4E7C5EE 158 | :10E9C0009F33A1F1903409F0E2C5BDC0953409F43C 159 | :10E9D00074C1963409F0DBC59CC1923509F42FC28D 160 | :10E9E000933538F49C3409F4F9C1913509F0CFC559 161 | :10E9F0001CC2963509F449C2993509F0C8C56BC4E3 162 | :10EA000083E792EE62E00F94F9F110920602109201 163 | :10EA10000702109208021092090210920A02109244 164 | :10EA20000B0210920C0210920D0217C18FE792EEAA 165 | :10EA300062E00F94F9F18FEE90EE60E00F94F9F13F 166 | :10EA400081E291EE60E00F94C2F187EB91EE60E01D 167 | :10EA50000F94F9F180E391EE60E00F94C2F184EE3F 168 | :10EA600090EE60E00F94F9F18FE391EE60E00F9487 169 | :10EA7000C2F186E090E061E070E00F9438F20F940C 170 | :10EA8000E0F18DE591EE60E00F94C2F189EC91EE3A 171 | :10EA900060E00F94F9F18EE491EE60E00F94C2F122 172 | :10EAA00083EC91EE60E00F94F9F18CE691EE60E07A 173 | :10EAB0000F94C2F18EE10F9411F288E90F9411F2D4 174 | :10EAC00081E00F9411F20F94E0F18BE791EE60E09A 175 | :10EAD0000F94C2F119E0E0E0F0E010935700E491E8 176 | :10EAE0008E2F0F9411F20F94E0F18AE891EE60E01E 177 | :10EAF0000F94C2F1E3E0F0E010935700E4918E2F01 178 | :10EB00000F9411F20F94E0F189E991EE60E00F9417 179 | :10EB1000C2F1E2E0F0E010935700E4918E2F0F94E1 180 | :10EB200011F20F94E0F188EA91EE60E00F94C2F1E7 181 | :10EB3000E1E0F0E0109357001491812F0F9411F24F 182 | :10EB40000F94E0F107CF8BE892EE62E00F94F9F1B9 183 | :10EB50008BE492EE60E00F94F9F10F94E0F100E0A5 184 | :10EB600010E019C0C8016F2D0F9475FEFF2031F41D 185 | :10EB700089E492EE60E00F94C2F10BC0F092C600FF 186 | :10EB80008091C00086FFFCCF8091C000806480939C 187 | :10EB9000C0000F5F1F4FC80181519F41AA2797FDF9 188 | :10EBA000A095BA2FABBFFC01F790BAE2FB1621F09B 189 | :10EBB000E2E000301E07B1F60F94E0F10F94E0F1AF 190 | :10EBC00087E592EE60E00F94F9F10F94E0F1CC2428 191 | :10EBD000DD2400E010E01EC0C8010F946DFEF82E89 192 | :10EBE000882331F489E492EE60E00F94C2F10BC007 193 | :10EBF0008093C6008091C00086FFFCCF8091C0004A 194 | :10EC000080648093C000FE1419F00894C11CD11CCC 195 | :10EC10000F5F1F4FC80181519F41AA2797FDA09503 196 | :10EC2000BA2FABBFFC01E790FAE2EF1621F022E029 197 | :10EC30000030120789F60F94E0F10F94E0F182E6BC 198 | :10EC400092EE60E00F94C2F1C60161E070E00F94B3 199 | :10EC500038F20F94E0F10F94E0F11092020210925A 200 | :10EC60000302109204021092050274CE89E992EE1A 201 | :10EC700062E00F94F9F1279A2F9A16C02F9880E03E 202 | :10EC800090E0E0EDF7E03197F1F7019684369105D9 203 | :10EC9000C1F72F9A80E090E0E0EDF7E03197F1F7CF 204 | :10ECA000019684369105C1F78091C00087FFE6CFB9 205 | :10ECB0008091C00087FFFCCF64C485EA92EE62E0D9 206 | :10ECC0000F94F9F140910202509103026091040205 207 | :10ECD0007091050281E020E10F9495F2809102028B 208 | :10ECE00090910302A0910402B091050280509F4FC1 209 | :10ECF000AF4FBF4F8093020290930302A093040290 210 | :10ED0000B093050280509041A040B04008F422CE5C 211 | :10ED1000A4CF83EB92EE62E00F94F9F140910602EA 212 | :10ED200050910702609108027091090280E020E191 213 | :10ED30000F9495F28091060290910702A09108022B 214 | :10ED4000B091090280509F4FAF4FBF4F8093060292 215 | :10ED500090930702A0930802B0930902FBCD80ECC8 216 | :10ED600092EE62E00F94F9F183E792EE60E00F9487 217 | :10ED7000F9F18FE792EE60E00F94F9F18BE892EEF3 218 | :10ED800060E00F94F9F189E992EE60E00F94F9F1F7 219 | :10ED900085EA92EE60E00F94F9F183EB92EE60E089 220 | :10EDA0000F94F9F180EC92EE60E00F94F9F187ECAA 221 | :10EDB00092EE60E00F94F9F188ED92EE60E00F942E 222 | :10EDC000F9F18FED92EE60E00F94F9F18AEE92EE98 223 | :10EDD00060E00F94F9F183E093EEB9CD87EC92EE09 224 | :10EDE00062E00F94F9F181E40F947FF282E40F94D2 225 | :10EDF0007FF283E40F947FF284E40F947FF285E442 226 | :10EE00000F947FF286E40F947FF287E40F947FF2F1 227 | :10EE100088E40F947FF28AE40F947FF28BE40F94DE 228 | :10EE20007FF28CE40F947FF295CD88ED92EE62E054 229 | :10EE30000F94F9F199249394AA24BB2409C48FED6B 230 | :10EE400092EE62E00F94F9F140910A0250910B02A8 231 | :10EE500060910C0270910D0282E020E10F9495F216 232 | :10EE600080910A0290910B02A0910C02B0910D02C8 233 | :10EE700080509F4FAF4FBF4F80930A0290930B0279 234 | :10EE8000A0930C02B0930D0265CD8AEE92EE62E083 235 | :10EE90000F94F9F184EE90EE60E00F94F9F18FECAD 236 | :10EEA00091EE60E00F94F9F1662477244301CC5D84 237 | :10EEB000DE4F19821882C452D140D401C301B695E5 238 | :10EEC000A79597958795CA5DDE4F88839983AA8316 239 | :10EED000BB83C652D140CC5DDE4FA881B981C452FC 240 | :10EEE000D1401196CC5DDE4FB983A883C452D14086 241 | :10EEF000CD0162E070E00F9438F2B0E2B093C6004A 242 | :10EF00008091C00086FFFCCF8091C0008064809318 243 | :10EF1000C000EDE2E093C6008091C00086FFFCCF08 244 | :10EF20008091C00080648093C000F0E2F093C6003E 245 | :10EF30008091C00086FFFCCF8091C00080648093E8 246 | :10EF4000C000CA5DDE4FE880F9800A811B81C6528D 247 | :10EF5000D140BB27A12F902F8F2D0F9411F2CA5DA6 248 | :10EF6000DE4F8881C652D1400F9411F2E0E2FE2EAE 249 | :10EF7000F092C6008091C00086FFFCCF8091C00057 250 | :10EF800080648093C0000DE30093C6008091C000B0 251 | :10EF900086FFFCCF8091C00080648093C00010E2A7 252 | :10EFA0001093C6008091C00086FFFCCF8091C00006 253 | :10EFB00080648093C0008BBEF3012791C65DDE4F55 254 | :10EFC0002883CA52D140A22EBB24CC24DD2408942D 255 | :10EFD000611C711C811C911C8BBEF3018791282E32 256 | :10EFE0003324442455240894611C711C811C911CF9 257 | :10EFF0008BBEF3013791C55DDE4F3883CB52D140D4 258 | :10F000000894611C711C811C911C8BBEF3014791FB 259 | :10F01000C45DDE4F4883CC52D1407DEFE72E7FEFB9 260 | :10F02000F72E7FEF072F7FEF172F6E0C7F1C801EB0 261 | :10F03000911E142D032DF22CEE24EA0CFB1C0C1D4A 262 | :10F040001D1D0F9411F220E22093C6008091C00094 263 | :10F0500086FFFCCF8091C00080648093C000C65DB5 264 | :10F06000DE4F8881CA52D1400F9411F230E23093C2 265 | :10F07000C6008091C00086FFFCCF8091C0008064F4 266 | :10F080008093C000C45DDE4F8881CC52D1400F9484 267 | :10F0900011F240E24093C6008091C00086FFFCCF91 268 | :10F0A0008091C00080648093C000C55DDE4F888180 269 | :10F0B000CB52D1400F9411F250E25093C600809190 270 | :10F0C000C00086FFFCCF8091C00080648093C000A8 271 | :10F0D0008FEFE8168FEFF80680E0080780E018074A 272 | :10F0E00031F484E092EE60E00F94C2F1DFC0D80109 273 | :10F0F000C7018070907CA070B0708050904CA04090 274 | :10F10000B040D1F52FEF3FE340E050E0E222F322A0 275 | :10F1100004231523CA5DDE4FA880B980CA80DB8036 276 | :10F12000C652D140AE0CBF1CC01ED11EAA0CBB1CC7 277 | :10F13000CC1CDD1C8EE092EE60E00F94C2F1BB2788 278 | :10F14000A12F902F8F2D0F9411F28E2D0F9411F26D 279 | :10F1500030E23093C6008091C00086FFFCCF8091E2 280 | :10F16000C00080648093C0004EE34093C60080914D 281 | :10F17000C00086FFFCCF87C08EE09EEFA0E0B0E02D 282 | :10F18000E822F9220A231B239CE0E91694E9F906F8 283 | :10F1900090E0090790E0190709F088C0C45DDE4FD0 284 | :10F1A000A881CC52D140EA2EFF2400E010E0102FBD 285 | :10F1B0000F2DFE2CEE24C55DDE4FB881CB52D14021 286 | :10F1C000EB0EF11C011D111DD601C501817090705F 287 | :10F1D000A070B070DC0199278827E80EF91E0A1F7D 288 | :10F1E0001B1F20EF30E040E050E0A222B322C422F7 289 | :10F1F000D522A1E1AA0CBB1CCC1CDD1CAA95D1F721 290 | :10F20000EA0CFB1C0C1D1D1D81E090E0A0E0B0E0AD 291 | :10F21000282239224A225B22F5E1220C331C441CAD 292 | :10F22000551CFA95D1F7E20CF31C041D151D57016E 293 | :10F230006801AA0CBB1CCC1CDD1C85E192EE60E0D1 294 | :10F240000F94C2F1C801AA27BB270F9411F2BB2764 295 | :10F25000A12F902F8F2D0F9411F28E2D0F9411F25C 296 | :10F2600090E29093C6008091C00086FFFCCF809111 297 | :10F27000C00080648093C000AEE3A093C60080917C 298 | :10F28000C00086FFFCCF8091C00080648093C000E6 299 | :10F29000C601AA27BB270F9411F2BB27AD2D9C2DC9 300 | :10F2A0008B2D0F9411F28A2D0F9411F20F94E0F12F 301 | :10F2B000CC5DDE4FE881F981C452D140F99709F461 302 | :10F2C00049CB34E0E32EF12C012D112D6E0C7F1C67 303 | :10F2D000801E911EF2CD83E093EE62E00F94F9F16F 304 | :10F2E0008AE192EE60E00F94C2F18091C00087FF46 305 | :10F2F000FCCF1091C6001F751093C6008091C0000E 306 | :10F3000086FFFCCF8091C00080648093C0000F9482 307 | :10F31000E0F1812F81548A3108F036C1163409F4A6 308 | :10F3200095C0173490F4133409F44EC0143430F4FB 309 | :10F330001134F1F0123409F01DC130C0143409F455 310 | :10F3400059C0153409F016C16BC01A3409F4C4C091 311 | :10F350001B3438F4173409F48FC0183409F00AC18B 312 | :10F36000A1C01B3409F4D2C01C3409F003C1E8C0A9 313 | :10F370008FEF81B90DC082B1809582B980E090E0B5 314 | :10F38000E0EDF7E03197F1F70196883C9105C1F780 315 | :10F390008091C00087FFEFCF12B8EFC08FEF84B924 316 | :10F3A0000DC085B1809585B980E090E0E0EDF7E093 317 | :10F3B0003197F1F70196883C9105C1F78091C00023 318 | :10F3C00087FFEFCF15B8D9C08FEF87B90DC088B1CF 319 | :10F3D000809588B980E090E0E0EDF7E03197F1F7B3 320 | :10F3E0000196883C9105C1F78091C00087FFEFCF5F 321 | :10F3F00018B8C3C08FEF8AB90DC08BB180958BB997 322 | :10F4000080E090E0E0EDF7E03197F1F70196883C7D 323 | :10F410009105C1F78091C00087FFEFCF1BB8ADC049 324 | :10F420008FEF8DB90DC08EB180958EB980E090E0E0 325 | :10F43000E0EDF7E03197F1F70196883C9105C1F7CF 326 | :10F440008091C00087FFEFCF1EB897C08FEF80BBC1 327 | :10F450000DC081B3809581BB80E090E0E0EDF7E0E6 328 | :10F460003197F1F70196883C9105C1F78091C00072 329 | :10F4700087FFEFCF11BA81C08FEF83BB0DC084B37C 330 | :10F48000809584BB80E090E0E0EDF7E03197F1F704 331 | :10F490000196883C9105C1F78091C00087FFEFCFAE 332 | :10F4A00014BA6BC08FEF809301010FC080910201ED 333 | :10F4B00080958093020180E090E0E0EDF7E03197E5 334 | :10F4C000F1F70196883C9105C1F78091C00087FF54 335 | :10F4D000EDCF1092020151C08FEF809304010FC055 336 | :10F4E0008091050180958093050180E090E0E0ED3A 337 | :10F4F000F7E03197F1F70196883C9105C1F78091CB 338 | :10F50000C00087FFEDCF1092050137C08FEF8093C9 339 | :10F5100007010FC08091080180958093080180E069 340 | :10F5200090E0E0EDF7E03197F1F70196883C910526 341 | :10F53000C1F78091C00087FFEDCF109208011DC078 342 | :10F540008FEF80930A010FC080910B01809580930B 343 | :10F550000B0180E090E0E0EDF7E03197F1F70196E4 344 | :10F56000883C9105C1F78091C00087FFEDCF1092D4 345 | :10F570000B0103C085E292EEEAC98091C00087FFCB 346 | :10F58000FCCF8091C600E6C988E392EEE0C98CE129 347 | :10F5900091EEDDC9AA24BB24933011F1943028F4F4 348 | :10F5A000913089F09230B8F408C0953061F195300F 349 | :10F5B000F0F0963009F048C043C02B3109F03EC945 350 | :10F5C00091E06BE13BC96227C15DDE4F2883CF52DA 351 | :10F5D000D14092E033C9B22FA0E0622793E02EC958 352 | :10F5E000822F90E0A82BB92B622794E027C92E30F8 353 | :10F5F00009F027C3622795E0C05DDE4F19821882AB 354 | :10F60000C053D1401BC9E1E0F0E0EC0FFD1FC05D2D 355 | :10F61000DE4F08811981C053D140E00FF11F2083D4 356 | :10F620000F5F1F4FC05DDE4F19830883C053D14069 357 | :10F6300062270A171B0709F001C9D80196E0FEC826 358 | :10F64000261709F0FEC203C0973009F0F7C89924C5 359 | :10F650009981933109F412C19431C8F4963009F4B8 360 | :10F66000D8C0973050F4923009F406C1933009F4B1 361 | :10F670006DC0913009F047C253C0913109F477C091 362 | :10F68000923108F0BBC0903109F03DC2F5C098310D 363 | :10F6900009F487C0993150F4953109F4EFC09531E0 364 | :10F6A00008F4B4C1963109F02EC2B0C19A3109F400 365 | :10F6B0006CC09A3108F491C09B3109F45BC09D3154 366 | :10F6C00009F021C29D81903359F48F81882311F470 367 | :10F6D0009EE11CC0813011F091E018C098E916C07D 368 | :10F6E000892F807591F0903539F4E0E0F0E089E001 369 | :10F6F0008093570094910AC0983539F4E3E0F0E024 370 | :10F7000089E080935700949101C090E01A821B8297 371 | :10F710008D818C831D829E831F8227E030E0F7C19C 372 | :10F720001A8288E08B8381E48C8386E58D8382E571 373 | :10F730008E8389E48F8383E5888780E589878FE5D9 374 | :10F740008A8782E38B872BE030E0E1C18A818139AF 375 | :10F7500041F0823941F0803911F48FE005C080E03A 376 | :10F7600003C082E001C08AE01A828B8344C09924DE 377 | :10F77000939482C08D81882311F48EE12CC0813056 378 | :10F7800011F081E028C088E926C01A82E1E0F0E0AB 379 | :10F7900089E08093570084918B831C8224E030E0C1 380 | :10F7A000B6C18B81803589F48C81883039F4E2E0F0 381 | :10F7B000F0E089E08093570084910DC0E0E0F0E034 382 | :10F7C00089E080935700849106C0E3E0F0E089E08F 383 | :10F7D0008093570084911A82DFCF8D81836C99E0EA 384 | :10F7E000E1E0F0E0082E90935700E89507B600FCA2 385 | :10F7F000FDCF1A821B8223E030E089C180EC8A832E 386 | :10F80000CE5CDE4F188219821A821B82C253D1400D 387 | :10F810007CC18A8190E0A0E0B0E0582F44273327D4 388 | :10F8200022278B8190E0A0E0B0E0DC0199278827B7 389 | :10F83000282B392B4A2B5B2B8D8190E0A0E0B0E088 390 | :10F84000282B392B4A2B5B2B8C8190E0A0E0B0E079 391 | :10F85000BA2FA92F982F8827282B392B4A2B5B2BBF 392 | :10F86000220F331F441F551FC05EDE4F288339838C 393 | :10F870004A835B83C052D1401A8247C13A81C95C36 394 | :10F88000DE4F3883C753D140CA5CDE4F1882C6535F 395 | :10F89000D1408B81A82FB0E0CA5CDE4F48815981EE 396 | :10F8A000C653D140A42BB52B933109F077C0CE5C61 397 | :10F8B000DE4F088119812A813B81C253D14000303B 398 | :10F8C00040EC140743E0240740E03407F0F483E001 399 | :10F8D000F80120935B0080935700E89507B600FC81 400 | :10F8E000FDCFCE5CDE4F088119812A813B81C25356 401 | :10F8F000D14000501F4F2F4F3F4FCE5CDE4F08834B 402 | :10F9000019832A833B83C253D140C05EDE4F4881B6 403 | :10F9100059816A817B81C052D1408E01055F1F4FA2 404 | :10F9200031E0F801808121810E5F1F4FC75CDE4FFF 405 | :10F930002883C953D140C85CDE4F1882C853D140D8 406 | :10F9400090E0C85CDE4FE880F980C853D1408E2932 407 | :10F950009F290C01FA0160935B0030935700E895F2 408 | :10F9600011244E5F5F4F6F4F7F4F1297D1F685E0A6 409 | :10F97000C05EDE4F088119812A813B81C052D1408F 410 | :10F98000F80120935B0080935700E89507B600FCD0 411 | :10F99000FDCF81E180935700E8952EC0C05EDE4F19 412 | :10F9A000288139814A815B81C052D140FE013B965A 413 | :10F9B00011977D0100E010E00894E11CF11C011D8D 414 | :10F9C000111DE20EF31E041F151F21BDBB27A52F1D 415 | :10F9D000942F832F82BD2F5F3F4F4F4F5F4F8191F9 416 | :10F9E00080BDFA9AF99AF999FECF2E153F05400786 417 | :10F9F000510759F7BA01A9011A82C05EDE4F488348 418 | :10FA000059836A837B83C052D1407FC01A81C55C11 419 | :10FA1000DE4F1883CB53D140C65CDE4F1882CA53E9 420 | :10FA2000D1408B81C82EDD24C65CDE4F2881398110 421 | :10FA3000CA53D140C22AD32A1A828981BE016D5F7E 422 | :10FA40007F4F843121F59601C05EDE4FE880F9805A 423 | :10FA50000A811B81C052D1400BBFF701879196915B 424 | :10FA6000DB018C9311969C936E5F7F4FD801C70189 425 | :10FA70000296A11DB11DC05EDE4F88839983AA83C3 426 | :10FA8000BB83C052D14022503040F1F636C0C05E38 427 | :10FA9000DE4F288139814A815B81C052D140089470 428 | :10FAA000C108D108760100E010E00894C11CD11C07 429 | :10FAB0000894E11CF11C011D111DE20EF31E041F30 430 | :10FAC000151F21BDBB27A52F942F832F82BD2F5F2C 431 | :10FAD0003F4F4F4F5F4FF89A80B5DB018D93BD01CB 432 | :10FAE0002E153F054007510761F7C05EDE4F2883A2 433 | :10FAF00039834A835B83C052D14096012D5F3F4FCB 434 | :10FB0000FB01108204C080EC8A8322E030E08BE1AC 435 | :10FB10008093C6008091C00086FFFCCF8091C0001A 436 | :10FB200080648093C000C15DDE4FF881CF52D14028 437 | :10FB3000F093C6008091C00086FFFCCF8091C0008A 438 | :10FB400080648093C000432F3093C6008091C00032 439 | :10FB500086FFFCCF8091C00080648093C000922F0C 440 | :10FB60002093C6008091C00086FFFCCF8091C0002A 441 | :10FB700080648093C0008EE08093C6008091C000B6 442 | :10FB800086FFFCCF8091C00080648093C00065E157 443 | :10FB9000C15DDE4FE880CF52D1406E2569276427D2 444 | :10FBA000FE01319610C090819093C6008091C000F4 445 | :10FBB00086FFFCCF31968091C00080648093C000A6 446 | :10FBC0006927215030402115310569F76093C6003F 447 | :10FBD0008091C00086FFFCCF8091C000806480933C 448 | :10FBE000C00085B1805885B9992081F4C15DDE4F90 449 | :10FBF0000881CF52D1400F5FC15DDE4F0883CF52E5 450 | :10FC0000D14090E0A0E0B0E00D941EF427982F982A 451 | :10FC100080E090E020ED37E0F9013197F1F70196AF 452 | :10FC200084369105C9F700008091C0008D7F8093D4 453 | :10FC3000C00081E180935700E895EE27FF270994E3 454 | :10FC4000FFCF90E00D941EF497FB092E07260AD0F3 455 | :10FC500077FD04D02ED006D000201AF4709561955F 456 | :10FC60007F4F0895F6F7909581959F4F0895A1E2F3 457 | :10FC70001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F26 458 | :10FC8000FF1FA217B307E407F50720F0A21BB30B71 459 | :10FC9000E40BF50B661F771F881F991F1A9469F7ED 460 | :10FCA00060957095809590959B01AC01BD01CF0149 461 | :10FCB0000895AA1BBB1B51E107C0AA1FBB1FA617B3 462 | :10FCC000B70710F0A61BB70B881F991F5A95A9F705 463 | :10FCD00080959095BC01CD010895F999FECF92BD14 464 | :10FCE00081BDF89A992780B50895262FF999FECFFE 465 | :10FCF0001FBA92BD81BD20BD0FB6F894FA9AF99A49 466 | :0AFD00000FBE01960895F894FFCF9E 467 | :040000033000E000E9 468 | :00000001FF 469 | -------------------------------------------------------------------------------- /stk500boot.c: -------------------------------------------------------------------------------- 1 | /***************************************************************************** 2 | Title: STK500v2 compatible bootloader 3 | Modified for Wiring board ATMega128-16MHz 4 | Author: Peter Fleury http://jump.to/fleury 5 | File: $Id: stk500boot.c,v 1.11 2006/06/25 12:39:17 peter Exp $ 6 | Compiler: avr-gcc 3.4.5 or 4.1 / avr-libc 1.4.3 7 | Hardware: All AVRs with bootloader support, tested with ATmega8 8 | License: GNU General Public License 9 | 10 | Modified: Worapoht Kornkaewwattanakul http://www.avride.com 11 | Date: 17 October 2007 12 | Update: 1st, 29 Dec 2007 : Enable CMD_SPI_MULTI but ignore unused command by return 0x00 byte response.. 13 | Compiler: WINAVR20060421 14 | Description: add timeout feature like previous Wiring bootloader 15 | 16 | DESCRIPTION: 17 | This program allows an AVR with bootloader capabilities to 18 | read/write its own Flash/EEprom. To enter Programming mode 19 | an input pin is checked. If this pin is pulled low, programming mode 20 | is entered. If not, normal execution is done from $0000 21 | "reset" vector in Application area. 22 | Size fits into a 1024 word bootloader section 23 | when compiled with avr-gcc 4.1 24 | (direct replace on Wiring Board without fuse setting changed) 25 | 26 | USAGE: 27 | - Set AVR MCU type and clock-frequency (F_CPU) in the Makefile. 28 | - Set baud rate below (AVRISP only works with 115200 bps) 29 | - compile/link the bootloader with the supplied Makefile 30 | - program the "Boot Flash section size" (BOOTSZ fuses), 31 | for boot-size 1024 words: program BOOTSZ01 32 | - enable the BOOT Reset Vector (program BOOTRST) 33 | - Upload the hex file to the AVR using any ISP programmer 34 | - Program Boot Lock Mode 3 (program BootLock 11 and BootLock 12 lock bits) // (leave them) 35 | - Reset your AVR while keeping PROG_PIN pulled low // (for enter bootloader by switch) 36 | - Start AVRISP Programmer (AVRStudio/Tools/Program AVR) 37 | - AVRISP will detect the bootloader 38 | - Program your application FLASH file and optional EEPROM file using AVRISP 39 | 40 | Note: 41 | Erasing the device without flashing, through AVRISP GUI button "Erase Device" 42 | is not implemented, due to AVRStudio limitations. 43 | Flash is always erased before programming. 44 | 45 | AVRdude: 46 | Please uncomment #define REMOVE_CMD_SPI_MULTI when using AVRdude. 47 | Comment #define REMOVE_PROGRAM_LOCK_BIT_SUPPORT to reduce code size 48 | Read Fuse Bits and Read/Write Lock Bits is not supported 49 | 50 | NOTES: 51 | Based on Atmel Application Note AVR109 - Self-programming 52 | Based on Atmel Application Note AVR068 - STK500v2 Protocol 53 | 54 | LICENSE: 55 | Copyright (C) 2006 Peter Fleury 56 | 57 | This program is free software; you can redistribute it and/or modify 58 | it under the terms of the GNU General Public License as published by 59 | the Free Software Foundation; either version 2 of the License, or 60 | any later version. 61 | 62 | This program is distributed in the hope that it will be useful, 63 | but WITHOUT ANY WARRANTY; without even the implied warranty of 64 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 65 | GNU General Public License for more details. 66 | 67 | *****************************************************************************/ 68 | 69 | //************************************************************************ 70 | //* Edit History 71 | //************************************************************************ 72 | //* Jul 7, 2010 = Mark Sproul msproul@skycharoit.com 73 | //* Jul 7, 2010 Working on mega2560. No Auto-restart 74 | //* Jul 7, 2010 Switched to 8K bytes (4K words) so that we have room for the monitor 75 | //* Jul 8, 2010 Found older version of source that had auto restart, put that code back in 76 | //* Jul 8, 2010 Adding monitor code 77 | //* Jul 11, 2010 Added blinking LED while waiting for download to start 78 | //* Jul 11, 2010 Added EEPROM test 79 | //* Jul 29, 2010 Added recchar_timeout for timing out on bootloading 80 | //* Aug 23, 2010 Added support for atmega2561 81 | //* Aug 26, 2010 Removed support for BOOT_BY_SWITCH 82 | //* Sep 8, 2010 Added support for atmega16 83 | //* Nov 9, 2010 Issue 392:Fixed bug that 3 !!! in code would cause it to jump to monitor 84 | //* Jun 24, 2011 Removed analogRead (was not used) 85 | //* Dec 29, 2011 Issue 181: added watch dog timmer support 86 | //* Dec 29, 2011 Issue 505: bootloader is comparing the seqNum to 1 or the current sequence 87 | //* Jan 1, 2012 Issue 543: CMD_CHIP_ERASE_ISP now returns STATUS_CMD_FAILED instead of STATUS_CMD_OK 88 | //* Jan 1, 2012 Issue 543: Write EEPROM now does something (NOT TESTED) 89 | //* Jan 1, 2012 Issue 544: stk500v2 bootloader doesn't support reading fuses 90 | //************************************************************************ 91 | 92 | //************************************************************************ 93 | //* these are used to test issues 94 | //* http://code.google.com/p/arduino/issues/detail?id=505 95 | //* Reported by mark.stubbs, Mar 14, 2011 96 | //* The STK500V2 bootloader is comparing the seqNum to 1 or the current sequence 97 | //* (IE: Requiring the sequence to be 1 or match seqNum before continuing). 98 | //* The correct behavior is for the STK500V2 to accept the PC's sequence number, and echo it back for the reply message. 99 | #define _FIX_ISSUE_505_ 100 | //************************************************************************ 101 | //* Issue 181: added watch dog timmer support 102 | #define _FIX_ISSUE_181_ 103 | 104 | #include 105 | #include 106 | #include 107 | #include 108 | #include 109 | #include 110 | #include 111 | #include 112 | #include 113 | #include "command.h" 114 | 115 | 116 | #if defined(_MEGA_BOARD_) || defined(_BOARD_AMBER128_) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) \ 117 | || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega1284P__) || defined(ENABLE_MONITOR) 118 | #undef ENABLE_MONITOR 119 | #define ENABLE_MONITOR 120 | static void RunMonitor(void); 121 | #endif 122 | 123 | #ifndef EEWE 124 | #define EEWE 1 125 | #endif 126 | #ifndef EEMWE 127 | #define EEMWE 2 128 | #endif 129 | 130 | //#define _DEBUG_SERIAL_ 131 | //#define _DEBUG_WITH_LEDS_ 132 | 133 | 134 | /* 135 | * Uncomment the following lines to save code space 136 | */ 137 | //#define REMOVE_PROGRAM_LOCK_BIT_SUPPORT // disable program lock bits 138 | //#define REMOVE_BOOTLOADER_LED // no LED to show active bootloader 139 | //#define REMOVE_CMD_SPI_MULTI // disable processing of SPI_MULTI commands, Remark this line for AVRDUDE 140 | // 141 | 142 | 143 | 144 | //************************************************************************ 145 | //* LED on pin "PROGLED_PIN" on port "PROGLED_PORT" 146 | //* indicates that bootloader is active 147 | //* PG2 -> LED on Wiring board 148 | //************************************************************************ 149 | #define BLINK_LED_WHILE_WAITING 150 | 151 | #ifdef _MEGA_BOARD_ 152 | #define PROGLED_PORT PORTB 153 | #define PROGLED_DDR DDRB 154 | #define PROGLED_PIN PINB7 155 | #elif defined( _BOARD_AMBER128_ ) 156 | //* this is for the amber 128 http://www.soc-robotics.com/ 157 | //* onbarod led is PORTE4 158 | #define PROGLED_PORT PORTD 159 | #define PROGLED_DDR DDRD 160 | #define PROGLED_PIN PINE7 161 | #elif defined( _CEREBOTPLUS_BOARD_ ) || defined(_CEREBOT_II_BOARD_) 162 | //* this is for the Cerebot 2560 board and the Cerebot-ii 163 | //* onbarod leds are on PORTE4-7 164 | #define PROGLED_PORT PORTE 165 | #define PROGLED_DDR DDRE 166 | #define PROGLED_PIN PINE7 167 | #elif defined( _PENGUINO_ ) 168 | //* this is for the Penguino 169 | //* onbarod led is PORTE4 170 | #define PROGLED_PORT PORTC 171 | #define PROGLED_DDR DDRC 172 | #define PROGLED_PIN PINC6 173 | #elif defined( _ANDROID_2561_ ) || defined( __AVR_ATmega2561__ ) 174 | //* this is for the Boston Android 2561 175 | //* onbarod led is PORTE4 176 | #define PROGLED_PORT PORTA 177 | #define PROGLED_DDR DDRA 178 | #define PROGLED_PIN PINA3 179 | #elif defined( _BOARD_MEGA16 ) 180 | //* onbarod led is PORTA7 181 | #define PROGLED_PORT PORTA 182 | #define PROGLED_DDR DDRA 183 | #define PROGLED_PIN PINA7 184 | #define UART_BAUDRATE_DOUBLE_SPEED 0 185 | 186 | #elif defined( _BOARD_BAHBOT_ ) 187 | //* dosent have an onboard LED but this is what will probably be added to this port 188 | #define PROGLED_PORT PORTB 189 | #define PROGLED_DDR DDRB 190 | #define PROGLED_PIN PINB0 191 | 192 | #elif defined( _BOARD_ROBOTX_ ) 193 | #define PROGLED_PORT PORTB 194 | #define PROGLED_DDR DDRB 195 | #define PROGLED_PIN PINB6 196 | #elif defined( _BOARD_CUSTOM1284_BLINK_B0_ ) 197 | #define PROGLED_PORT PORTB 198 | #define PROGLED_DDR DDRB 199 | #define PROGLED_PIN PINB0 200 | #elif defined( _BOARD_CUSTOM1284_ ) 201 | #define PROGLED_PORT PORTD 202 | #define PROGLED_DDR DDRD 203 | #define PROGLED_PIN PIND5 204 | #elif defined( _AVRLIP_ ) 205 | #define PROGLED_PORT PORTB 206 | #define PROGLED_DDR DDRB 207 | #define PROGLED_PIN PINB5 208 | #elif defined( _BOARD_STK500_ ) 209 | #define PROGLED_PORT PORTA 210 | #define PROGLED_DDR DDRA 211 | #define PROGLED_PIN PINA7 212 | #elif defined( _BOARD_STK502_ ) 213 | #define PROGLED_PORT PORTB 214 | #define PROGLED_DDR DDRB 215 | #define PROGLED_PIN PINB5 216 | #elif defined( _BOARD_STK525_ ) 217 | #define PROGLED_PORT PORTB 218 | #define PROGLED_DDR DDRB 219 | #define PROGLED_PIN PINB7 220 | #else 221 | #define PROGLED_PORT PORTG 222 | #define PROGLED_DDR DDRG 223 | #define PROGLED_PIN PING2 224 | #endif 225 | 226 | 227 | 228 | /* 229 | * define CPU frequency in Mhz here if not defined in Makefile 230 | */ 231 | #ifndef F_CPU 232 | #define F_CPU 16000000UL 233 | #endif 234 | 235 | #define _BLINK_LOOP_COUNT_ (F_CPU / 2250) 236 | /* 237 | * UART Baudrate, AVRStudio AVRISP only accepts 115200 bps 238 | */ 239 | 240 | #ifndef BAUDRATE 241 | #define BAUDRATE 115200 242 | #endif 243 | 244 | /* 245 | * Enable (1) or disable (0) USART double speed operation 246 | */ 247 | #ifndef UART_BAUDRATE_DOUBLE_SPEED 248 | #if defined (__AVR_ATmega32__) 249 | #define UART_BAUDRATE_DOUBLE_SPEED 0 250 | #else 251 | #define UART_BAUDRATE_DOUBLE_SPEED 1 252 | #endif 253 | #endif 254 | 255 | /* 256 | * HW and SW version, reported to AVRISP, must match version of AVRStudio 257 | */ 258 | #define CONFIG_PARAM_BUILD_NUMBER_LOW 0 259 | #define CONFIG_PARAM_BUILD_NUMBER_HIGH 0 260 | #define CONFIG_PARAM_HW_VER 0x0F 261 | #define CONFIG_PARAM_SW_MAJOR 2 262 | #define CONFIG_PARAM_SW_MINOR 0x0A 263 | 264 | /* 265 | * Calculate the address where the bootloader starts from FLASHEND and BOOTSIZE 266 | * (adjust BOOTSIZE below and BOOTLOADER_ADDRESS in Makefile if you want to change the size of the bootloader) 267 | */ 268 | //#define BOOTSIZE 1024 269 | #if FLASHEND > 0x0F000 270 | #define BOOTSIZE 8192 271 | #else 272 | #define BOOTSIZE 2048 273 | #endif 274 | 275 | #define APP_END (FLASHEND -(2*BOOTSIZE) + 1) 276 | 277 | /* 278 | * Signature bytes are not available in avr-gcc io_xxx.h 279 | */ 280 | #if defined (__AVR_ATmega8__) 281 | #define SIGNATURE_BYTES 0x1E9307 282 | #elif defined (__AVR_ATmega16__) 283 | #define SIGNATURE_BYTES 0x1E9403 284 | #elif defined (__AVR_ATmega32__) 285 | #define SIGNATURE_BYTES 0x1E9502 286 | #elif defined (__AVR_ATmega8515__) 287 | #define SIGNATURE_BYTES 0x1E9306 288 | #elif defined (__AVR_ATmega8535__) 289 | #define SIGNATURE_BYTES 0x1E9308 290 | #elif defined (__AVR_ATmega162__) 291 | #define SIGNATURE_BYTES 0x1E9404 292 | #elif defined (__AVR_ATmega128__) 293 | #define SIGNATURE_BYTES 0x1E9702 294 | #elif defined (__AVR_ATmega1280__) 295 | #define SIGNATURE_BYTES 0x1E9703 296 | #elif defined (__AVR_ATmega2560__) 297 | #define SIGNATURE_BYTES 0x1E9801 298 | #elif defined (__AVR_ATmega2561__) 299 | #define SIGNATURE_BYTES 0x1e9802 300 | #elif defined (__AVR_ATmega1284P__) 301 | #define SIGNATURE_BYTES 0x1e9705 302 | #elif defined (__AVR_ATmega640__) 303 | #define SIGNATURE_BYTES 0x1e9608 304 | #elif defined (__AVR_ATmega64__) 305 | #define SIGNATURE_BYTES 0x1E9602 306 | #elif defined (__AVR_ATmega169__) 307 | #define SIGNATURE_BYTES 0x1e9405 308 | #elif defined (__AVR_AT90USB1287__) 309 | #define SIGNATURE_BYTES 0x1e9782 310 | #else 311 | #error "no signature definition for MCU available" 312 | #endif 313 | 314 | 315 | #if defined(_BOARD_ROBOTX_) || defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) 316 | #define UART_BAUD_RATE_LOW UBRR1L 317 | #define UART_STATUS_REG UCSR1A 318 | #define UART_CONTROL_REG UCSR1B 319 | #define UART_ENABLE_TRANSMITTER TXEN1 320 | #define UART_ENABLE_RECEIVER RXEN1 321 | #define UART_TRANSMIT_COMPLETE TXC1 322 | #define UART_RECEIVE_COMPLETE RXC1 323 | #define UART_DATA_REG UDR1 324 | #define UART_DOUBLE_SPEED U2X1 325 | 326 | #elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \ 327 | || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) 328 | /* ATMega8 with one USART */ 329 | #define UART_BAUD_RATE_LOW UBRRL 330 | #define UART_STATUS_REG UCSRA 331 | #define UART_CONTROL_REG UCSRB 332 | #define UART_ENABLE_TRANSMITTER TXEN 333 | #define UART_ENABLE_RECEIVER RXEN 334 | #define UART_TRANSMIT_COMPLETE TXC 335 | #define UART_RECEIVE_COMPLETE RXC 336 | #define UART_DATA_REG UDR 337 | #define UART_DOUBLE_SPEED U2X 338 | 339 | #elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) || defined(__AVR_ATmega162__) \ 340 | || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) 341 | /* ATMega with two USART, use UART0 */ 342 | #define UART_BAUD_RATE_LOW UBRR0L 343 | #define UART_STATUS_REG UCSR0A 344 | #define UART_CONTROL_REG UCSR0B 345 | #define UART_ENABLE_TRANSMITTER TXEN0 346 | #define UART_ENABLE_RECEIVER RXEN0 347 | #define UART_TRANSMIT_COMPLETE TXC0 348 | #define UART_RECEIVE_COMPLETE RXC0 349 | #define UART_DATA_REG UDR0 350 | #define UART_DOUBLE_SPEED U2X0 351 | #elif defined(UBRR0L) && defined(UCSR0A) && defined(TXEN0) 352 | /* ATMega with two USART, use UART0 */ 353 | #define UART_BAUD_RATE_LOW UBRR0L 354 | #define UART_STATUS_REG UCSR0A 355 | #define UART_CONTROL_REG UCSR0B 356 | #define UART_ENABLE_TRANSMITTER TXEN0 357 | #define UART_ENABLE_RECEIVER RXEN0 358 | #define UART_TRANSMIT_COMPLETE TXC0 359 | #define UART_RECEIVE_COMPLETE RXC0 360 | #define UART_DATA_REG UDR0 361 | #define UART_DOUBLE_SPEED U2X0 362 | #elif defined(UBRRL) && defined(UCSRA) && defined(UCSRB) && defined(TXEN) && defined(RXEN) 363 | //* catch all 364 | #define UART_BAUD_RATE_LOW UBRRL 365 | #define UART_STATUS_REG UCSRA 366 | #define UART_CONTROL_REG UCSRB 367 | #define UART_ENABLE_TRANSMITTER TXEN 368 | #define UART_ENABLE_RECEIVER RXEN 369 | #define UART_TRANSMIT_COMPLETE TXC 370 | #define UART_RECEIVE_COMPLETE RXC 371 | #define UART_DATA_REG UDR 372 | #define UART_DOUBLE_SPEED U2X 373 | #else 374 | #error "no UART definition for MCU available" 375 | #endif 376 | 377 | 378 | 379 | /* 380 | * Macro to calculate UBBR from XTAL and baudrate 381 | */ 382 | #if defined(__AVR_ATmega32__) && UART_BAUDRATE_DOUBLE_SPEED 383 | #define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu / 4 / baudRate - 1) / 2) 384 | #elif defined(__AVR_ATmega32__) 385 | #define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu / 8 / baudRate - 1) / 2) 386 | #elif UART_BAUDRATE_DOUBLE_SPEED 387 | #define UART_BAUD_SELECT(baudRate,xtalCpu) (((float)(xtalCpu))/(((float)(baudRate))*8.0)-1.0+0.5) 388 | #else 389 | #define UART_BAUD_SELECT(baudRate,xtalCpu) (((float)(xtalCpu))/(((float)(baudRate))*16.0)-1.0+0.5) 390 | #endif 391 | 392 | 393 | /* 394 | * States used in the receive state machine 395 | */ 396 | #define ST_START 0 397 | #define ST_GET_SEQ_NUM 1 398 | #define ST_MSG_SIZE_1 2 399 | #define ST_MSG_SIZE_2 3 400 | #define ST_GET_TOKEN 4 401 | #define ST_GET_DATA 5 402 | #define ST_GET_CHECK 6 403 | #define ST_PROCESS 7 404 | 405 | /* 406 | * use 16bit address variable for ATmegas with <= 64K flash 407 | */ 408 | #if defined(RAMPZ) 409 | typedef uint32_t address_t; 410 | #else 411 | typedef uint16_t address_t; 412 | #endif 413 | 414 | /* 415 | * function prototypes 416 | */ 417 | static void sendchar(char c); 418 | static unsigned char recchar(void); 419 | 420 | /* 421 | * since this bootloader is not linked against the avr-gcc crt1 functions, 422 | * to reduce the code size, we need to provide our own initialization 423 | */ 424 | void __jumpMain (void) __attribute__ ((naked)) __attribute__ ((section (".init9"))); 425 | #include 426 | 427 | //#define SPH_REG 0x3E 428 | //#define SPL_REG 0x3D 429 | 430 | //***************************************************************************** 431 | void __jumpMain(void) 432 | { 433 | //* July 17, 2010 Added stack pointer initialzation 434 | //* the first line did not do the job on the ATmega128 435 | 436 | asm volatile ( ".set __stack, %0" :: "i" (RAMEND) ); 437 | 438 | //* set stack pointer to top of RAM 439 | 440 | asm volatile ( "ldi 16, %0" :: "i" (RAMEND >> 8) ); 441 | asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_HI_ADDR) ); 442 | 443 | asm volatile ( "ldi 16, %0" :: "i" (RAMEND & 0x0ff) ); 444 | asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_LO_ADDR) ); 445 | 446 | asm volatile ( "clr __zero_reg__" ); // GCC depends on register r1 set to 0 447 | asm volatile ( "out %0, __zero_reg__" :: "I" (_SFR_IO_ADDR(SREG)) ); // set SREG to 0 448 | asm volatile ( "jmp main"); // jump to main() 449 | } 450 | 451 | 452 | //***************************************************************************** 453 | void delay_ms(unsigned int timedelay) 454 | { 455 | unsigned int i; 456 | for (i=0;i> 1) 496 | //***************************************************************************** 497 | static unsigned char recchar_timeout(void) 498 | { 499 | uint32_t count = 0; 500 | 501 | while (!(UART_STATUS_REG & (1 << UART_RECEIVE_COMPLETE))) 502 | { 503 | // wait for data 504 | count++; 505 | if (count > MAX_TIME_COUNT) 506 | { 507 | unsigned int data; 508 | #if (FLASHEND > 0x10000) 509 | data = pgm_read_word_far(0); //* get the first word of the user program 510 | #else 511 | data = pgm_read_word_near(0); //* get the first word of the user program 512 | #endif 513 | if (data != 0xffff) //* make sure its valid before jumping to it. 514 | { 515 | asm volatile( 516 | "clr r30 \n\t" 517 | "clr r31 \n\t" 518 | "ijmp \n\t" 519 | ); 520 | } 521 | count = 0; 522 | } 523 | } 524 | return UART_DATA_REG; 525 | } 526 | 527 | //* for watch dog timer startup 528 | void (*app_start)(void) = 0x0000; 529 | 530 | 531 | //***************************************************************************** 532 | int main(void) 533 | { 534 | address_t address = 0; 535 | address_t eraseAddress = 0; 536 | unsigned char msgParseState; 537 | unsigned int ii = 0; 538 | unsigned char checksum = 0; 539 | unsigned char seqNum = 0; 540 | unsigned int msgLength = 0; 541 | unsigned char msgBuffer[285]; 542 | unsigned char c, *p; 543 | unsigned char isLeave = 0; 544 | 545 | unsigned long boot_timeout; 546 | unsigned long boot_timer; 547 | unsigned int boot_state; 548 | #ifdef ENABLE_MONITOR 549 | unsigned int exPointCntr = 0; 550 | unsigned int rcvdCharCntr = 0; 551 | #endif 552 | 553 | //* some chips dont set the stack properly 554 | asm volatile ( ".set __stack, %0" :: "i" (RAMEND) ); 555 | asm volatile ( "ldi 16, %0" :: "i" (RAMEND >> 8) ); 556 | asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_HI_ADDR) ); 557 | asm volatile ( "ldi 16, %0" :: "i" (RAMEND & 0x0ff) ); 558 | asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_LO_ADDR) ); 559 | 560 | #ifdef _FIX_ISSUE_181_ 561 | //************************************************************************ 562 | //* Dec 29, 2011 Issue #181, added watch dog timmer support 563 | //* handle the watch dog timer 564 | uint8_t mcuStatusReg; 565 | mcuStatusReg = MCUSR; 566 | 567 | __asm__ __volatile__ ("cli"); 568 | __asm__ __volatile__ ("wdr"); 569 | MCUSR = 0; 570 | WDTCSR |= _BV(WDCE) | _BV(WDE); 571 | WDTCSR = 0; 572 | __asm__ __volatile__ ("sei"); 573 | // check if WDT generated the reset, if so, go straight to app 574 | if (mcuStatusReg & _BV(WDRF)) 575 | { 576 | app_start(); 577 | } 578 | //************************************************************************ 579 | #endif 580 | 581 | 582 | boot_timer = 0; 583 | boot_state = 0; 584 | 585 | #ifdef BLINK_LED_WHILE_WAITING 586 | // boot_timeout = 90000; //* should be about 4 seconds 587 | // boot_timeout = 170000; 588 | boot_timeout = 20000; //* should be about 1 second 589 | #else 590 | boot_timeout = 3500000; // 7 seconds , approx 2us per step when optimize "s" 591 | #endif 592 | /* 593 | * Branch to bootloader or application code ? 594 | */ 595 | 596 | #ifndef REMOVE_BOOTLOADER_LED 597 | /* PROG_PIN pulled low, indicate with LED that bootloader is active */ 598 | PROGLED_DDR |= (1< boot_timeout) 649 | { 650 | boot_state = 1; // (after ++ -> boot_state=2 bootloader timeout, jump to main 0x00000 ) 651 | } 652 | #ifdef BLINK_LED_WHILE_WAITING 653 | if ((boot_timer % _BLINK_LOOP_COUNT_) == 0) 654 | { 655 | //* toggle the LED 656 | PROGLED_PORT ^= (1<> 16) & 0x000000FF; 803 | } 804 | else if ( signatureIndex == 1 ) 805 | { 806 | answerByte = (SIGNATURE_BYTES >> 8) & 0x000000FF; 807 | } 808 | else 809 | { 810 | answerByte = SIGNATURE_BYTES & 0x000000FF; 811 | } 812 | } 813 | else if ( msgBuffer[4] & 0x50 ) 814 | { 815 | //* Issue 544: stk500v2 bootloader doesn't support reading fuses 816 | //* I cant find the docs that say what these are supposed to be but this was figured out by trial and error 817 | // answerByte = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS); 818 | // answerByte = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS); 819 | // answerByte = boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS); 820 | if (msgBuffer[4] == 0x50) 821 | { 822 | answerByte = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS); 823 | } 824 | else if (msgBuffer[4] == 0x58) 825 | { 826 | answerByte = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS); 827 | } 828 | else 829 | { 830 | answerByte = 0; 831 | } 832 | } 833 | else 834 | { 835 | answerByte = 0; // for all others command are not implemented, return dummy value for AVRDUDE happy 836 | } 837 | if ( !flag ) 838 | { 839 | msgLength = 7; 840 | msgBuffer[1] = STATUS_CMD_OK; 841 | msgBuffer[2] = 0; 842 | msgBuffer[3] = msgBuffer[4]; 843 | msgBuffer[4] = 0; 844 | msgBuffer[5] = answerByte; 845 | msgBuffer[6] = STATUS_CMD_OK; 846 | } 847 | } 848 | break; 849 | #endif 850 | case CMD_SIGN_ON: 851 | msgLength = 11; 852 | msgBuffer[1] = STATUS_CMD_OK; 853 | msgBuffer[2] = 8; 854 | msgBuffer[3] = 'A'; 855 | msgBuffer[4] = 'V'; 856 | msgBuffer[5] = 'R'; 857 | msgBuffer[6] = 'I'; 858 | msgBuffer[7] = 'S'; 859 | msgBuffer[8] = 'P'; 860 | msgBuffer[9] = '_'; 861 | msgBuffer[10] = '2'; 862 | break; 863 | 864 | case CMD_GET_PARAMETER: 865 | { 866 | unsigned char value; 867 | 868 | switch(msgBuffer[1]) 869 | { 870 | case PARAM_BUILD_NUMBER_LOW: 871 | value = CONFIG_PARAM_BUILD_NUMBER_LOW; 872 | break; 873 | case PARAM_BUILD_NUMBER_HIGH: 874 | value = CONFIG_PARAM_BUILD_NUMBER_HIGH; 875 | break; 876 | case PARAM_HW_VER: 877 | value = CONFIG_PARAM_HW_VER; 878 | break; 879 | case PARAM_SW_MAJOR: 880 | value = CONFIG_PARAM_SW_MAJOR; 881 | break; 882 | case PARAM_SW_MINOR: 883 | value = CONFIG_PARAM_SW_MINOR; 884 | break; 885 | default: 886 | value = 0; 887 | break; 888 | } 889 | msgLength = 3; 890 | msgBuffer[1] = STATUS_CMD_OK; 891 | msgBuffer[2] = value; 892 | } 893 | break; 894 | 895 | case CMD_LEAVE_PROGMODE_ISP: 896 | isLeave = 1; 897 | //* fall thru 898 | 899 | case CMD_SET_PARAMETER: 900 | case CMD_ENTER_PROGMODE_ISP: 901 | msgLength = 2; 902 | msgBuffer[1] = STATUS_CMD_OK; 903 | break; 904 | 905 | case CMD_READ_SIGNATURE_ISP: 906 | { 907 | unsigned char signatureIndex = msgBuffer[4]; 908 | unsigned char signature; 909 | 910 | if ( signatureIndex == 0 ) 911 | signature = (SIGNATURE_BYTES >>16) & 0x000000FF; 912 | else if ( signatureIndex == 1 ) 913 | signature = (SIGNATURE_BYTES >> 8) & 0x000000FF; 914 | else 915 | signature = SIGNATURE_BYTES & 0x000000FF; 916 | 917 | msgLength = 4; 918 | msgBuffer[1] = STATUS_CMD_OK; 919 | msgBuffer[2] = signature; 920 | msgBuffer[3] = STATUS_CMD_OK; 921 | } 922 | break; 923 | 924 | case CMD_READ_LOCK_ISP: 925 | msgLength = 4; 926 | msgBuffer[1] = STATUS_CMD_OK; 927 | msgBuffer[2] = boot_lock_fuse_bits_get( GET_LOCK_BITS ); 928 | msgBuffer[3] = STATUS_CMD_OK; 929 | break; 930 | 931 | case CMD_READ_FUSE_ISP: 932 | { 933 | unsigned char fuseBits; 934 | 935 | if ( msgBuffer[2] == 0x50 ) 936 | { 937 | if ( msgBuffer[3] == 0x08 ) 938 | fuseBits = boot_lock_fuse_bits_get( GET_EXTENDED_FUSE_BITS ); 939 | else 940 | fuseBits = boot_lock_fuse_bits_get( GET_LOW_FUSE_BITS ); 941 | } 942 | else 943 | { 944 | fuseBits = boot_lock_fuse_bits_get( GET_HIGH_FUSE_BITS ); 945 | } 946 | msgLength = 4; 947 | msgBuffer[1] = STATUS_CMD_OK; 948 | msgBuffer[2] = fuseBits; 949 | msgBuffer[3] = STATUS_CMD_OK; 950 | } 951 | break; 952 | 953 | #ifndef REMOVE_PROGRAM_LOCK_BIT_SUPPORT 954 | case CMD_PROGRAM_LOCK_ISP: 955 | { 956 | unsigned char lockBits = msgBuffer[4]; 957 | 958 | lockBits = (~lockBits) & 0x3C; // mask BLBxx bits 959 | boot_lock_bits_set(lockBits); // and program it 960 | boot_spm_busy_wait(); 961 | 962 | msgLength = 3; 963 | msgBuffer[1] = STATUS_CMD_OK; 964 | msgBuffer[2] = STATUS_CMD_OK; 965 | } 966 | break; 967 | #endif 968 | case CMD_CHIP_ERASE_ISP: 969 | eraseAddress = 0; 970 | msgLength = 2; 971 | // msgBuffer[1] = STATUS_CMD_OK; 972 | msgBuffer[1] = STATUS_CMD_FAILED; //* isue 543, return FAILED instead of OK 973 | break; 974 | 975 | case CMD_LOAD_ADDRESS: 976 | #if defined(RAMPZ) 977 | address = ( ((address_t)(msgBuffer[1])<<24)|((address_t)(msgBuffer[2])<<16)|((address_t)(msgBuffer[3])<<8)|(msgBuffer[4]) )<<1; 978 | #else 979 | address = ( ((msgBuffer[3])<<8)|(msgBuffer[4]) )<<1; //convert word to byte address 980 | #endif 981 | msgLength = 2; 982 | msgBuffer[1] = STATUS_CMD_OK; 983 | break; 984 | 985 | case CMD_PROGRAM_FLASH_ISP: 986 | case CMD_PROGRAM_EEPROM_ISP: 987 | { 988 | unsigned int size = ((msgBuffer[1])<<8) | msgBuffer[2]; 989 | unsigned char *p = msgBuffer+10; 990 | unsigned int data; 991 | unsigned char highByte, lowByte; 992 | address_t tempaddress = address; 993 | 994 | 995 | if ( msgBuffer[0] == CMD_PROGRAM_FLASH_ISP ) 996 | { 997 | // erase only main section (bootloader protection) 998 | if (eraseAddress < APP_END ) 999 | { 1000 | boot_page_erase(eraseAddress); // Perform page erase 1001 | boot_spm_busy_wait(); // Wait until the memory is erased. 1002 | eraseAddress += SPM_PAGESIZE; // point to next page to be erase 1003 | } 1004 | 1005 | /* Write FLASH */ 1006 | do { 1007 | lowByte = *p++; 1008 | highByte = *p++; 1009 | 1010 | data = (highByte << 8) | lowByte; 1011 | boot_page_fill(address,data); 1012 | 1013 | address = address + 2; // Select next word in memory 1014 | size -= 2; // Reduce number of bytes to write by two 1015 | } while (size); // Loop until all bytes written 1016 | 1017 | boot_page_write(tempaddress); 1018 | boot_spm_busy_wait(); 1019 | boot_rww_enable(); // Re-enable the RWW section 1020 | } 1021 | else 1022 | { 1023 | //* issue 543, this should work, It has not been tested. 1024 | // #if (!defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) && !defined(__AVR_ATmega2561__) && !defined(__AVR_ATmega1284P__) && !defined(__AVR_ATmega640__)) 1025 | #if (defined(EEARL) && defined(EEARH) && defined(EEMWE) && defined(EEWE) && defined(EEDR)) 1026 | /* write EEPROM */ 1027 | do { 1028 | EEARL = address; // Setup EEPROM address 1029 | EEARH = (address >> 8); 1030 | address++; // Select next EEPROM byte 1031 | 1032 | EEDR = *p++; // get byte from buffer 1033 | EECR |= (1< 0x10000) 1062 | data = pgm_read_word_far(address); 1063 | #else 1064 | data = pgm_read_word_near(address); 1065 | #endif 1066 | *p++ = (unsigned char)data; //LSB 1067 | *p++ = (unsigned char)(data >> 8); //MSB 1068 | address += 2; // Select next word in memory 1069 | size -= 2; 1070 | }while (size); 1071 | } 1072 | else 1073 | { 1074 | /* Read EEPROM */ 1075 | do { 1076 | EEARL = address; // Setup EEPROM address 1077 | EEARH = ((address >> 8)); 1078 | address++; // Select next EEPROM byte 1079 | EECR |= (1<>8)&0xFF); 1104 | sendchar(c); 1105 | checksum ^= c; 1106 | 1107 | c = msgLength&0x00FF; 1108 | sendchar(c); 1109 | checksum ^= c; 1110 | 1111 | sendchar(TOKEN); 1112 | checksum ^= TOKEN; 1113 | 1114 | p = msgBuffer; 1115 | while ( msgLength ) 1116 | { 1117 | c = *p++; 1118 | sendchar(c); 1119 | checksum ^=c; 1120 | msgLength--; 1121 | } 1122 | sendchar(checksum); 1123 | seqNum++; 1124 | 1125 | #ifndef REMOVE_BOOTLOADER_LED 1126 | //* toggle the LED 1127 | PROGLED_PORT ^= (1< 1205 | 1206 | 1207 | base address = f000 1208 | avrdude: Device signature = 0x1e9703 1209 | avrdude: safemode: lfuse reads as FF 1210 | avrdude: safemode: hfuse reads as D8 1211 | avrdude: safemode: efuse reads as F5 1212 | avrdude> 1213 | */ 1214 | 1215 | //************************************************************************ 1216 | #ifdef ENABLE_MONITOR 1217 | #include 1218 | 1219 | unsigned long gRamIndex; 1220 | unsigned long gFlashIndex; 1221 | unsigned long gEepromIndex; 1222 | 1223 | 1224 | #define true 1 1225 | #define false 0 1226 | 1227 | #include "avr_cpunames.h" 1228 | 1229 | #ifndef _AVR_CPU_NAME_ 1230 | #error cpu name not defined 1231 | #endif 1232 | 1233 | #ifdef _VECTORS_SIZE 1234 | #define kInterruptVectorCount (_VECTORS_SIZE / 4) 1235 | #else 1236 | #define kInterruptVectorCount 23 1237 | #endif 1238 | 1239 | 1240 | void PrintDecInt(int theNumber, int digitCnt); 1241 | 1242 | #ifdef _AVR_CPU_NAME_ 1243 | prog_char gTextMsg_CPU_Name[] PROGMEM = _AVR_CPU_NAME_; 1244 | #else 1245 | prog_char gTextMsg_CPU_Name[] PROGMEM = "UNKNOWN"; 1246 | #endif 1247 | 1248 | prog_char gTextMsg_Explorer[] PROGMEM = "Arduino explorer stk500V2 by MLS"; 1249 | prog_char gTextMsg_Prompt[] PROGMEM = "Bootloader>"; 1250 | prog_char gTextMsg_HUH[] PROGMEM = "Huh?"; 1251 | prog_char gTextMsg_COMPILED_ON[] PROGMEM = "Compiled on = "; 1252 | prog_char gTextMsg_CPU_Type[] PROGMEM = "CPU Type = "; 1253 | prog_char gTextMsg_AVR_ARCH[] PROGMEM = "__AVR_ARCH__= "; 1254 | prog_char gTextMsg_AVR_LIBC[] PROGMEM = "AVR LibC Ver= "; 1255 | prog_char gTextMsg_GCC_VERSION[] PROGMEM = "GCC Version = "; 1256 | prog_char gTextMsg_CPU_SIGNATURE[] PROGMEM = "CPU ID = "; 1257 | prog_char gTextMsg_FUSE_BYTE_LOW[] PROGMEM = "Low fuse = "; 1258 | prog_char gTextMsg_FUSE_BYTE_HIGH[] PROGMEM = "High fuse = "; 1259 | prog_char gTextMsg_FUSE_BYTE_EXT[] PROGMEM = "Ext fuse = "; 1260 | prog_char gTextMsg_FUSE_BYTE_LOCK[] PROGMEM = "Lock fuse = "; 1261 | prog_char gTextMsg_GCC_DATE_STR[] PROGMEM = __DATE__; 1262 | prog_char gTextMsg_AVR_LIBC_VER_STR[] PROGMEM = __AVR_LIBC_VERSION_STRING__; 1263 | prog_char gTextMsg_GCC_VERSION_STR[] PROGMEM = __VERSION__; 1264 | prog_char gTextMsg_VECTOR_HEADER[] PROGMEM = "V# ADDR op code instruction addr Interrupt"; 1265 | prog_char gTextMsg_noVector[] PROGMEM = "no vector"; 1266 | prog_char gTextMsg_rjmp[] PROGMEM = "rjmp "; 1267 | prog_char gTextMsg_jmp[] PROGMEM = "jmp "; 1268 | prog_char gTextMsg_WHAT_PORT[] PROGMEM = "What port:"; 1269 | prog_char gTextMsg_PortNotSupported[] PROGMEM = "Port not supported"; 1270 | prog_char gTextMsg_MustBeLetter[] PROGMEM = "Must be a letter"; 1271 | prog_char gTextMsg_SPACE[] PROGMEM = " "; 1272 | prog_char gTextMsg_WriteToEEprom[] PROGMEM = "Writting EE"; 1273 | prog_char gTextMsg_ReadingEEprom[] PROGMEM = "Reading EE"; 1274 | prog_char gTextMsg_EEPROMerrorCnt[] PROGMEM = "EE err cnt="; 1275 | prog_char gTextMsg_PORT[] PROGMEM = "PORT"; 1276 | 1277 | 1278 | //************************************************************************ 1279 | //* Help messages 1280 | prog_char gTextMsg_HELP_MSG_0[] PROGMEM = "0=Zero addr"; 1281 | prog_char gTextMsg_HELP_MSG_QM[] PROGMEM = "?=CPU stats"; 1282 | prog_char gTextMsg_HELP_MSG_AT[] PROGMEM = "@=EEPROM test"; 1283 | prog_char gTextMsg_HELP_MSG_B[] PROGMEM = "B=Blink LED"; 1284 | prog_char gTextMsg_HELP_MSG_E[] PROGMEM = "E=Dump EEPROM"; 1285 | prog_char gTextMsg_HELP_MSG_F[] PROGMEM = "F=Dump FLASH"; 1286 | prog_char gTextMsg_HELP_MSG_H[] PROGMEM = "H=Help"; 1287 | prog_char gTextMsg_HELP_MSG_L[] PROGMEM = "L=List I/O Ports"; 1288 | // prog_char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit & jump to user pgm"; 1289 | prog_char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit"; 1290 | prog_char gTextMsg_HELP_MSG_R[] PROGMEM = "R=Dump RAM"; 1291 | prog_char gTextMsg_HELP_MSG_V[] PROGMEM = "V=show interrupt Vectors"; 1292 | prog_char gTextMsg_HELP_MSG_Y[] PROGMEM = "Y=Port blink"; 1293 | 1294 | prog_char gTextMsg_END[] PROGMEM = "*"; 1295 | 1296 | 1297 | //************************************************************************ 1298 | void PrintFromPROGMEM(void *dataPtr, unsigned char offset) 1299 | { 1300 | uint8_t ii; 1301 | char theChar; 1302 | 1303 | ii = offset; 1304 | theChar = 1; 1305 | 1306 | while (theChar != 0) 1307 | { 1308 | #if (FLASHEND > 0x10000) 1309 | theChar = pgm_read_byte_far((uint32_t)dataPtr + ii); 1310 | #else 1311 | theChar = pgm_read_byte_near((uint32_t)dataPtr + ii); 1312 | #endif 1313 | if (theChar != 0) 1314 | { 1315 | sendchar(theChar); 1316 | } 1317 | ii++; 1318 | } 1319 | } 1320 | 1321 | //************************************************************************ 1322 | void PrintNewLine(void) 1323 | { 1324 | sendchar(0x0d); 1325 | sendchar(0x0a); 1326 | } 1327 | 1328 | 1329 | //************************************************************************ 1330 | void PrintFromPROGMEMln(void *dataPtr, unsigned char offset) 1331 | { 1332 | PrintFromPROGMEM(dataPtr, offset); 1333 | 1334 | PrintNewLine(); 1335 | } 1336 | 1337 | 1338 | //************************************************************************ 1339 | void PrintString(char *textString) 1340 | { 1341 | char theChar; 1342 | int ii; 1343 | 1344 | theChar = 1; 1345 | ii = 0; 1346 | while (theChar != 0) 1347 | { 1348 | theChar = textString[ii]; 1349 | if (theChar != 0) 1350 | { 1351 | sendchar(theChar); 1352 | } 1353 | ii++; 1354 | } 1355 | } 1356 | 1357 | //************************************************************************ 1358 | void PrintHexByte(unsigned char theByte) 1359 | { 1360 | char theChar; 1361 | 1362 | theChar = 0x30 + ((theByte >> 4) & 0x0f); 1363 | if (theChar > 0x39) 1364 | { 1365 | theChar += 7; 1366 | } 1367 | sendchar(theChar ); 1368 | 1369 | theChar = 0x30 + (theByte & 0x0f); 1370 | if (theChar > 0x39) 1371 | { 1372 | theChar += 7; 1373 | } 1374 | sendchar(theChar ); 1375 | } 1376 | 1377 | //************************************************************************ 1378 | void PrintDecInt(int theNumber, int digitCnt) 1379 | { 1380 | int theChar; 1381 | int myNumber; 1382 | 1383 | myNumber = theNumber; 1384 | 1385 | if ((myNumber > 100) || (digitCnt >= 3)) 1386 | { 1387 | theChar = 0x30 + myNumber / 100; 1388 | sendchar(theChar ); 1389 | } 1390 | 1391 | if ((myNumber > 10) || (digitCnt >= 2)) 1392 | { 1393 | theChar = 0x30 + ((myNumber % 100) / 10 ); 1394 | sendchar(theChar ); 1395 | } 1396 | theChar = 0x30 + (myNumber % 10); 1397 | sendchar(theChar ); 1398 | } 1399 | 1400 | 1401 | 1402 | 1403 | //************************************************************************ 1404 | static void PrintCPUstats(void) 1405 | { 1406 | unsigned char fuseByte; 1407 | 1408 | PrintFromPROGMEMln(gTextMsg_Explorer, 0); 1409 | 1410 | PrintFromPROGMEM(gTextMsg_COMPILED_ON, 0); 1411 | PrintFromPROGMEMln(gTextMsg_GCC_DATE_STR, 0); 1412 | 1413 | PrintFromPROGMEM(gTextMsg_CPU_Type, 0); 1414 | PrintFromPROGMEMln(gTextMsg_CPU_Name, 0); 1415 | 1416 | PrintFromPROGMEM(gTextMsg_AVR_ARCH, 0); 1417 | PrintDecInt(__AVR_ARCH__, 1); 1418 | PrintNewLine(); 1419 | 1420 | PrintFromPROGMEM(gTextMsg_GCC_VERSION, 0); 1421 | PrintFromPROGMEMln(gTextMsg_GCC_VERSION_STR, 0); 1422 | 1423 | //* these can be found in avr/version.h 1424 | PrintFromPROGMEM(gTextMsg_AVR_LIBC, 0); 1425 | PrintFromPROGMEMln(gTextMsg_AVR_LIBC_VER_STR, 0); 1426 | 1427 | #if defined(SIGNATURE_0) 1428 | PrintFromPROGMEM(gTextMsg_CPU_SIGNATURE, 0); 1429 | //* these can be found in avr/iomxxx.h 1430 | PrintHexByte(SIGNATURE_0); 1431 | PrintHexByte(SIGNATURE_1); 1432 | PrintHexByte(SIGNATURE_2); 1433 | PrintNewLine(); 1434 | #endif 1435 | 1436 | 1437 | #if defined(GET_LOW_FUSE_BITS) 1438 | //* fuse settings 1439 | PrintFromPROGMEM(gTextMsg_FUSE_BYTE_LOW, 0); 1440 | fuseByte = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS); 1441 | PrintHexByte(fuseByte); 1442 | PrintNewLine(); 1443 | 1444 | PrintFromPROGMEM(gTextMsg_FUSE_BYTE_HIGH, 0); 1445 | fuseByte = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS); 1446 | PrintHexByte(fuseByte); 1447 | PrintNewLine(); 1448 | 1449 | PrintFromPROGMEM(gTextMsg_FUSE_BYTE_EXT, 0); 1450 | fuseByte = boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS); 1451 | PrintHexByte(fuseByte); 1452 | PrintNewLine(); 1453 | 1454 | PrintFromPROGMEM(gTextMsg_FUSE_BYTE_LOCK, 0); 1455 | fuseByte = boot_lock_fuse_bits_get(GET_LOCK_BITS); 1456 | PrintHexByte(fuseByte); 1457 | PrintNewLine(); 1458 | 1459 | #endif 1460 | 1461 | } 1462 | 1463 | 1464 | //************************************************************************ 1465 | static void BlinkLED(void) 1466 | { 1467 | PROGLED_DDR |= (1< 0) 1501 | { 1502 | if (myAddressPointer > 0x10000) 1503 | { 1504 | PrintHexByte((myAddressPointer >> 16) & 0x00ff); 1505 | } 1506 | PrintHexByte((myAddressPointer >> 8) & 0x00ff); 1507 | PrintHexByte(myAddressPointer & 0x00ff); 1508 | sendchar(0x20); 1509 | sendchar('-'); 1510 | sendchar(0x20); 1511 | 1512 | asciiDump[0] = 0; 1513 | for (ii=0; ii<16; ii++) 1514 | { 1515 | switch(dumpWhat) 1516 | { 1517 | case kDUMP_FLASH: 1518 | #if (FLASHEND > 0x10000) 1519 | theValue = pgm_read_byte_far(myAddressPointer); 1520 | #else 1521 | theValue = pgm_read_byte_near(myAddressPointer); 1522 | #endif 1523 | break; 1524 | 1525 | case kDUMP_EEPROM: 1526 | theValue = eeprom_read_byte((void *)myAddressPointer); 1527 | break; 1528 | 1529 | case kDUMP_RAM: 1530 | theValue = ramPtr[myAddressPointer]; 1531 | break; 1532 | 1533 | } 1534 | PrintHexByte(theValue); 1535 | sendchar(0x20); 1536 | if ((theValue >= 0x20) && (theValue < 0x7f)) 1537 | { 1538 | asciiDump[ii % 16] = theValue; 1539 | } 1540 | else 1541 | { 1542 | asciiDump[ii % 16] = '.'; 1543 | } 1544 | 1545 | myAddressPointer++; 1546 | } 1547 | asciiDump[16] = 0; 1548 | PrintString(asciiDump); 1549 | PrintNewLine(); 1550 | 1551 | numRows--; 1552 | } 1553 | } 1554 | 1555 | 1556 | 1557 | //************************************************************************ 1558 | //* returns amount of extended memory 1559 | static void EEPROMtest(void) 1560 | { 1561 | int ii; 1562 | char theChar; 1563 | char theEEPROMchar; 1564 | int errorCount; 1565 | 1566 | PrintFromPROGMEMln(gTextMsg_WriteToEEprom, 0); 1567 | PrintNewLine(); 1568 | ii = 0; 1569 | #if (FLASHEND > 0x10000) 1570 | while (((theChar = pgm_read_byte_far(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) 1571 | #else 1572 | while (((theChar = pgm_read_byte_near(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) 1573 | #endif 1574 | { 1575 | eeprom_write_byte((uint8_t *)ii, theChar); 1576 | if (theChar == 0) 1577 | { 1578 | PrintFromPROGMEM(gTextMsg_SPACE, 0); 1579 | } 1580 | else 1581 | { 1582 | sendchar(theChar); 1583 | } 1584 | ii++; 1585 | } 1586 | 1587 | //* no go back through and test 1588 | PrintNewLine(); 1589 | PrintNewLine(); 1590 | PrintFromPROGMEMln(gTextMsg_ReadingEEprom, 0); 1591 | PrintNewLine(); 1592 | errorCount = 0; 1593 | ii = 0; 1594 | #if (FLASHEND > 0x10000) 1595 | while (((theChar = pgm_read_byte_far(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) 1596 | #else 1597 | while (((theChar = pgm_read_byte_near(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) 1598 | #endif 1599 | { 1600 | theEEPROMchar = eeprom_read_byte((uint8_t *)ii); 1601 | if (theEEPROMchar == 0) 1602 | { 1603 | PrintFromPROGMEM(gTextMsg_SPACE, 0); 1604 | } 1605 | else 1606 | { 1607 | sendchar(theEEPROMchar); 1608 | } 1609 | if (theEEPROMchar != theChar) 1610 | { 1611 | errorCount++; 1612 | } 1613 | ii++; 1614 | } 1615 | PrintNewLine(); 1616 | PrintNewLine(); 1617 | PrintFromPROGMEM(gTextMsg_EEPROMerrorCnt, 0); 1618 | PrintDecInt(errorCount, 1); 1619 | PrintNewLine(); 1620 | PrintNewLine(); 1621 | 1622 | gEepromIndex = 0; //* set index back to zero for next eeprom dump 1623 | 1624 | } 1625 | 1626 | 1627 | 1628 | #if (FLASHEND > 0x08000) 1629 | //* this includes the interrupt names for the monitor portion. There is no longer enough 1630 | //* memory to include this 1631 | // #include "avrinterruptnames.h" 1632 | // #ifndef _INTERRUPT_NAMES_DEFINED_ 1633 | // #warning Interrupt vectors not defined 1634 | // #endif 1635 | #endif 1636 | 1637 | //************************************************************************ 1638 | static void VectorDisplay(void) 1639 | { 1640 | unsigned long byte1; 1641 | unsigned long byte2; 1642 | unsigned long byte3; 1643 | unsigned long byte4; 1644 | unsigned long word1; 1645 | unsigned long word2; 1646 | int vectorIndex; 1647 | unsigned long myMemoryPtr; 1648 | unsigned long wordMemoryAddress; 1649 | unsigned long realitiveAddr; 1650 | unsigned long myFullAddress; 1651 | unsigned long absoluteAddr; 1652 | #if defined(_INTERRUPT_NAMES_DEFINED_) 1653 | long stringPointer; 1654 | #endif 1655 | 1656 | myMemoryPtr = 0; 1657 | vectorIndex = 0; 1658 | PrintFromPROGMEMln(gTextMsg_CPU_Name, 0); 1659 | PrintFromPROGMEMln(gTextMsg_VECTOR_HEADER, 0); 1660 | // V# ADDR op code 1661 | // 1 - 0000 = C3 BB 00 00 rjmp 03BB >000776 RESET 1662 | while (vectorIndex < kInterruptVectorCount) 1663 | { 1664 | wordMemoryAddress = myMemoryPtr / 2; 1665 | // 01 - 0000 = 12 34 1666 | PrintDecInt(vectorIndex + 1, 2); 1667 | sendchar(0x20); 1668 | sendchar('-'); 1669 | sendchar(0x20); 1670 | PrintHexByte((wordMemoryAddress >> 8) & 0x00ff); 1671 | PrintHexByte((wordMemoryAddress) & 0x00ff); 1672 | sendchar(0x20); 1673 | sendchar('='); 1674 | sendchar(0x20); 1675 | 1676 | 1677 | //* the AVR is LITTLE ENDIAN, swap the byte order 1678 | #if (FLASHEND > 0x10000) 1679 | byte1 = pgm_read_byte_far(myMemoryPtr++); 1680 | byte2 = pgm_read_byte_far(myMemoryPtr++); 1681 | byte3 = pgm_read_byte_far(myMemoryPtr++); 1682 | byte4 = pgm_read_byte_far(myMemoryPtr++); 1683 | #else 1684 | byte1 = pgm_read_byte_near(myMemoryPtr++); 1685 | byte2 = pgm_read_byte_near(myMemoryPtr++); 1686 | byte3 = pgm_read_byte_near(myMemoryPtr++); 1687 | byte4 = pgm_read_byte_near(myMemoryPtr++); 1688 | #endif 1689 | word1 = (byte2 << 8) + byte1; 1690 | word2 = (byte4 << 8) + byte3; 1691 | 1692 | 1693 | PrintHexByte(byte2); 1694 | sendchar(0x20); 1695 | PrintHexByte(byte1); 1696 | sendchar(0x20); 1697 | PrintHexByte(byte4); 1698 | sendchar(0x20); 1699 | PrintHexByte(byte3); 1700 | sendchar(0x20); 1701 | 1702 | if (word1 == 0xffff) 1703 | { 1704 | PrintFromPROGMEM(gTextMsg_noVector, 0); 1705 | } 1706 | else if ((word1 & 0xc000) == 0xc000) 1707 | { 1708 | //* rjmp instruction 1709 | realitiveAddr = word1 & 0x3FFF; 1710 | absoluteAddr = wordMemoryAddress + realitiveAddr; //* add the offset to the current address 1711 | absoluteAddr = absoluteAddr << 1; //* multiply by 2 for byte address 1712 | 1713 | PrintFromPROGMEM(gTextMsg_rjmp, 0); 1714 | PrintHexByte((realitiveAddr >> 8) & 0x00ff); 1715 | PrintHexByte((realitiveAddr) & 0x00ff); 1716 | sendchar(0x20); 1717 | sendchar('>'); 1718 | PrintHexByte((absoluteAddr >> 16) & 0x00ff); 1719 | PrintHexByte((absoluteAddr >> 8) & 0x00ff); 1720 | PrintHexByte((absoluteAddr) & 0x00ff); 1721 | 1722 | } 1723 | else if ((word1 & 0xfE0E) == 0x940c) 1724 | { 1725 | //* jmp instruction, this is REALLY complicated, refer to the instruction manual (JMP) 1726 | myFullAddress = ((byte1 & 0x01) << 16) + 1727 | ((byte1 & 0xf0) << 17) + 1728 | ((byte2 & 0x01) << 21) + 1729 | word2; 1730 | 1731 | absoluteAddr = myFullAddress << 1; 1732 | 1733 | PrintFromPROGMEM(gTextMsg_jmp, 0); 1734 | PrintHexByte((myFullAddress >> 16) & 0x00ff); 1735 | PrintHexByte((myFullAddress >> 8) & 0x00ff); 1736 | PrintHexByte((myFullAddress) & 0x00ff); 1737 | sendchar(0x20); 1738 | sendchar('>'); 1739 | PrintHexByte((absoluteAddr >> 16) & 0x00ff); 1740 | PrintHexByte((absoluteAddr >> 8) & 0x00ff); 1741 | PrintHexByte((absoluteAddr) & 0x00ff); 1742 | } 1743 | 1744 | #if defined(_INTERRUPT_NAMES_DEFINED_) 1745 | sendchar(0x20); 1746 | #if (FLASHEND > 0x10000) 1747 | stringPointer = pgm_read_word_far(&(gInterruptNameTable[vectorIndex])); 1748 | #else 1749 | stringPointer = pgm_read_word_near(&(gInterruptNameTable[vectorIndex])); 1750 | #endif 1751 | PrintFromPROGMEM((char *)stringPointer, 0); 1752 | #endif 1753 | PrintNewLine(); 1754 | 1755 | vectorIndex++; 1756 | } 1757 | } 1758 | 1759 | //************************************************************************ 1760 | static void PrintAvailablePort(char thePortLetter) 1761 | { 1762 | PrintFromPROGMEM(gTextMsg_PORT, 0); 1763 | sendchar(thePortLetter); 1764 | PrintNewLine(); 1765 | } 1766 | 1767 | //************************************************************************ 1768 | static void ListAvailablePorts(void) 1769 | { 1770 | 1771 | #ifdef DDRA 1772 | PrintAvailablePort('A'); 1773 | #endif 1774 | 1775 | #ifdef DDRB 1776 | PrintAvailablePort('B'); 1777 | #endif 1778 | 1779 | #ifdef DDRC 1780 | PrintAvailablePort('C'); 1781 | #endif 1782 | 1783 | #ifdef DDRD 1784 | PrintAvailablePort('D'); 1785 | #endif 1786 | 1787 | #ifdef DDRE 1788 | PrintAvailablePort('E'); 1789 | #endif 1790 | 1791 | #ifdef DDRF 1792 | PrintAvailablePort('F'); 1793 | #endif 1794 | 1795 | #ifdef DDRG 1796 | PrintAvailablePort('G'); 1797 | #endif 1798 | 1799 | #ifdef DDRH 1800 | PrintAvailablePort('H'); 1801 | #endif 1802 | 1803 | #ifdef DDRI 1804 | PrintAvailablePort('I'); 1805 | #endif 1806 | 1807 | #ifdef DDRJ 1808 | PrintAvailablePort('J'); 1809 | #endif 1810 | 1811 | #ifdef DDRK 1812 | PrintAvailablePort('K'); 1813 | #endif 1814 | 1815 | #ifdef DDRL 1816 | PrintAvailablePort('L'); 1817 | #endif 1818 | 1819 | } 1820 | 1821 | //************************************************************************ 1822 | static void AVR_PortOutput(void) 1823 | { 1824 | char portLetter; 1825 | char getCharFlag; 1826 | 1827 | PrintFromPROGMEM(gTextMsg_WHAT_PORT, 0); 1828 | 1829 | portLetter = recchar(); 1830 | portLetter = portLetter & 0x5f; 1831 | sendchar(portLetter); 1832 | PrintNewLine(); 1833 | 1834 | if ((portLetter >= 'A') && (portLetter <= 'Z')) 1835 | { 1836 | getCharFlag = true; 1837 | switch(portLetter) 1838 | { 1839 | #ifdef DDRA 1840 | case 'A': 1841 | DDRA = 0xff; 1842 | while (!Serial_Available()) 1843 | { 1844 | PORTA ^= 0xff; 1845 | delay_ms(200); 1846 | } 1847 | PORTA = 0; 1848 | break; 1849 | #endif 1850 | 1851 | #ifdef DDRB 1852 | case 'B': 1853 | DDRB = 0xff; 1854 | while (!Serial_Available()) 1855 | { 1856 | PORTB ^= 0xff; 1857 | delay_ms(200); 1858 | } 1859 | PORTB = 0; 1860 | break; 1861 | #endif 1862 | 1863 | #ifdef DDRC 1864 | case 'C': 1865 | DDRC = 0xff; 1866 | while (!Serial_Available()) 1867 | { 1868 | PORTC ^= 0xff; 1869 | delay_ms(200); 1870 | } 1871 | PORTC = 0; 1872 | break; 1873 | #endif 1874 | 1875 | #ifdef DDRD 1876 | case 'D': 1877 | DDRD = 0xff; 1878 | while (!Serial_Available()) 1879 | { 1880 | PORTD ^= 0xff; 1881 | delay_ms(200); 1882 | } 1883 | PORTD = 0; 1884 | break; 1885 | #endif 1886 | 1887 | #ifdef DDRE 1888 | case 'E': 1889 | DDRE = 0xff; 1890 | while (!Serial_Available()) 1891 | { 1892 | PORTE ^= 0xff; 1893 | delay_ms(200); 1894 | } 1895 | PORTE = 0; 1896 | break; 1897 | #endif 1898 | 1899 | #ifdef DDRF 1900 | case 'F': 1901 | DDRF = 0xff; 1902 | while (!Serial_Available()) 1903 | { 1904 | PORTF ^= 0xff; 1905 | delay_ms(200); 1906 | } 1907 | PORTF = 0; 1908 | break; 1909 | #endif 1910 | 1911 | #ifdef DDRG 1912 | case 'G': 1913 | DDRG = 0xff; 1914 | while (!Serial_Available()) 1915 | { 1916 | PORTG ^= 0xff; 1917 | delay_ms(200); 1918 | } 1919 | PORTG = 0; 1920 | break; 1921 | #endif 1922 | 1923 | #ifdef DDRH 1924 | case 'H': 1925 | DDRH = 0xff; 1926 | while (!Serial_Available()) 1927 | { 1928 | PORTH ^= 0xff; 1929 | delay_ms(200); 1930 | } 1931 | PORTH = 0; 1932 | break; 1933 | #endif 1934 | 1935 | #ifdef DDRI 1936 | case 'I': 1937 | DDRI = 0xff; 1938 | while (!Serial_Available()) 1939 | { 1940 | PORTI ^= 0xff; 1941 | delay_ms(200); 1942 | } 1943 | PORTI = 0; 1944 | break; 1945 | #endif 1946 | 1947 | #ifdef DDRJ 1948 | case 'J': 1949 | DDRJ = 0xff; 1950 | while (!Serial_Available()) 1951 | { 1952 | PORTJ ^= 0xff; 1953 | delay_ms(200); 1954 | } 1955 | PORTJ = 0; 1956 | break; 1957 | #endif 1958 | 1959 | #ifdef DDRK 1960 | case 'K': 1961 | DDRK = 0xff; 1962 | while (!Serial_Available()) 1963 | { 1964 | PORTK ^= 0xff; 1965 | delay_ms(200); 1966 | } 1967 | PORTK = 0; 1968 | break; 1969 | #endif 1970 | 1971 | #ifdef DDRL 1972 | case 'L': 1973 | DDRL = 0xff; 1974 | while (!Serial_Available()) 1975 | { 1976 | PORTL ^= 0xff; 1977 | delay_ms(200); 1978 | } 1979 | PORTL = 0; 1980 | break; 1981 | #endif 1982 | 1983 | default: 1984 | PrintFromPROGMEMln(gTextMsg_PortNotSupported, 0); 1985 | getCharFlag = false; 1986 | break; 1987 | } 1988 | if (getCharFlag) 1989 | { 1990 | recchar(); 1991 | } 1992 | } 1993 | else 1994 | { 1995 | PrintFromPROGMEMln(gTextMsg_MustBeLetter, 0); 1996 | } 1997 | } 1998 | 1999 | 2000 | //******************************************************************* 2001 | static void PrintHelp(void) 2002 | { 2003 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_0, 0); 2004 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_QM, 0); 2005 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_AT, 0); 2006 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_B, 0); 2007 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_E, 0); 2008 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_F, 0); 2009 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_H, 0); 2010 | 2011 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_L, 0); 2012 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_Q, 0); 2013 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_R, 0); 2014 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_V, 0); 2015 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_Y, 0); 2016 | } 2017 | 2018 | //************************************************************************ 2019 | static void RunMonitor(void) 2020 | { 2021 | char keepGoing; 2022 | unsigned char theChar; 2023 | int ii, jj; 2024 | 2025 | for (ii=0; ii<5; ii++) 2026 | { 2027 | for (jj=0; jj<25; jj++) 2028 | { 2029 | sendchar('!'); 2030 | } 2031 | PrintNewLine(); 2032 | } 2033 | 2034 | gRamIndex = 0; 2035 | gFlashIndex = 0; 2036 | gEepromIndex = 0; 2037 | 2038 | PrintFromPROGMEMln(gTextMsg_Explorer, 0); 2039 | 2040 | keepGoing = 1; 2041 | while (keepGoing) 2042 | { 2043 | PrintFromPROGMEM(gTextMsg_Prompt, 0); 2044 | theChar = recchar(); 2045 | if (theChar >= 0x60) 2046 | { 2047 | theChar = theChar & 0x5F; 2048 | } 2049 | 2050 | if (theChar >= 0x20) 2051 | { 2052 | sendchar(theChar); 2053 | sendchar(0x20); 2054 | } 2055 | 2056 | switch(theChar) 2057 | { 2058 | case '0': 2059 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_0, 2); 2060 | gFlashIndex = 0; 2061 | gRamIndex = 0; 2062 | gEepromIndex = 0; 2063 | break; 2064 | 2065 | case '?': 2066 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_QM, 2); 2067 | PrintCPUstats(); 2068 | break; 2069 | 2070 | case '@': 2071 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_AT, 2); 2072 | EEPROMtest(); 2073 | break; 2074 | 2075 | case 'B': 2076 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_B, 2); 2077 | BlinkLED(); 2078 | break; 2079 | 2080 | case 'E': 2081 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_E, 2); 2082 | DumpHex(kDUMP_EEPROM, gEepromIndex, 16); 2083 | gEepromIndex += 256; 2084 | if (gEepromIndex > E2END) 2085 | { 2086 | gEepromIndex = 0; 2087 | } 2088 | break; 2089 | 2090 | case 'F': 2091 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_F, 2); 2092 | DumpHex(kDUMP_FLASH, gFlashIndex, 16); 2093 | gFlashIndex += 256; 2094 | break; 2095 | 2096 | case 'H': 2097 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_H, 2); 2098 | PrintHelp(); 2099 | break; 2100 | 2101 | case 'L': 2102 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_L, 2); 2103 | ListAvailablePorts(); 2104 | break; 2105 | 2106 | case 'Q': 2107 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_Q, 2); 2108 | keepGoing = false; 2109 | break; 2110 | 2111 | case 'R': 2112 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_R, 2); 2113 | DumpHex(kDUMP_RAM, gRamIndex, 16); 2114 | gRamIndex += 256; 2115 | break; 2116 | 2117 | case 'V': 2118 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_V, 2); 2119 | VectorDisplay(); 2120 | break; 2121 | 2122 | case 'Y': 2123 | PrintFromPROGMEMln(gTextMsg_HELP_MSG_Y, 2); 2124 | AVR_PortOutput(); 2125 | break; 2126 | 2127 | default: 2128 | PrintFromPROGMEMln(gTextMsg_HUH, 0); 2129 | break; 2130 | } 2131 | } 2132 | } 2133 | 2134 | #endif 2135 | 2136 | --------------------------------------------------------------------------------