diff options
author | David A. Mellis <d.mellis@arduino.cc> | 2010-08-07 19:48:59 +0000 |
---|---|---|
committer | David A. Mellis <d.mellis@arduino.cc> | 2010-08-07 19:48:59 +0000 |
commit | 8a2387e805a3cc8f8fb18fe2ab4da857bd8c32b6 (patch) | |
tree | 32dd17f71d1756aac95708eaf321bd51dda578c9 /bootloaders/bt/ATmegaBOOT_168.c | |
parent | fddeda17175c6e27a86d60b92077c07c30d8333a (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.c | 22 |
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 |