From 8e1f62667b640255fae7df415fd339e4de5a1120 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sat, 22 Dec 2012 19:20:42 +0100 Subject: [PATCH 1/6] Added patch to bootloader for Mega2560. (Mark Sproul) See #181 #392 #505 #543 #544 --- .../bootloaders/stk500v2/avr_cpunames.h | 189 +++++++++ .../bootloaders/stk500v2/avrinterruptnames.h | 314 ++++++++++++++- .../arduino/bootloaders/stk500v2/stk500boot.c | 365 ++++++++++++------ 3 files changed, 747 insertions(+), 121 deletions(-) create mode 100644 hardware/arduino/bootloaders/stk500v2/avr_cpunames.h diff --git a/hardware/arduino/bootloaders/stk500v2/avr_cpunames.h b/hardware/arduino/bootloaders/stk500v2/avr_cpunames.h new file mode 100644 index 00000000000..ad0ed9c02b4 --- /dev/null +++ b/hardware/arduino/bootloaders/stk500v2/avr_cpunames.h @@ -0,0 +1,189 @@ +//************************************************************************************************** +//* +//* Atmel AVR CPU name strings +//* +//************************************************************************************************** +//* Sep 19, 2010 Started on avr_cpunames.h +//************************************************************************************************** + +//#include "avr_cpunames.h" + +//************************************************************************************************** + + +#if defined (__AVR_AT94K__) + #define _AVR_CPU_NAME_ "AT94k" +#elif defined (__AVR_AT43USB320__) +#elif defined (__AVR_AT43USB355__) +#elif defined (__AVR_AT76C711__) +#elif defined (__AVR_AT86RF401__) +#elif defined (__AVR_AT90PWM1__) +#elif defined (__AVR_AT90PWM2__) +#elif defined (__AVR_AT90PWM2B__) +#elif defined (__AVR_AT90PWM3__) +#elif defined (__AVR_AT90PWM3B__) +#elif defined (__AVR_AT90PWM216__) +#elif defined (__AVR_AT90PWM316__) +#elif defined (__AVR_ATmega32C1__) +#elif defined (__AVR_ATmega32M1__) +#elif defined (__AVR_ATmega32U4__) + #define _AVR_CPU_NAME_ "ATmega32U4" +#elif defined (__AVR_ATmega32U6__) + #define _AVR_CPU_NAME_ "ATmega32U6" +#elif defined (__AVR_ATmega128__) + #define _AVR_CPU_NAME_ "Atmega128" +#elif defined (__AVR_ATmega1280__) + #define _AVR_CPU_NAME_ "ATmega1280" +#elif defined (__AVR_ATmega1281__) + #define _AVR_CPU_NAME_ "ATmega1281" +#elif defined (__AVR_ATmega1284P__) + #define _AVR_CPU_NAME_ "ATmega1284" +#elif defined (__AVR_ATmega128RFA1__) + #define _AVR_CPU_NAME_ "ATmega128RFA1" +#elif defined (__AVR_ATmega2560__) + #define _AVR_CPU_NAME_ "ATmega2560" +#elif defined (__AVR_ATmega2561__) + #define _AVR_CPU_NAME_ "ATmega2561" +#elif defined (__AVR_AT90CAN32__) + #define _AVR_CPU_NAME_ "AT90CAN32" +#elif defined (__AVR_AT90CAN64__) + #define _AVR_CPU_NAME_ "AT90CAN64" +#elif defined (__AVR_AT90CAN128__) + #define _AVR_CPU_NAME_ "AT90CAN128" +#elif defined (__AVR_AT90USB82__) + #define _AVR_CPU_NAME_ "AT90USB82" +#elif defined (__AVR_AT90USB162__) + #define _AVR_CPU_NAME_ "AT90USB162" +#elif defined (__AVR_AT90USB646__) + #define _AVR_CPU_NAME_ "AT90USB646" +#elif defined (__AVR_AT90USB647__) + #define _AVR_CPU_NAME_ "AT90USB647" +#elif defined (__AVR_AT90USB1286__) + #define _AVR_CPU_NAME_ "AT90USB1286" +#elif defined (__AVR_AT90USB1287__) + #define _AVR_CPU_NAME_ "AT90USB1287" +#elif defined (__AVR_ATmega64__) + #define _AVR_CPU_NAME_ "ATmega64" +#elif defined (__AVR_ATmega640__) + #define _AVR_CPU_NAME_ "ATmega640" +#elif defined (__AVR_ATmega644__) + #define _AVR_CPU_NAME_ "ATmega644" +#elif defined (__AVR_ATmega644P__) + #define _AVR_CPU_NAME_ "ATmega644P" +#elif defined (__AVR_ATmega645__) + #define _AVR_CPU_NAME_ "ATmega645" +#elif defined (__AVR_ATmega6450__) + #define _AVR_CPU_NAME_ "ATmega6450" +#elif defined (__AVR_ATmega649__) + #define _AVR_CPU_NAME_ "ATmega649" +#elif defined (__AVR_ATmega6490__) + #define _AVR_CPU_NAME_ "ATmega6490" +#elif defined (__AVR_ATmega103__) + #define _AVR_CPU_NAME_ "ATmega103" +#elif defined (__AVR_ATmega32__) + #define _AVR_CPU_NAME_ "Atmega32" +#elif defined (__AVR_ATmega323__) + #define _AVR_CPU_NAME_ "ATmega323" +#elif defined (__AVR_ATmega324P__) + #define _AVR_CPU_NAME_ "ATmega324P" +#elif defined (__AVR_ATmega325__) + #define _AVR_CPU_NAME_ "ATmega325" +#elif defined (__AVR_ATmega325P__) + #define _AVR_CPU_NAME_ "ATmega325P" +#elif defined (__AVR_ATmega3250__) + #define _AVR_CPU_NAME_ "ATmega3250" +#elif defined (__AVR_ATmega3250P__) + #define _AVR_CPU_NAME_ "ATmega3250P" +#elif defined (__AVR_ATmega328P__) + #define _AVR_CPU_NAME_ "ATmega328P" +#elif defined (__AVR_ATmega329__) + #define _AVR_CPU_NAME_ "ATmega329" +#elif defined (__AVR_ATmega329P__) + #define _AVR_CPU_NAME_ "ATmega329P" +#elif defined (__AVR_ATmega3290__) + #define _AVR_CPU_NAME_ "ATmega3290" +#elif defined (__AVR_ATmega3290P__) + #define _AVR_CPU_NAME_ "ATmega3290P" +#elif defined (__AVR_ATmega32HVB__) + #define _AVR_CPU_NAME_ "ATmega32HVB" +#elif defined (__AVR_ATmega406__) + #define _AVR_CPU_NAME_ "ATmega406" +#elif defined (__AVR_ATmega16__) + #define _AVR_CPU_NAME_ "Atmega16" +#elif defined (__AVR_ATmega161__) + #define _AVR_CPU_NAME_ "ATmega161" +#elif defined (__AVR_ATmega162__) + #define _AVR_CPU_NAME_ "ATmega162" +#elif defined (__AVR_ATmega163__) + #define _AVR_CPU_NAME_ "ATmega163" +#elif defined (__AVR_ATmega164P__) + #define _AVR_CPU_NAME_ "ATmega164P" +#elif defined (__AVR_ATmega165__) + #define _AVR_CPU_NAME_ "ATmega165" +#elif defined (__AVR_ATmega165P__) + #define _AVR_CPU_NAME_ "ATmega165P" +#elif defined (__AVR_ATmega168__) + #define _AVR_CPU_NAME_ "ATmega168" +#elif defined (__AVR_ATmega168P__) + #define _AVR_CPU_NAME_ "ATmega168P" +#elif defined (__AVR_ATmega169__) + #define _AVR_CPU_NAME_ "Atmega169" +#elif defined (__AVR_ATmega169P__) + #define _AVR_CPU_NAME_ "ATmega169P" +#elif defined (__AVR_ATmega8HVA__) + #define _AVR_CPU_NAME_ "ATmega8HVA" +#elif defined (__AVR_ATmega16HVA__) + #define _AVR_CPU_NAME_ "ATmega16HVA" +#elif defined (__AVR_ATmega8__) + #define _AVR_CPU_NAME_ "ATmega8" +#elif defined (__AVR_ATmega48__) + #define _AVR_CPU_NAME_ "ATmega48" +#elif defined (__AVR_ATmega48P__) + #define _AVR_CPU_NAME_ "ATmega48P" +#elif defined (__AVR_ATmega88__) + #define _AVR_CPU_NAME_ "ATmega88" +#elif defined (__AVR_ATmega88P__) + #define _AVR_CPU_NAME_ "ATmega88P" +#elif defined (__AVR_ATmega8515__) + #define _AVR_CPU_NAME_ "ATmega8515" +#elif defined (__AVR_ATmega8535__) + #define _AVR_CPU_NAME_ "ATmega8535" +#elif defined (__AVR_AT90S8535__) +#elif defined (__AVR_AT90C8534__) +#elif defined (__AVR_AT90S8515__) +#elif defined (__AVR_AT90S4434__) +#elif defined (__AVR_AT90S4433__) +#elif defined (__AVR_AT90S4414__) +#elif defined (__AVR_ATtiny22__) +#elif defined (__AVR_ATtiny26__) +#elif defined (__AVR_AT90S2343__) +#elif defined (__AVR_AT90S2333__) +#elif defined (__AVR_AT90S2323__) +#elif defined (__AVR_AT90S2313__) +#elif defined (__AVR_ATtiny2313__) + #define _AVR_CPU_NAME_ "ATtiny2313" +#elif defined (__AVR_ATtiny13__) +#elif defined (__AVR_ATtiny13A__) +#elif defined (__AVR_ATtiny25__) +#elif defined (__AVR_ATtiny45__) +#elif defined (__AVR_ATtiny85__) +#elif defined (__AVR_ATtiny24__) +#elif defined (__AVR_ATtiny44__) +#elif defined (__AVR_ATtiny84__) +#elif defined (__AVR_ATtiny261__) +#elif defined (__AVR_ATtiny461__) +#elif defined (__AVR_ATtiny861__) +#elif defined (__AVR_ATtiny43U__) +#elif defined (__AVR_ATtiny48__) +#elif defined (__AVR_ATtiny88__) +#elif defined (__AVR_ATtiny167__) +#elif defined (__AVR_ATmega8U2__) + #define _AVR_CPU_NAME_ "ATmega8U2" +#else + #error cpu not defined +#endif + + +#if !defined (_AVR_CPU_NAME_) +// #define _AVR_CPU_NAME_ "UNKNOWN" +#endif diff --git a/hardware/arduino/bootloaders/stk500v2/avrinterruptnames.h b/hardware/arduino/bootloaders/stk500v2/avrinterruptnames.h index 0ae80f9250d..f862f9ae098 100644 --- a/hardware/arduino/bootloaders/stk500v2/avrinterruptnames.h +++ b/hardware/arduino/bootloaders/stk500v2/avrinterruptnames.h @@ -13,6 +13,7 @@ //* Jul 4, 2010 Started using vector defs for #ifdefs as defined in //* Jul 13, 2010 Added support for __AVR_ATmega128__ //* Aug 26, 2010 Added support for __AVR_ATmega2561__ +//* Sep 13, 2010 Added support for __AVR_AT90CAN32__ __AVR_AT90CAN64__ __AVR_AT90CAN128__ //************************************************************************************************** //#include "avrinterruptnames.h" @@ -253,13 +254,69 @@ prog_char gAvrInt_LCD_StartFrame[] PROGMEM = "LCD Start of Frame"; #endif +//* these are for the chips with CAN bus support +#ifdef CANIT_vect + prog_char gAvrInt_CAN_TrafnsferCE[] PROGMEM = "CAN Transfer Complete or Error"; +#endif +#ifdef OVRIT_vect + prog_char gAvrInt_CAN_TimerOverRun[] PROGMEM = "CAN Timer Overrun"; +#endif + +//* these are for __AVR_ATmega128RFA1__ +#ifdef TRX24_PLL_LOCK_vect + prog_char gAvrInt_TRN_PLL_LOCK[] PROGMEM = "TRX24_PLL_LOCK"; +#endif +#ifdef TRX24_PLL_UNLOCK_vect + prog_char gAvrInt_TRN_PLL_UNLOCK[] PROGMEM = "TRX24_PLL_UNLOCK"; +#endif +#ifdef TRX24_RX_START_vect + prog_char gAvrInt_TRN_RX_START[] PROGMEM = "TRX24_RX_START"; +#endif +#ifdef TRX24_RX_END_vect + prog_char gAvrInt_TRN_RX_END[] PROGMEM = "TRX24_RX_END"; +#endif +#ifdef TRX24_CCA_ED_DONE_vect + prog_char gAvrInt_TRN_CAAED_DONE[] PROGMEM = "TRX24_CCA_ED_DONE"; +#endif +#ifdef TRX24_XAH_AMI_vect + prog_char gAvrInt_TRN_FRAME_MATCH[] PROGMEM = "TRX24_FRAME_ADDRESS_MATCH"; +#endif +#ifdef TRX24_TX_END_vect + prog_char gAvrInt_TRN_TX_END[] PROGMEM = "TRX24_TX_END"; +#endif +#ifdef TRX24_AWAKE_vect + prog_char gAvrInt_TRN_AWAKE[] PROGMEM = "TRX24_AWAKE"; +#endif +#ifdef SCNT_CMP1_vect + prog_char gAvrInt_SCNT_CMP1[] PROGMEM = "SCNT_CMP1"; +#endif +#ifdef SCNT_CMP2_vect + prog_char gAvrInt_SCNT_CMP2[] PROGMEM = "SCNT_CMP2"; +#endif +#ifdef SCNT_CMP3_vect + prog_char gAvrInt_SCNT_CMP3[] PROGMEM = "SCNT_CMP3"; +#endif +#ifdef SCNT_OVFL_vect + prog_char gAvrInt_SCNT_OVFL[] PROGMEM = "SCNT_OVFL"; +#endif +#ifdef SCNT_BACKOFF_vect + prog_char gAvrInt_SCNT_BACKOFF[] PROGMEM = "SCNT_BACKOFF"; +#endif +#ifdef AES_READY_vect + prog_char gAvrInt_AES_READY[] PROGMEM = "AES_READY"; +#endif +#ifdef BAT_LOW_vect + prog_char gAvrInt_BAT_LOW[] PROGMEM = "BAT_LOW"; +#endif + + //************************************************************************************************** //* these do not have vector defs and have to be done by CPU type #if defined(__AVR_ATmega645__ ) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) prog_char gAvrInt_NOT_USED[] PROGMEM = "NOT_USED"; #endif -#if defined(__AVR_ATmega32U4__) +#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega128RFA1__) prog_char gAvrInt_RESERVED[] PROGMEM = "Reserved"; #endif @@ -309,8 +366,8 @@ PGM_P gInterruptNameTable[] PROGMEM = #endif //************************************************************************************************** -#pragma mark __AVR_ATmega169__ #if defined(__AVR_ATmega169__) +#pragma mark __AVR_ATmega169__ #define _INTERRUPT_NAMES_DEFINED_ @@ -439,8 +496,8 @@ PGM_P gInterruptNameTable[] PROGMEM = //************************************************************************************************** -#if defined(__AVR_ATmega324P__ ) || defined(__AVR_ATmega644__ ) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) -#pragma mark __AVR_ATmega324P__ __AVR_ATmega644__ __AVR_ATmega644P__ __AVR_ATmega1284P__ +#if defined(__AVR_ATmega324P__ ) || defined(__AVR_ATmega644__ ) || defined(__AVR_ATmega644P__) +#pragma mark __AVR_ATmega324P__ __AVR_ATmega644__ __AVR_ATmega644P__ #define _INTERRUPT_NAMES_DEFINED_ @@ -487,6 +544,61 @@ PGM_P gInterruptNameTable[] PROGMEM = #endif +//************************************************************************************************** +#if defined(__AVR_ATmega1284P__ ) +#pragma mark __AVR_ATmega1284P__ + +#define _INTERRUPT_NAMES_DEFINED_ + +PGM_P gInterruptNameTable[] PROGMEM = +{ + + gAvrInt_RESET, // 1 + gAvrInt_INT0, // 2 + gAvrInt_INT1, // 3 + gAvrInt_INT2, // 4 + gAvrInt_PCINT0, // 5 + gAvrInt_PCINT1, // 6 + gAvrInt_PCINT2, // 7 + gAvrInt_PCINT3, // 8 + gAvrInt_WDT, // 9 + gAvrInt_TIMER2_COMPA, // 10 + gAvrInt_TIMER2_COMPB, // 11 + gAvrInt_TIMER2_OVF, // 12 + gAvrInt_TIMER1_CAPT, // 13 + gAvrInt_TIMER1_COMPA, // 14 + gAvrInt_TIMER1_COMPB, // 15 + gAvrInt_TIMER1_OVF, // 16 + gAvrInt_TIMER0_COMPA, // 17 + gAvrInt_TIMER0_COMPB, // 18 + gAvrInt_TIMER0_OVF, // 19 + gAvrInt_SPI_STC, // 20 + gAvrInt_USART0_RX, // 21 + gAvrInt_USART0_UDRE, // 22 + gAvrInt_USART0_TX, // 23 + gAvrInt_ANALOG_COMP, // 24 + gAvrInt_ADC, // 25 + gAvrInt_EE_READY, // 26 + gAvrInt_TWI, // 27 + gAvrInt_SPM_READY, // 28 + + gAvrInt_USART1_RX, // 29 + gAvrInt_USART1_UDRE, // 30 + gAvrInt_USART1_TX, // 31 + //* these are NOT documented in doc8272.pdf + //* they are in iom1284p.h + gAvrInt_TIMER3_CAPT, // 32 + gAvrInt_TIMER3_COMPA, // 33 + gAvrInt_TIMER3_COMPB, // 34 + gAvrInt_TIMER3_OVF, // 35 + + +}; + + +#endif + + //************************************************************************************************** #if defined(__AVR_ATmega645__ ) #pragma mark __AVR_ATmega645__ @@ -529,6 +641,41 @@ PGM_P gInterruptNameTable[] PROGMEM = #endif +//************************************************************************************************** +#if defined(__AVR_ATmega16__ ) +#pragma mark __AVR_ATmega16__ + +#define _INTERRUPT_NAMES_DEFINED_ + +PGM_P gInterruptNameTable[] PROGMEM = +{ + + gAvrInt_RESET, // 1 + gAvrInt_INT0, // 2 + gAvrInt_INT1, // 3 + gAvrInt_TIMER2_COMP, // 4 + gAvrInt_TIMER2_OVF, // 5 + gAvrInt_TIMER1_CAPT, // 6 + gAvrInt_TIMER1_COMPA, // 7 + gAvrInt_TIMER1_COMPB, // 8 + gAvrInt_TIMER1_OVF, // 9 + gAvrInt_TIMER0_OVF, // 10 + gAvrInt_SPI_STC, // 11 + gAvrInt_USART_RX, // 12 + gAvrInt_USART_UDRE, // 13 + gAvrInt_USART_TX, // 14 + gAvrInt_ADC, // 15 + gAvrInt_EE_READY, // 16 + gAvrInt_ANALOG_COMP, // 17 + gAvrInt_TWI, // 18 + gAvrInt_INT2, // 19 + gAvrInt_TIMER0_COMP, // 20 + gAvrInt_SPM_READY, // 21 + +}; + + +#endif //************************************************************************************************** #if defined(__AVR_ATmega32__ ) @@ -629,7 +776,7 @@ PGM_P gInterruptNameTable[] PROGMEM = #endif //************************************************************************************************** -#if defined(__AVR_AT90USB1286__) +#if defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) #pragma mark __AVR_AT90USB1286__ //* teensy++ 2.0 //* http://www.pjrc.com/teensy/pinout.html @@ -689,8 +836,8 @@ PGM_P gInterruptNameTable[] PROGMEM = //************************************************************************************************** -#if defined(__AVR_ATmega128__) -#pragma mark __AVR_ATmega128__ +#if defined(__AVR_ATmega128__) || defined(__AVR_ATmega64__) +#pragma mark __AVR_ATmega64__ __AVR_ATmega128__ #define _INTERRUPT_NAMES_DEFINED_ @@ -737,6 +884,157 @@ PGM_P gInterruptNameTable[] PROGMEM = #endif +//************************************************************************************************** +#if defined(__AVR_AT90CAN32__) || defined(__AVR_AT90CAN64__) || defined(__AVR_AT90CAN128__) +#pragma mark __AVR_AT90CAN32__ __AVR_AT90CAN64__ __AVR_AT90CAN128__ + +#define _INTERRUPT_NAMES_DEFINED_ + +PGM_P gInterruptNameTable[] PROGMEM = +{ + + gAvrInt_RESET, // 1 + gAvrInt_INT0, // 2 + gAvrInt_INT1, // 3 + gAvrInt_INT2, // 4 + gAvrInt_INT3, // 5 + gAvrInt_INT4, // 6 + gAvrInt_INT5, // 7 + gAvrInt_INT6, // 8 + gAvrInt_INT7, // 9 + gAvrInt_TIMER2_COMP, // 10 + gAvrInt_TIMER2_OVF, // 11 + gAvrInt_TIMER1_CAPT, // 12 + gAvrInt_TIMER1_COMPA, // 13 + gAvrInt_TIMER1_COMPB, // 14 + gAvrInt_TIMER1_COMPC, // 15 + gAvrInt_TIMER1_OVF, // 16 + gAvrInt_TIMER0_COMP, // 17 + gAvrInt_TIMER0_OVF, // 18 + gAvrInt_CAN_TrafnsferCE, // 19 + gAvrInt_CAN_TimerOverRun, // 20 + gAvrInt_SPI_STC, // 21 + gAvrInt_USART0_RX, // 22 + gAvrInt_USART0_UDRE, // 23 + gAvrInt_USART0_TX, // 24 + gAvrInt_ANALOG_COMP, // 25 + gAvrInt_ADC, // 26 + gAvrInt_EE_READY, // 27 + gAvrInt_TIMER3_CAPT, // 28 + gAvrInt_TIMER3_COMPA, // 29 + gAvrInt_TIMER3_COMPB, // 30 + gAvrInt_TIMER3_COMPC, // 31 + gAvrInt_TIMER3_OVF, // 32 + gAvrInt_USART1_RX, // 33 + gAvrInt_USART1_UDRE, // 34 + gAvrInt_USART1_TX, // 35 + gAvrInt_TWI, // 36 + gAvrInt_SPM_READY, // 37 +}; + +#endif + +//************************************************************************************************** +#if defined (__AVR_ATmega128RFA1__) +#pragma mark __AVR_ATmega128RFA1__ +#define _INTERRUPT_NAMES_DEFINED_ + +PGM_P gInterruptNameTable[] PROGMEM = +{ + //* Atmel changed the number scheme for interrupt vectors + gAvrInt_RESET, // 0 + gAvrInt_INT0, // 1 + gAvrInt_INT1, // 2 + gAvrInt_INT2, // 3 + gAvrInt_INT3, // 4 + gAvrInt_INT4, // 5 + gAvrInt_INT5, // 6 + gAvrInt_INT6, // 7 + gAvrInt_INT7, // 8 + gAvrInt_PCINT0, // 9 + gAvrInt_PCINT1, // 10 + gAvrInt_PCINT2, // 11 + gAvrInt_WDT, // 12 + gAvrInt_TIMER2_COMPA, // 13 + gAvrInt_TIMER2_COMPB, // 14 + gAvrInt_TIMER2_OVF, // 15 + gAvrInt_TIMER1_CAPT, // 16 + gAvrInt_TIMER1_COMPA, // 17 + gAvrInt_TIMER1_COMPB, // 18 + gAvrInt_TIMER1_COMPC, // 19 + gAvrInt_TIMER1_OVF, // 20 + gAvrInt_TIMER0_COMPA, // 21 + gAvrInt_TIMER0_COMPB, // 22 + gAvrInt_TIMER0_OVF, // 23 + gAvrInt_SPI_STC, // 24 + gAvrInt_USART0_RX, // 25 + gAvrInt_USART0_UDRE, // 26 + gAvrInt_USART0_TX, // 27 + gAvrInt_ANALOG_COMP, // 28 + gAvrInt_ADC, // 29 + gAvrInt_EE_READY, // 30 + gAvrInt_TIMER3_CAPT, // 31 + gAvrInt_TIMER3_COMPA, // 32 + gAvrInt_TIMER3_COMPB, // 33 + gAvrInt_TIMER3_COMPC, // 34 + gAvrInt_TIMER3_OVF, // 35 + gAvrInt_USART1_RX, // 36 + gAvrInt_USART1_UDRE, // 37 + gAvrInt_USART1_TX, // 38 + gAvrInt_TWI, // 39 + gAvrInt_SPM_READY, // 40 + gAvrInt_TIMER4_CAPT, // 41 + gAvrInt_TIMER4_COMPA, // 42 + gAvrInt_TIMER4_COMPB, // 43 + gAvrInt_TIMER4_COMPC, // 44 + gAvrInt_TIMER4_OVF, // 45 + gAvrInt_TIMER5_CAPT, // 46 + gAvrInt_TIMER5_COMPA, // 47 + gAvrInt_TIMER5_COMPB, // 48 + gAvrInt_TIMER5_COMPC, // 49 + gAvrInt_TIMER5_OVF, // 50 +#if 1 + gAvrInt_RESERVED, // 51 + gAvrInt_RESERVED, // 52 + gAvrInt_RESERVED, // 53 + + gAvrInt_RESERVED, // 54 + gAvrInt_RESERVED, // 55 + gAvrInt_RESERVED, // 56 + +#else + gAvrInt_USART2_RX, // 51 + gAvrInt_USART2_UDRE, // 52 + gAvrInt_USART2_TX, // 53 + + gAvrInt_USART3_RX, // 54 + gAvrInt_USART3_UDRE, // 55 + gAvrInt_USART3_TX, // 56 +#endif + gAvrInt_TRN_PLL_LOCK, // 57 + gAvrInt_TRN_PLL_UNLOCK, // 58 + gAvrInt_TRN_RX_START, // 59 + gAvrInt_TRN_RX_END, // 60 + gAvrInt_TRN_CAAED_DONE, // 61 + gAvrInt_TRN_FRAME_MATCH,// 62 + gAvrInt_TRN_TX_END, // 63 + gAvrInt_TRN_AWAKE, // 64 + + gAvrInt_SCNT_CMP1, // 65 + gAvrInt_SCNT_CMP2, // 66 + gAvrInt_SCNT_CMP3, // 67 + gAvrInt_SCNT_OVFL, // 68 + gAvrInt_SCNT_BACKOFF, // 69 + gAvrInt_AES_READY, // 70 + gAvrInt_BAT_LOW, // 71 + + +}; + +#endif + + #if !defined(_INTERRUPT_NAMES_DEFINED_) #warning No interrupt string defs for this cpu -#endif \ No newline at end of file +#endif + diff --git a/hardware/arduino/bootloaders/stk500v2/stk500boot.c b/hardware/arduino/bootloaders/stk500v2/stk500boot.c index 13dec895182..89eead16366 100755 --- a/hardware/arduino/bootloaders/stk500v2/stk500boot.c +++ b/hardware/arduino/bootloaders/stk500v2/stk500boot.c @@ -79,9 +79,27 @@ Description: add timeout feature like previous Wiring bootloader //* Jul 29, 2010 Added recchar_timeout for timing out on bootloading //* Aug 23, 2010 Added support for atmega2561 //* Aug 26, 2010 Removed support for BOOT_BY_SWITCH +//* Sep 8, 2010 Added support for atmega16 +//* Nov 9, 2010 Issue 392:Fixed bug that 3 !!! in code would cause it to jump to monitor +//* Jun 24, 2011 Removed analogRead (was not used) +//* Dec 29, 2011 Issue 181: added watch dog timmer support +//* Dec 29, 2011 Issue 505: bootloader is comparing the seqNum to 1 or the current sequence +//* Jan 1, 2012 Issue 543: CMD_CHIP_ERASE_ISP now returns STATUS_CMD_FAILED instead of STATUS_CMD_OK +//* Jan 1, 2012 Issue 543: Write EEPROM now does something (NOT TESTED) +//* Jan 1, 2012 Issue 544: stk500v2 bootloader doesn't support reading fuses //************************************************************************ - +//************************************************************************ +//* these are used to test issues +//* http://code.google.com/p/arduino/issues/detail?id=505 +//* Reported by mark.stubbs, Mar 14, 2011 +//* The STK500V2 bootloader is comparing the seqNum to 1 or the current sequence +//* (IE: Requiring the sequence to be 1 or match seqNum before continuing). +//* The correct behavior is for the STK500V2 to accept the PC's sequence number, and echo it back for the reply message. +#define _FIX_ISSUE_505_ +//************************************************************************ +//* Issue 181: added watch dog timmer support +#define _FIX_ISSUE_181_ #include #include @@ -95,11 +113,20 @@ Description: add timeout feature like previous Wiring bootloader #include "command.h" -#if defined(_MEGA_BOARD_) || defined(_BOARD_AMBER128_) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) +#if defined(_MEGA_BOARD_) || defined(_BOARD_AMBER128_) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) \ + || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega1284P__) || defined(ENABLE_MONITOR) + #undef ENABLE_MONITOR #define ENABLE_MONITOR static void RunMonitor(void); #endif +#ifndef EEWE + #define EEWE 1 +#endif +#ifndef EEMWE + #define EEMWE 2 +#endif + //#define _DEBUG_SERIAL_ //#define _DEBUG_WITH_LEDS_ @@ -131,8 +158,8 @@ Description: add timeout feature like previous Wiring bootloader #define PROGLED_PORT PORTD #define PROGLED_DDR DDRD #define PROGLED_PIN PINE7 -#elif defined( _CEREBOTPLUS_BOARD_ ) - //* this is for the Cerebot 2560 board +#elif defined( _CEREBOTPLUS_BOARD_ ) || defined(_CEREBOT_II_BOARD_) + //* this is for the Cerebot 2560 board and the Cerebot-ii //* onbarod leds are on PORTE4-7 #define PROGLED_PORT PORTE #define PROGLED_DDR DDRE @@ -149,6 +176,47 @@ Description: add timeout feature like previous Wiring bootloader #define PROGLED_PORT PORTA #define PROGLED_DDR DDRA #define PROGLED_PIN PINA3 +#elif defined( _BOARD_MEGA16 ) + //* onbarod led is PORTA7 + #define PROGLED_PORT PORTA + #define PROGLED_DDR DDRA + #define PROGLED_PIN PINA7 + #define UART_BAUDRATE_DOUBLE_SPEED 0 + +#elif defined( _BOARD_BAHBOT_ ) + //* dosent have an onboard LED but this is what will probably be added to this port + #define PROGLED_PORT PORTB + #define PROGLED_DDR DDRB + #define PROGLED_PIN PINB0 + +#elif defined( _BOARD_ROBOTX_ ) + #define PROGLED_PORT PORTB + #define PROGLED_DDR DDRB + #define PROGLED_PIN PINB6 +#elif defined( _BOARD_CUSTOM1284_BLINK_B0_ ) + #define PROGLED_PORT PORTB + #define PROGLED_DDR DDRB + #define PROGLED_PIN PINB0 +#elif defined( _BOARD_CUSTOM1284_ ) + #define PROGLED_PORT PORTD + #define PROGLED_DDR DDRD + #define PROGLED_PIN PIND5 +#elif defined( _AVRLIP_ ) + #define PROGLED_PORT PORTB + #define PROGLED_DDR DDRB + #define PROGLED_PIN PINB5 +#elif defined( _BOARD_STK500_ ) + #define PROGLED_PORT PORTA + #define PROGLED_DDR DDRA + #define PROGLED_PIN PINA7 +#elif defined( _BOARD_STK502_ ) + #define PROGLED_PORT PORTB + #define PROGLED_DDR DDRB + #define PROGLED_PIN PINB5 +#elif defined( _BOARD_STK525_ ) + #define PROGLED_PORT PORTB + #define PROGLED_DDR DDRB + #define PROGLED_PIN PINB7 #else #define PROGLED_PORT PORTG #define PROGLED_DDR DDRG @@ -164,6 +232,7 @@ Description: add timeout feature like previous Wiring bootloader #define F_CPU 16000000UL #endif +#define _BLINK_LOOP_COUNT_ (F_CPU / 2250) /* * UART Baudrate, AVRStudio AVRISP only accepts 115200 bps */ @@ -228,12 +297,33 @@ Description: add timeout feature like previous Wiring bootloader #define SIGNATURE_BYTES 0x1E9801 #elif defined (__AVR_ATmega2561__) #define SIGNATURE_BYTES 0x1e9802 +#elif defined (__AVR_ATmega1284P__) + #define SIGNATURE_BYTES 0x1e9705 +#elif defined (__AVR_ATmega640__) + #define SIGNATURE_BYTES 0x1e9608 +#elif defined (__AVR_ATmega64__) + #define SIGNATURE_BYTES 0x1E9602 +#elif defined (__AVR_ATmega169__) + #define SIGNATURE_BYTES 0x1e9405 +#elif defined (__AVR_AT90USB1287__) + #define SIGNATURE_BYTES 0x1e9782 #else #error "no signature definition for MCU available" #endif -#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \ +#if defined(_BOARD_ROBOTX_) || defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) + #define UART_BAUD_RATE_LOW UBRR1L + #define UART_STATUS_REG UCSR1A + #define UART_CONTROL_REG UCSR1B + #define UART_ENABLE_TRANSMITTER TXEN1 + #define UART_ENABLE_RECEIVER RXEN1 + #define UART_TRANSMIT_COMPLETE TXC1 + #define UART_RECEIVE_COMPLETE RXC1 + #define UART_DATA_REG UDR1 + #define UART_DOUBLE_SPEED U2X1 + +#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \ || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) /* ATMega8 with one USART */ #define UART_BAUD_RATE_LOW UBRRL @@ -258,6 +348,28 @@ Description: add timeout feature like previous Wiring bootloader #define UART_RECEIVE_COMPLETE RXC0 #define UART_DATA_REG UDR0 #define UART_DOUBLE_SPEED U2X0 +#elif defined(UBRR0L) && defined(UCSR0A) && defined(TXEN0) + /* ATMega with two USART, use UART0 */ + #define UART_BAUD_RATE_LOW UBRR0L + #define UART_STATUS_REG UCSR0A + #define UART_CONTROL_REG UCSR0B + #define UART_ENABLE_TRANSMITTER TXEN0 + #define UART_ENABLE_RECEIVER RXEN0 + #define UART_TRANSMIT_COMPLETE TXC0 + #define UART_RECEIVE_COMPLETE RXC0 + #define UART_DATA_REG UDR0 + #define UART_DOUBLE_SPEED U2X0 +#elif defined(UBRRL) && defined(UCSRA) && defined(UCSRB) && defined(TXEN) && defined(RXEN) + //* catch all + #define UART_BAUD_RATE_LOW UBRRL + #define UART_STATUS_REG UCSRA + #define UART_CONTROL_REG UCSRB + #define UART_ENABLE_TRANSMITTER TXEN + #define UART_ENABLE_RECEIVER RXEN + #define UART_TRANSMIT_COMPLETE TXC + #define UART_RECEIVE_COMPLETE RXC + #define UART_DATA_REG UDR + #define UART_DOUBLE_SPEED U2X #else #error "no UART definition for MCU available" #endif @@ -323,26 +435,16 @@ void __jumpMain(void) asm volatile ( ".set __stack, %0" :: "i" (RAMEND) ); -// ldi r16,high(RAMEND) -// out SPH,r16 ; Set stack pointer to top of RAM +//* set stack pointer to top of RAM -// asm volatile ( "ldi 16, 0x10"); asm volatile ( "ldi 16, %0" :: "i" (RAMEND >> 8) ); -// asm volatile ( "out 0x3E,16"); -// asm volatile ( "out %0,16" :: "i" (SPH_REG) ); asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_HI_ADDR) ); -// asm volatile ( "ldi 16, 0x00"); asm volatile ( "ldi 16, %0" :: "i" (RAMEND & 0x0ff) ); -// asm volatile ( "out 0x3d,16"); -// asm volatile ( "out %0,16" :: "i" (SPL_REG) ); asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_LO_ADDR) ); - - asm volatile ( "clr __zero_reg__" ); // GCC depends on register r1 set to 0 asm volatile ( "out %0, __zero_reg__" :: "I" (_SFR_IO_ADDR(SREG)) ); // set SREG to 0 -// asm volatile ( "rjmp main"); // jump to main() asm volatile ( "jmp main"); // jump to main() } @@ -403,7 +505,7 @@ uint32_t count = 0; if (count > MAX_TIME_COUNT) { unsigned int data; - #if (FLASHEND > 0x0FFFF) + #if (FLASHEND > 0x10000) data = pgm_read_word_far(0); //* get the first word of the user program #else data = pgm_read_word_near(0); //* get the first word of the user program @@ -422,6 +524,8 @@ uint32_t count = 0; return UART_DATA_REG; } +//* for watch dog timer startup +void (*app_start)(void) = 0x0000; //***************************************************************************** @@ -442,7 +546,36 @@ int main(void) unsigned long boot_timer; unsigned int boot_state; #ifdef ENABLE_MONITOR - unsigned int exPointCntr = 0; + unsigned int exPointCntr = 0; + unsigned int rcvdCharCntr = 0; +#endif + + //* some chips dont set the stack properly + asm volatile ( ".set __stack, %0" :: "i" (RAMEND) ); + asm volatile ( "ldi 16, %0" :: "i" (RAMEND >> 8) ); + asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_HI_ADDR) ); + asm volatile ( "ldi 16, %0" :: "i" (RAMEND & 0x0ff) ); + asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_LO_ADDR) ); + +#ifdef _FIX_ISSUE_181_ + //************************************************************************ + //* Dec 29, 2011 Issue #181, added watch dog timmer support + //* handle the watch dog timer + uint8_t mcuStatusReg; + mcuStatusReg = MCUSR; + + __asm__ __volatile__ ("cli"); + __asm__ __volatile__ ("wdr"); + MCUSR = 0; + WDTCSR |= _BV(WDCE) | _BV(WDE); + WDTCSR = 0; + __asm__ __volatile__ ("sei"); + // check if WDT generated the reset, if so, go straight to app + if (mcuStatusReg & _BV(WDRF)) + { + app_start(); + } + //************************************************************************ #endif @@ -450,8 +583,9 @@ int main(void) boot_state = 0; #ifdef BLINK_LED_WHILE_WAITING - boot_timeout = 20000; //* should be about 1 second +// boot_timeout = 90000; //* should be about 4 seconds // boot_timeout = 170000; + boot_timeout = 20000; //* should be about 1 second #else boot_timeout = 3500000; // 7 seconds , approx 2us per step when optimize "s" #endif @@ -516,7 +650,7 @@ int main(void) boot_state = 1; // (after ++ -> boot_state=2 bootloader timeout, jump to main 0x00000 ) } #ifdef BLINK_LED_WHILE_WAITING - if ((boot_timer % 7000) == 0) + if ((boot_timer % _BLINK_LOOP_COUNT_) == 0) { //* toggle the LED PROGLED_PORT ^= (1<>16) & 0x000000FF; + { + answerByte = (SIGNATURE_BYTES >> 16) & 0x000000FF; + } else if ( signatureIndex == 1 ) + { answerByte = (SIGNATURE_BYTES >> 8) & 0x000000FF; + } else + { answerByte = SIGNATURE_BYTES & 0x000000FF; + } } else if ( msgBuffer[4] & 0x50 ) { - answerByte = 0; //read fuse/lock bits not implemented, return dummy value + //* Issue 544: stk500v2 bootloader doesn't support reading fuses + //* I cant find the docs that say what these are supposed to be but this was figured out by trial and error + // answerByte = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS); + // answerByte = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS); + // answerByte = boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS); + if (msgBuffer[4] == 0x50) + { + answerByte = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS); + } + else if (msgBuffer[4] == 0x58) + { + answerByte = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS); + } + else + { + answerByte = 0; + } } else { answerByte = 0; // for all others command are not implemented, return dummy value for AVRDUDE happy - // flag = 1; // Remark this line for AVRDUDE } if ( !flag ) { @@ -804,7 +968,8 @@ int main(void) case CMD_CHIP_ERASE_ISP: eraseAddress = 0; msgLength = 2; - msgBuffer[1] = STATUS_CMD_OK; + // msgBuffer[1] = STATUS_CMD_OK; + msgBuffer[1] = STATUS_CMD_FAILED; //* isue 543, return FAILED instead of OK break; case CMD_LOAD_ADDRESS: @@ -855,7 +1020,9 @@ int main(void) } else { - #if (!defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) && !defined(__AVR_ATmega2561__)) + //* issue 543, this should work, It has not been tested. + // #if (!defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) && !defined(__AVR_ATmega2561__) && !defined(__AVR_ATmega1284P__) && !defined(__AVR_ATmega640__)) + #if (defined(EEARL) && defined(EEARH) && defined(EEMWE) && defined(EEWE) && defined(EEDR)) /* write EEPROM */ do { EEARL = address; // Setup EEPROM address @@ -890,11 +1057,12 @@ int main(void) // Read FLASH do { - #if defined(RAMPZ) + //#if defined(RAMPZ) + #if (FLASHEND > 0x10000) data = pgm_read_word_far(address); - #else + #else data = pgm_read_word_near(address); - #endif + #endif *p++ = (unsigned char)data; //LSB *p++ = (unsigned char)(data >> 8); //MSB address += 2; // Select next word in memory @@ -1056,16 +1224,10 @@ unsigned long gEepromIndex; #define true 1 #define false 0 -#if defined(__AVR_ATmega128__) - #define kCPU_NAME "ATmega128" -#elif defined(__AVR_ATmega1280__) - #define kCPU_NAME "ATmega1280" -#elif defined(__AVR_ATmega1281__) - #define kCPU_NAME "ATmega1281" -#elif defined(__AVR_ATmega2560__) - #define kCPU_NAME "ATmega2560" -#elif defined(__AVR_ATmega2561__) - #define kCPU_NAME "ATmega2561" +#include "avr_cpunames.h" + +#ifndef _AVR_CPU_NAME_ + #error cpu name not defined #endif #ifdef _VECTORS_SIZE @@ -1077,8 +1239,8 @@ unsigned long gEepromIndex; void PrintDecInt(int theNumber, int digitCnt); -#ifdef kCPU_NAME - prog_char gTextMsg_CPU_Name[] PROGMEM = kCPU_NAME; +#ifdef _AVR_CPU_NAME_ + prog_char gTextMsg_CPU_Name[] PROGMEM = _AVR_CPU_NAME_; #else prog_char gTextMsg_CPU_Name[] PROGMEM = "UNKNOWN"; #endif @@ -1086,16 +1248,16 @@ void PrintDecInt(int theNumber, int digitCnt); prog_char gTextMsg_Explorer[] PROGMEM = "Arduino explorer stk500V2 by MLS"; prog_char gTextMsg_Prompt[] PROGMEM = "Bootloader>"; prog_char gTextMsg_HUH[] PROGMEM = "Huh?"; - prog_char gTextMsg_COMPILED_ON[] PROGMEM = "Compiled on = "; - prog_char gTextMsg_CPU_Type[] PROGMEM = "CPU Type = "; - prog_char gTextMsg_AVR_ARCH[] PROGMEM = "__AVR_ARCH__ = "; - prog_char gTextMsg_AVR_LIBC[] PROGMEM = "AVR LibC Ver = "; - prog_char gTextMsg_GCC_VERSION[] PROGMEM = "GCC Version = "; - prog_char gTextMsg_CPU_SIGNATURE[] PROGMEM = "CPU signature= "; - prog_char gTextMsg_FUSE_BYTE_LOW[] PROGMEM = "Low fuse = "; - prog_char gTextMsg_FUSE_BYTE_HIGH[] PROGMEM = "High fuse = "; - prog_char gTextMsg_FUSE_BYTE_EXT[] PROGMEM = "Ext fuse = "; - prog_char gTextMsg_FUSE_BYTE_LOCK[] PROGMEM = "Lock fuse = "; + prog_char gTextMsg_COMPILED_ON[] PROGMEM = "Compiled on = "; + prog_char gTextMsg_CPU_Type[] PROGMEM = "CPU Type = "; + prog_char gTextMsg_AVR_ARCH[] PROGMEM = "__AVR_ARCH__= "; + prog_char gTextMsg_AVR_LIBC[] PROGMEM = "AVR LibC Ver= "; + prog_char gTextMsg_GCC_VERSION[] PROGMEM = "GCC Version = "; + prog_char gTextMsg_CPU_SIGNATURE[] PROGMEM = "CPU ID = "; + prog_char gTextMsg_FUSE_BYTE_LOW[] PROGMEM = "Low fuse = "; + prog_char gTextMsg_FUSE_BYTE_HIGH[] PROGMEM = "High fuse = "; + prog_char gTextMsg_FUSE_BYTE_EXT[] PROGMEM = "Ext fuse = "; + prog_char gTextMsg_FUSE_BYTE_LOCK[] PROGMEM = "Lock fuse = "; prog_char gTextMsg_GCC_DATE_STR[] PROGMEM = __DATE__; prog_char gTextMsg_AVR_LIBC_VER_STR[] PROGMEM = __AVR_LIBC_VERSION_STRING__; prog_char gTextMsg_GCC_VERSION_STR[] PROGMEM = __VERSION__; @@ -1109,13 +1271,13 @@ void PrintDecInt(int theNumber, int digitCnt); prog_char gTextMsg_SPACE[] PROGMEM = " "; prog_char gTextMsg_WriteToEEprom[] PROGMEM = "Writting EE"; prog_char gTextMsg_ReadingEEprom[] PROGMEM = "Reading EE"; - prog_char gTextMsg_EEPROMerrorCnt[] PROGMEM = "eeprom error count="; + prog_char gTextMsg_EEPROMerrorCnt[] PROGMEM = "EE err cnt="; prog_char gTextMsg_PORT[] PROGMEM = "PORT"; //************************************************************************ //* Help messages - prog_char gTextMsg_HELP_MSG_0[] PROGMEM = "0=Zero address ctrs"; + prog_char gTextMsg_HELP_MSG_0[] PROGMEM = "0=Zero addr"; prog_char gTextMsg_HELP_MSG_QM[] PROGMEM = "?=CPU stats"; prog_char gTextMsg_HELP_MSG_AT[] PROGMEM = "@=EEPROM test"; prog_char gTextMsg_HELP_MSG_B[] PROGMEM = "B=Blink LED"; @@ -1123,7 +1285,8 @@ void PrintDecInt(int theNumber, int digitCnt); prog_char gTextMsg_HELP_MSG_F[] PROGMEM = "F=Dump FLASH"; prog_char gTextMsg_HELP_MSG_H[] PROGMEM = "H=Help"; prog_char gTextMsg_HELP_MSG_L[] PROGMEM = "L=List I/O Ports"; - prog_char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit & jump to user pgm"; +// prog_char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit & jump to user pgm"; + prog_char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit"; prog_char gTextMsg_HELP_MSG_R[] PROGMEM = "R=Dump RAM"; prog_char gTextMsg_HELP_MSG_V[] PROGMEM = "V=show interrupt Vectors"; prog_char gTextMsg_HELP_MSG_Y[] PROGMEM = "Y=Port blink"; @@ -1142,7 +1305,11 @@ char theChar; while (theChar != 0) { + #if (FLASHEND > 0x10000) theChar = pgm_read_byte_far((uint32_t)dataPtr + ii); + #else + theChar = pgm_read_byte_near((uint32_t)dataPtr + ii); + #endif if (theChar != 0) { sendchar(theChar); @@ -1293,46 +1460,6 @@ unsigned char fuseByte; } -#ifndef sbi - #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) -#endif - -//************************************************************************ -int analogRead(uint8_t pin) -{ -uint8_t low, high; - - // set the analog reference (high two bits of ADMUX) and select the - // channel (low 4 bits). this also sets ADLAR (left-adjust result) - // to 0 (the default). -// ADMUX = (analog_reference << 6) | (pin & 0x07); - ADMUX = (1 << 6) | (pin & 0x07); - -#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - // the MUX5 bit of ADCSRB selects whether we're reading from channels - // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high). - ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); -#endif - - // without a delay, we seem to read from the wrong channel - //delay(1); - - // start the conversion - sbi(ADCSRA, ADSC); - - // ADSC is cleared when the conversion finishes - while (bit_is_set(ADCSRA, ADSC)); - - // we have to read ADCL first; doing so locks both ADCL - // and ADCH until ADCH is read. reading ADCL second would - // cause the results of each conversion to be discarded, - // as ADCL and ADCH would be locked when it completed. - low = ADCL; - high = ADCH; - - // combine the two bytes - return (high << 8) | low; -} //************************************************************************ static void BlinkLED(void) @@ -1388,7 +1515,11 @@ unsigned char *ramPtr; switch(dumpWhat) { case kDUMP_FLASH: + #if (FLASHEND > 0x10000) theValue = pgm_read_byte_far(myAddressPointer); + #else + theValue = pgm_read_byte_near(myAddressPointer); + #endif break; case kDUMP_EEPROM: @@ -1435,7 +1566,11 @@ int errorCount; PrintFromPROGMEMln(gTextMsg_WriteToEEprom, 0); PrintNewLine(); ii = 0; +#if (FLASHEND > 0x10000) while (((theChar = pgm_read_byte_far(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) +#else + while (((theChar = pgm_read_byte_near(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) +#endif { eeprom_write_byte((uint8_t *)ii, theChar); if (theChar == 0) @@ -1456,7 +1591,11 @@ int errorCount; PrintNewLine(); errorCount = 0; ii = 0; +#if (FLASHEND > 0x10000) while (((theChar = pgm_read_byte_far(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) +#else + while (((theChar = pgm_read_byte_near(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) +#endif { theEEPROMchar = eeprom_read_byte((uint8_t *)ii); if (theEEPROMchar == 0) @@ -1487,10 +1626,12 @@ int errorCount; #if (FLASHEND > 0x08000) - #include "avrinterruptnames.h" - #ifndef _INTERRUPT_NAMES_DEFINED_ - #warning Interrupt vectors not defined - #endif +//* this includes the interrupt names for the monitor portion. There is no longer enough +//* memory to include this +// #include "avrinterruptnames.h" +// #ifndef _INTERRUPT_NAMES_DEFINED_ +// #warning Interrupt vectors not defined +// #endif #endif //************************************************************************ @@ -1534,12 +1675,18 @@ unsigned long absoluteAddr; //* the AVR is LITTLE ENDIAN, swap the byte order + #if (FLASHEND > 0x10000) byte1 = pgm_read_byte_far(myMemoryPtr++); byte2 = pgm_read_byte_far(myMemoryPtr++); - word1 = (byte2 << 8) + byte1; - byte3 = pgm_read_byte_far(myMemoryPtr++); byte4 = pgm_read_byte_far(myMemoryPtr++); + #else + byte1 = pgm_read_byte_near(myMemoryPtr++); + byte2 = pgm_read_byte_near(myMemoryPtr++); + byte3 = pgm_read_byte_near(myMemoryPtr++); + byte4 = pgm_read_byte_near(myMemoryPtr++); + #endif + word1 = (byte2 << 8) + byte1; word2 = (byte4 << 8) + byte3; @@ -1596,7 +1743,11 @@ unsigned long absoluteAddr; #if defined(_INTERRUPT_NAMES_DEFINED_) sendchar(0x20); + #if (FLASHEND > 0x10000) stringPointer = pgm_read_word_far(&(gInterruptNameTable[vectorIndex])); + #else + stringPointer = pgm_read_word_near(&(gInterruptNameTable[vectorIndex])); + #endif PrintFromPROGMEM((char *)stringPointer, 0); #endif PrintNewLine(); @@ -1895,13 +2046,7 @@ int ii, jj; { theChar = theChar & 0x5F; } - #if defined( _CEREBOTPLUS_BOARD_ ) - if (theChar == 0x5F) - { - - } - else - #endif + if (theChar >= 0x20) { sendchar(theChar); @@ -1979,12 +2124,6 @@ int ii, jj; AVR_PortOutput(); break; - #if defined( _CEREBOTPLUS_BOARD_ ) - case 0x5F: - //* do nothing - break; - #endif - default: PrintFromPROGMEMln(gTextMsg_HUH, 0); break; From 7625c33fcda5c9ddce6a33bafbfeb38fb8073f12 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sat, 22 Dec 2012 19:25:20 +0100 Subject: [PATCH 2/6] Saved old production firmware for Mega2560 --- ...boot_v2_mega2560.hex => Mega2560-prod-firmware-2011-06-29.hex} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename hardware/arduino/bootloaders/stk500v2/{stk500boot_v2_mega2560.hex => Mega2560-prod-firmware-2011-06-29.hex} (100%) diff --git a/hardware/arduino/bootloaders/stk500v2/stk500boot_v2_mega2560.hex b/hardware/arduino/bootloaders/stk500v2/Mega2560-prod-firmware-2011-06-29.hex similarity index 100% rename from hardware/arduino/bootloaders/stk500v2/stk500boot_v2_mega2560.hex rename to hardware/arduino/bootloaders/stk500v2/Mega2560-prod-firmware-2011-06-29.hex From 06ee62afc66e9917b3dc38bcf496de0e1a3d7d7d Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sat, 22 Dec 2012 19:31:03 +0100 Subject: [PATCH 3/6] Fixed compile problems with avr gcc 4.6.2 (crosspack CrossPack-AVR-20121207.dmg) --- .../arduino/bootloaders/stk500v2/Makefile | 2 +- .../arduino/bootloaders/stk500v2/stk500boot.c | 118 +++-- .../stk500v2/stk500boot_v2_mega2560.hex | 408 ++++++++++++++++++ 3 files changed, 466 insertions(+), 62 deletions(-) create mode 100644 hardware/arduino/bootloaders/stk500v2/stk500boot_v2_mega2560.hex diff --git a/hardware/arduino/bootloaders/stk500v2/Makefile b/hardware/arduino/bootloaders/stk500v2/Makefile index 54c5f8526d7..6b66a26615d 100755 --- a/hardware/arduino/bootloaders/stk500v2/Makefile +++ b/hardware/arduino/bootloaders/stk500v2/Makefile @@ -124,7 +124,7 @@ CINCS = CFLAGS = -g$(DEBUG) CFLAGS += $(CDEFS) $(CINCS) CFLAGS += -O$(OPT) -CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -mno-tablejump +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -fno-jump-tables CFLAGS += -Wall -Wstrict-prototypes CFLAGS += -Wa,-adhlns=$(<:.c=.lst) CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) diff --git a/hardware/arduino/bootloaders/stk500v2/stk500boot.c b/hardware/arduino/bootloaders/stk500v2/stk500boot.c index 89eead16366..3e8becc9599 100755 --- a/hardware/arduino/bootloaders/stk500v2/stk500boot.c +++ b/hardware/arduino/bootloaders/stk500v2/stk500boot.c @@ -1240,82 +1240,78 @@ unsigned long gEepromIndex; void PrintDecInt(int theNumber, int digitCnt); #ifdef _AVR_CPU_NAME_ - prog_char gTextMsg_CPU_Name[] PROGMEM = _AVR_CPU_NAME_; + const char gTextMsg_CPU_Name[] PROGMEM = _AVR_CPU_NAME_; #else - prog_char gTextMsg_CPU_Name[] PROGMEM = "UNKNOWN"; + const char gTextMsg_CPU_Name[] PROGMEM = "UNKNOWN"; #endif - prog_char gTextMsg_Explorer[] PROGMEM = "Arduino explorer stk500V2 by MLS"; - prog_char gTextMsg_Prompt[] PROGMEM = "Bootloader>"; - prog_char gTextMsg_HUH[] PROGMEM = "Huh?"; - prog_char gTextMsg_COMPILED_ON[] PROGMEM = "Compiled on = "; - prog_char gTextMsg_CPU_Type[] PROGMEM = "CPU Type = "; - prog_char gTextMsg_AVR_ARCH[] PROGMEM = "__AVR_ARCH__= "; - prog_char gTextMsg_AVR_LIBC[] PROGMEM = "AVR LibC Ver= "; - prog_char gTextMsg_GCC_VERSION[] PROGMEM = "GCC Version = "; - prog_char gTextMsg_CPU_SIGNATURE[] PROGMEM = "CPU ID = "; - prog_char gTextMsg_FUSE_BYTE_LOW[] PROGMEM = "Low fuse = "; - prog_char gTextMsg_FUSE_BYTE_HIGH[] PROGMEM = "High fuse = "; - prog_char gTextMsg_FUSE_BYTE_EXT[] PROGMEM = "Ext fuse = "; - prog_char gTextMsg_FUSE_BYTE_LOCK[] PROGMEM = "Lock fuse = "; - prog_char gTextMsg_GCC_DATE_STR[] PROGMEM = __DATE__; - prog_char gTextMsg_AVR_LIBC_VER_STR[] PROGMEM = __AVR_LIBC_VERSION_STRING__; - prog_char gTextMsg_GCC_VERSION_STR[] PROGMEM = __VERSION__; - prog_char gTextMsg_VECTOR_HEADER[] PROGMEM = "V# ADDR op code instruction addr Interrupt"; - prog_char gTextMsg_noVector[] PROGMEM = "no vector"; - prog_char gTextMsg_rjmp[] PROGMEM = "rjmp "; - prog_char gTextMsg_jmp[] PROGMEM = "jmp "; - prog_char gTextMsg_WHAT_PORT[] PROGMEM = "What port:"; - prog_char gTextMsg_PortNotSupported[] PROGMEM = "Port not supported"; - prog_char gTextMsg_MustBeLetter[] PROGMEM = "Must be a letter"; - prog_char gTextMsg_SPACE[] PROGMEM = " "; - prog_char gTextMsg_WriteToEEprom[] PROGMEM = "Writting EE"; - prog_char gTextMsg_ReadingEEprom[] PROGMEM = "Reading EE"; - prog_char gTextMsg_EEPROMerrorCnt[] PROGMEM = "EE err cnt="; - prog_char gTextMsg_PORT[] PROGMEM = "PORT"; + const char gTextMsg_Explorer[] PROGMEM = "Arduino explorer stk500V2 by MLS"; + const char gTextMsg_Prompt[] PROGMEM = "Bootloader>"; + const char gTextMsg_HUH[] PROGMEM = "Huh?"; + const char gTextMsg_COMPILED_ON[] PROGMEM = "Compiled on = "; + const char gTextMsg_CPU_Type[] PROGMEM = "CPU Type = "; + const char gTextMsg_AVR_ARCH[] PROGMEM = "__AVR_ARCH__= "; + const char gTextMsg_AVR_LIBC[] PROGMEM = "AVR LibC Ver= "; + const char gTextMsg_GCC_VERSION[] PROGMEM = "GCC Version = "; + const char gTextMsg_CPU_SIGNATURE[] PROGMEM = "CPU ID = "; + const char gTextMsg_FUSE_BYTE_LOW[] PROGMEM = "Low fuse = "; + const char gTextMsg_FUSE_BYTE_HIGH[] PROGMEM = "High fuse = "; + const char gTextMsg_FUSE_BYTE_EXT[] PROGMEM = "Ext fuse = "; + const char gTextMsg_FUSE_BYTE_LOCK[] PROGMEM = "Lock fuse = "; + const char gTextMsg_GCC_DATE_STR[] PROGMEM = __DATE__; + const char gTextMsg_AVR_LIBC_VER_STR[] PROGMEM = __AVR_LIBC_VERSION_STRING__; + const char gTextMsg_GCC_VERSION_STR[] PROGMEM = __VERSION__; + const char gTextMsg_VECTOR_HEADER[] PROGMEM = "V# ADDR op code instruction addr Interrupt"; + const char gTextMsg_noVector[] PROGMEM = "no vector"; + const char gTextMsg_rjmp[] PROGMEM = "rjmp "; + const char gTextMsg_jmp[] PROGMEM = "jmp "; + const char gTextMsg_WHAT_PORT[] PROGMEM = "What port:"; + const char gTextMsg_PortNotSupported[] PROGMEM = "Port not supported"; + const char gTextMsg_MustBeLetter[] PROGMEM = "Must be a letter"; + const char gTextMsg_SPACE[] PROGMEM = " "; + const char gTextMsg_WriteToEEprom[] PROGMEM = "Writting EE"; + const char gTextMsg_ReadingEEprom[] PROGMEM = "Reading EE"; + const char gTextMsg_EEPROMerrorCnt[] PROGMEM = "EE err cnt="; + const char gTextMsg_PORT[] PROGMEM = "PORT"; //************************************************************************ //* Help messages - prog_char gTextMsg_HELP_MSG_0[] PROGMEM = "0=Zero addr"; - prog_char gTextMsg_HELP_MSG_QM[] PROGMEM = "?=CPU stats"; - prog_char gTextMsg_HELP_MSG_AT[] PROGMEM = "@=EEPROM test"; - prog_char gTextMsg_HELP_MSG_B[] PROGMEM = "B=Blink LED"; - prog_char gTextMsg_HELP_MSG_E[] PROGMEM = "E=Dump EEPROM"; - prog_char gTextMsg_HELP_MSG_F[] PROGMEM = "F=Dump FLASH"; - prog_char gTextMsg_HELP_MSG_H[] PROGMEM = "H=Help"; - prog_char gTextMsg_HELP_MSG_L[] PROGMEM = "L=List I/O Ports"; -// prog_char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit & jump to user pgm"; - prog_char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit"; - prog_char gTextMsg_HELP_MSG_R[] PROGMEM = "R=Dump RAM"; - prog_char gTextMsg_HELP_MSG_V[] PROGMEM = "V=show interrupt Vectors"; - prog_char gTextMsg_HELP_MSG_Y[] PROGMEM = "Y=Port blink"; - - prog_char gTextMsg_END[] PROGMEM = "*"; + const char gTextMsg_HELP_MSG_0[] PROGMEM = "0=Zero addr"; + const char gTextMsg_HELP_MSG_QM[] PROGMEM = "?=CPU stats"; + const char gTextMsg_HELP_MSG_AT[] PROGMEM = "@=EEPROM test"; + const char gTextMsg_HELP_MSG_B[] PROGMEM = "B=Blink LED"; + const char gTextMsg_HELP_MSG_E[] PROGMEM = "E=Dump EEPROM"; + const char gTextMsg_HELP_MSG_F[] PROGMEM = "F=Dump FLASH"; + const char gTextMsg_HELP_MSG_H[] PROGMEM = "H=Help"; + const char gTextMsg_HELP_MSG_L[] PROGMEM = "L=List I/O Ports"; +// const char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit & jump to user pgm"; + const char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit"; + const char gTextMsg_HELP_MSG_R[] PROGMEM = "R=Dump RAM"; + const char gTextMsg_HELP_MSG_V[] PROGMEM = "V=show interrupt Vectors"; + const char gTextMsg_HELP_MSG_Y[] PROGMEM = "Y=Port blink"; + + const char gTextMsg_END[] PROGMEM = "*"; //************************************************************************ -void PrintFromPROGMEM(void *dataPtr, unsigned char offset) +void PrintFromPROGMEM(const void *dataPtr, unsigned char offset) { -uint8_t ii; char theChar; - ii = offset; - theChar = 1; + dataPtr += offset; - while (theChar != 0) - { + do { #if (FLASHEND > 0x10000) - theChar = pgm_read_byte_far((uint32_t)dataPtr + ii); + theChar = pgm_read_byte_far((uint16_t)dataPtr++); #else - theChar = pgm_read_byte_near((uint32_t)dataPtr + ii); + theChar = pgm_read_byte_near((uint16_t)dataPtr++); #endif if (theChar != 0) { sendchar(theChar); } - ii++; - } + } while (theChar != 0); } //************************************************************************ @@ -1327,7 +1323,7 @@ void PrintNewLine(void) //************************************************************************ -void PrintFromPROGMEMln(void *dataPtr, unsigned char offset) +void PrintFromPROGMEMln(const void *dataPtr, unsigned char offset) { PrintFromPROGMEM(dataPtr, offset); @@ -1523,7 +1519,7 @@ unsigned char *ramPtr; break; case kDUMP_EEPROM: - theValue = eeprom_read_byte((void *)myAddressPointer); + theValue = eeprom_read_byte((uint8_t *)(uint16_t)myAddressPointer); break; case kDUMP_RAM: @@ -1567,9 +1563,9 @@ int errorCount; PrintNewLine(); ii = 0; #if (FLASHEND > 0x10000) - while (((theChar = pgm_read_byte_far(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) + while (((theChar = pgm_read_byte_far(((uint16_t)gTextMsg_Explorer) + ii)) != '*') && (ii < 512)) #else - while (((theChar = pgm_read_byte_near(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) + while (((theChar = pgm_read_byte_near(((uint16_t)gTextMsg_Explorer) + ii)) != '*') && (ii < 512)) #endif { eeprom_write_byte((uint8_t *)ii, theChar); @@ -1592,9 +1588,9 @@ int errorCount; errorCount = 0; ii = 0; #if (FLASHEND > 0x10000) - while (((theChar = pgm_read_byte_far(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) + while (((theChar = pgm_read_byte_far((uint16_t)gTextMsg_Explorer + ii)) != '*') && (ii < 512)) #else - while (((theChar = pgm_read_byte_near(gTextMsg_Explorer + ii)) != '*') && (ii < 512)) + while (((theChar = pgm_read_byte_near((uint16_t)gTextMsg_Explorer + ii)) != '*') && (ii < 512)) #endif { theEEPROMchar = eeprom_read_byte((uint8_t *)ii); diff --git a/hardware/arduino/bootloaders/stk500v2/stk500boot_v2_mega2560.hex b/hardware/arduino/bootloaders/stk500v2/stk500boot_v2_mega2560.hex new file mode 100644 index 00000000000..a600ec234e3 --- /dev/null +++ b/hardware/arduino/bootloaders/stk500v2/stk500boot_v2_mega2560.hex @@ -0,0 +1,408 @@ +:020000023000CC +:10E000000D9489F10D94B3F10D94B3F10D94B3F126 +:10E010000D94B3F10D94B3F10D94B3F10D94B3F1EC +:10E020000D94B3F10D94B3F10D94B3F10D94B3F1DC +:10E030000D94B3F10D94B3F10D94B3F10D94B3F1CC +:10E040000D94B3F10D94B3F10D94B3F10D94B3F1BC +:10E050000D94B3F10D94B3F10D94B3F10D94B3F1AC +:10E060000D94B3F10D94B3F10D94B3F10D94B3F19C +:10E070000D94B3F10D94B3F10D94B3F10D94B3F18C +:10E080000D94B3F10D94B3F10D94B3F10D94B3F17C +:10E090000D94B3F10D94B3F10D94B3F10D94B3F16C +:10E0A0000D94B3F10D94B3F10D94B3F10D94B3F15C +:10E0B0000D94B3F10D94B3F10D94B3F10D94B3F14C +:10E0C0000D94B3F10D94B3F10D94B3F10D94B3F13C +:10E0D0000D94B3F10D94B3F10D94B3F10D94B3F12C +:10E0E0000D94B3F12A00593D506F727420626C692F +:10E0F0006E6B00563D73686F7720696E746572723F +:10E1000075707420566563746F727300523D447568 +:10E110006D702052414D00513D51756974004C3D68 +:10E120004C69737420492F4F20506F7274730048EC +:10E130003D48656C7000463D44756D7020464C410D +:10E14000534800453D44756D7020454550524F4D34 +:10E1500000423D426C696E6B204C454400403D4599 +:10E160004550524F4D2074657374003F3D435055E8 +:10E1700020737461747300303D5A65726F2061645E +:10E18000647200504F5254004545206572722063FE +:10E190006E743D0052656164696E672045450057A5 +:10E1A00072697474696E672045450020004D75736F +:10E1B000742062652061206C657474657200506F14 +:10E1C0007274206E6F7420737570706F72746564F2 +:10E1D000005768617420706F72743A006A6D702025 +:10E1E00000726A6D702020006E6F20766563746F18 +:10E1F00072005623202020414444522020206F707A +:10E2000020636F64652020202020696E737472750E +:10E210006374696F6E2061646472202020496E749B +:10E2200065727275707400342E362E3200312E38BD +:10E230002E30004465632032322032303132004CBF +:10E240006F636B20667573652020203D2000457844 +:10E25000742066757365202020203D200048696782 +:10E260006820667573652020203D20004C6F772064 +:10E2700066757365202020203D20004350552049BD +:10E28000442020202020203D200047434320566585 +:10E290007273696F6E203D2000415652204C6962B6 +:10E2A00043205665723D20005F5F4156525F4152E8 +:10E2B00043485F5F3D2000435055205479706520EE +:10E2C0002020203D2000436F6D70696C6564206FD5 +:10E2D0006E203D20004875683F00426F6F746C6F80 +:10E2E000616465723E0041726475696E6F20657885 +:10E2F000706C6F7265722073746B353030563220DB +:10E300006279204D4C530041546D6567613235365A +:10E31000300011241FBECFEFD1E2DEBFCDBF01E040 +:10E320000CBF12E0A0E0B2E0E2E3F9EF03E00BBFC4 +:10E3300002C007900D92A430B107D9F71BBE12E0BE +:10E34000A4E0B2E001C01D92A231B107E1F70F9441 +:10E35000F7F20D9497FC01E20EBF0FEF0DBF1124F1 +:10E360001FBE0D94F7F20D9400F08093C6008091CB +:10E37000C00086FFFCCF8091C00080648093C00005 +:10E38000089520E030E008C0EFECF7E03197F1F7B6 +:10E3900000C000002F5F3F4F28173907A9F70895E5 +:10E3A000CF93DF93EC01C60FD11DCE01A0E0B0E00A +:10E3B0002196ABBFFC018791882319F00F94B5F12A +:10E3C000F4CFDF91CF9108958DE00F94B5F18AE0FD +:10E3D0000F94B5F108950F94D0F10F94E4F10895DE +:10E3E000CF93DF93EC018991882319F00F94B5F155 +:10E3F000FACFDF91CF910895CF93C82F982F9295A0 +:10E400009F70892F805D8A3308F0895F0F94B5F182 +:10E41000CF708C2F805D8A3308F0895F0F94B5F13F +:10E42000CF9108950F931F93CF93DF93EC018B014E +:10E43000853691051CF4633071054CF0CE0164E61D +:10E4400070E00F9438FC862F805D0F94B5F1CB30CF +:10E45000D1051CF4023011056CF0CE0164E670E0C9 +:10E460000F9438FC6AE070E00F9438FC862F805DD2 +:10E470000F94B5F1CE016AE070E00F9438FC805D36 +:10E480000F94B5F1DF91CF911F910F910895809175 +:10E49000C00087FFFCCF8091C6000895CF93C82F9E +:10E4A00083E891EE60E00F94D0F18C2F0F94B5F1DA +:10E4B0000F94E4F1CF9108953F924F925F926F9243 +:10E4C0007F928F929F92AF92BF92CF92DF92EF9204 +:10E4D000FF920F931F93CF93DF93CDB7DEB7629771 +:10E4E0000FB6F894DEBF0FBECDBF582E6A017B0178 +:10E4F00010E144248EE2382E81E0C81680E0D80670 +:10E5000081E0E80680E0F80618F08E2D0F94FCF10B +:10E510008D2D0F94FCF18C2D0F94FCF180E20F9463 +:10E52000B5F18DE20F94B5F180E20F94B5F1198247 +:10E530003E010894611C711C4601570100E191E005 +:10E54000591651F0591620F0A2E05A1661F409C08C +:10E55000ABBEF401479007C0C4010F9481FC482E64 +:10E5600002C0F4014080842D0F94FCF180E20F94EE +:10E57000B5F1842D80528F3518F4F301408202C02A +:10E58000D3013C920894811C911CA11CB11C015028 +:10E590000894611C711C002391F680E190E0A0E0DA +:10E5A000B0E0C80ED91EEA1EFB1E198ACE010196E4 +:10E5B0000F94F0F10F94E4F1115009F09DCF6296A1 +:10E5C0000FB6F894DEBF0FBECDBFDF91CF911F9184 +:10E5D0000F91FF90EF90DF90CF90BF90AF909F9002 +:10E5E0008F907F906F905F904F903F900895CF9362 +:10E5F000DF93CDB7DEB7C054D1400FB6F894DEBF7D +:10E600000FBECDBF01E20EBF0FEF0DBF94B7F89460 +:10E61000A89514BE8091600088618093600010927C +:10E620006000789493FF05C0E0910402F091050228 +:10E630001995279A2F9A8091C00082608093C0001C +:10E6400080E18093C40088E18093C1000000CC2465 +:10E65000DD247601A7EC8A2EABE19A2EA12CB12CF9 +:10E6600000E010E025C005E00A95F1F700000894ED +:10E67000C11CD11CE11CF11C01E010E021E2C2161A +:10E680002EE4D20620E0E20620E0F20610F400E0DC +:10E6900010E0C701B601A50194010F944BFCDC0109 +:10E6A000CB010097A105B10519F485B1805885B952 +:10E6B0008091C00087FD03C001151105A1F2C801BA +:10E6C00001968130910511F00D9419FC0D94D4FB45 +:10E6D00080E090E081309105C9F41FC00196A11D32 +:10E6E000B11D813032E193073AE7A30730E0B30769 +:10E6F00080F0C15CDE4F88819981CF53D140AFEF6C +:10E700008F3F9A0719F0EE27FF27099480E090E0E9 +:10E71000DC013091C00037FFE1CF3091C600089492 +:10E72000E11CF11C313209F042C5BAE0EB16F104EC +:10E7300008F03DC56F5F7F4F6330710509F039C543 +:10E740000FC081E20F94B5F101501040D1F70F9442 +:10E75000E4F10894E108F108E114F10481F412C035 +:10E76000C95DDE4FF982E882C752D140C55DDE4FF8 +:10E7700019830883CB52D140F5E0EF2EF12C09E14B +:10E7800010E0DFCF10920E0210920F0210921002D2 +:10E790001092110210920A0210920B0210920C02B7 +:10E7A00010920D02109206021092070210920802B7 +:10E7B0001092090286EE92EE60E00F94EBF18AED82 +:10E7C00092EE60E00F94D0F10F9447F2182F80364C +:10E7D00008F01F75103230F0812F0F94B5F180E2F0 +:10E7E0000F94B5F1183409F4B5C11934B8F41234E2 +:10E7F00009F446C1133458F4103319F1103308F4F6 +:10E80000D3C41F33A1F1103409F0CEC4B9C01534FC +:10E8100009F44DC1163409F0C7C477C1123509F4A3 +:10E8200009C2133538F41C3409F4D3C1113509F089 +:10E83000BBC4F6C1163509F422C2193509F0B4C4B7 +:10E84000A8C387E791EE62E00F94EBF110920A0201 +:10E8500010920B0210920C0210920D0210920E02F6 +:10E8600010920F02109210021092110200C18BE65A +:10E8700091EE62E00F94EBF186EE92EE60E00F9481 +:10E88000EBF186EC92EE60E00F94D0F183E392EE30 +:10E8900060E00F94EBF187EB92EE60E00F94D0F123 +:10E8A00087E093EE60E00F94EBF188EA92EE60E08F +:10E8B0000F94D0F186E090E061E070E00F9412F2E6 +:10E8C0000F94E4F18AE892EE60E00F94D0F187E2D1 +:10E8D00092EE60E00F94EBF189E992EE60E00F9424 +:10E8E000D0F18DE292EE60E00F94EBF18BE792EEC7 +:10E8F00060E00F94D0F18EE10F94FCF188E90F9461 +:10E90000FCF181E00F94FCF10F94E4F18CE692EEBF +:10E9100060E00F94D0F119E0E0E0F0E010935700D0 +:10E9200084910F94FCF10F94E4F18DE592EE60E098 +:10E930000F94D0F1E3E0F0E01093570084910F942E +:10E94000FCF10F94E4F18EE492EE60E00F94D0F1CC +:10E95000E2E0F0E01093570084910F94FCF10F94E3 +:10E96000E4F18FE392EE60E00F94D0F1E1E0F0E0AB +:10E970001093570084910F94FCF10F94E4F11FCF92 +:10E980008DE591EE62E00F94EBF18FE991EE60E09E +:10E990000F94EBF10F94E4F1EE24FF2412C0C701B1 +:10E9A000612F0F9489FC112331F48BEA91EE60E022 +:10E9B0000F94D0F103C0812F0F94B5F10894E11C9E +:10E9C000F11CC7018A519D41A0E0B0E0ABBFFC0142 +:10E9D00017911A3229F0E0E0EE16E2E0FE06F9F6B1 +:10E9E0000F94E4F10F94E4F184E991EE60E00F9468 +:10E9F000EBF10F94E4F1CC24DD24EE24FF2416C0C7 +:10EA0000C7010F9481FC182F882331F48BEA91EE13 +:10EA100060E00F94D0F102C00F94B5F1101719F017 +:10EA20000894C11CD11C0894E11CF11C87010A51F7 +:10EA30001D4120E030E02BBFF80107910A3229F098 +:10EA4000F0E0EF16F2E0FF06D9F60F94E4F10F9430 +:10EA5000E4F188E891EE60E00F94D0F1C60161E046 +:10EA600070E00F9412F20F94E4F10F94E4F110921D +:10EA700006021092070210920802109209029FCE1D +:10EA800081E591EE62E00F94EBF1279A2F9A0AC08C +:10EA90002F9884E690E00F94C1F12F9A84E690E0DD +:10EAA0000F94C1F18091C00087FFF2CF77C383E458 +:10EAB00091EE62E00F94EBF1409106025091070253 +:10EAC000609108027091090281E00F945CF28091DC +:10EAD000060290910702A0910802B09109028050AD +:10EAE0009F4FAF4FBF4F8093060290930702A093B2 +:10EAF0000802B0930902803000E1900700E0A0070F +:10EB000000E0B00708F45BCEB2CF86E391EE62E09E +:10EB10000F94EBF140910A0250910B0260910C02AC +:10EB200070910D0280E00F945CF280910A02909146 +:10EB30000B02A0910C02B0910D0280509F4FAF4F7D +:10EB4000BF4F80930A0290930B02A0930C02B093E4 +:10EB50000D0235CE8FE291EE62E00F94EBF187E784 +:10EB600091EE60E00F94EBF18BE691EE60E00F9494 +:10EB7000EBF18DE591EE60E00F94EBF181E591EE24 +:10EB800060E00F94EBF183E491EE60E00F94EBF121 +:10EB900086E391EE60E00F94EBF18FE291EE60E09E +:10EBA0000F94EBF18EE191EE60E00F94EBF187E1D1 +:10EBB00091EE60E00F94EBF18CE091EE60E00F9449 +:10EBC000EBF183EF90EE60E00F94EBF186EE90EEC8 +:10EBD000F3CD8EE191EE62E00F94EBF181E40F94BE +:10EBE0004EF282E40F944EF283E40F944EF284E4EA +:10EBF0000F944EF285E40F944EF286E40F944EF299 +:10EC000087E40F944EF288E40F944EF28AE40F9456 +:10EC10004EF28BE40F944EF28CE40F944EF2CFCD73 +:10EC200087E191EE62E00F94EBF122243324442437 +:10EC3000439413C38CE091EE62E00F94EBF14091AA +:10EC40000E0250910F02609110027091110282E049 +:10EC50000F945CF280910E0290910F02A09110022D +:10EC6000B091110280509F4FAF4FBF4F80930E0263 +:10EC700090930F02A0931002B0931102A0CD83EFE6 +:10EC800090EE62E00F94EBF187E093EE60E00F947A +:10EC9000EBF182EF91EE60E00F94EBF1C75DDE4F98 +:10ECA00019821882C952D140442455243201A3014B +:10ECB00092015695479537952795CF5CDE4F28836F +:10ECC00039834A835B83C153D140C75DDE4F48819E +:10ECD0005981C952D1404F5F5F4FC75DDE4F5983A5 +:10ECE0004883C952D140CA0162E070E00F9412F229 +:10ECF00080E20F94B5F18DE20F94B5F180E20F94AC +:10ED0000B5F180E00F94FCF1CF5CDE4F8881C153F8 +:10ED1000D1400F94FCF180E20F94B5F18DE30F9494 +:10ED2000B5F180E20F94B5F16BBEF2018790682DCA +:10ED300070E080E090E0C35DDE4F688379838A8372 +:10ED40009B83CD52D140D301C2010196A11DB11DBB +:10ED5000ABBFFC018791082F10E020E030E0CB5CD6 +:10ED6000DE4F088319832A833B83C553D140930127 +:10ED700082010D5F1F4F2F4F3F4FB301A2014E5F26 +:10ED80005F4F6F4F7F4F6BBFFA01379044E050E009 +:10ED900060E070E0440E551E661E771E2BBFF80122 +:10EDA0001791CB5CDE4F288139814A815B81C55345 +:10EDB000D140CC24D22EE32EF42EC35DDE4F488109 +:10EDC00059816A817B81CD52D140C40ED51EE61E89 +:10EDD000F71E0F94FCF180E20F94B5F1882D0F948B +:10EDE000FCF180E20F94B5F1812F0F94FCF180E2E9 +:10EDF0000F94B5F1832D0F94FCF180E20F94B5F1DF +:10EE00005FEFC5165FEFD50650E0E50650E0F5066A +:10EE100031F488EE91EE60E00F94D0F1ADC0D701EF +:10EE2000C6018070907CA070B070803060EC960756 +:10EE300060E0A60760E0B60701F57FEF872E7FE36D +:10EE4000972EA12CB12C8C209D20AE20BF20CF5C12 +:10EE5000DE4FC880D980EA80FB80C153D140C80C06 +:10EE6000D91CEA1CFB1CCC0CDD1CEE1CFF1C81EE2B +:10EE700091EE60E00F94D0F16AC0D701C6018E70A8 +:10EE80009E7FA070B0708C3074E9970770E0A70780 +:10EE900070E0B70709F070C0812F90E0A0E0B0E00B +:10EEA0008824982EA92EBA2E830C911CA11CB11C6B +:10EEB000C35DDE4F88819981AA81BB81CD52D1404B +:10EEC00081709070A070B070DC0199278827880E3F +:10EED000991EAA1EBB1EC35DDE4F88819981AA813F +:10EEE000BB81CD52D140807F9070A070B07041E165 +:10EEF000880F991FAA1FBB1F4A95D1F7880E991E2C +:10EF0000AA1EBB1ECB5CDE4F88819981AA81BB8182 +:10EF1000C553D14081709070A070B07055E1880FDA +:10EF2000991FAA1FBB1F5A95D1F7880E991EAA1EBA +:10EF3000BB1E75016401CC0CDD1CEE1CFF1C8CEDAE +:10EF400091EE60E00F94D0F18A2D0F94FCF1892DA1 +:10EF50000F94FCF1882D0F94FCF180E20F94B5F131 +:10EF60008EE30F94B5F18E2D0F94FCF18D2D0F943F +:10EF7000FCF18C2D0F94FCF10F94E4F1C75DDE4F92 +:10EF800008811981C952D1400933110509F08FCE8A +:10EF900016CC86EE90EE62E00F94EBF181ED91EEEF +:10EFA00060E00F94D0F10F9447F2182F1F75812F56 +:10EFB0000F94B5F10F94E4F1812F81548A3108F058 +:10EFC000F0C0163409F477C0173490F4133409F400 +:10EFD00042C0143430F41134F1F0123409F0DBC0C3 +:10EFE0002AC0143409F447C0153409F0D4C053C002 +:10EFF0001A3409F494C01B3438F4173409F46BC084 +:10F00000183409F0C8C077C01B3409F49CC01C3404 +:10F0100009F0C1C0ACC08FEF81B907C082B1809543 +:10F0200082B988EC90E00F94C1F18091C00087FF15 +:10F03000F5CF12B8B3C08FEF84B907C085B1809502 +:10F0400085B988EC90E00F94C1F18091C00087FFF2 +:10F05000F5CF15B8A3C08FEF87B907C088B18095E9 +:10F0600088B988EC90E00F94C1F18091C00087FFCF +:10F07000F5CF18B893C08FEF8AB907C08BB18095D0 +:10F080008BB988EC90E00F94C1F18091C00087FFAC +:10F09000F5CF1BB883C08FEF8DB907C08EB18095B7 +:10F0A0008EB988EC90E00F94C1F18091C00087FF89 +:10F0B000F5CF1EB873C08FEF80BB07C081B38095BA +:10F0C00081BB88EC90E00F94C1F18091C00087FF74 +:10F0D000F5CF11BA63C08FEF83BB07C084B38095AF +:10F0E00084BB88EC90E00F94C1F18091C00087FF51 +:10F0F000F5CF14BA53C08FEF8093010109C08091FE +:10F10000020180958093020188EC90E00F94C1F198 +:10F110008091C00087FFF3CF109202013FC08FEFB4 +:10F120008093040109C080910501809580930501B9 +:10F1300088EC90E00F94C1F18091C00087FFF3CF7D +:10F14000109205012BC08FEF8093070109C08091B9 +:10F15000080180958093080188EC90E00F94C1F13C +:10F160008091C00087FFF3CF1092080117C08FEF86 +:10F1700080930A0109C080910B01809580930B0157 +:10F1800088EC90E00F94C1F18091C00087FFF3CF2D +:10F1900010920B0103C08EEB91EE0ECB0F9447F251 +:10F1A0000ECB8DEA91EE08CB85ED92EE05CB60E0BB +:10F1B00070E02330F9F0243028F4213071F022304F +:10F1C000A0F407C0253029F12530D8F02630A1F56C +:10F1D0002FC03B3109F07CCA40C3C326CA5DDE4F55 +:10F1E0003883C652D14022E073CA532F40E0C32671 +:10F1F00023E06ECA832F90E0482B592BC32624E0CE +:10F2000067CA3E3009F02EC3C32600E010E025E0B7 +:10F210005FCAE1E0F0E0EC0FFD1FE00FF11F30836B +:10F220000F5F1F4FC3260417150709F051CA1DC3EE +:10F230003C1509F017C303C0273009F049CA1B0168 +:10F24000C95DDE4FF982E882C752D140C55DDE4F0D +:10F2500019830883CB52D14044249981933109F416 +:10F260000AC19431C8F4963009F4D0C0973050F4F4 +:10F27000923009F4FEC0933009F46AC0913009F06D +:10F2800048C24FC0913109F470C0923108F0B0C04B +:10F29000903109F03EC2EDC0983109F483C0993134 +:10F2A00050F4953109F4E7C0953108F4B4C19631B2 +:10F2B00009F02FC2B0C19A3109F467C09A3108F43D +:10F2C00085C09B3109F454C09D3109F022C28D8163 +:10F2D000803339F49F819923A9F09130A9F4E8E9AA +:10F2E00016C0982F907591F0803519F4E0E0F0E0A9 +:10F2F00004C0883559F4E3E0F0E099E090935700BA +:10F30000E49105C0EEE103C0E1E001C0E0E01A8253 +:10F310001B828C831D82EE831F8207E0E02EF12C7E +:10F32000FDC11A8288E08B8381E48C8386E58D831E +:10F3300082E58E8389E48F8383E5888780E58987EA +:10F340008FE58A8782E38B871BE0E12EF12CE6C1F3 +:10F35000EA81E059E33028F4F0E0E050FE4F80818C +:10F3600001C080E01A828B833FC04424439481C053 +:10F370008D81882321F0813021F488E903C08EE15A +:10F3800001C081E01A828B8308C01A82E1E0F0E0BC +:10F3900089E080935700E491EB831C82B4E0EB2E6C +:10F3A000F12CBCC18B81803549F48C81883019F4F3 +:10F3B000E2E0F0E005C0E0E0F0E002C0E3E0F0E011 +:10F3C00089E080935700E4911A82E6CF8D81836CA7 +:10F3D00099E0E1E0F0E0082E90935700E89507B639 +:10F3E00000FCFDCF1A821B82A3E0EA2EF12C96C10D +:10F3F00080EC8A83F2E0EF2EF12CCE5DDE4F188296 +:10F4000019821A821B82C252D14088C18A8190E03F +:10F41000A0E0B0E0582F4427332722278B8190E0CB +:10F42000A0E0B0E0DC0199278827282B392B4A2B54 +:10F430005B2B8D8190E0A0E0B0E0282B392B4A2B8C +:10F440005B2B8C8190E0A0E0B0E0BA2FA92F982F21 +:10F450008827282B392B4A2B5B2B220F331F441F65 +:10F46000551FC25EDE4F288339834A835B83CE51AA +:10F47000D1401A8250C13A81C65CDE4F3883CA53EC +:10F48000D140C75CDE4F1882C953D1402B8130E098 +:10F49000C75CDE4F08811981C953D140202B312B25 +:10F4A000933109F079C0CE5DDE4F488159816A8180 +:10F4B0007B81C252D140403080EC580783E068071E +:10F4C00080E07807F0F483E0FA0160935B008093BA +:10F4D0005700E89507B600FCFDCFCE5DDE4F4881B2 +:10F4E00059816A817B81C252D14040505F4F6F4F3A +:10F4F0007F4FCE5DDE4F488359836A837B83C25240 +:10F50000D1408B85DE011D96C25EDE4F4881598158 +:10F510006A817B81CE51D14011E0FD01319790810C +:10F52000C45CDE4F9883CC53D140C55CDE4F18825B +:10F53000CB53D14090E0C55CDE4FE881F981CB53DD +:10F54000D1408E2B9F2B0C01FA0160935B0010932E +:10F550005700E89511244E5F5F4F6F4F7F4F225049 +:10F56000304019F08C911296D8CF85E0C25EDE4F04 +:10F57000088119812A813B81CE51D140F801209325 +:10F580005B0080935700E89507B600FCFDCF81E152 +:10F5900080935700E89535C0F901C25EDE4F48817F +:10F5A00059816A817B81CE51D1408E01055F1F4F09 +:10F5B00041BDBB27A72F962F852F82BD4F5F5F4F81 +:10F5C0006F4F7F4FD8018D918D0180BDFA9AF99AC6 +:10F5D000F999FECF319761F7C9010197AC0160E05D +:10F5E00070E04F5F5F4F6F4F7F4FC25EDE4F08810D +:10F5F00019812A813B81CE51D140400F511F621F9A +:10F60000731F1A82C25EDE4F488359836A837B83ED +:10F61000CE51D14080C01A81C25CDE4F1883CE53D8 +:10F62000D140C35CDE4F1882CD53D1402B8130E0F6 +:10F63000C35CDE4F08811981CD53D140202B312B83 +:10F64000B3E0EB2EF12CE20EF31E1A82943119F581 +:10F65000DE011396C25EDE4F488159816A817B814B +:10F66000CE51D1406BBFFA01879196918C93119640 +:10F670009C93119712964E5F5F4F6F4F7F4F2250B2 +:10F68000304081F7C25EDE4F488359836A837B83B3 +:10F69000CE51D1403CC0F901C25EDE4F4881598154 +:10F6A0006A817B81CE51D1408E010D5F1F4F41BDDC +:10F6B000BB27A72F962F852F82BD4F5F5F4F6F4FC0 +:10F6C0007F4FF89A80B5D8018D938D01319779F7E6 +:10F6D000C9010197A0E0B0E00196A11DB11DC25E75 +:10F6E000DE4F488159816A817B81CE51D140480FDC +:10F6F000591F6A1F7B1FC25EDE4F488359836A838E +:10F700007B83CE51D140DE011396A20FB31F1C9212 +:10F7100005C080EC8A8332E0E32EF12C8BE10F945C +:10F72000B5F1CA5DDE4F8881C652D1400F94B5F164 +:10F730008F2D0F94B5F18E2D0F94B5F18EE00F94AF +:10F74000B5F125E1C22ECA5DDE4F2881C652D140F7 +:10F75000C226CE24CF244E010894811C911C0AC0DD +:10F76000D4011D914D01812F0F94B5F1C12608944C +:10F77000E108F108E114F10499F78C2D0F94B5F12B +:10F78000CA5DDE4F0881C652D1400F5FCA5DDE4FB1 +:10F790000883C652D14085B1805885B9442009F00C +:10F7A00048C080E090E033C0C95DDE4F1982188206 +:10F7B000C752D140EE24FF242224CC24C55DDE4F65 +:10F7C00019821882CB52D140CE5DDE4F1882198249 +:10F7D0001A821B82C252D140C25EDE4F1882198249 +:10F7E0001A821B82CE51D14020E030E0A9014BBFEC +:10F7F000F90147915691C15CDE4F59834883CF533D +:10F80000D140CA5DDE4F2882C652D140170140E088 +:10F8100050E020E0B101C95DDE4FE880F980C752B9 +:10F82000D140C55DDE4F08811981CB52D1400D9486 +:10F830006AF327982F9884E690E00F94C1F10000B6 +:10F840008091C0008D7F8093C00081E1809357003C +:10F85000E895EE27FF270994FFCF9BE1C92E21E011 +:10F860000D9468F320E00D9468F326E00D9468F39E +:10F8700097FB092E07260AD077FD04D02ED006D09C +:10F8800000201AF4709561957F4F0895F6F79095D2 +:10F8900081959F4F0895A1E21A2EAA1BBB1BFD0163 +:10F8A0000DC0AA1FBB1FEE1FFF1FA217B307E4075F +:10F8B000F50720F0A21BB30BE40BF50B661F771FB7 +:10F8C000881F991F1A9469F7609570958095909597 +:10F8D0009B01AC01BD01CF010895AA1BBB1B51E1E7 +:10F8E00007C0AA1FBB1FA617B70710F0A61BB70BB0 +:10F8F000881F991F5A95A9F780959095BC01CD0155 +:10F900000895F999FECF92BD81BDF89A992780B5E7 +:10F910000895262FF999FECF1FBA92BD81BD20BD53 +:10F920000FB6F894FA9AF99A0FBE01960895F894D2 +:02F93000FFCF07 +:04F932000F020A00B6 +:040000033000E000E9 +:00000001FF From 1066766bfa4d885b6af01b9435eb5e015b853874 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 7 Mar 2013 22:00:26 +0100 Subject: [PATCH 4/6] Mega2560 bootloader: fix wrong eeprom addressing --- .../arduino/bootloaders/stk500v2/stk500boot.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/hardware/arduino/bootloaders/stk500v2/stk500boot.c b/hardware/arduino/bootloaders/stk500v2/stk500boot.c index 3e8becc9599..104ab3bf938 100755 --- a/hardware/arduino/bootloaders/stk500v2/stk500boot.c +++ b/hardware/arduino/bootloaders/stk500v2/stk500boot.c @@ -1021,13 +1021,14 @@ int main(void) else { //* issue 543, this should work, It has not been tested. - // #if (!defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__) && !defined(__AVR_ATmega2561__) && !defined(__AVR_ATmega1284P__) && !defined(__AVR_ATmega640__)) - #if (defined(EEARL) && defined(EEARH) && defined(EEMWE) && defined(EEWE) && defined(EEDR)) + #if (defined(EEARL) && defined(EEARH) && defined(EEMWE) && defined(EEWE) && defined(EEDR)) + uint16_t ii = address >> 1; /* write EEPROM */ do { - EEARL = address; // Setup EEPROM address - EEARH = (address >> 8); - address++; // Select next EEPROM byte + EEARL = ii; // Setup EEPROM address + EEARH = (ii >> 8); + address+=2; // Select next EEPROM byte + ii++; EEDR = *p++; // get byte from buffer EECR |= (1< Date: Thu, 7 Mar 2013 22:09:41 +0100 Subject: [PATCH 5/6] Mega2560 bootloader: use avr library functions for writing into EEPROM --- .../arduino/bootloaders/stk500v2/stk500boot.c | 19 +- .../stk500v2/stk500boot_v2_mega2560.hex | 871 ++++++++++-------- 2 files changed, 471 insertions(+), 419 deletions(-) mode change 100755 => 100644 hardware/arduino/bootloaders/stk500v2/stk500boot.c diff --git a/hardware/arduino/bootloaders/stk500v2/stk500boot.c b/hardware/arduino/bootloaders/stk500v2/stk500boot.c old mode 100755 new mode 100644 index 104ab3bf938..e7494df037b --- a/hardware/arduino/bootloaders/stk500v2/stk500boot.c +++ b/hardware/arduino/bootloaders/stk500v2/stk500boot.c @@ -1020,24 +1020,15 @@ int main(void) } else { - //* issue 543, this should work, It has not been tested. - #if (defined(EEARL) && defined(EEARH) && defined(EEMWE) && defined(EEWE) && defined(EEDR)) + //* issue 543, this should work, It has not been tested. uint16_t ii = address >> 1; /* write EEPROM */ - do { - EEARL = ii; // Setup EEPROM address - EEARH = (ii >> 8); + while (size) { + eeprom_write_byte((uint8_t*)ii, *p++); address+=2; // Select next EEPROM byte ii++; - - EEDR = *p++; // get byte from buffer - EECR |= (1< Date: Thu, 7 Mar 2013 22:12:28 +0100 Subject: [PATCH 6/6] Fixed permissions --- hardware/arduino/bootloaders/stk500v2/License.txt | 0 hardware/arduino/bootloaders/stk500v2/Makefile | 0 hardware/arduino/bootloaders/stk500v2/STK500V2.pnproj | 0 hardware/arduino/bootloaders/stk500v2/STK500V2.pnps | 0 hardware/arduino/bootloaders/stk500v2/command.h | 0 hardware/arduino/bootloaders/stk500v2/stk500boot.ppg | 0 6 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 hardware/arduino/bootloaders/stk500v2/License.txt mode change 100755 => 100644 hardware/arduino/bootloaders/stk500v2/Makefile mode change 100755 => 100644 hardware/arduino/bootloaders/stk500v2/STK500V2.pnproj mode change 100755 => 100644 hardware/arduino/bootloaders/stk500v2/STK500V2.pnps mode change 100755 => 100644 hardware/arduino/bootloaders/stk500v2/command.h mode change 100755 => 100644 hardware/arduino/bootloaders/stk500v2/stk500boot.ppg diff --git a/hardware/arduino/bootloaders/stk500v2/License.txt b/hardware/arduino/bootloaders/stk500v2/License.txt old mode 100755 new mode 100644 diff --git a/hardware/arduino/bootloaders/stk500v2/Makefile b/hardware/arduino/bootloaders/stk500v2/Makefile old mode 100755 new mode 100644 diff --git a/hardware/arduino/bootloaders/stk500v2/STK500V2.pnproj b/hardware/arduino/bootloaders/stk500v2/STK500V2.pnproj old mode 100755 new mode 100644 diff --git a/hardware/arduino/bootloaders/stk500v2/STK500V2.pnps b/hardware/arduino/bootloaders/stk500v2/STK500V2.pnps old mode 100755 new mode 100644 diff --git a/hardware/arduino/bootloaders/stk500v2/command.h b/hardware/arduino/bootloaders/stk500v2/command.h old mode 100755 new mode 100644 diff --git a/hardware/arduino/bootloaders/stk500v2/stk500boot.ppg b/hardware/arduino/bootloaders/stk500v2/stk500boot.ppg old mode 100755 new mode 100644