Skip to content

Commit d76d58a

Browse files
iMartyncmaglie
authored andcommitted
Bootloaders: adds support for 328-nonp chips
1 parent 10da8ab commit d76d58a

File tree

6 files changed

+52
-27
lines changed

6 files changed

+52
-27
lines changed

bootloaders/atmega/ATmegaBOOT_168.c

+13-8
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373

7474
/* the current avr-libc eeprom functions do not support the ATmega168 */
7575
/* own eeprom write/read functions are used instead */
76-
#if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__)
76+
#if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__) || !defined(__AVR_ATmega328__)
7777
#include <avr/eeprom.h>
7878
#endif
7979

@@ -202,6 +202,11 @@
202202
#define SIG3 0x0F
203203
#define PAGE_SIZE 0x40U //64 words
204204

205+
#elif defined __AVR_ATmega328__
206+
#define SIG2 0x95
207+
#define SIG3 0x14
208+
#define PAGE_SIZE 0x40U //64 words
209+
205210
#elif defined __AVR_ATmega162__
206211
#define SIG2 0x94
207212
#define SIG3 0x04
@@ -367,7 +372,7 @@ int main(void)
367372
UBRRHI = (F_CPU/(BAUD_RATE*16L)-1) >> 8;
368373
UCSRA = 0x00;
369374
UCSRB = _BV(TXEN)|_BV(RXEN);
370-
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
375+
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__)
371376

372377
#ifdef DOUBLE_SPEED
373378
UCSR0A = (1<<U2X0); //Double speed mode USART0
@@ -556,7 +561,7 @@ int main(void)
556561
if (flags.eeprom) { //Write to EEPROM one byte at a time
557562
address.word <<= 1;
558563
for(w=0;w<length.word;w++) {
559-
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
564+
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
560565
while(EECR & (1<<EEPE));
561566
EEAR = (uint16_t)(void *)address.word;
562567
EEDR = buff[w];
@@ -677,7 +682,7 @@ int main(void)
677682
"rjmp write_page \n\t"
678683
"block_done: \n\t"
679684
"clr __zero_reg__ \n\t" //restore zero register
680-
#if defined __AVR_ATmega168__ || __AVR_ATmega328P__ || __AVR_ATmega128__ || __AVR_ATmega1280__ || __AVR_ATmega1281__
685+
#if defined __AVR_ATmega168__ || __AVR_ATmega328P__ || __AVR_ATmega328__ || __AVR_ATmega128__ || __AVR_ATmega1280__ || __AVR_ATmega1281__
681686
: "=m" (SPMCSR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31"
682687
#else
683688
: "=m" (SPMCR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31"
@@ -710,7 +715,7 @@ int main(void)
710715
putch(0x14);
711716
for (w=0;w < length.word;w++) { // Can handle odd and even lengths okay
712717
if (flags.eeprom) { // Byte access EEPROM read
713-
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
718+
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
714719
while(EECR & (1<<EEPE));
715720
EEAR = (uint16_t)(void *)address.word;
716721
EECR |= (1<<EERE);
@@ -926,7 +931,7 @@ void putch(char ch)
926931
while (!(UCSR1A & _BV(UDRE1)));
927932
UDR1 = ch;
928933
}
929-
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
934+
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__)
930935
while (!(UCSR0A & _BV(UDRE0)));
931936
UDR0 = ch;
932937
#else
@@ -964,7 +969,7 @@ char getch(void)
964969
return UDR1;
965970
}
966971
return 0;
967-
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
972+
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__)
968973
uint32_t count = 0;
969974
while(!(UCSR0A & _BV(RXC0))){
970975
/* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/
@@ -1001,7 +1006,7 @@ void getNch(uint8_t count)
10011006
while(!(UCSR1A & _BV(RXC1)));
10021007
UDR1;
10031008
}
1004-
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
1009+
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__)
10051010
getch();
10061011
#else
10071012
/* m8,16,32,169,8515,8535,163 */

bootloaders/atmega/Makefile

+20-5
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt
5050
OBJ = $(PROGRAM).o
5151
OPTIMIZE = -Os
5252

53-
DEFS =
53+
DEFS =
5454
LIBS =
5555

5656
CC = avr-gcc
@@ -128,7 +128,7 @@ pro20_isp: isp
128128

129129
diecimila: TARGET = diecimila
130130
diecimila: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1'
131-
diecimila: AVR_FREQ = 16000000L
131+
diecimila: AVR_FREQ = 16000000L
132132
diecimila: $(PROGRAM)_diecimila.hex
133133

134134
diecimila_isp: diecimila
@@ -153,7 +153,7 @@ ng_isp: isp
153153
atmega328: TARGET = atmega328
154154
atmega328: MCU_TARGET = atmega328p
155155
atmega328: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600
156-
atmega328: AVR_FREQ = 16000000L
156+
atmega328: AVR_FREQ = 16000000L
157157
atmega328: LDSECTION = --section-start=.text=0x7800
158158
atmega328: $(PROGRAM)_atmega328.hex
159159

@@ -165,10 +165,25 @@ atmega328_isp: LFUSE = FF
165165
atmega328_isp: EFUSE = 05
166166
atmega328_isp: isp
167167

168+
atmega328_notp: TARGET = atmega328_notp
169+
atmega328_notp: MCU_TARGET = atmega328
170+
atmega328_notp: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600
171+
atmega328_notp: AVR_FREQ = 16000000L
172+
atmega328_notp: LDSECTION = --section-start=.text=0x7800
173+
atmega328_notp: $(PROGRAM)_atmega328_notp.hex
174+
175+
atmega328_notp_isp: atmega328_notp
176+
atmega328_notp_isp: TARGET = atmega328
177+
atmega328_notp_isp: MCU_TARGET = atmega328
178+
atmega328_notp_isp: HFUSE = DA
179+
atmega328_notp_isp: LFUSE = FF
180+
atmega328_notp_isp: EFUSE = 05
181+
atmega328_notp_isp: isp
182+
168183
atmega328_pro8: TARGET = atmega328_pro_8MHz
169184
atmega328_pro8: MCU_TARGET = atmega328p
170185
atmega328_pro8: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600 -DDOUBLE_SPEED
171-
atmega328_pro8: AVR_FREQ = 8000000L
186+
atmega328_pro8: AVR_FREQ = 8000000L
172187
atmega328_pro8: LDSECTION = --section-start=.text=0x7800
173188
atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.hex
174189

@@ -183,7 +198,7 @@ atmega328_pro8_isp: isp
183198
mega: TARGET = atmega1280
184199
mega: MCU_TARGET = atmega1280
185200
mega: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=0' -DBAUD_RATE=57600
186-
mega: AVR_FREQ = 16000000L
201+
mega: AVR_FREQ = 16000000L
187202
mega: LDSECTION = --section-start=.text=0x1F000
188203
mega: $(PROGRAM)_atmega1280.hex
189204

bootloaders/bt/ATmegaBOOT_168.c

+13-8
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979

8080
/* the current avr-libc eeprom functions do not support the ATmega168 */
8181
/* own eeprom write/read functions are used instead */
82-
#if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__)
82+
#if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__) || !defined(__AVR_ATmega328__)
8383
#include <avr/eeprom.h>
8484
#endif
8585

@@ -194,6 +194,11 @@
194194
#define SIG3 0x0F
195195
#define PAGE_SIZE 0x40U //64 words
196196

197+
#elif defined __AVR_ATmega328__
198+
#define SIG2 0x95
199+
#define SIG3 0x14
200+
#define PAGE_SIZE 0x40U //64 words
201+
197202
#elif defined __AVR_ATmega162__
198203
#define SIG2 0x94
199204
#define SIG3 0x04
@@ -335,7 +340,7 @@ int main(void)
335340
UBRRHI = (F_CPU/(BAUD_RATE*16L)-1) >> 8;
336341
UCSRA = 0x00;
337342
UCSRB = _BV(TXEN)|_BV(RXEN);
338-
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
343+
#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
339344

340345
UBRR0H = ((F_CPU / 16 + BAUD_RATE / 2) / BAUD_RATE - 1) >> 8;
341346
UBRR0L = ((F_CPU / 16 + BAUD_RATE / 2) / BAUD_RATE - 1);
@@ -557,7 +562,7 @@ putch(0x0D);
557562
if (getch() == ' ') {
558563
if (flags.eeprom) { //Write to EEPROM one byte at a time
559564
for(w=0;w<length.word;w++) {
560-
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
565+
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
561566
while(EECR & (1<<EEPE));
562567
EEAR = (uint16_t)(void *)address.word;
563568
EEDR = buff[w];
@@ -675,7 +680,7 @@ putch(0x0D);
675680
"rjmp write_page \n\t"
676681
"block_done: \n\t"
677682
"clr __zero_reg__ \n\t" //restore zero register
678-
#if defined __AVR_ATmega168__ || __AVR_ATmega328P__
683+
#if defined __AVR_ATmega168__ || __AVR_ATmega328P__ || __AVR_ATmega_328__
679684
: "=m" (SPMCSR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31"
680685
#else
681686
: "=m" (SPMCR) : "M" (PAGE_SIZE) : "r0","r16","r17","r24","r25","r28","r29","r30","r31"
@@ -707,7 +712,7 @@ putch(0x0D);
707712
putch(0x14);
708713
for (w=0;w < length.word;w++) { // Can handle odd and even lengths okay
709714
if (flags.eeprom) { // Byte access EEPROM read
710-
#if defined __AVR_ATmega168__ || __AVR_ATmega328P__
715+
#if defined __AVR_ATmega168__ || __AVR_ATmega328P__ || __AVR_ATmega328__
711716
while(EECR & (1<<EEPE));
712717
EEAR = (uint16_t)(void *)address.word;
713718
EECR |= (1<<EERE);
@@ -921,7 +926,7 @@ void putch(char ch)
921926
while (!(UCSR1A & _BV(UDRE1)));
922927
UDR1 = ch;
923928
}
924-
#elif defined (__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
929+
#elif defined (__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
925930
while (!(UCSR0A & _BV(UDRE0)));
926931
UDR0 = ch;
927932
#else
@@ -944,7 +949,7 @@ char getch(void)
944949
return UDR1;
945950
}
946951
return 0;
947-
#elif defined (__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
952+
#elif defined (__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
948953
uint32_t count = 0;
949954
while(!(UCSR0A & _BV(RXC0))){
950955
/* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/
@@ -982,7 +987,7 @@ void getNch(uint8_t count)
982987
while(!(UCSR1A & _BV(RXC1)));
983988
UDR1;
984989
}
985-
#elif (defined __AVR_ATmega168__) || defined(__AVR_ATmega328P__)
990+
#elif (defined __AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
986991
while(!(UCSR0A & _BV(RXC0)));
987992
UDR0;
988993
#else

bootloaders/optiboot/optiboot.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ void appStart() __attribute__ ((naked));
231231
#if defined(__AVR_ATmega168__)
232232
#define RAMSTART (0x100)
233233
#define NRWWSTART (0x3800)
234-
#elif defined(__AVR_ATmega328P__)
234+
#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
235235
#define RAMSTART (0x100)
236236
#define NRWWSTART (0x7000)
237237
#elif defined (__AVR_ATmega644P__)

bootloaders/optiboot/pin_defs.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega88) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__)
1+
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega88) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__)
22
/* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duemilanove */
33
#define LED_DDR DDRB
44
#define LED_PORT PORTB

bootloaders/stk500v2/avrinterruptnames.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -327,8 +327,8 @@
327327

328328

329329
//**************************************************************************************************
330-
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
331-
#pragma mark __AVR_ATmega168__ / __AVR_ATmega328P__
330+
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__)
331+
#pragma mark __AVR_ATmega168__ / __AVR_ATmega328P__ / __AVR_ATmega328__
332332

333333
#define _INTERRUPT_NAMES_DEFINED_
334334

@@ -496,8 +496,8 @@ PGM_P gInterruptNameTable[] PROGMEM =
496496

497497

498498
//**************************************************************************************************
499-
#if defined(__AVR_ATmega324P__ ) || defined(__AVR_ATmega644__ ) || defined(__AVR_ATmega644P__)
500-
#pragma mark __AVR_ATmega324P__ __AVR_ATmega644__ __AVR_ATmega644P__
499+
#if defined(__AVR_ATmega324P__ ) || defined(__AVR_ATmega644__ ) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)
500+
#pragma mark __AVR_ATmega324P__ __AVR_ATmega644__ __AVR_ATmega644P__ __AVR_ATmega1284P__
501501

502502
#define _INTERRUPT_NAMES_DEFINED_
503503

0 commit comments

Comments
 (0)