diff options
author | Martyn Ranyard <ranyardm@gmail.com> | 2012-11-02 21:45:58 +0000 |
---|---|---|
committer | Cristian Maglie <c.maglie@arduino.cc> | 2015-07-14 12:55:22 +0200 |
commit | d76d58a12e6982c54ca8a1d51b96fb9f864fc569 (patch) | |
tree | f389796f3a514ac7d876059885d17ce4a9006800 | |
parent | 10da8ab42f635b96bb848574e446bf32a9e4165b (diff) |
Bootloaders: adds support for 328-nonp chips
-rw-r--r-- | bootloaders/atmega/ATmegaBOOT_168.c | 21 | ||||
-rwxr-xr-x | bootloaders/atmega/Makefile | 25 | ||||
-rw-r--r-- | bootloaders/bt/ATmegaBOOT_168.c | 21 | ||||
-rw-r--r-- | bootloaders/optiboot/optiboot.c | 2 | ||||
-rw-r--r-- | bootloaders/optiboot/pin_defs.h | 2 | ||||
-rw-r--r-- | bootloaders/stk500v2/avrinterruptnames.h | 8 |
6 files changed, 52 insertions, 27 deletions
diff --git a/bootloaders/atmega/ATmegaBOOT_168.c b/bootloaders/atmega/ATmegaBOOT_168.c index 90899a2..d0d4dab 100644 --- a/bootloaders/atmega/ATmegaBOOT_168.c +++ b/bootloaders/atmega/ATmegaBOOT_168.c @@ -73,7 +73,7 @@ /* the current avr-libc eeprom functions do not support the ATmega168 */
/* own eeprom write/read functions are used instead */
-#if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__)
+#if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__) || !defined(__AVR_ATmega328__)
#include <avr/eeprom.h>
#endif
@@ -202,6 +202,11 @@ #define SIG3 0x0F
#define PAGE_SIZE 0x40U //64 words
+#elif defined __AVR_ATmega328__
+#define SIG2 0x95
+#define SIG3 0x14
+#define PAGE_SIZE 0x40U //64 words
+
#elif defined __AVR_ATmega162__
#define SIG2 0x94
#define SIG3 0x04
@@ -367,7 +372,7 @@ int main(void) UBRRHI = (F_CPU/(BAUD_RATE*16L)-1) >> 8;
UCSRA = 0x00;
UCSRB = _BV(TXEN)|_BV(RXEN);
-#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
+#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__)
#ifdef DOUBLE_SPEED
UCSR0A = (1<<U2X0); //Double speed mode USART0
@@ -556,7 +561,7 @@ int main(void) if (flags.eeprom) { //Write to EEPROM one byte at a time
address.word <<= 1;
for(w=0;w<length.word;w++) {
-#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
+#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
while(EECR & (1<<EEPE));
EEAR = (uint16_t)(void *)address.word;
EEDR = buff[w];
@@ -677,7 +682,7 @@ int main(void) "rjmp write_page \n\t"
"block_done: \n\t"
"clr __zero_reg__ \n\t" //restore zero register
-#if defined __AVR_ATmega168__ || __AVR_ATmega328P__ || __AVR_ATmega128__ || __AVR_ATmega1280__ || __AVR_ATmega1281__
+#if defined __AVR_ATmega168__ || __AVR_ATmega328P__ || __AVR_ATmega328__ || __AVR_ATmega128__ || __AVR_ATmega1280__ || __AVR_ATmega1281__
: "=m" (SPMCSR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31"
#else
: "=m" (SPMCR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31"
@@ -710,7 +715,7 @@ int main(void) putch(0x14);
for (w=0;w < length.word;w++) { // Can handle odd and even lengths okay
if (flags.eeprom) { // Byte access EEPROM read
-#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
+#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
while(EECR & (1<<EEPE));
EEAR = (uint16_t)(void *)address.word;
EECR |= (1<<EERE);
@@ -926,7 +931,7 @@ void putch(char ch) while (!(UCSR1A & _BV(UDRE1)));
UDR1 = ch;
}
-#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
+#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__)
while (!(UCSR0A & _BV(UDRE0)));
UDR0 = ch;
#else
@@ -964,7 +969,7 @@ char getch(void) return UDR1;
}
return 0;
-#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
+#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__)
uint32_t count = 0;
while(!(UCSR0A & _BV(RXC0))){
/* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/
@@ -1001,7 +1006,7 @@ void getNch(uint8_t count) while(!(UCSR1A & _BV(RXC1)));
UDR1;
}
-#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
+#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__)
getch();
#else
/* m8,16,32,169,8515,8535,163 */
diff --git a/bootloaders/atmega/Makefile b/bootloaders/atmega/Makefile index 52e486b..efe92e6 100755 --- a/bootloaders/atmega/Makefile +++ b/bootloaders/atmega/Makefile @@ -50,7 +50,7 @@ STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt OBJ = $(PROGRAM).o OPTIMIZE = -Os -DEFS = +DEFS = LIBS = CC = avr-gcc @@ -128,7 +128,7 @@ pro20_isp: isp diecimila: TARGET = diecimila diecimila: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -diecimila: AVR_FREQ = 16000000L +diecimila: AVR_FREQ = 16000000L diecimila: $(PROGRAM)_diecimila.hex diecimila_isp: diecimila @@ -153,7 +153,7 @@ ng_isp: isp atmega328: TARGET = atmega328 atmega328: MCU_TARGET = atmega328p atmega328: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600 -atmega328: AVR_FREQ = 16000000L +atmega328: AVR_FREQ = 16000000L atmega328: LDSECTION = --section-start=.text=0x7800 atmega328: $(PROGRAM)_atmega328.hex @@ -165,10 +165,25 @@ atmega328_isp: LFUSE = FF atmega328_isp: EFUSE = 05 atmega328_isp: isp +atmega328_notp: TARGET = atmega328_notp +atmega328_notp: MCU_TARGET = atmega328 +atmega328_notp: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600 +atmega328_notp: AVR_FREQ = 16000000L +atmega328_notp: LDSECTION = --section-start=.text=0x7800 +atmega328_notp: $(PROGRAM)_atmega328_notp.hex + +atmega328_notp_isp: atmega328_notp +atmega328_notp_isp: TARGET = atmega328 +atmega328_notp_isp: MCU_TARGET = atmega328 +atmega328_notp_isp: HFUSE = DA +atmega328_notp_isp: LFUSE = FF +atmega328_notp_isp: EFUSE = 05 +atmega328_notp_isp: isp + atmega328_pro8: TARGET = atmega328_pro_8MHz atmega328_pro8: MCU_TARGET = atmega328p atmega328_pro8: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600 -DDOUBLE_SPEED -atmega328_pro8: AVR_FREQ = 8000000L +atmega328_pro8: AVR_FREQ = 8000000L atmega328_pro8: LDSECTION = --section-start=.text=0x7800 atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.hex @@ -183,7 +198,7 @@ atmega328_pro8_isp: isp mega: TARGET = atmega1280 mega: MCU_TARGET = atmega1280 mega: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=0' -DBAUD_RATE=57600 -mega: AVR_FREQ = 16000000L +mega: AVR_FREQ = 16000000L mega: LDSECTION = --section-start=.text=0x1F000 mega: $(PROGRAM)_atmega1280.hex diff --git a/bootloaders/bt/ATmegaBOOT_168.c b/bootloaders/bt/ATmegaBOOT_168.c index c73eefa..7ce2832 100644 --- a/bootloaders/bt/ATmegaBOOT_168.c +++ b/bootloaders/bt/ATmegaBOOT_168.c @@ -79,7 +79,7 @@ /* the current avr-libc eeprom functions do not support the ATmega168 */ /* own eeprom write/read functions are used instead */ -#if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__) +#if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__) || !defined(__AVR_ATmega328__) #include <avr/eeprom.h> #endif @@ -194,6 +194,11 @@ #define SIG3 0x0F #define PAGE_SIZE 0x40U //64 words +#elif defined __AVR_ATmega328__ +#define SIG2 0x95 +#define SIG3 0x14 +#define PAGE_SIZE 0x40U //64 words + #elif defined __AVR_ATmega162__ #define SIG2 0x94 #define SIG3 0x04 @@ -335,7 +340,7 @@ int main(void) UBRRHI = (F_CPU/(BAUD_RATE*16L)-1) >> 8; UCSRA = 0x00; UCSRB = _BV(TXEN)|_BV(RXEN); -#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) +#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) UBRR0H = ((F_CPU / 16 + BAUD_RATE / 2) / BAUD_RATE - 1) >> 8; UBRR0L = ((F_CPU / 16 + BAUD_RATE / 2) / BAUD_RATE - 1); @@ -557,7 +562,7 @@ putch(0x0D); if (getch() == ' ') { if (flags.eeprom) { //Write to EEPROM one byte at a time for(w=0;w<length.word;w++) { -#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) while(EECR & (1<<EEPE)); EEAR = (uint16_t)(void *)address.word; EEDR = buff[w]; @@ -675,7 +680,7 @@ putch(0x0D); "rjmp write_page \n\t" "block_done: \n\t" "clr __zero_reg__ \n\t" //restore zero register -#if defined __AVR_ATmega168__ || __AVR_ATmega328P__ +#if defined __AVR_ATmega168__ || __AVR_ATmega328P__ || __AVR_ATmega_328__ : "=m" (SPMCSR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31" #else : "=m" (SPMCR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31" @@ -707,7 +712,7 @@ putch(0x0D); putch(0x14); for (w=0;w < length.word;w++) { // Can handle odd and even lengths okay if (flags.eeprom) { // Byte access EEPROM read -#if defined __AVR_ATmega168__ || __AVR_ATmega328P__ +#if defined __AVR_ATmega168__ || __AVR_ATmega328P__ || __AVR_ATmega328__ while(EECR & (1<<EEPE)); EEAR = (uint16_t)(void *)address.word; EECR |= (1<<EERE); @@ -921,7 +926,7 @@ void putch(char ch) while (!(UCSR1A & _BV(UDRE1))); UDR1 = ch; } -#elif defined (__AVR_ATmega168__) || defined(__AVR_ATmega328P__) +#elif defined (__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) while (!(UCSR0A & _BV(UDRE0))); UDR0 = ch; #else @@ -944,7 +949,7 @@ char getch(void) return UDR1; } return 0; -#elif defined (__AVR_ATmega168__) || defined(__AVR_ATmega328P__) +#elif defined (__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) uint32_t count = 0; while(!(UCSR0A & _BV(RXC0))){ /* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/ @@ -982,7 +987,7 @@ void getNch(uint8_t count) while(!(UCSR1A & _BV(RXC1))); UDR1; } -#elif (defined __AVR_ATmega168__) || defined(__AVR_ATmega328P__) +#elif (defined __AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) while(!(UCSR0A & _BV(RXC0))); UDR0; #else diff --git a/bootloaders/optiboot/optiboot.c b/bootloaders/optiboot/optiboot.c index 41545b7..bd3a1db 100644 --- a/bootloaders/optiboot/optiboot.c +++ b/bootloaders/optiboot/optiboot.c @@ -231,7 +231,7 @@ void appStart() __attribute__ ((naked)); #if defined(__AVR_ATmega168__) #define RAMSTART (0x100) #define NRWWSTART (0x3800) -#elif defined(__AVR_ATmega328P__) +#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) #define RAMSTART (0x100) #define NRWWSTART (0x7000) #elif defined (__AVR_ATmega644P__) diff --git a/bootloaders/optiboot/pin_defs.h b/bootloaders/optiboot/pin_defs.h index 27d7772..61ce64e 100644 --- a/bootloaders/optiboot/pin_defs.h +++ b/bootloaders/optiboot/pin_defs.h @@ -1,4 +1,4 @@ -#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega88) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__) +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega88) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__) /* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duemilanove */ #define LED_DDR DDRB #define LED_PORT PORTB diff --git a/bootloaders/stk500v2/avrinterruptnames.h b/bootloaders/stk500v2/avrinterruptnames.h index f862f9a..e7e3ed9 100644 --- a/bootloaders/stk500v2/avrinterruptnames.h +++ b/bootloaders/stk500v2/avrinterruptnames.h @@ -327,8 +327,8 @@ //************************************************************************************************** -#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) -#pragma mark __AVR_ATmega168__ / __AVR_ATmega328P__ +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) +#pragma mark __AVR_ATmega168__ / __AVR_ATmega328P__ / __AVR_ATmega328__ #define _INTERRUPT_NAMES_DEFINED_ @@ -496,8 +496,8 @@ PGM_P gInterruptNameTable[] PROGMEM = //************************************************************************************************** -#if defined(__AVR_ATmega324P__ ) || defined(__AVR_ATmega644__ ) || defined(__AVR_ATmega644P__) -#pragma mark __AVR_ATmega324P__ __AVR_ATmega644__ __AVR_ATmega644P__ +#if defined(__AVR_ATmega324P__ ) || defined(__AVR_ATmega644__ ) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) +#pragma mark __AVR_ATmega324P__ __AVR_ATmega644__ __AVR_ATmega644P__ __AVR_ATmega1284P__ #define _INTERRUPT_NAMES_DEFINED_ |