Version 0.83 (20080412)

This commit is contained in:
Olaf Rempel 2009-02-05 15:32:15 +01:00
parent 2c2646b64f
commit 7c18de72f8
16 changed files with 1230 additions and 85 deletions

View File

@ -1 +1 @@
<Project name="avrprog_boot"><File path="chipdef.h"></File><File path="main.c"></File><File path="makefile"></File><File path="mega128.h"></File><File path="mega128can.h"></File><File path="mega16.h"></File><File path="mega169.h"></File><File path="mega32.h"></File><File path="mega8.h"></File><File path="readme.txt"></File><File path="ldscripts_no_vector\avr5.x"></File><File path="main.lss"></File><File path="main.map"></File><File path="ldscripts_no_vector\avr4.x"></File></Project>
<Project name="avrprog_boot"><File path="chipdef.h"></File><File path="main.c"></File><File path="makefile"></File><File path="mega128.h"></File><File path="mega128can.h"></File><File path="mega16.h"></File><File path="mega169.h"></File><File path="mega32.h"></File><File path="mega8.h"></File><File path="readme.txt"></File><File path="ldscripts_no_vector\avr5.x"></File><File path="main.lss"></File><File path="main.map"></File><File path="ldscripts_no_vector\avr4.x"></File><File path="mega162.h"></File><File path="mega644.h"></File><File path="mega644p.h"></File><File path="megaxx4p.h"></File><File path="mega324p.h"></File></Project>

View File

@ -25,12 +25,24 @@ typedef uint8_t pagebuf_t;
#elif defined(__AVR_ATmega16__)
#include "mega16.h"
#elif defined(__AVR_ATmega162__)
#include "mega162.h"
#elif defined(__AVR_ATmega8__)
#include "mega8.h"
#elif defined(__AVR_ATmega32__)
#include "mega32.h"
#elif defined(__AVR_ATmega324P__)
#include "mega324p.h"
#elif defined(__AVR_ATmega644__)
#include "mega644.h"
#elif defined(__AVR_ATmega644P__)
#include "mega644p.h"
#elif defined(__AVR_ATmega128__)
#include "mega128.h"

BIN
main Normal file

Binary file not shown.

144
main.c
View File

@ -1,8 +1,8 @@
/*****************************************************************************
*
* AVRPROG compatible boot-loader
* Version : 0.80beta3 (May 2006)
* Compiler : avr-gcc 3.4.6 / avr-libc 1.4.4
* Version : 0.83 (Apr. 2008)
* Compiler : avr-gcc 4.1.2 / avr-libc 1.4.6
* size : depends on features and startup ( minmal features < 512 words)
* by : Martin Thomas, Kaiserslautern, Germany
* eversmith@heizung-thomas.de
@ -11,33 +11,27 @@
* - Bjoern Riemer
* - Olaf Rempel
*
* License : Copyright (c) 2006 Martin Thomas
* License : Copyright (c) 2006-2008 M. Thomas, U. Bonnes, O. Rempel
* Free to use. You have to mention the copyright
* owners in source-code and documentation of derived
* work. No warranty!
* work. No warranty! (Yes, you can insert the BSD
* license here)
*
* Tested with ATmega8, ATmega16, ATmega32, ATmega128, AT90CAN128
* Tested with ATmega8, ATmega16, ATmega162, ATmega32, ATmega324P,
* ATmega644, ATmega644P, ATmega128, AT90CAN128
*
* - Initial versions have been based on the Butterfly bootloader-code
* by Atmel Corporation (Authors: BBrandal, PKastnes, ARodland, LHM)
*
****************************************************************************
*
* See the makefile for information how to adapt the linker-settings to
* the selected Boot Size (BOOTSIZE=xxxx), the AVR clock-frequency and the
* MCU-type in
* See the makefile and readme.txt for information on how to adapt
* the linker-settings to the selected Boot Size (BOOTSIZE=xxxx) and
* the MCU-type. Other configurations futher down in this file.
*
* With BOOT_SIMPLE, minimal features and discarded int-vectors
* this bootloader has
* 0x2CA - atmega8
* 0x308 - atmega16
* 0x322 - atmega169
* 0x308 - atmega32
* 0x34C - atmega128
* 0x352 - at90can128
* bytes size and should fit into a 512 word (0x400 byte) bootloader-section.
* The above values depend on the compiler-version and may differ from
* your results.
* this bootloader has should fit into a a 512 word (1024, 0x400 bytes)
* bootloader-section.
*
****************************************************************************/
/*
@ -46,6 +40,7 @@
- __bad_interrupt still linked even with modified
linker-scripts which needs a default-handler,
"wasted": 3 words for AVR5 (>8kB), 2 words for AVR4
- Check watchdog-disable-function in avr-libc.
*/
// tabsize: 4
@ -63,7 +58,7 @@
/* use "Double Speed Operation" */
//#define UART_DOUBLESPEED
/* use second UART on mega128 / can128 */
/* use second UART on mega128 / can128 / mega162 / mega324p / mega644p */
//#define UART_USE_SECOND
/* Device-Type:
@ -71,16 +66,27 @@
which is the "correct" value for a bootloader.
avrdude may only detect the part-code for ISP */
#define DEVTYPE DEVTYPE_BOOT
//#define DEVTYPE DEVTYPE_ISP
// #define DEVTYPE DEVTYPE_ISP
/*
* Pin "STARTPIN" on port "STARTPORT" in this port has to grounded
* (active low) to start the bootloader
*/
#define BLPORT PORTB
#define BLDDR DDRB
#define BLPIN PINB
#define BLPNUM PINB0
#define BLPORT PORTC
#define BLDDR DDRC
#define BLPIN PINC
#define BLPNUM PINC7
/*
* Define if Watchdog-Timer should be disable at startup
*/
#define DISABLE_WDT_AT_STARTUP
/*
* Watchdog-reset is issued at exit
* define the timeout-value here (see avr-libc manual)
*/
#define EXIT_WDT_TIME WDTO_250MS
/*
* Select startup-mode
@ -108,8 +114,8 @@
/* character to start the bootloader in mode START_WAIT */
#define START_WAIT_UARTCHAR 'S'
/* wait 1s in START_WAIT mode (10ms steps) */
#define WAIT_VALUE 100
/* wait-time for START_WAIT mode ( t = WAIT_TIME * 10ms ) */
#define WAIT_VALUE 100 /* here: 100*10ms = 1000ms = 1sec */
/*
* enable/disable readout of fuse and lock-bits
@ -118,7 +124,7 @@
*/
//#define ENABLEREADFUSELOCK
/* enable/disable write of lock-bits
/* enable/disable write of lock-bits
* WARNING: lock-bits can not be reseted by bootloader (as far as I know)
* Only protection no unprotection, "chip erase" from bootloader only
* clears the flash but does no real "chip erase" (this is not possible
@ -127,6 +133,13 @@
*/
//#define WRITELOCKBITS
/*
* define the following if the bootloader should not output
* itself at flash read (will fake an empty boot-section)
*/
#define READ_PROTECT_BOOTLOADER
#define VERSION_HIGH '0'
#define VERSION_LOW '8'
@ -141,8 +154,9 @@
#include <avr/wdt.h>
#include <avr/boot.h>
#include <avr/pgmspace.h>
// #include <util/delay.h>
#include <avr/delay.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "chipdef.h"
@ -184,8 +198,9 @@ static inline void recvBuffer(pagebuf_t size)
pagebuf_t cnt;
uint8_t *tmp = gBuffer;
for (cnt = 0; cnt < sizeof(gBuffer); cnt++)
for (cnt = 0; cnt < sizeof(gBuffer); cnt++) {
*tmp++ = (cnt < size) ? recvchar() : 0xFF;
}
}
static inline uint16_t writeFlashPage(uint16_t waddr, pagebuf_t size)
@ -206,7 +221,7 @@ static inline uint16_t writeFlashPage(uint16_t waddr, pagebuf_t size)
boot_page_write(pagestart);
boot_spm_busy_wait();
boot_rww_enable(); // Re-enable the RWW section
boot_rww_enable(); // Re-enable the RWW section
return baddr>>1;
}
@ -216,18 +231,13 @@ static inline uint16_t writeEEpromPage(uint16_t address, pagebuf_t size)
uint8_t *tmp = gBuffer;
do {
EEARL = address; // Setup EEPROM address
EEARH = (address >> 8);
EEDR = *tmp++;
eeprom_write_byte( (uint8_t*)address, *tmp++ );
address++; // Select next byte
EECR |= (1<<EEMWE); // Write data into EEPROM
EECR |= (1<<EEWE);
eeprom_busy_wait();
size--; // Decreas number of bytes to write
} while (size); // Loop until all bytes written
// eeprom_busy_wait();
return address;
}
@ -237,16 +247,31 @@ static inline uint16_t readFlashPage(uint16_t waddr, pagebuf_t size)
uint16_t data;
do {
#ifndef READ_PROTECT_BOOTLOADER
#warning "Bootloader not read-protected"
#if defined(RAMPZ)
data = pgm_read_word_far(baddr);
#else
data = pgm_read_word_near(baddr);
#endif
#else
// don't read bootloader
if ( baddr < APP_END ) {
#if defined(RAMPZ)
data = pgm_read_word_far(baddr);
#else
data = pgm_read_word_near(baddr);
#endif
}
else {
data = 0xFFFF; // fake empty
}
#endif
sendchar(data); // send LSB
sendchar((data >> 8)); // send MSB
baddr += 2; // Select next word in memory
size -= 2; // Subtract two bytes from number of bytes to read
} while (size); // Repeat until all block has been read
} while (size); // Repeat until block has been read
return baddr>>1;
}
@ -254,15 +279,10 @@ static inline uint16_t readFlashPage(uint16_t waddr, pagebuf_t size)
static inline uint16_t readEEpromPage(uint16_t address, pagebuf_t size)
{
do {
EEARL = address; // Setup EEPROM address
EEARH = (address >> 8);
EECR |= (1<<EERE); // Read EEPROM
address++; // Select next EEPROM byte
sendchar(EEDR); // Transmit EEPROM data to PC
sendchar( eeprom_read_byte( (uint8_t*)address ) );
address++;
size--; // Decrease number of bytes to read
} while (size); // Repeat until all block has been read
} while (size); // Repeat until block has been read
return address;
}
@ -307,6 +327,17 @@ int main(void)
uint16_t address = 0;
uint8_t device = 0, val;
#ifdef DISABLE_WDT_AT_STARTUP
#ifdef WDT_OFF_SPECIAL
#warning "using target specific watchdog_off"
bootloader_wdt_off();
#else
cli();
wdt_reset();
wdt_disable();
#endif
#endif
#ifdef START_POWERSAVE
uint8_t OK = 1;
#endif
@ -319,12 +350,12 @@ int main(void)
UART_BAUD_LOW = (UART_CALC_BAUDRATE(BAUDRATE) & 0xFF);
#ifdef UART_DOUBLESPEED
UART_STATUS = (1<<UART_DOUBLE);
UART_STATUS = ( 1<<UART_DOUBLE );
#endif
UART_CTRL = UART_CTRL_DATA;
UART_CTRL2 = UART_CTRL2_DATA;
#if defined(START_POWERSAVE)
/*
This is an adoption of the Butterfly Bootloader startup-sequence.
@ -397,7 +428,7 @@ int main(void)
sendchar('Y'); // Autoincrement is quicker
//write address
} else if (val == 'A') {
} else if (val == 'A') {
address = recvchar(); //read address 8 MSB
address = (address<<8) | recvchar();
sendchar('\r');
@ -419,12 +450,10 @@ int main(void)
if (device == DEVTYPE) {
if (val == 'F') {
address = writeFlashPage(address, size);
} else if (val == 'E') {
address = writeEEpromPage(address, size);
}
sendchar('\r');
} else {
sendchar(0);
}
@ -438,21 +467,20 @@ int main(void)
if (val == 'F') {
address = readFlashPage(address, size);
} else if (val == 'E') {
address = readEEpromPage(address, size);
}
// Chip erase
} else if (val == 'e') {
if (device == DEVTYPE)
if (device == DEVTYPE) {
eraseFlash();
}
sendchar('\r');
// Exit upgrade
} else if (val == 'E') {
wdt_enable(WDTO_15MS); // Enable Watchdog Timer to give reset
wdt_enable(EXIT_WDT_TIME); // Enable Watchdog Timer to give reset
sendchar('\r');
#ifdef WRITELOCKBITS
@ -504,7 +532,7 @@ int main(void)
sendchar(0);
// clear and set LED ignored
} else if ((val == 'x') || (val == 'y')) {
} else if ((val == 'x') || (val == 'y')) {
recvchar();
sendchar('\r');

View File

@ -39,15 +39,27 @@
# MCU name
## MCU = atmega8
## MCU = atmega16
MCU = atmega32
## MCU = atmega162
## MCU = atmega169
## MCU = atmega32
MCU = atmega324p
## MCU = atmega644
## MCU = atmega644p
## MCU = atmega128
## MCU = at90can128
################## BOOTLOADER ######################
# mt: Boot loader support. So far not done with a separate section
# to get the interrupt vector into the bootloader area (for BOOTINTVEC=yes).
# Bootloader address in datasheet and stk500 is given as
# "word", gcc toolchain needs "byte"-address
# (see LDFLAGS further down)
#/* Select Boot Size in Words (select one, comment out the others) */
## NO! BOOTSIZE=128
## NO! BOOTSIZE=256
BOOTSIZE=512
## BOOTSIZE=1024
## BOOTSIZE=512
BOOTSIZE=1024
## BOOTSIZE=2048
# /* Select if bootloader should include the inverrupt-vectors
@ -56,14 +68,6 @@ BOOTSIZE=512
##BOOTINTVEC=yes
BOOTINTVEC=no
################## BOOTLOADER ######################
# mt: Boot loader support. So far not done with a separate section
# to get the interrupt vector into the bootloader area.
# Bootloader address in datasheet and stk500 is given as
# "word", gcc toolchain needs "byte"-address
# (see LDFLAGS further down)
##
ifeq ($(MCU), atmega8)
BFD_MACH=avr4
@ -98,6 +102,23 @@ ifeq ($(BOOTSIZE), 1024)
endif
endif
##
ifeq ($(MCU), atmega162)
BFD_MACH=avr5
ifeq ($(BOOTSIZE), 128)
MT_BOOTLOADER_ADDRESS = 0x3F00
endif
ifeq ($(BOOTSIZE), 256)
MT_BOOTLOADER_ADDRESS = 0x3E00
endif
ifeq ($(BOOTSIZE), 512)
MT_BOOTLOADER_ADDRESS = 0x3C00
endif
ifeq ($(BOOTSIZE), 1024)
MT_BOOTLOADER_ADDRESS = 0x3800
endif
endif
##
ifeq ($(MCU), atmega169)
BFD_MACH=avr5
@ -132,6 +153,57 @@ ifeq ($(BOOTSIZE), 2048)
endif
endif
##
ifeq ($(MCU), atmega324p)
BFD_MACH=avr5
ifeq ($(BOOTSIZE), 256)
MT_BOOTLOADER_ADDRESS = 0x7E00
endif
ifeq ($(BOOTSIZE), 512)
MT_BOOTLOADER_ADDRESS = 0x7C00
endif
ifeq ($(BOOTSIZE), 1024)
MT_BOOTLOADER_ADDRESS = 0x7800
endif
ifeq ($(BOOTSIZE), 2048)
MT_BOOTLOADER_ADDRESS = 0x7000
endif
endif
##
ifeq ($(MCU), atmega644)
BFD_MACH=avr5
ifeq ($(BOOTSIZE), 512)
MT_BOOTLOADER_ADDRESS = 0xFC00
endif
ifeq ($(BOOTSIZE), 1024)
MT_BOOTLOADER_ADDRESS = 0xF800
endif
ifeq ($(BOOTSIZE), 2048)
MT_BOOTLOADER_ADDRESS = 0xF000
endif
ifeq ($(BOOTSIZE), 4096)
MT_BOOTLOADER_ADDRESS = 0xE000
endif
endif
##
ifeq ($(MCU), atmega644p)
BFD_MACH=avr5
ifeq ($(BOOTSIZE), 512)
MT_BOOTLOADER_ADDRESS = 0xFC00
endif
ifeq ($(BOOTSIZE), 1024)
MT_BOOTLOADER_ADDRESS = 0xF800
endif
ifeq ($(BOOTSIZE), 2048)
MT_BOOTLOADER_ADDRESS = 0xF000
endif
ifeq ($(BOOTSIZE), 4096)
MT_BOOTLOADER_ADDRESS = 0xE000
endif
endif
##
ifeq ($(MCU), atmega128)
BFD_MACH=avr5

52
mega162.h Normal file
View File

@ -0,0 +1,52 @@
#ifndef _MEGA162_H_
#define _MEGA162_H_
/* Part-Code ISP */
// documented code (AVR109 AppNote) but not supported by AVRProg 1.40
// #define DEVTYPE_ISP 0x62
// fake ATmega16 instead:
#define DEVTYPE_ISP 0x74
/* Part-Code Boot */
// documented code but not supported by AVRProg 1.40
// #define DEVTYPE_BOOT 0x63
// fake ATmega16:
#define DEVTYPE_BOOT 0x75
#define SIG_BYTE1 0x1E
#define SIG_BYTE2 0x94
#define SIG_BYTE3 0x04
#ifdef UART_DOUBLESPEED
#define UART_CALC_BAUDRATE(baudRate) ((uint32_t)(F_CPU) / ((uint32_t)(baudRate) *8) -1)
#else
#define UART_CALC_BAUDRATE(baudRate) ((uint32_t)(F_CPU) / ((uint32_t)(baudRate)*16) -1)
#endif
#ifndef UART_USE_SECOND
#define UART_BAUD_HIGH UBRR0H
#define UART_BAUD_LOW UBRR0L
#define UART_STATUS UCSR0A
#define UART_TXREADY UDRE0
#define UART_RXREADY RXC0
#define UART_DOUBLE U2X0
#define UART_CTRL UCSR0B
#define UART_CTRL_DATA ((1<<TXEN0) | (1<<RXEN0))
#define UART_CTRL2 UCSR0C
#define UART_CTRL2_DATA ((1<<URSEL0) | (1<<UCSZ01) | (1<<UCSZ00))
#define UART_DATA UDR0
#else
#define UART_BAUD_HIGH UBRR1H
#define UART_BAUD_LOW UBRR1L
#define UART_STATUS UCSR1A
#define UART_TXREADY UDRE1
#define UART_RXREADY RXC1
#define UART_DOUBLE U2X1
#define UART_CTRL UCSR1B
#define UART_CTRL_DATA ((1<<TXEN1) | (1<<RXEN1))
#define UART_CTRL2 UCSR1C
#define UART_CTRL2_DATA ( (1<<URSEL1) | (1<<UCSZ11) | (1<<UCSZ10))
#define UART_DATA UDR1
#endif
#endif // #ifndef _MEGA162_H_

View File

@ -1,7 +1,8 @@
#ifndef _MEGA169_H_
#define _MEGA169_H_
#define DEVTYPE 0x79
#define DEVTYPE_ISP 0x78
#define DEVTYPE_BOOT 0x79
#define SIG_BYTE3 0x1E
#define SIG_BYTE2 0x94

17
mega324p.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef _MEGA324P_H_
#define _MEGA324P_H_
/* I (M. Thomas) could not find an official Boot-ID
for the ATmega324P so pretend it's an ATmega32 */
/* Part-Code ISP */
#define DEVTYPE_ISP 0x72
/* Part-Code Boot */
#define DEVTYPE_BOOT 0x73
#define SIG_BYTE1 0x1E
#define SIG_BYTE2 0x95
#define SIG_BYTE3 0x08
#include "megaxx4p.h"
#endif // #ifndef _MEGA324P_H_

49
mega644.h Normal file
View File

@ -0,0 +1,49 @@
#ifndef _MEGA644_H_
#define _MEGA644_H_
/* I (M. Thomas) could not find an official Boot-ID
for the ATmega644 so pretend it's an ATmega64 */
/* Part-Code ISP */
#define DEVTYPE_ISP 0x45
/* Part-Code Boot */
#define DEVTYPE_BOOT 0x46
#define SIG_BYTE1 0x1E
#define SIG_BYTE2 0x96
#define SIG_BYTE3 0x09
#ifdef UART_DOUBLESPEED
#define UART_CALC_BAUDRATE(baudRate) ((uint32_t)(F_CPU) / ((uint32_t)(baudRate) *8) -1)
#else
#define UART_CALC_BAUDRATE(baudRate) ((uint32_t)(F_CPU) / ((uint32_t)(baudRate)*16) -1)
#endif
#define UART_BAUD_HIGH UBRR0H
#define UART_BAUD_LOW UBRR0L
#define UART_STATUS UCSR0A
#define UART_TXREADY UDRE0
#define UART_RXREADY RXC0
#define UART_DOUBLE U2X0
#define UART_CTRL UCSR0B
#define UART_CTRL_DATA ((1<<TXEN0) | (1<<RXEN0))
#define UART_CTRL2 UCSR0C
#define UART_CTRL2_DATA ( (1<<UCSZ01) | (1<<UCSZ00))
#define UART_DATA UDR0
#define WDT_OFF_SPECIAL
static inline void bootloader_wdt_off(void)
{
cli();
wdt_reset();
/* Clear WDRF in MCUSR */
MCUSR &= ~(1<<WDRF);
/* Write logical one to WDCE and WDE */
/* Keep old prescaler setting to prevent unintentional time-out */
WDTCSR |= (1<<WDCE) | (1<<WDE);
/* Turn off WDT */
WDTCSR = 0x00;
}
#endif // #ifndef _MEGA644_H_

17
mega644p.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef _MEGA644P_H_
#define _MEGA644P_H_
/* I (M. Thomas) could not find an official Boot-ID
for the ATmega644P so pretend it's an ATmega64 */
/* Part-Code ISP */
#define DEVTYPE_ISP 0x45
/* Part-Code Boot */
#define DEVTYPE_BOOT 0x46
#define SIG_BYTE1 0x1E
#define SIG_BYTE2 0x96
#define SIG_BYTE3 0x0A
#include "megaxx4p.h"
#endif // #ifndef _MEGA644P_H_

53
megaxx4p.h Normal file
View File

@ -0,0 +1,53 @@
#ifndef _MEGAxx4_H_
#define _MEGAxx4_H_
#ifdef UART_DOUBLESPEED
#define UART_CALC_BAUDRATE(baudRate) ((uint32_t)(F_CPU) / ((uint32_t)(baudRate) *8) -1)
#else
#define UART_CALC_BAUDRATE(baudRate) ((uint32_t)(F_CPU) / ((uint32_t)(baudRate)*16) -1)
#endif
#ifndef UART_USE_SECOND
/* UART 0 */
#define UART_BAUD_HIGH UBRR0H
#define UART_BAUD_LOW UBRR0L
#define UART_STATUS UCSR0A
#define UART_TXREADY UDRE0
#define UART_RXREADY RXC0
#define UART_DOUBLE U2X0
#define UART_CTRL UCSR0B
#define UART_CTRL_DATA ((1<<TXEN0) | (1<<RXEN0))
#define UART_CTRL2 UCSR0C
#define UART_CTRL2_DATA ( (1<<UCSZ01) | (1<<UCSZ00))
#define UART_DATA UDR0
#else
/* UART 1 */
#define UART_BAUD_HIGH UBRR1H
#define UART_BAUD_LOW UBRR1L
#define UART_STATUS UCSR1A
#define UART_TXREADY UDRE1
#define UART_RXREADY RXC1
#define UART_DOUBLE U2X1
#define UART_CTRL UCSR1B
#define UART_CTRL_DATA ((1<<TXEN1) | (1<<RXEN1))
#define UART_CTRL2 UCSR1C
#define UART_CTRL2_DATA ( (1<<UCSZ11) | (1<<UCSZ10))
#define UART_DATA UDR1
#endif
#define WDT_OFF_SPECIAL
static inline void bootloader_wdt_off(void)
{
cli();
wdt_reset();
/* Clear WDRF in MCUSR */
MCUSR &= ~(1<<WDRF);
/* Write logical one to WDCE and WDE */
/* Keep old prescaler setting to prevent unintentional time-out */
WDTCSR |= (1<<WDCE) | (1<<WDE);
/* Turn off WDT */
WDTCSR = 0x00;
}
#endif // #ifndef _MEGA644_H_

View File

@ -30,17 +30,41 @@ Programming-Software (on the "PC-Side"):
* Installation instructions at the end of this file.
2. Oct. 2006 - Version 0.81
12. Apr. 2008 - Version 0.83
* Bernhard Roth reported a mistake in the UART-configuration
for double-speed. Thanks for the report.
Change in main.c:
UART_STATUS = UART_DOUBLE; -> UART_STATUS = (1<<UART_DOUBLE);
* Added definitions for ATmega644P and ATmega324P
* Tested with ATmega324P, gcc 4.2.2, avr-libc 1.4.6
* Added testapp to verify "exit bootloader" with
watchdog (n.b.: watchdog-disable called early in testapp)
27. Jan. 2007 - Version 0.82
* Added definitions for ATmega644.
* Using avr-lib's eeprom-functions (old "direct-access"-code
has not been compatible with ATmega644).
* Watchdog-disable at startup (configurable): avoids problems with
repeated login to bootloader. Not needed if the bootloader is
never re-entered again between an "exit programming" and
a system-reset/power-toogle.
* Additional watchdog disable-function for ATmega644.
* Made watchdog-enable time at exit-programming a configuration-value
(define).
* Bootloader read-protection: if enabled the bootloader fakes
an empty boot-section (configurable by define)
Since more of the avr-libc functions's are used this version
should be more portable for other AVRs but the size of the
binary increases a little bit.
Make sure to disable the watchdog early in the user-application
esp. when using a "modern" AVR (i.e. ATmega48/88/168/644/324P/644P).
3. Dec. 2006 - Version 0.81
* Added definitions for ATmega162.
* Fixed init for double-speed (bitmask). Thanks to Bernhard Roth
28. May 2006 - Version 0.8beta3
* Support discarding of interrupt-vectors which saves some space
* Supports discarding of interrupt-vectors which saves some space
if no interrupts are needed in the bootloader. Added option
in makefile to enable this feature, modified LDFLAGS,
additional code in main.c for a pseudo default_interrupt ISR.
@ -71,7 +95,7 @@ Programming-Software (on the "PC-Side"):
* This bootloader lets the watchdog do a reset when the
user selects "Exit programmer" (i.e. in AVRProg) after an
update. Make sure to disable or reset the watchdog early in
you application.
your application.
27. May 2006 - Version 0.8beta2
@ -198,9 +222,10 @@ not enabled (TODO).
- Program the "Boot Flash section size" (BOOTSZ fuses)
according to the boot-size selected in the makefile
i.e. BOOTSZ=00 for boot-size 1024 words on ATmega16
i.e. BOOTSZ=00 for boot-size 1024 words (2048 bytes)
on ATmega16
- enable the BOOT Reset Vector fuse (BOOTTRST=0)
- enable the BOOT Reset Vector fuse (BOOTRST=0)
- Set the lock bits to protect the bootloader from
SPM-writes (Boot Loader Protection Mode 2 in STK500-
@ -214,13 +239,14 @@ not enabled (TODO).
The condition must be "true" until you see the
AVRPROG dialog or avrdude connects.
- Start AVRPROG (AVRStuido/Tools or stand-alone)
avrdude is supported too, check the avrdude manual
for command-line options.
- Start AVRPROG (AVRStudio/Tools or stand-alone avrprog.exe)
AVRDUDE is supported too, check it's manual
for command-line options. Read the text above for
information about Device-Types and AVRDUDE
- AVRPROG or avrdude should detect the bootloader.
- AVRPROG or AVRDUDE should detect the bootloader.
- see AVRStudio online-help for more information how
- see AVRStudio's online-help for more information how
to use AVRPROG
- make sure to EXIT from AVRPROG (button) to start

619
testapp/Makefile Normal file
View File

@ -0,0 +1,619 @@
# Hey Emacs, this is a -*- makefile -*-
#----------------------------------------------------------------------------
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
#
# Released to the Public Domain
#
# Additional material for this makefile was written by:
# Peter Fleury
# Tim Henigan
# Colin O'Flynn
# Reiner Patommel
# Markus Pfaff
# Sander Pool
# Frederik Rouleau
# Carlos Lamas
#
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device, using avrdude.
# Please customize the avrdude settings below first!
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# MCU name
MCU = atmega324p
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
# Typical values are:
# F_CPU = 1000000
# F_CPU = 1843200
# F_CPU = 2000000
# F_CPU = 3686400
# F_CPU = 4000000
# F_CPU = 7372800
# F_CPU = 8000000
# F_CPU = 11059200
# F_CPU = 14745600
# F_CPU = 16000000
# F_CPU = 18432000
# F_CPU = 20000000
F_CPU = 3686400
# Output format. (can be srec, ihex, binary)
FORMAT = ihex
# Target file name (without extension).
TARGET = testapp
# Object files directory
# To put object files in current directory, use a dot (.), do NOT make
# this an empty or blank macro!
OBJDIR = .
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c
# List C++ source files here. (C dependencies are automatically generated.)
CPPSRC =
# List Assembler source files here.
# Make them always end in a capital .S. Files ending in a lowercase .s
# will not be considered source files but generated files (assembler
# output from the compiler), and will be deleted upon "make clean"!
# Even though the DOS/Win* filesystem matches both .s and .S the same,
# it will preserve the spelling of the filenames, and gcc itself does
# care about how the name is spelled on its command-line.
ASRC =
# Optimization level, can be [0, 1, 2, 3, s].
# 0 = turn off optimization. s = optimize for size.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s
# Debugging format.
# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
# AVR Studio 4.10 requires dwarf-2.
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
DEBUG = dwarf-2
# List any extra directories to look for include files here.
# Each directory must be seperated by a space.
# Use forward slashes for directory separators.
# For a directory that has spaces, enclose it in quotes.
EXTRAINCDIRS =
# Compiler flag to set the C Standard level.
# c89 = "ANSI" C
# gnu89 = c89 plus GCC extensions
# c99 = ISO C99 standard (not yet fully implemented)
# gnu99 = c99 plus GCC extensions
CSTANDARD = -std=gnu99
# Place -D or -U options here for C sources
CDEFS = -DF_CPU=$(F_CPU)UL
# Place -D or -U options here for ASM sources
ADEFS = -DF_CPU=$(F_CPU)
# Place -D or -U options here for C++ sources
CPPDEFS = -DF_CPU=$(F_CPU)UL
#CPPDEFS += -D__STDC_LIMIT_MACROS
#CPPDEFS += -D__STDC_CONSTANT_MACROS
#---------------- Compiler Options C ----------------
# -g*: generate debugging information
# -O*: optimization level
# -f...: tuning, see GCC manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
# -adhlns...: create assembler listing
CFLAGS = -g$(DEBUG)
CFLAGS += $(CDEFS)
CFLAGS += -O$(OPT)
CFLAGS += -funsigned-char
CFLAGS += -funsigned-bitfields
CFLAGS += -fpack-struct
CFLAGS += -fshort-enums
CFLAGS += -Wall
CFLAGS += -Wstrict-prototypes
#CFLAGS += -mshort-calls
#CFLAGS += -fno-unit-at-a-time
#CFLAGS += -Wundef
#CFLAGS += -Wunreachable-code
#CFLAGS += -Wsign-compare
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
CFLAGS += $(CSTANDARD)
#---------------- Compiler Options C++ ----------------
# -g*: generate debugging information
# -O*: optimization level
# -f...: tuning, see GCC manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
# -adhlns...: create assembler listing
CPPFLAGS = -g$(DEBUG)
CPPFLAGS += $(CPPDEFS)
CPPFLAGS += -O$(OPT)
CPPFLAGS += -funsigned-char
CPPFLAGS += -funsigned-bitfields
CPPFLAGS += -fpack-struct
CPPFLAGS += -fshort-enums
CPPFLAGS += -fno-exceptions
CPPFLAGS += -Wall
CFLAGS += -Wundef
#CPPFLAGS += -mshort-calls
#CPPFLAGS += -fno-unit-at-a-time
#CPPFLAGS += -Wstrict-prototypes
#CPPFLAGS += -Wunreachable-code
#CPPFLAGS += -Wsign-compare
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
#CPPFLAGS += $(CSTANDARD)
#---------------- Assembler Options ----------------
# -Wa,...: tell GCC to pass this to the assembler.
# -adhlns: create listing
# -gstabs: have the assembler create line number information; note that
# for use in COFF files, additional information about filenames
# and function names needs to be present in the assembler source
# files -- see avr-libc docs [FIXME: not yet described there]
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
# dump that will be displayed for a given single line of source input.
ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
#---------------- Library Options ----------------
# Minimalistic printf version
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
# Floating point printf version (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
# If this is left blank, then it will use the Standard printf version.
PRINTF_LIB =
#PRINTF_LIB = $(PRINTF_LIB_MIN)
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
# Minimalistic scanf version
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
# If this is left blank, then it will use the Standard scanf version.
SCANF_LIB =
#SCANF_LIB = $(SCANF_LIB_MIN)
#SCANF_LIB = $(SCANF_LIB_FLOAT)
MATH_LIB = -lm
# List any extra directories to look for libraries here.
# Each directory must be seperated by a space.
# Use forward slashes for directory separators.
# For a directory that has spaces, enclose it in quotes.
EXTRALIBDIRS =
#---------------- External Memory Options ----------------
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# used for variables (.data/.bss) and heap (malloc()).
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
# only used for heap (malloc()).
#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
EXTMEMOPTS =
#---------------- Linker Options ----------------
# -Wl,...: tell GCC to pass this to linker.
# -Map: create map file
# --cref: add cross reference to map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
#LDFLAGS += -T linker_script.x
#---------------- Programming Options (avrdude) ----------------
# Programming hardware: alf avr910 avrisp bascom bsd
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
#
# Type: avrdude -c ?
# to get a full listing.
#
AVRDUDE_PROGRAMMER = stk500
# com1 = serial port. Use lpt1 to connect to parallel port.
AVRDUDE_PORT = com1 # programmer connected to serial device
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
# Uncomment the following if you want avrdude's erase cycle counter.
# Note that this counter needs to be initialized first using -Yn,
# see avrdude manual.
#AVRDUDE_ERASE_COUNTER = -y
# Uncomment the following if you do /not/ wish a verification to be
# performed after programming the device.
#AVRDUDE_NO_VERIFY = -V
# Increase verbosity level. Please use this when submitting bug
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
# to submit bug reports.
#AVRDUDE_VERBOSE = -v -v
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
#---------------- Debugging Options ----------------
# For simulavr only - target MCU frequency.
DEBUG_MFREQ = $(F_CPU)
# Set the DEBUG_UI to either gdb or insight.
# DEBUG_UI = gdb
DEBUG_UI = insight
# Set the debugging back-end to either avarice, simulavr.
DEBUG_BACKEND = avarice
#DEBUG_BACKEND = simulavr
# GDB Init Filename.
GDBINIT_FILE = __avr_gdbinit
# When using avarice settings for the JTAG
JTAG_DEV = /dev/com1
# Debugging port used to communicate between GDB / avarice / simulavr.
DEBUG_PORT = 4242
# Debugging host used to communicate between GDB / avarice / simulavr, normally
# just set to localhost unless doing some sort of crazy debugging when
# avarice is running on a different computer.
DEBUG_HOST = localhost
#============================================================================
# Define programs and commands.
SHELL = sh
CC = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
AR = avr-ar rcs
NM = avr-nm
AVRDUDE = avrdude
REMOVE = rm -f
REMOVEDIR = rm -rf
COPY = cp
WINSHELL = cmd
# Define Messages
# English
MSG_ERRORS_NONE = Errors: none
MSG_BEGIN = -------- begin --------
MSG_END = -------- end --------
MSG_SIZE_BEFORE = Size before:
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling C:
MSG_COMPILING_CPP = Compiling C++:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:
MSG_CREATING_LIBRARY = Creating library:
# Define all object files.
OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
# Define all listing files.
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
# Compiler flags to generate dependency files.
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
# Default target.
all: begin gccversion sizebefore build sizeafter end
# Change the build target to build a HEX file or a library.
build: elf hex eep lss sym
#build: lib
elf: $(TARGET).elf
hex: $(TARGET).hex
eep: $(TARGET).eep
lss: $(TARGET).lss
sym: $(TARGET).sym
LIBNAME=lib$(TARGET).a
lib: $(LIBNAME)
# Eye candy.
# AVR Studio 3.x does not check make's exit code but relies on
# the following magic strings to be generated by the compile job.
begin:
@echo
@echo $(MSG_BEGIN)
end:
@echo $(MSG_END)
@echo
# Display size of file.
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) --mcu=$(MCU) --format=avr $(TARGET).elf
sizebefore:
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
2>/dev/null; echo; fi
sizeafter:
@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
2>/dev/null; echo; fi
# Display compiler version information.
gccversion :
@$(CC) --version
# Program the device.
program: $(TARGET).hex $(TARGET).eep
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
# Generate avr-gdb config/init file which does the following:
# define the reset signal, load the target file, connect to target, and set
# a breakpoint at main().
gdb-config:
@$(REMOVE) $(GDBINIT_FILE)
@echo define reset >> $(GDBINIT_FILE)
@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
@echo end >> $(GDBINIT_FILE)
@echo file $(TARGET).elf >> $(GDBINIT_FILE)
@echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
ifeq ($(DEBUG_BACKEND),simulavr)
@echo load >> $(GDBINIT_FILE)
endif
@echo break main >> $(GDBINIT_FILE)
debug: gdb-config $(TARGET).elf
ifeq ($(DEBUG_BACKEND), avarice)
@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
@$(WINSHELL) /c pause
else
@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
$(DEBUG_MFREQ) --port $(DEBUG_PORT)
endif
@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
COFFCONVERT = $(OBJCOPY) --debugging
COFFCONVERT += --change-section-address .data-0x800000
COFFCONVERT += --change-section-address .bss-0x800000
COFFCONVERT += --change-section-address .noinit-0x800000
COFFCONVERT += --change-section-address .eeprom-0x810000
coff: $(TARGET).elf
@echo
@echo $(MSG_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
extcoff: $(TARGET).elf
@echo
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
@echo
@echo $(MSG_FLASH) $@
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
%.eep: %.elf
@echo
@echo $(MSG_EEPROM) $@
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
# Create extended listing file from ELF output file.
%.lss: %.elf
@echo
@echo $(MSG_EXTENDED_LISTING) $@
$(OBJDUMP) -h -S $< > $@
# Create a symbol table from ELF output file.
%.sym: %.elf
@echo
@echo $(MSG_SYMBOL_TABLE) $@
$(NM) -n $< > $@
# Create library from object files.
.SECONDARY : $(TARGET).a
.PRECIOUS : $(OBJ)
%.a: $(OBJ)
@echo
@echo $(MSG_CREATING_LIBRARY) $@
$(AR) $@ $(OBJ)
# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
@echo
@echo $(MSG_LINKING) $@
$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
# Compile: create object files from C source files.
$(OBJDIR)/%.o : %.c
@echo
@echo $(MSG_COMPILING) $<
$(CC) -c $(ALL_CFLAGS) $< -o $@
# Compile: create object files from C++ source files.
$(OBJDIR)/%.o : %.cpp
@echo
@echo $(MSG_COMPILING_CPP) $<
$(CC) -c $(ALL_CPPFLAGS) $< -o $@
# Compile: create assembler files from C source files.
%.s : %.c
$(CC) -S $(ALL_CFLAGS) $< -o $@
# Compile: create assembler files from C++ source files.
%.s : %.cpp
$(CC) -S $(ALL_CPPFLAGS) $< -o $@
# Assemble: create object files from assembler source files.
$(OBJDIR)/%.o : %.S
@echo
@echo $(MSG_ASSEMBLING) $<
$(CC) -c $(ALL_ASFLAGS) $< -o $@
# Create preprocessed source for use in sending a bug report.
%.i : %.c
$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
# Target: clean project.
clean: begin clean_list end
clean_list :
@echo
@echo $(MSG_CLEANING)
$(REMOVE) $(TARGET).hex
$(REMOVE) $(TARGET).eep
$(REMOVE) $(TARGET).cof
$(REMOVE) $(TARGET).elf
$(REMOVE) $(TARGET).map
$(REMOVE) $(TARGET).sym
$(REMOVE) $(TARGET).lss
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o)
$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst)
$(REMOVE) $(SRC:.c=.s)
$(REMOVE) $(SRC:.c=.d)
$(REMOVE) $(SRC:.c=.i)
$(REMOVEDIR) .dep
# Create object files directory
$(shell mkdir $(OBJDIR) 2>/dev/null)
# Include the dependency files.
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion \
build elf hex eep lss sym coff extcoff \
clean clean_list program debug gdb-config

62
testapp/testapp.c Normal file
View File

@ -0,0 +1,62 @@
// Martin Thomas 4/2008
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <util/delay.h>
#define LED_PORT PORTB
#define LED_DDR DDRB
#define LED_BIT PB2
#define BT_PORT PORTC
#define BT_DDR DDRC
#define BT_PIN PINC
#define BT_BIT PC7
static inline void my_wdt_off(void)
{
cli();
wdt_reset();
/* Clear WDRF in MCUSR */
MCUSR &= ~(1<<WDRF);
/* Write logical one to WDCE and WDE */
/* Keep old prescaler setting to prevent unintentional time-out */
WDTCSR |= (1<<WDCE) | (1<<WDE);
/* Turn off WDT */
WDTCSR = 0x00;
}
static void my_delay( void )
{
int i;
for ( i=0; i<500; i++ ) {
_delay_ms(1);
}
}
int main( void )
{
my_wdt_off();
LED_PORT |= ( 1<<LED_BIT );
LED_DDR |= ( 1<<LED_BIT );
BT_DDR &= ~( 1<<BT_BIT );
BT_PORT |= ( 1<<BT_BIT );
while ( 1 ) {
LED_PORT &= ~( 1<<LED_BIT );
my_delay();
LED_PORT |= ( 1<<LED_BIT );
my_delay();
if ( !( BT_PIN & ( 1<<BT_BIT ) ) ) {
/* start bootloader */
wdt_enable( WDTO_250MS );
while (1) { ; }
}
}
return 0; /* never reached */
}

117
testavrdude/dummy.hex Normal file
View File

@ -0,0 +1,117 @@
:103800000C942A1C0C94451C0C94451C0C94451CCF
:103810000C94451C0C94451C0C94451C0C94451CA4
:103820000C94451C0C94451C0C94451C0C94451C94
:103830000C94451C0C94451C0C94451C0C94451C84
:103840000C94451C0C94451C0C94451C0C94451C74
:103850000C94451C11241FBECFE5D4E0DEBFCDBFC4
:1038600010E0A0E6B0E0EEE2FFE302C005900D92AA
:10387000A036B107D9F710E0A0E6B0E001C01D9274
:10388000A53EB107E1F70C94871D0C94001C8F9A9C
:1038900084E083BD89E185BD089581E40E94E21E34
:1038A00086E50E94E21E82E50E94E21E82E40E94FA
:1038B000E21E8FE40E94E21E8FE40E94E21E84E575
:1038C0000E94E21E08958F929F92AF92BF92CF9274
:1038D000DF92EF92FF920F931F93CF93DF936C01D0
:1038E000962EEE24FF2487010E591F4FE7012196E3
:1038F000EC14FD0418F40E94E61E01C08FEFF801DD
:1039000080837E01C038D10570F3EE24FF248091BE
:10391000E400853721F08B3311F0C7018CC0A090F3
:10392000E200B090E300E199FECF8FB6F89426E470
:10393000921609F07DC08091E40087010E591F4F57
:10394000E7012196EEEFFFEFCE0EDF1E8537F1F493
:10395000F8018081282F3327FE01EE59FF4F808127
:103960009927982F8827282B392B7E010894E11C52
:10397000F11C41E08091E2009091E3000901FC011B
:1039800040935700E8951124029628C080E40E94D5
:103990004B1F8091E3000E944B1F8091E2000E9428
:1039A0004B1FF80180810E944B1F88E40E944B1F2F
:1039B0008091E3000E944B1F8091E2000E944B1F08
:1039C0007E010894E11CF11CCE59DF4F88810E94D2
:1039D0004B1F8091E2009091E30001969093E300E9
:1039E0008093E200C114D10409F0A5CF8091E400D6
:1039F000853769F485E0F50180935700E89507B6AF
:103A000000FCFDCF81E180935700E89511C08CE464
:103A10000E944B1F8B2D99270E944B1F8A2D0E94BD
:103A20004B1F80E00E944B1F88E893E10E94F51E27
:103A30008FBE8DE090E0DF91CF911F910F91FF90AD
:103A4000EF90DF90CF90BF90AF909F908F900895B0
:103A5000FF920F931F93CF93DF93EC01FFB6F8947F
:103A6000E199FECF8091E4008537E9F4653409F4EB
:103A700047C060E08091E2009091E3000E94EB1E5D
:103A80008C010E94E21E812F99270E94E21E8091E4
:103A9000E2009091E30002969093E3008093E200AD
:103AA000229739F72DC08B3359F580E20E944B1FC6
:103AB0008091E3000E944B1F8091E2000E944B1F07
:103AC0008FEF0E944B1F0E94E21E88E20E944B1F54
:103AD0008091E3000E944B1F8091E2000E944B1FE7
:103AE0008FEF0E944B1F0E94E21E8091E200909196
:103AF000E30001969093E3008093E2002297A9F6F9
:103B0000FFBEDF91CF911F910F91FF900895CFE5F8
:103B1000D4E0DEBFCDBFF89401E005BF82E085BFF1
:103B2000A698AE9A60E087E190E00E94D81E9E9B26
:103B300008C0AE9805BF15BEE0916000F09161002D
:103B40000995BB9AC39A0E94401F0E94471C0E947D
:103B5000E61E813611F489E528C18134F9F40E940A
:103B6000E61E99279093E3008093E200182F002728
:103B70000E94E61E282F3327202B312B3093E300A1
:103B80002093E2008091E400853709F083C0220F82
:103B9000331F3093E3002093E2007CC0823689F427
:103BA00089E50E94E21E8091E400853729F480E0D7
:103BB0000E94E21E80E8F9C080E00E94E21E80E4DC
:103BC000F4C0823489F40E94E61E9927182F00273A
:103BD0000E94E61E9927082B192B0E94E61E682FCB
:103BE000C8010E94631CE1C0873689F40E94E61E6A
:103BF0009927182F00270E94E61E9927082B192BBA
:103C00000E94E61E682FC8010E94281DA0CF85369D
:103C1000B1F58091E4008537F9F41092E300109239
:103C2000E20043E020E030E0F90140935700E895DE
:103C300007B600FCFDCFC90180589F4F9C0158E397
:103C40008030950788F39093E3008093E20081E150
:103C500080935700E8951EC08B33E1F48CEA0E94F4
:103C60004B1F80E80E944B1F80E00E944B1F80E0AA
:103C70000E944B1F8CE893E20E94F51E0BC0853416
:103C800059F488E190E028E00FB6F894A89581BD3A
:103C90000FBE21BD8DE089C0803539F48091E400EC
:103CA0008B33C1F70E94511FF5CF8C3439F48091CA
:103CB000E4008B3379F70E946D1FECCF803711F44D
:103CC00083E573C0823711F48FEF6FC08E3459F4DF
:103CD0008091E400853711F488E967C08B3309F0DF
:103CE00036CF8EED62C08C3619F40E94E61ED2CF1C
:103CF000843741F485E70E94E21E8BE30E94E21EB6
:103D000080E053C0883731F40E94E61E823031F4DF
:103D1000C398C0CF893721F40E94E61EC39ABACF58
:103D2000843529F40E94E61E8093E400B3CF8335E6
:103D300019F40E944D1C0BCF863529F480E30E94B4
:103D4000E21E87E332C0833711F58091E4008537A6
:103D500041F483E00E94E21E84E90E94E21E8EE1AB
:103D600024C08B3309F0F3CE03E0015080E30E94BE
:103D70004B1F80E00E944B1F802F0E944B1F8FEF34
:103D80000E944B1F0E94E21E002379F7E0CE8D3483
:103D900041F488B398E0892788BB84E70E94E21E3B
:103DA00079CF8B3109F4D3CE8FE30E94E21ECFCEC0
:103DB0009C01832F992780BD29B988E18AB986E8BB
:103DC00080BD08955D9BFECF8CB908955F9BFECFAB
:103DD0008CB199270895FC0160FD60935700C89548
:103DE000802DE395C895902D0895CF93DF93CDB79F
:103DF000DEB722970FB6F894DEBF0FBECDBF039695
:103E000065E070E00E94831F9B0144275527DA017B
:103E1000C90163E0880F991FAA1FBB1F6A95D1F7DC
:103E2000821B930BA40BB50B9C0119821A8289810A
:103E30009A818217930750F489819A810196898328
:103E40009A8389819A8182179307B0F322960FB6DD
:103E5000F894DEBF0FBECDBFDF91CF910895D89803
:103E600088E092E50E94F51E0895D89A88E092E5D0
:103E70000E94F51E08950E94351F0E942F1F08956D
:103E8000C79A87B3806B87BBD09ABE9883E58DB9FC
:103E90000E94351F08958FB9779BFECF8FB1992768
:103EA0000895CF93C7980E943B1FC0E08CEA0E9400
:103EB0004B1F83E50E944B1F8FEF0E944B1F8335E2
:103EC00011F4C1E402C00E943B1F80E00E944B1F1E
:103ED000CF5FC03458F3CF9108950E943B1F0E94DA
:103EE000351F08950E94511F8CEA0E944B1F80E8E5
:103EF0000E944B1F80E00E944B1F80E00E944B1FDE
:103F00000E946D1F0895AA1BBB1B51E107C0AA1F89
:103F1000BB1FA617B70710F0A61BB70B881F991F6A
:0E3F20005A95A9F780959095BC01CD010895A2
:0400000300003800C1
:00000001FF

20
testavrdude/go.cmd Normal file
View File

@ -0,0 +1,20 @@
@echo off
rem Use avrdude as programming-software with the AVRProg compatible bootloader
rem Martin Thomas, 2006
rem Verfiy that the bootloader is configured with #define DEVTYPE DEVTYPE_ISP
rem since it seems that avrdude does not work with "Boot" device-types and needs
rem ISP device-types (at least in version 5.1 as in WinAVR 4/06)
set HEXFILE=cansniffer.hex
set PROGRAMMER=avr109
set PORT=com2
set BAUD=19200
set PART=atmega32
rem * disable safemode - bootloader can not "restore" fuses anyway
set DIS_SAVE=-u
avrdude %DIS_SAVE% -p %PART% -P %PORT% -c %PROGRAMMER% -b %BAUD% -v -U flash:w:%HEXFILE%
rem pause