aboutsummaryrefslogtreecommitdiff
path: root/bootloaders/bt/ATmegaBOOT_168.c
diff options
context:
space:
mode:
authorDavid A. Mellis <d.mellis@arduino.cc>2010-08-07 19:48:59 +0000
committerDavid A. Mellis <d.mellis@arduino.cc>2010-08-07 19:48:59 +0000
commit8a2387e805a3cc8f8fb18fe2ab4da857bd8c32b6 (patch)
tree32dd17f71d1756aac95708eaf321bd51dda578c9 /bootloaders/bt/ATmegaBOOT_168.c
parentfddeda17175c6e27a86d60b92077c07c30d8333a (diff)
Adding ATmega328 version of the Arduino BT bootloader, along with a Makefile for building it.
Diffstat (limited to 'bootloaders/bt/ATmegaBOOT_168.c')
-rw-r--r--bootloaders/bt/ATmegaBOOT_168.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/bootloaders/bt/ATmegaBOOT_168.c b/bootloaders/bt/ATmegaBOOT_168.c
index a85dc9a..c73eefa 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 */
-#ifndef __AVR_ATmega168__
+#if !defined(__AVR_ATmega168__) || !defined(__AVR_ATmega328P__)
#include <avr/eeprom.h>
#endif
@@ -189,6 +189,11 @@
#define SIG3 0x06
#define PAGE_SIZE 0x40U //64 words
+#elif defined __AVR_ATmega328P__
+#define SIG2 0x95
+#define SIG3 0x0F
+#define PAGE_SIZE 0x40U //64 words
+
#elif defined __AVR_ATmega162__
#define SIG2 0x94
#define SIG3 0x04
@@ -330,7 +335,8 @@ int main(void)
UBRRHI = (F_CPU/(BAUD_RATE*16L)-1) >> 8;
UCSRA = 0x00;
UCSRB = _BV(TXEN)|_BV(RXEN);
-#elif defined __AVR_ATmega168__
+#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
+
UBRR0H = ((F_CPU / 16 + BAUD_RATE / 2) / BAUD_RATE - 1) >> 8;
UBRR0L = ((F_CPU / 16 + BAUD_RATE / 2) / BAUD_RATE - 1);
@@ -551,7 +557,7 @@ putch(0x0D);
if (getch() == ' ') {
if (flags.eeprom) { //Write to EEPROM one byte at a time
for(w=0;w<length.word;w++) {
-#ifdef __AVR_ATmega168__
+#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
while(EECR & (1<<EEPE));
EEAR = (uint16_t)(void *)address.word;
EEDR = buff[w];
@@ -669,7 +675,7 @@ putch(0x0D);
"rjmp write_page \n\t"
"block_done: \n\t"
"clr __zero_reg__ \n\t" //restore zero register
-#if defined __AVR_ATmega168__
+#if defined __AVR_ATmega168__ || __AVR_ATmega328P__
: "=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"
@@ -701,7 +707,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
-#ifdef __AVR_ATmega168__
+#if defined __AVR_ATmega168__ || __AVR_ATmega328P__
while(EECR & (1<<EEPE));
EEAR = (uint16_t)(void *)address.word;
EECR |= (1<<EERE);
@@ -915,7 +921,7 @@ void putch(char ch)
while (!(UCSR1A & _BV(UDRE1)));
UDR1 = ch;
}
-#elif defined __AVR_ATmega168__
+#elif defined (__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
while (!(UCSR0A & _BV(UDRE0)));
UDR0 = ch;
#else
@@ -938,7 +944,7 @@ char getch(void)
return UDR1;
}
return 0;
-#elif defined __AVR_ATmega168__
+#elif defined (__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
uint32_t count = 0;
while(!(UCSR0A & _BV(RXC0))){
/* 20060803 DojoCorp:: Addon coming from the previous Bootloader*/
@@ -976,7 +982,7 @@ void getNch(uint8_t count)
while(!(UCSR1A & _BV(RXC1)));
UDR1;
}
-#elif defined __AVR_ATmega168__
+#elif (defined __AVR_ATmega168__) || defined(__AVR_ATmega328P__)
while(!(UCSR0A & _BV(RXC0)));
UDR0;
#else