cleanup
- dos2unix - remove trailing spaces
This commit is contained in:
parent
919606b3ab
commit
ba471f01de
378
chipdef.h
378
chipdef.h
@ -1,190 +1,190 @@
|
|||||||
|
|
||||||
#ifndef CHIPDEF_H
|
#ifndef CHIPDEF_H
|
||||||
#define CHIPDEF_H
|
#define CHIPDEF_H
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
|
||||||
// TODO: make use of RAMEND in the avr-libc io-files and
|
// TODO: make use of RAMEND in the avr-libc io-files and
|
||||||
// avoid a lot of by-device definitions here
|
// avoid a lot of by-device definitions here
|
||||||
|
|
||||||
#if defined(__AVR_ATmega169__)
|
#if defined(__AVR_ATmega169__)
|
||||||
#define sig_byte3 0x1E
|
#define sig_byte3 0x1E
|
||||||
#define sig_byte2 0x94
|
#define sig_byte2 0x94
|
||||||
#define sig_byte1 0x05
|
#define sig_byte1 0x05
|
||||||
|
|
||||||
#define devtype 0x79 // Mega 169 device code
|
#define devtype 0x79 // Mega 169 device code
|
||||||
|
|
||||||
// #define PAGESIZE 128 // 2*64 Words = Size in Bytes
|
// #define PAGESIZE 128 // 2*64 Words = Size in Bytes
|
||||||
|
|
||||||
#ifdef _B128
|
#ifdef _B128
|
||||||
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*128 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*128 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B256
|
#ifdef _B256
|
||||||
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*256 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*256 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B512
|
#ifdef _B512
|
||||||
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B1024
|
#ifdef _B1024
|
||||||
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B2048
|
#ifdef _B2048
|
||||||
#error "_B2048 not suppoted on this device"
|
#error "_B2048 not suppoted on this device"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif defined(__AVR_ATmega16__)
|
#elif defined(__AVR_ATmega16__)
|
||||||
|
|
||||||
#define sig_byte3 0x1E
|
#define sig_byte3 0x1E
|
||||||
#define sig_byte2 0x94
|
#define sig_byte2 0x94
|
||||||
#define sig_byte1 0x03
|
#define sig_byte1 0x03
|
||||||
|
|
||||||
#define devtype 0x75 // Mega16 device code
|
#define devtype 0x75 // Mega16 device code
|
||||||
|
|
||||||
// #define PAGESIZE 128 // Size in Bytes
|
// #define PAGESIZE 128 // Size in Bytes
|
||||||
|
|
||||||
#ifdef _B128
|
#ifdef _B128
|
||||||
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*128 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*128 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B256
|
#ifdef _B256
|
||||||
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*256 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*256 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B512
|
#ifdef _B512
|
||||||
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B1024
|
#ifdef _B1024
|
||||||
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*8192 / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B2048
|
#ifdef _B2048
|
||||||
#error "_B2048 not suppoted on this device"
|
#error "_B2048 not suppoted on this device"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif defined(__AVR_ATmega8__)
|
#elif defined(__AVR_ATmega8__)
|
||||||
|
|
||||||
#define sig_byte3 0x1E
|
#define sig_byte3 0x1E
|
||||||
#define sig_byte2 0x93
|
#define sig_byte2 0x93
|
||||||
#define sig_byte1 0x07
|
#define sig_byte1 0x07
|
||||||
|
|
||||||
//#define devtype 0x77 // Mega8 boot device code
|
//#define devtype 0x77 // Mega8 boot device code
|
||||||
#define devtype 0x76 // Mega8 boot device code
|
#define devtype 0x76 // Mega8 boot device code
|
||||||
|
|
||||||
// #define PAGESIZE 64 // Size in Bytes
|
// #define PAGESIZE 64 // Size in Bytes
|
||||||
|
|
||||||
#ifdef _B128
|
#ifdef _B128
|
||||||
#define APP_PAGES ((2*4096 / SPM_PAGESIZE)- (2*128 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*4096 / SPM_PAGESIZE)- (2*128 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B256
|
#ifdef _B256
|
||||||
#define APP_PAGES ((2*4096 / SPM_PAGESIZE)- (2*256 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*4096 / SPM_PAGESIZE)- (2*256 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B512
|
#ifdef _B512
|
||||||
#define APP_PAGES ((2*4096 / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*4096 / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B1024
|
#ifdef _B1024
|
||||||
#define APP_PAGES ((2*4096 / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*4096 / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B2048
|
#ifdef _B2048
|
||||||
#error "_B2048 not suppoted on this device"
|
#error "_B2048 not suppoted on this device"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif defined(__AVR_ATmega32__)
|
#elif defined(__AVR_ATmega32__)
|
||||||
|
|
||||||
#define sig_byte3 0x1E
|
#define sig_byte3 0x1E
|
||||||
#define sig_byte2 0x95
|
#define sig_byte2 0x95
|
||||||
#define sig_byte1 0x02
|
#define sig_byte1 0x02
|
||||||
|
|
||||||
#define devtype 0x73 // Mega32 device code
|
#define devtype 0x73 // Mega32 device code
|
||||||
|
|
||||||
// #define PAGESIZE 128 // Size in Bytes
|
// #define PAGESIZE 128 // Size in Bytes
|
||||||
|
|
||||||
#ifdef _B128
|
#ifdef _B128
|
||||||
#define APP_PAGES ((2*16384UL / SPM_PAGESIZE)- (2*128 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*16384UL / SPM_PAGESIZE)- (2*128 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B256
|
#ifdef _B256
|
||||||
#define APP_PAGES ((2*16384UL / SPM_PAGESIZE)- (2*256 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*16384UL / SPM_PAGESIZE)- (2*256 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B512
|
#ifdef _B512
|
||||||
#define APP_PAGES ((2*16384UL / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*16384UL / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B1024
|
#ifdef _B1024
|
||||||
#define APP_PAGES ((2*16384UL / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*16384UL / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B2048
|
#ifdef _B2048
|
||||||
#define APP_PAGES ((2*16384UL / SPM_PAGESIZE)- (2*2048 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*16384UL / SPM_PAGESIZE)- (2*2048 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif defined(__AVR_ATmega128__)
|
#elif defined(__AVR_ATmega128__)
|
||||||
|
|
||||||
#define sig_byte3 0x1E
|
#define sig_byte3 0x1E
|
||||||
#define sig_byte2 0x97
|
#define sig_byte2 0x97
|
||||||
#define sig_byte1 0x02
|
#define sig_byte1 0x02
|
||||||
|
|
||||||
#define devtype 0x44 //
|
#define devtype 0x44 //
|
||||||
|
|
||||||
// #define PAGESIZE 128 // Size in Bytes
|
// #define PAGESIZE 128 // Size in Bytes
|
||||||
|
|
||||||
#ifdef _B512
|
#ifdef _B512
|
||||||
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B1024
|
#ifdef _B1024
|
||||||
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B2048
|
#ifdef _B2048
|
||||||
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*2048 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*2048 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B4096
|
#ifdef _B4096
|
||||||
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*4096 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*4096 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif defined(__AVR_AT90CAN128__)
|
#elif defined(__AVR_AT90CAN128__)
|
||||||
|
|
||||||
#define sig_byte3 0x1E
|
#define sig_byte3 0x1E
|
||||||
#define sig_byte2 0x97
|
#define sig_byte2 0x97
|
||||||
#define sig_byte1 0x81
|
#define sig_byte1 0x81
|
||||||
|
|
||||||
#define devtype 0x43 /* Dummy device code for now, must be same as
|
#define devtype 0x43 /* Dummy device code for now, must be same as
|
||||||
used in avrdude.conf */
|
used in avrdude.conf */
|
||||||
|
|
||||||
// #define PAGESIZE 128 // Size in Bytes
|
// #define PAGESIZE 128 // Size in Bytes
|
||||||
|
|
||||||
#ifdef _B512
|
#ifdef _B512
|
||||||
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B1024
|
#ifdef _B1024
|
||||||
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B2048
|
#ifdef _B2048
|
||||||
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*2048 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*2048 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
#ifdef _B4096
|
#ifdef _B4096
|
||||||
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*4096 / SPM_PAGESIZE ))
|
#define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*4096 / SPM_PAGESIZE ))
|
||||||
#define APP_END APP_PAGES * SPM_PAGESIZE
|
#define APP_END APP_PAGES * SPM_PAGESIZE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#error "no definition for MCU available in chipdef.h"
|
#error "no definition for MCU available in chipdef.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
54
lowlevel.c
54
lowlevel.c
@ -1,27 +1,27 @@
|
|||||||
//
|
//
|
||||||
// Low-level routines to read lock and fuse-bytes
|
// Low-level routines to read lock and fuse-bytes
|
||||||
//
|
//
|
||||||
// Copyright (C) 2/2005 Martin Thomas, Kaiserslautern, Germany
|
// Copyright (C) 2/2005 Martin Thomas, Kaiserslautern, Germany
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "lowlevel.h"
|
#include "lowlevel.h"
|
||||||
|
|
||||||
unsigned char read_fuse_lock(unsigned short addr, unsigned char mode)
|
unsigned char read_fuse_lock(unsigned short addr, unsigned char mode)
|
||||||
{
|
{
|
||||||
unsigned char retval;
|
unsigned char retval;
|
||||||
|
|
||||||
asm volatile
|
asm volatile
|
||||||
(
|
(
|
||||||
"movw r30, %3\n\t" /* Z to addr */ \
|
"movw r30, %3\n\t" /* Z to addr */ \
|
||||||
"sts %0, %2\n\t" /* set mode in SPM_REG */ \
|
"sts %0, %2\n\t" /* set mode in SPM_REG */ \
|
||||||
"lpm\n\t" /* load fuse/lock value into r0 */ \
|
"lpm\n\t" /* load fuse/lock value into r0 */ \
|
||||||
"mov %1,r0\n\t" /* save return value */ \
|
"mov %1,r0\n\t" /* save return value */ \
|
||||||
: "=m" (SPM_REG),
|
: "=m" (SPM_REG),
|
||||||
"=r" (retval)
|
"=r" (retval)
|
||||||
: "r" (mode),
|
: "r" (mode),
|
||||||
"r" (addr)
|
"r" (addr)
|
||||||
: "r30", "r31", "r0"
|
: "r30", "r31", "r0"
|
||||||
);
|
);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
36
lowlevel.h
36
lowlevel.h
@ -1,18 +1,18 @@
|
|||||||
#ifndef LOWLEVEL_H
|
#ifndef LOWLEVEL_H
|
||||||
#define LOWLEVEL_H
|
#define LOWLEVEL_H
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
|
||||||
/* Check for SPM Control Register in processor. */
|
/* Check for SPM Control Register in processor. */
|
||||||
#if defined (SPMCSR)
|
#if defined (SPMCSR)
|
||||||
# define SPM_REG SPMCSR
|
# define SPM_REG SPMCSR
|
||||||
#elif defined (SPMCR)
|
#elif defined (SPMCR)
|
||||||
# define SPM_REG SPMCR
|
# define SPM_REG SPMCR
|
||||||
#else
|
#else
|
||||||
# error AVR processor does not provide bootloader support!
|
# error AVR processor does not provide bootloader support!
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned char read_fuse_lock(unsigned short addr, unsigned char mode);
|
unsigned char read_fuse_lock(unsigned short addr, unsigned char mode);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
186
main.c
186
main.c
@ -2,14 +2,14 @@
|
|||||||
*
|
*
|
||||||
* AVRPROG compatible boot-loader
|
* AVRPROG compatible boot-loader
|
||||||
* Version : 0.75 (Feb. 2006)
|
* Version : 0.75 (Feb. 2006)
|
||||||
* Compiler : avr-gcc 3.4.1 / avr-libc 1.0.2
|
* Compiler : avr-gcc 3.4.1 / avr-libc 1.0.2
|
||||||
* size : depends on features and startup ( minmal features < 512 words)
|
* size : depends on features and startup ( minmal features < 512 words)
|
||||||
* by : Martin Thomas, Kaiserslautern, Germany
|
* by : Martin Thomas, Kaiserslautern, Germany
|
||||||
* eversmith@heizung-thomas.de
|
* eversmith@heizung-thomas.de
|
||||||
*
|
*
|
||||||
* License : Copyright (c) 2005 Martin Thomas
|
* License : Copyright (c) 2005 Martin Thomas
|
||||||
* Free to use. You have to mention the copyright
|
* Free to use. You have to mention the copyright
|
||||||
* owners in source-code and documentation of derived
|
* owners in source-code and documentation of derived
|
||||||
* work. No warranty.
|
* work. No warranty.
|
||||||
*
|
*
|
||||||
* Additional code and improvements contributed by:
|
* Additional code and improvements contributed by:
|
||||||
@ -22,11 +22,11 @@
|
|||||||
* - based on the Butterfly Bootloader-Code
|
* - based on the Butterfly Bootloader-Code
|
||||||
* Copyright (C) 1996-1998 Atmel Corporation
|
* Copyright (C) 1996-1998 Atmel Corporation
|
||||||
* Author(s) : BBrandal, PKastnes, ARodland, LHM
|
* Author(s) : BBrandal, PKastnes, ARodland, LHM
|
||||||
* The orignal code has been made available by ATMEL together with the
|
* The orignal code has been made available by ATMEL together with the
|
||||||
* Butterfly application code. Since ATMEL.NO had no problem with
|
* Butterfly application code. Since ATMEL.NO had no problem with
|
||||||
* the application gcc-port they hopefully will not have any concerns about
|
* the application gcc-port they hopefully will not have any concerns about
|
||||||
* publishing this port. A lot of things have been change but the ATMEL
|
* publishing this port. A lot of things have been change but the ATMEL
|
||||||
* "skeleton" is still in this code. Make sure to keep the copyright notice
|
* "skeleton" is still in this code. Make sure to keep the copyright notice
|
||||||
* in derived work to avoid trouble.
|
* in derived work to avoid trouble.
|
||||||
*
|
*
|
||||||
* - based on boot.h from the avr-libc (c) Eric Weddington
|
* - based on boot.h from the avr-libc (c) Eric Weddington
|
||||||
@ -36,19 +36,19 @@
|
|||||||
* The boot interrupt vector is included (this bootloader is completly in
|
* The boot interrupt vector is included (this bootloader is completly in
|
||||||
* ".text" section). If you need this space for further functions you have to
|
* ".text" section). If you need this space for further functions you have to
|
||||||
* add a separate section for the bootloader-functions and add an attribute
|
* add a separate section for the bootloader-functions and add an attribute
|
||||||
* for this section to _all_ function prototypes of functions in the loader.
|
* for this section to _all_ function prototypes of functions in the loader.
|
||||||
* With this the interrupt vector will be placed at .0000 and the bootloader
|
* With this the interrupt vector will be placed at .0000 and the bootloader
|
||||||
* code (without interrupt vector) at the adress you define in the linker
|
* code (without interrupt vector) at the adress you define in the linker
|
||||||
* options for the newly created section. See the avr-libc FAQ, the avr-
|
* options for the newly created section. See the avr-libc FAQ, the avr-
|
||||||
* libc's avr/boot.h documentation and the makefile for further details.
|
* libc's avr/boot.h documentation and the makefile for further details.
|
||||||
*
|
*
|
||||||
* See the makefile for information how to adopt the linker-settings to
|
* See the makefile for information how to adopt the linker-settings to
|
||||||
* the selected Boot Size (_Bxxx below)
|
* the selected Boot Size (_Bxxx below)
|
||||||
*
|
*
|
||||||
* With BOOT_SIMPLE this bootloader has 0x3DE bytes size and should fit
|
* With BOOT_SIMPLE this bootloader has 0x3DE bytes size and should fit
|
||||||
* into a 512word bootloader-section.
|
* into a 512word bootloader-section.
|
||||||
*
|
*
|
||||||
* Set AVR clock-frequency and the baudrate below, set MCU-type in
|
* Set AVR clock-frequency and the baudrate below, set MCU-type in
|
||||||
* makefile.
|
* makefile.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -87,11 +87,11 @@
|
|||||||
// UART handling - some definitions from P. Fleury's Library - thanks
|
// UART handling - some definitions from P. Fleury's Library - thanks
|
||||||
#include "uart.h"
|
#include "uart.h"
|
||||||
|
|
||||||
/* enable/disable readout of fuse and lock-bits
|
/* enable/disable readout of fuse and lock-bits
|
||||||
(will not work for Mega169 since not supported by AVRPROG 1.37 */
|
(will not work for Mega169 since not supported by AVRPROG 1.37 */
|
||||||
#define ENABLEREADFUSELOCK
|
#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)
|
WARNING: lock-bits can not be reseted by bootloader (as far as I know)
|
||||||
Only protection no unprotection, "chip erase" from bootloader only
|
Only protection no unprotection, "chip erase" from bootloader only
|
||||||
clears the flash but does no real "chip erase" (this is not possible
|
clears the flash but does no real "chip erase" (this is not possible
|
||||||
@ -131,33 +131,33 @@ int main(void)
|
|||||||
{
|
{
|
||||||
unsigned tempi;
|
unsigned tempi;
|
||||||
char val;
|
char val;
|
||||||
|
|
||||||
#ifdef START_POWERSAVE
|
#ifdef START_POWERSAVE
|
||||||
char OK = 1;
|
char OK = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
cli();
|
cli();
|
||||||
|
|
||||||
MCUCR = (1<<IVCE); // move interruptvectors to the Boot sector
|
MCUCR = (1<<IVCE); // move interruptvectors to the Boot sector
|
||||||
MCUCR = (1<<IVSEL); // device specific !
|
MCUCR = (1<<IVSEL); // device specific !
|
||||||
|
|
||||||
BLDDR &= ~(1<<BLPNUM); // set as Input
|
BLDDR &= ~(1<<BLPNUM); // set as Input
|
||||||
BLPORT |= (1<<BLPNUM); // Enable pullup
|
BLPORT |= (1<<BLPNUM); // Enable pullup
|
||||||
|
|
||||||
USART_Init(UART_BAUD_SELECT(BAUDRATE,XTAL),UARTSINGLE); // single speed
|
USART_Init(UART_BAUD_SELECT(BAUDRATE,XTAL),UARTSINGLE); // single speed
|
||||||
// USART_Init(UART_BAUD_SELECT(BAUDRATE/2,XTAL),UARTDOUBLE); // double speed
|
// USART_Init(UART_BAUD_SELECT(BAUDRATE/2,XTAL),UARTDOUBLE); // double speed
|
||||||
|
|
||||||
#ifdef START_POWERSAVE
|
#ifdef START_POWERSAVE
|
||||||
/*
|
/*
|
||||||
This is an adoption of the Butterfly Bootloader startup-sequence.
|
This is an adoption of the Butterfly Bootloader startup-sequence.
|
||||||
It may look a little strange but separating the login-loop from
|
It may look a little strange but separating the login-loop from
|
||||||
the main parser-loop gives a lot a possibilities (timeout, sleep-modes
|
the main parser-loop gives a lot a possibilities (timeout, sleep-modes
|
||||||
etc.).
|
etc.).
|
||||||
*/
|
*/
|
||||||
for(;OK;)
|
for(;OK;)
|
||||||
{
|
{
|
||||||
if((BLPIN & (1<<BLPNUM)))
|
if((BLPIN & (1<<BLPNUM)))
|
||||||
{
|
{
|
||||||
// jump to main app if pin is not grounded
|
// jump to main app if pin is not grounded
|
||||||
BLPORT &= ~(1<<BLPNUM); // set to default
|
BLPORT &= ~(1<<BLPNUM); // set to default
|
||||||
MCUCR = (1<<IVCE); // move interruptvectors to the Application sector
|
MCUCR = (1<<IVCE); // move interruptvectors to the Application sector
|
||||||
@ -165,12 +165,12 @@ int main(void)
|
|||||||
jump_to_app(); // Jump to application sector
|
jump_to_app(); // Jump to application sector
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
val = recchar();
|
val = recchar();
|
||||||
|
|
||||||
if( val == 0x1B ) /* ESC */
|
if( val == 0x1B ) /* ESC */
|
||||||
{ // AVRPROG connection
|
{ // AVRPROG connection
|
||||||
while (val != 'S') // Wait for signon
|
while (val != 'S') // Wait for signon
|
||||||
{
|
{
|
||||||
val = recchar();
|
val = recchar();
|
||||||
}
|
}
|
||||||
@ -182,26 +182,26 @@ int main(void)
|
|||||||
}
|
}
|
||||||
// Power-Save code here
|
// Power-Save code here
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(START_SIMPLE)
|
#elif defined(START_SIMPLE)
|
||||||
|
|
||||||
if((BLPIN & (1<<BLPNUM)))
|
if((BLPIN & (1<<BLPNUM)))
|
||||||
{
|
{
|
||||||
// jump to main app if pin is not grounded
|
// jump to main app if pin is not grounded
|
||||||
BLPORT &= ~(1<<BLPNUM); // set to default
|
BLPORT &= ~(1<<BLPNUM); // set to default
|
||||||
MCUCR = (1<<IVCE);
|
MCUCR = (1<<IVCE);
|
||||||
MCUCR = (0<<IVSEL); //move interruptvectors to the Application sector
|
MCUCR = (0<<IVSEL); //move interruptvectors to the Application sector
|
||||||
jump_to_app(); // Jump to application sector
|
jump_to_app(); // Jump to application sector
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#elif defined(START_WAIT)
|
#elif defined(START_WAIT)
|
||||||
|
|
||||||
// Timer-Setup for ATmega8
|
// Timer-Setup for ATmega8
|
||||||
// - verify that the configuration is valid for the target AVR
|
// - verify that the configuration is valid for the target AVR
|
||||||
|
|
||||||
#define F_OSC XTAL
|
#define F_OSC XTAL
|
||||||
#define UART0_STATUS UCSRA
|
#define UART0_STATUS UCSRA
|
||||||
#define UART0_DATA UDR
|
#define UART0_DATA UDR
|
||||||
#define MY_WAIT 900
|
#define MY_WAIT 900
|
||||||
// wait ca 1 sec (900ms)
|
// wait ca 1 sec (900ms)
|
||||||
@ -210,21 +210,21 @@ int main(void)
|
|||||||
#if (((F_OSC / 8 / 1000)*MY_WAIT) < 65535)
|
#if (((F_OSC / 8 / 1000)*MY_WAIT) < 65535)
|
||||||
#warning Information: setting prescaler to 8
|
#warning Information: setting prescaler to 8
|
||||||
#define WAIT_VALUE ((F_OSC / 8 / 1000)*MY_WAIT)
|
#define WAIT_VALUE ((F_OSC / 8 / 1000)*MY_WAIT)
|
||||||
TCCR1B |= _BV(CS01);
|
TCCR1B |= _BV(CS01);
|
||||||
#elif ((((F_OSC / 64 / 1000)*MY_WAIT) < 65535))
|
#elif ((((F_OSC / 64 / 1000)*MY_WAIT) < 65535))
|
||||||
#warning Information: setting prescaler to 64
|
#warning Information: setting prescaler to 64
|
||||||
#define WAIT_VALUE ((F_OSC / 64 / 1000)*MY_WAIT)
|
#define WAIT_VALUE ((F_OSC / 64 / 1000)*MY_WAIT)
|
||||||
TCCR1B |= _BV(CS01)| _BV(CS00);
|
TCCR1B |= _BV(CS01)| _BV(CS00);
|
||||||
#elif ((((F_OSC / 256 / 1000)*MY_WAIT) < 65535))
|
#elif ((((F_OSC / 256 / 1000)*MY_WAIT) < 65535))
|
||||||
#warning Information: setting prescaler to 256
|
#warning Information: setting prescaler to 256
|
||||||
#define WAIT_VALUE ((F_OSC / 256 / 1000)*MY_WAIT)
|
#define WAIT_VALUE ((F_OSC / 256 / 1000)*MY_WAIT)
|
||||||
TCCR1B |= _BV(CS02);
|
TCCR1B |= _BV(CS02);
|
||||||
#else //((((F_OSC / 1024 / 1000)*MY_WAIT) < 65535))
|
#else //((((F_OSC / 1024 / 1000)*MY_WAIT) < 65535))
|
||||||
#warning Information: setting prescaler to 1024
|
#warning Information: setting prescaler to 1024
|
||||||
#define WAIT_VALUE ((F_OSC / 1024 / 1000)*MY_WAIT)
|
#define WAIT_VALUE ((F_OSC / 1024 / 1000)*MY_WAIT)
|
||||||
TCCR1B |= _BV(CS00) |_BV(CS02); //1024 prescaler
|
TCCR1B |= _BV(CS00) |_BV(CS02); //1024 prescaler
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
if(UART0_STATUS & (1<<RXC)){
|
if(UART0_STATUS & (1<<RXC)){
|
||||||
if (UART0_DATA == 'S')
|
if (UART0_DATA == 'S')
|
||||||
@ -232,7 +232,7 @@ int main(void)
|
|||||||
}
|
}
|
||||||
if (TCNT1 >= WAIT_VALUE){
|
if (TCNT1 >= WAIT_VALUE){
|
||||||
BLPORT &= ~(1<<BLPNUM); // set to default
|
BLPORT &= ~(1<<BLPNUM); // set to default
|
||||||
MCUCR = (1<<IVCE);
|
MCUCR = (1<<IVCE);
|
||||||
MCUCR = (0<<IVSEL); //move interruptvectors to the Application sector
|
MCUCR = (0<<IVSEL); //move interruptvectors to the Application sector
|
||||||
TCCR1B = 0; // timer off
|
TCCR1B = 0; // timer off
|
||||||
jump_to_app(); // Jump to application sector
|
jump_to_app(); // Jump to application sector
|
||||||
@ -240,7 +240,7 @@ int main(void)
|
|||||||
}
|
}
|
||||||
TCCR1B = 0; // timer off
|
TCCR1B = 0; // timer off
|
||||||
send_boot();
|
send_boot();
|
||||||
|
|
||||||
#elif defined(START_BOOTICE)
|
#elif defined(START_BOOTICE)
|
||||||
#warning "BOOTICE mode - no startup-condition"
|
#warning "BOOTICE mode - no startup-condition"
|
||||||
|
|
||||||
@ -248,24 +248,24 @@ int main(void)
|
|||||||
#error "Select START_ condition for bootloader in main.c"
|
#error "Select START_ condition for bootloader in main.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
val=recchar();
|
val=recchar();
|
||||||
|
|
||||||
if(val=='a') //Autoincrement?
|
if(val=='a') //Autoincrement?
|
||||||
{
|
{
|
||||||
sendchar('Y'); //Autoincrement is quicker
|
sendchar('Y'); //Autoincrement is quicker
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(val=='A') //write address
|
else if(val=='A') //write address
|
||||||
{
|
{
|
||||||
address=recchar(); //read address 8 MSB
|
address=recchar(); //read address 8 MSB
|
||||||
address=(address<<8)|recchar();
|
address=(address<<8)|recchar();
|
||||||
|
|
||||||
address=address<<1; // !! convert from word address to byte address
|
address=address<<1; // !! convert from word address to byte address
|
||||||
sendchar('\r');
|
sendchar('\r');
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(val=='b')
|
else if(val=='b')
|
||||||
{ // Buffer load support
|
{ // Buffer load support
|
||||||
sendchar('Y'); // Report buffer load supported
|
sendchar('Y'); // Report buffer load supported
|
||||||
@ -282,21 +282,21 @@ int main(void)
|
|||||||
sendchar (BufferLoad(tempi,val));
|
sendchar (BufferLoad(tempi,val));
|
||||||
// Start downloading of buffer
|
// Start downloading of buffer
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(val == 'g') // Block read
|
else if(val == 'g') // Block read
|
||||||
{
|
{
|
||||||
tempi = (recchar() << 8) | recchar();
|
tempi = (recchar() << 8) | recchar();
|
||||||
|
|
||||||
val = recchar(); // Get memtype
|
val = recchar(); // Get memtype
|
||||||
BlockRead(tempi,val); // Perform the block read
|
BlockRead(tempi,val); // Perform the block read
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(val=='e') //Chip erase
|
else if(val=='e') //Chip erase
|
||||||
{
|
{
|
||||||
if (device == devtype)
|
if (device == devtype)
|
||||||
{
|
{
|
||||||
// erase only main section (bootloader protection)
|
// erase only main section (bootloader protection)
|
||||||
address = 0;
|
address = 0;
|
||||||
while ( APP_END > address )
|
while ( APP_END > address )
|
||||||
{
|
{
|
||||||
boot_page_erase(address); // Perform page erase
|
boot_page_erase(address); // Perform page erase
|
||||||
@ -305,7 +305,7 @@ int main(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
boot_rww_enable();
|
boot_rww_enable();
|
||||||
sendchar('\r');
|
sendchar('\r');
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(val=='E') //Exit upgrade
|
else if(val=='E') //Exit upgrade
|
||||||
@ -313,11 +313,11 @@ int main(void)
|
|||||||
wdt_enable(WDTO_15MS); // Enable Watchdog Timer to give reset
|
wdt_enable(WDTO_15MS); // Enable Watchdog Timer to give reset
|
||||||
sendchar('\r');
|
sendchar('\r');
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WRITELOCKBITS
|
#ifdef WRITELOCKBITS
|
||||||
#warning "Extension 'WriteLockBits' enabled"
|
#warning "Extension 'WriteLockBits' enabled"
|
||||||
// TODO: does not work reliably
|
// TODO: does not work reliably
|
||||||
else if(val=='l') // write lockbits
|
else if(val=='l') // write lockbits
|
||||||
{
|
{
|
||||||
if (device == devtype)
|
if (device == devtype)
|
||||||
{
|
{
|
||||||
@ -328,22 +328,22 @@ int main(void)
|
|||||||
sendchar('\r');
|
sendchar('\r');
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
else if(val=='P') // Enter programming mode
|
else if(val=='P') // Enter programming mode
|
||||||
{
|
{
|
||||||
sendchar('\r');
|
sendchar('\r');
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(val=='L') // Leave programming mode
|
else if(val=='L') // Leave programming mode
|
||||||
{
|
{
|
||||||
sendchar('\r');
|
sendchar('\r');
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (val=='p') // return programmer type
|
else if (val=='p') // return programmer type
|
||||||
{
|
{
|
||||||
sendchar('S'); // always serial programmer
|
sendchar('S'); // always serial programmer
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLEREADFUSELOCK
|
#ifdef ENABLEREADFUSELOCK
|
||||||
#warning "Extension 'ReadFuseLock' enabled"
|
#warning "Extension 'ReadFuseLock' enabled"
|
||||||
else if(val=='F') // read "low" fuse bits
|
else if(val=='F') // read "low" fuse bits
|
||||||
@ -352,23 +352,23 @@ int main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
else if(val=='r') // read lock bits
|
else if(val=='r') // read lock bits
|
||||||
{
|
{
|
||||||
sendchar( read_fuse_lock(0x0001, _BV(BLBSET)|_BV(SPMEN)) );
|
sendchar( read_fuse_lock(0x0001, _BV(BLBSET)|_BV(SPMEN)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(val=='N') // read high fuse bits
|
else if(val=='N') // read high fuse bits
|
||||||
{
|
{
|
||||||
sendchar( read_fuse_lock(0x0003,_BV(BLBSET)|_BV(SPMEN)) );
|
sendchar( read_fuse_lock(0x0003,_BV(BLBSET)|_BV(SPMEN)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(val=='Q') // read extended fuse bits
|
else if(val=='Q') // read extended fuse bits
|
||||||
{
|
{
|
||||||
sendchar( read_fuse_lock(0x0002,_BV(BLBSET)|_BV(SPMEN)) );
|
sendchar( read_fuse_lock(0x0002,_BV(BLBSET)|_BV(SPMEN)) );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// end of ENABLEREADFUSELOCK section
|
// end of ENABLEREADFUSELOCK section
|
||||||
|
|
||||||
else if(val=='t') // Return device type
|
else if(val=='t') // Return device type
|
||||||
{
|
{
|
||||||
sendchar(devtype);
|
sendchar(devtype);
|
||||||
sendchar(0);
|
sendchar(0);
|
||||||
@ -379,37 +379,37 @@ int main(void)
|
|||||||
recchar();
|
recchar();
|
||||||
sendchar('\r');
|
sendchar('\r');
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (val=='T') // set device
|
else if (val=='T') // set device
|
||||||
{
|
{
|
||||||
device = recchar();
|
device = recchar();
|
||||||
sendchar('\r');
|
sendchar('\r');
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (val=='S') // Return software identifier
|
else if (val=='S') // Return software identifier
|
||||||
{
|
{
|
||||||
send_boot();
|
send_boot();
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (val=='V') // Return Software Version
|
else if (val=='V') // Return Software Version
|
||||||
{
|
{
|
||||||
sendchar(VERSION_HIGH);
|
sendchar(VERSION_HIGH);
|
||||||
sendchar(VERSION_LOW);
|
sendchar(VERSION_LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (val=='s') // Return Signature Byte
|
else if (val=='s') // Return Signature Byte
|
||||||
{
|
{
|
||||||
sendchar(sig_byte1);
|
sendchar(sig_byte1);
|
||||||
sendchar(sig_byte2);
|
sendchar(sig_byte2);
|
||||||
sendchar(sig_byte3);
|
sendchar(sig_byte3);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(val != 0x1b) /* ESC */
|
else if(val != 0x1b) /* ESC */
|
||||||
{
|
{
|
||||||
sendchar('?');
|
sendchar('?');
|
||||||
}
|
}
|
||||||
} // end of "parser" for-loop
|
} // end of "parser" for-loop
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -418,7 +418,7 @@ unsigned char BufferLoad(unsigned int size, unsigned char mem)
|
|||||||
{
|
{
|
||||||
unsigned int data, cnt;
|
unsigned int data, cnt;
|
||||||
uint32_t tempaddress;
|
uint32_t tempaddress;
|
||||||
|
|
||||||
for (cnt=0; cnt<UART_RX_BUFFER_SIZE; cnt++) {
|
for (cnt=0; cnt<UART_RX_BUFFER_SIZE; cnt++) {
|
||||||
if (cnt<size) gBuffer[cnt]=recchar();
|
if (cnt<size) gBuffer[cnt]=recchar();
|
||||||
else gBuffer[cnt]=0xFF;
|
else gBuffer[cnt]=0xFF;
|
||||||
@ -426,9 +426,9 @@ unsigned char BufferLoad(unsigned int size, unsigned char mem)
|
|||||||
cnt=0;
|
cnt=0;
|
||||||
|
|
||||||
tempaddress = address; // Store address in page
|
tempaddress = address; // Store address in page
|
||||||
|
|
||||||
my_eeprom_busy_wait();
|
my_eeprom_busy_wait();
|
||||||
|
|
||||||
if (device == devtype)
|
if (device == devtype)
|
||||||
{
|
{
|
||||||
if (mem == 'F') // Flash
|
if (mem == 'F') // Flash
|
||||||
@ -437,29 +437,29 @@ unsigned char BufferLoad(unsigned int size, unsigned char mem)
|
|||||||
data=gBuffer[cnt++];
|
data=gBuffer[cnt++];
|
||||||
data|=(gBuffer[cnt++]<<8);
|
data|=(gBuffer[cnt++]<<8);
|
||||||
boot_page_fill(address,data);
|
boot_page_fill(address,data);
|
||||||
//call asm routine.
|
//call asm routine.
|
||||||
address=address+2; // Select next word in memory
|
address=address+2; // Select next word in memory
|
||||||
size -= 2; // Reduce number of bytes to write by two
|
size -= 2; // Reduce number of bytes to write by two
|
||||||
} while(size); // Loop until all bytes written
|
} while(size); // Loop until all bytes written
|
||||||
|
|
||||||
/* commented out since not compatible with mega8 -
|
/* commented out since not compatible with mega8 -
|
||||||
secondary benefit: saves memory
|
secondary benefit: saves memory
|
||||||
tempaddress &= 0xFF80; // Ensure the address points to the first byte in the page
|
tempaddress &= 0xFF80; // Ensure the address points to the first byte in the page
|
||||||
*/
|
*/
|
||||||
|
|
||||||
boot_page_write(tempaddress);
|
boot_page_write(tempaddress);
|
||||||
boot_spm_busy_wait();
|
boot_spm_busy_wait();
|
||||||
boot_rww_enable(); //Re-enable the RWW section
|
boot_rww_enable(); //Re-enable the RWW section
|
||||||
|
|
||||||
/* commented out since not compatible with mega8
|
/* commented out since not compatible with mega8
|
||||||
if (address != (address & 0xFF80))
|
if (address != (address & 0xFF80))
|
||||||
{ // Ensure that the address points to the beginning of the next page
|
{ // Ensure that the address points to the beginning of the next page
|
||||||
address &= 0xFF80;
|
address &= 0xFF80;
|
||||||
address += SPM_PAGESIZE;
|
address += SPM_PAGESIZE;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
} // End FLASH
|
} // End FLASH
|
||||||
|
|
||||||
if (mem == 'E') // Start EEPROM
|
if (mem == 'E') // Start EEPROM
|
||||||
{
|
{
|
||||||
address>>=1;
|
address>>=1;
|
||||||
@ -468,10 +468,10 @@ unsigned char BufferLoad(unsigned int size, unsigned char mem)
|
|||||||
EEARH = (address >> 8);
|
EEARH = (address >> 8);
|
||||||
address++; // Select next byte
|
address++; // Select next byte
|
||||||
EEDR=gBuffer[cnt++];
|
EEDR=gBuffer[cnt++];
|
||||||
|
|
||||||
EECR |= (1<<EEMWE); // Write data into EEPROM
|
EECR |= (1<<EEMWE); // Write data into EEPROM
|
||||||
EECR |= (1<<EEWE);
|
EECR |= (1<<EEWE);
|
||||||
|
|
||||||
while (EECR & (1<<EEWE)); // Wait for EEPROM write to finish
|
while (EECR & (1<<EEWE)); // Wait for EEPROM write to finish
|
||||||
size--; // Decreas number of bytes to write
|
size--; // Decreas number of bytes to write
|
||||||
} while(size); // Loop until all bytes written
|
} while(size); // Loop until all bytes written
|
||||||
@ -481,16 +481,16 @@ unsigned char BufferLoad(unsigned int size, unsigned char mem)
|
|||||||
return '\r'; // Report programming OK
|
return '\r'; // Report programming OK
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0; // Report programming failed
|
return 0; // Report programming failed
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlockRead(unsigned int size, unsigned char mem)
|
void BlockRead(unsigned int size, unsigned char mem)
|
||||||
{
|
{
|
||||||
unsigned int data;
|
unsigned int data;
|
||||||
|
|
||||||
my_eeprom_busy_wait();
|
my_eeprom_busy_wait();
|
||||||
|
|
||||||
if (mem == 'E') // Read EEPROM
|
if (mem == 'E') // Read EEPROM
|
||||||
{
|
{
|
||||||
// address>>=1; // not needed here - hmm, somehow inconsistant TODO
|
// address>>=1; // not needed here - hmm, somehow inconsistant TODO
|
||||||
@ -512,7 +512,7 @@ void BlockRead(unsigned int size, unsigned char mem)
|
|||||||
data = pgm_read_word_near((uint16_t)address);
|
data = pgm_read_word_near((uint16_t)address);
|
||||||
#endif
|
#endif
|
||||||
sendchar((unsigned char)data); //send LSB
|
sendchar((unsigned char)data); //send LSB
|
||||||
sendchar((unsigned char)(data >> 8)); //send MSB
|
sendchar((unsigned char)(data >> 8)); //send MSB
|
||||||
address += 2; // Select next word in memory
|
address += 2; // Select next word in memory
|
||||||
size -= 2; // Subtract two bytes from number of bytes to read
|
size -= 2; // Subtract two bytes from number of bytes to read
|
||||||
} while (size); // Repeat until all block has been read
|
} while (size); // Repeat until all block has been read
|
||||||
|
62
makefile
62
makefile
@ -44,7 +44,7 @@ XTAL=16000000
|
|||||||
#BAUDRATE=115200
|
#BAUDRATE=115200
|
||||||
BAUDRATE=9600UL
|
BAUDRATE=9600UL
|
||||||
|
|
||||||
#Pin "STARTPIN" on port "STARTPORT" in this port has to grounded
|
#Pin "STARTPIN" on port "STARTPORT" in this port has to grounded
|
||||||
# (active low) to start the bootloader
|
# (active low) to start the bootloader
|
||||||
BLPORT = PORTB
|
BLPORT = PORTB
|
||||||
BLDDR = DDRB
|
BLDDR = DDRB
|
||||||
@ -52,8 +52,8 @@ BLPIN = PINB
|
|||||||
BLPNUM = PINB0
|
BLPNUM = PINB0
|
||||||
|
|
||||||
# Select startup-mode
|
# Select startup-mode
|
||||||
# * SIMPLE-Mode - Jump to bootloader main BL-loop if key is
|
# * SIMPLE-Mode - Jump to bootloader main BL-loop if key is
|
||||||
# pressed (Pin grounded) "during" reset or jump to the
|
# pressed (Pin grounded) "during" reset or jump to the
|
||||||
# application if the pin is not grounded (=pulled up by
|
# application if the pin is not grounded (=pulled up by
|
||||||
# internal pull-up-resistor)
|
# internal pull-up-resistor)
|
||||||
# * POWERSAVE-Mode - Startup is separated in two loops
|
# * POWERSAVE-Mode - Startup is separated in two loops
|
||||||
@ -61,7 +61,7 @@ BLPNUM = PINB0
|
|||||||
# is on the chip. Needs more memory
|
# is on the chip. Needs more memory
|
||||||
# * BOOTICE-Mode - to flash the JTAGICE upgrade.ebn file.
|
# * BOOTICE-Mode - to flash the JTAGICE upgrade.ebn file.
|
||||||
# No startup-sequence in this mode. Jump directly to the
|
# No startup-sequence in this mode. Jump directly to the
|
||||||
# parser-loop on reset
|
# parser-loop on reset
|
||||||
# XTAL in BOOTICEMODE must be 7372800 Hz to be compatible
|
# XTAL in BOOTICEMODE must be 7372800 Hz to be compatible
|
||||||
# with the org. JTAGICE-Firmware */
|
# with the org. JTAGICE-Firmware */
|
||||||
# * WAIT-mode waits 1 sec for the S command if nothing is recived
|
# * WAIT-mode waits 1 sec for the S command if nothing is recived
|
||||||
@ -74,43 +74,43 @@ STARTMODE=START_WAIT
|
|||||||
|
|
||||||
#/* Select Boot Size in Words (select one, comment out the others) */
|
#/* Select Boot Size in Words (select one, comment out the others) */
|
||||||
## NO! BOOTSIZE=_B128
|
## NO! BOOTSIZE=_B128
|
||||||
## NO! BOOTSIZE=_B256
|
## NO! BOOTSIZE=_B256
|
||||||
## MAYBE: BOOTSIZE=_B512
|
## MAYBE: BOOTSIZE=_B512
|
||||||
#BOOTSIZE=_B512
|
#BOOTSIZE=_B512
|
||||||
BOOTSIZE=_B1024
|
BOOTSIZE=_B1024
|
||||||
##BOOTSIZE=_B2048
|
##BOOTSIZE=_B2048
|
||||||
|
|
||||||
|
|
||||||
################## BOOTLOADER ######################
|
################## BOOTLOADER ######################
|
||||||
# mt: Boot loader support. So far not done with a separate section
|
# mt: Boot loader support. So far not done with a separate section
|
||||||
# to get the interrupt vector into the bootloader area.
|
# to get the interrupt vector into the bootloader area.
|
||||||
# Bootloader address in datasheet and stk500 is given as
|
# Bootloader address in datasheet and stk500 is given as
|
||||||
# "word", gcc toolchain needs "byte"-address
|
# "word", gcc toolchain needs "byte"-address
|
||||||
# (see LDFLAGS further down)
|
# (see LDFLAGS further down)
|
||||||
|
|
||||||
# 0x1C00*2=0x3800 for ATmega16 1024 words Boot Size
|
# 0x1C00*2=0x3800 for ATmega16 1024 words Boot Size
|
||||||
ifeq ($(MCU), atmega16)
|
ifeq ($(MCU), atmega16)
|
||||||
MT_BOOTLOADER_ADDRESS = 3800
|
MT_BOOTLOADER_ADDRESS = 3800
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# 0x0C00*2=0x1800 for ATmega8 1024 words Boot Size
|
# 0x0C00*2=0x1800 for ATmega8 1024 words Boot Size
|
||||||
ifeq ($(MCU), atmega8)
|
ifeq ($(MCU), atmega8)
|
||||||
MT_BOOTLOADER_ADDRESS = 1800
|
MT_BOOTLOADER_ADDRESS = 1800
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# 0x3C00*2=0x7800 for ATmega32 1024 words Boot Size
|
# 0x3C00*2=0x7800 for ATmega32 1024 words Boot Size
|
||||||
ifeq ($(MCU), atmega32)
|
ifeq ($(MCU), atmega32)
|
||||||
MT_BOOTLOADER_ADDRESS = 7800
|
MT_BOOTLOADER_ADDRESS = 7800
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# 0xFC00*2=0x1F800 for ATmega128 1024 words Boot Size
|
# 0xFC00*2=0x1F800 for ATmega128 1024 words Boot Size
|
||||||
ifeq ($(MCU), atmega128)
|
ifeq ($(MCU), atmega128)
|
||||||
MT_BOOTLOADER_ADDRESS = 1F800
|
MT_BOOTLOADER_ADDRESS = 1F800
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# 0xFC00*2=0x1F800 for AT90Can128 1024 words Boot Size
|
# 0xFC00*2=0x1F800 for AT90Can128 1024 words Boot Size
|
||||||
ifeq ($(MCU), at90can128)
|
ifeq ($(MCU), at90can128)
|
||||||
MT_BOOTLOADER_ADDRESS = 1f800
|
MT_BOOTLOADER_ADDRESS = 1f800
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
@ -133,11 +133,11 @@ SRC = $(TARGET).c uart.c lowlevel.c
|
|||||||
# Even though the DOS/Win* filesystem matches both .s and .S the same,
|
# 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
|
# it will preserve the spelling of the filenames, and gcc itself does
|
||||||
# care about how the name is spelled on its command-line.
|
# care about how the name is spelled on its command-line.
|
||||||
ASRC =
|
ASRC =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Optimization level, can be [0, 1, 2, 3, s].
|
# Optimization level, can be [0, 1, 2, 3, s].
|
||||||
# 0 = turn off optimization. s = optimize for size.
|
# 0 = turn off optimization. s = optimize for size.
|
||||||
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
|
||||||
OPT = s
|
OPT = s
|
||||||
@ -149,7 +149,7 @@ DEBUG = stabs
|
|||||||
|
|
||||||
# List any extra directories to look for include files here.
|
# List any extra directories to look for include files here.
|
||||||
# Each directory must be seperated by a space.
|
# Each directory must be seperated by a space.
|
||||||
EXTRAINCDIRS =
|
EXTRAINCDIRS =
|
||||||
|
|
||||||
|
|
||||||
# Compiler flag to set the C Standard level.
|
# Compiler flag to set the C Standard level.
|
||||||
@ -194,7 +194,7 @@ CFLAGS += $(CSTANDARD)
|
|||||||
# for use in COFF files, additional information about filenames
|
# for use in COFF files, additional information about filenames
|
||||||
# and function names needs to be present in the assembler source
|
# and function names needs to be present in the assembler source
|
||||||
# files -- see avr-libc docs [FIXME: not yet described there]
|
# files -- see avr-libc docs [FIXME: not yet described there]
|
||||||
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
|
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -206,7 +206,7 @@ PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
|
|||||||
# Floating point printf version (requires MATH_LIB = -lm below)
|
# Floating point printf version (requires MATH_LIB = -lm below)
|
||||||
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
|
||||||
|
|
||||||
PRINTF_LIB =
|
PRINTF_LIB =
|
||||||
|
|
||||||
# Minimalistic scanf version
|
# Minimalistic scanf version
|
||||||
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
||||||
@ -214,7 +214,7 @@ SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
|
|||||||
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
|
||||||
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
|
||||||
|
|
||||||
SCANF_LIB =
|
SCANF_LIB =
|
||||||
|
|
||||||
MATH_LIB = -lm
|
MATH_LIB = -lm
|
||||||
|
|
||||||
@ -247,7 +247,7 @@ LDFLAGS += -Wl,--section-start=.text=$(MT_BOOTLOADER_ADDRESS)
|
|||||||
|
|
||||||
# Programming support using avrdude. Settings and variables.
|
# Programming support using avrdude. Settings and variables.
|
||||||
|
|
||||||
# Programming hardware: alf avr910 avrisp bascom bsd
|
# Programming hardware: alf avr910 avrisp bascom bsd
|
||||||
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
|
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
|
||||||
#
|
#
|
||||||
# Type: avrdude -c ?
|
# Type: avrdude -c ?
|
||||||
@ -273,7 +273,7 @@ AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
|||||||
#AVRDUDE_NO_VERIFY = -V
|
#AVRDUDE_NO_VERIFY = -V
|
||||||
|
|
||||||
# Increase verbosity level. Please use this when submitting bug
|
# Increase verbosity level. Please use this when submitting bug
|
||||||
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
|
||||||
# to submit bug reports.
|
# to submit bug reports.
|
||||||
#AVRDUDE_VERBOSE = -v -v
|
#AVRDUDE_VERBOSE = -v -v
|
||||||
|
|
||||||
@ -296,7 +296,7 @@ AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
|
|||||||
|
|
||||||
# Define programs and commands.
|
# Define programs and commands.
|
||||||
#SHELL = $(DIRAVRUTILS)/sh
|
#SHELL = $(DIRAVRUTILS)/sh
|
||||||
#NM = $(DIRAVRBIN)/avr-nm
|
#NM = $(DIRAVRBIN)/avr-nm
|
||||||
#CC = $(DIRAVRBIN)/avr-gcc
|
#CC = $(DIRAVRBIN)/avr-gcc
|
||||||
#OBJCOPY = $(DIRAVRBIN)/avr-objcopy
|
#OBJCOPY = $(DIRAVRBIN)/avr-objcopy
|
||||||
#OBJDUMP= $(DIRAVRBIN)/avr-objdump
|
#OBJDUMP= $(DIRAVRBIN)/avr-objdump
|
||||||
@ -323,7 +323,7 @@ WINSHELL = cmd
|
|||||||
MSG_ERRORS_NONE = Errors: none
|
MSG_ERRORS_NONE = Errors: none
|
||||||
MSG_BEGIN = -------- begin --------
|
MSG_BEGIN = -------- begin --------
|
||||||
MSG_END = -------- end --------
|
MSG_END = -------- end --------
|
||||||
MSG_SIZE_BEFORE = Size before:
|
MSG_SIZE_BEFORE = Size before:
|
||||||
MSG_SIZE_AFTER = Size after:
|
MSG_SIZE_AFTER = Size after:
|
||||||
MSG_COFF = Converting to AVR COFF:
|
MSG_COFF = Converting to AVR COFF:
|
||||||
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
|
||||||
@ -340,7 +340,7 @@ MSG_CLEANING = Cleaning project:
|
|||||||
|
|
||||||
|
|
||||||
# Define all object files.
|
# Define all object files.
|
||||||
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
|
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)
|
||||||
|
|
||||||
# Define all listing files.
|
# Define all listing files.
|
||||||
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
|
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
|
||||||
@ -367,7 +367,7 @@ build: elf hex eep lss sym
|
|||||||
elf: $(TARGET).elf
|
elf: $(TARGET).elf
|
||||||
hex: $(TARGET).hex
|
hex: $(TARGET).hex
|
||||||
eep: $(TARGET).eep
|
eep: $(TARGET).eep
|
||||||
lss: $(TARGET).lss
|
lss: $(TARGET).lss
|
||||||
sym: $(TARGET).sym
|
sym: $(TARGET).sym
|
||||||
|
|
||||||
|
|
||||||
@ -399,12 +399,12 @@ sizeafter:
|
|||||||
|
|
||||||
|
|
||||||
# Display compiler version information.
|
# Display compiler version information.
|
||||||
gccversion :
|
gccversion :
|
||||||
@$(CC) --version
|
@$(CC) --version
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Program the device.
|
# Program the device.
|
||||||
program: $(TARGET).hex $(TARGET).eep
|
program: $(TARGET).hex $(TARGET).eep
|
||||||
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
|
||||||
|
|
||||||
@ -416,7 +416,7 @@ COFFCONVERT=$(OBJCOPY) --debugging \
|
|||||||
--change-section-address .data-0x800000 \
|
--change-section-address .data-0x800000 \
|
||||||
--change-section-address .bss-0x800000 \
|
--change-section-address .bss-0x800000 \
|
||||||
--change-section-address .noinit-0x800000 \
|
--change-section-address .noinit-0x800000 \
|
||||||
--change-section-address .eeprom-0x810000
|
--change-section-address .eeprom-0x810000
|
||||||
|
|
||||||
|
|
||||||
coff: $(TARGET).elf
|
coff: $(TARGET).elf
|
||||||
@ -471,7 +471,7 @@ extcoff: $(TARGET).elf
|
|||||||
%.o : %.c
|
%.o : %.c
|
||||||
@echo
|
@echo
|
||||||
@echo $(MSG_COMPILING) $<
|
@echo $(MSG_COMPILING) $<
|
||||||
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
# Compile: create assembler files from C source files.
|
# Compile: create assembler files from C source files.
|
||||||
|
358
readme.txt
358
readme.txt
@ -1,179 +1,179 @@
|
|||||||
|
|
||||||
======================================================
|
======================================================
|
||||||
|
|
||||||
ATMEL AVR UART Bootloader for AVR-GCC/avr-libc
|
ATMEL AVR UART Bootloader for AVR-GCC/avr-libc
|
||||||
based on the AVR Butterfly bootloader code
|
based on the AVR Butterfly bootloader code
|
||||||
|
|
||||||
by Martin Thomas, Kaiserslautern, Germany
|
by Martin Thomas, Kaiserslautern, Germany
|
||||||
mthomas@rhrk.uni-kl.de
|
mthomas@rhrk.uni-kl.de
|
||||||
eversmith@heizung-thomas.de
|
eversmith@heizung-thomas.de
|
||||||
|
|
||||||
http://www.siwawi.arubi.uni-kl.de/avr_projects
|
http://www.siwawi.arubi.uni-kl.de/avr_projects
|
||||||
|
|
||||||
Addtional code and improvements provided by
|
Addtional code and improvements provided by
|
||||||
Uwe Bonnes and Bjoern Riemer.
|
Uwe Bonnes and Bjoern Riemer.
|
||||||
|
|
||||||
|
|
||||||
======================================================
|
======================================================
|
||||||
|
|
||||||
|
|
||||||
Programming-Software (on the "PC-Side"):
|
Programming-Software (on the "PC-Side"):
|
||||||
|
|
||||||
* AVRProg (included in AVRStudio) available at www.atmel.com.
|
* AVRProg (included in AVRStudio) available at www.atmel.com.
|
||||||
MS-Windows only. AVRProg can be used as stand-alone application.
|
MS-Windows only. AVRProg can be used as stand-alone application.
|
||||||
(avrprog.exe)
|
(avrprog.exe)
|
||||||
|
|
||||||
* avrdude available at http://savannah.nongnu.org/projects/avrdude/
|
* avrdude available at http://savannah.nongnu.org/projects/avrdude/
|
||||||
"Multiplattform"
|
"Multiplattform"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
09. Feb. 2006 - Version 0.75
|
09. Feb. 2006 - Version 0.75
|
||||||
|
|
||||||
* additional STARTUP_WAIT support contributed by Bjoern Riemer
|
* additional STARTUP_WAIT support contributed by Bjoern Riemer
|
||||||
|
|
||||||
18. Aug. 2005 - Version 0.74
|
18. Aug. 2005 - Version 0.74
|
||||||
|
|
||||||
* AT90CAN128 support contributed by Uwe Bonnes
|
* AT90CAN128 support contributed by Uwe Bonnes
|
||||||
* Makefile modifications contributed by Uwe Bonnes
|
* Makefile modifications contributed by Uwe Bonnes
|
||||||
|
|
||||||
23. Feb. 2005 - Version 0.7
|
23. Feb. 2005 - Version 0.7
|
||||||
|
|
||||||
* (Version 0.6 has never been available on the web-page)
|
* (Version 0.6 has never been available on the web-page)
|
||||||
* ATmega128 support
|
* ATmega128 support
|
||||||
* code cleanup
|
* code cleanup
|
||||||
* Tested with ATmega8, ATmega32 and ATmega128
|
* Tested with ATmega8, ATmega32 and ATmega128
|
||||||
|
|
||||||
7. Apr. 2004 - Version 0.5
|
7. Apr. 2004 - Version 0.5
|
||||||
|
|
||||||
* added different startup-methods
|
* added different startup-methods
|
||||||
* compatible with ATmega8 now
|
* compatible with ATmega8 now
|
||||||
* included makefile adopted to ATmega8 now
|
* included makefile adopted to ATmega8 now
|
||||||
(ATmega16 options still available)
|
(ATmega16 options still available)
|
||||||
* fixed jump to application which did not work
|
* fixed jump to application which did not work
|
||||||
reliably before
|
reliably before
|
||||||
* tested with ATmega8
|
* tested with ATmega8
|
||||||
* minimal options and startup-code result in
|
* minimal options and startup-code result in
|
||||||
bootloader-size < 512 words
|
bootloader-size < 512 words
|
||||||
|
|
||||||
6. Apr. 2004 - Version 0.4
|
6. Apr. 2004 - Version 0.4
|
||||||
|
|
||||||
* Buffered read of chars from UART during programming
|
* Buffered read of chars from UART during programming
|
||||||
since eeprom-write is too slow for unbuffered
|
since eeprom-write is too slow for unbuffered
|
||||||
operation. So EEPROM-upload does work now.
|
operation. So EEPROM-upload does work now.
|
||||||
* Added BOOTICE-mode to flash JTAGICE-compatible
|
* Added BOOTICE-mode to flash JTAGICE-compatible
|
||||||
hardware (ATmega16@7,3Mhz) (if you know about BOOTICE,
|
hardware (ATmega16@7,3Mhz) (if you know about BOOTICE,
|
||||||
you may unterstand why this has been added, if not
|
you may unterstand why this has been added, if not
|
||||||
just keep the option disabled)
|
just keep the option disabled)
|
||||||
* small changes in (my)boot.h (lock-bit-mask) found
|
* small changes in (my)boot.h (lock-bit-mask) found
|
||||||
out during the development of the STK-500-compatible
|
out during the development of the STK-500-compatible
|
||||||
bootloader. But setting lock-bits still does not
|
bootloader. But setting lock-bits still does not
|
||||||
work with this bootloader.
|
work with this bootloader.
|
||||||
* read of the low-fuse byte works (high byte still TODO)
|
* read of the low-fuse byte works (high byte still TODO)
|
||||||
* read of the lock-byte works (write still TODO)
|
* read of the lock-byte works (write still TODO)
|
||||||
|
|
||||||
27. Mar 2004 - Version 0.3
|
27. Mar 2004 - Version 0.3
|
||||||
|
|
||||||
Felt that as much functions from avr-libc's boot.h
|
Felt that as much functions from avr-libc's boot.h
|
||||||
as possible should be used without modifications.
|
as possible should be used without modifications.
|
||||||
Latest CVS-version of boot.h is included.
|
Latest CVS-version of boot.h is included.
|
||||||
Only the read-routine is still "self-made" based
|
Only the read-routine is still "self-made" based
|
||||||
on ATMELs assembler-code.
|
on ATMELs assembler-code.
|
||||||
EEPROM write on Mega16 does not work (and did not
|
EEPROM write on Mega16 does not work (and did not
|
||||||
work with V0.2 too). May be caused by my old Mega16
|
work with V0.2 too). May be caused by my old Mega16
|
||||||
chip. Needs testing. Flash read/write and EEPROM
|
chip. Needs testing. Flash read/write and EEPROM
|
||||||
read works. Still only tested with ATmega16.
|
read works. Still only tested with ATmega16.
|
||||||
This version may not work with the ATmega169 any
|
This version may not work with the ATmega169 any
|
||||||
more.
|
more.
|
||||||
|
|
||||||
24. Mar 2004 - Version 0.2
|
24. Mar 2004 - Version 0.2
|
||||||
|
|
||||||
During the development of a data-logger application
|
During the development of a data-logger application
|
||||||
with the AVR-Butterfly there was a need to make
|
with the AVR-Butterfly there was a need to make
|
||||||
some changes in the bootloader. The same problem
|
some changes in the bootloader. The same problem
|
||||||
again: no IAR compiler. The same way to solve the
|
again: no IAR compiler. The same way to solve the
|
||||||
problem: a port of the code to avr-gcc/avr-libc.
|
problem: a port of the code to avr-gcc/avr-libc.
|
||||||
So this code is based on the ATMEL Butterfly
|
So this code is based on the ATMEL Butterfly
|
||||||
bootloader source code Rev 0.2 for IAR.
|
bootloader source code Rev 0.2 for IAR.
|
||||||
|
|
||||||
The bootloader-port for the Butterfly which mimics
|
The bootloader-port for the Butterfly which mimics
|
||||||
the complete functionality of the original
|
the complete functionality of the original
|
||||||
BF-bootloader is availabe at:
|
BF-bootloader is availabe at:
|
||||||
www.siwawi.arubi.uni-kl.de/avr_projects
|
www.siwawi.arubi.uni-kl.de/avr_projects
|
||||||
|
|
||||||
Atmel used a separate "lib" written in "pure"
|
Atmel used a separate "lib" written in "pure"
|
||||||
assembly to access the low-level functions
|
assembly to access the low-level functions
|
||||||
for flash read/write. Well, so far I
|
for flash read/write. Well, so far I
|
||||||
don't know how to use "mixed language sources"
|
don't know how to use "mixed language sources"
|
||||||
with the avr-gcc toolchain, so the low-level
|
with the avr-gcc toolchain, so the low-level
|
||||||
routines have been implemented as inline assembler.
|
routines have been implemented as inline assembler.
|
||||||
The avr-libc boot.h module written by Eric
|
The avr-libc boot.h module written by Eric
|
||||||
Weddington served as a template Three of the four
|
Weddington served as a template Three of the four
|
||||||
low-level routines found in lowlevel.c come from
|
low-level routines found in lowlevel.c come from
|
||||||
boot.h with minimal changes. The read routine has
|
boot.h with minimal changes. The read routine has
|
||||||
been developed based on the ATMEL assembler code.
|
been developed based on the ATMEL assembler code.
|
||||||
|
|
||||||
Ignore the fuse and lock-bit readout. Read and Set is
|
Ignore the fuse and lock-bit readout. Read and Set is
|
||||||
not enabled (TODO).
|
not enabled (TODO).
|
||||||
|
|
||||||
|
|
||||||
--------------- Installation -----------------
|
--------------- Installation -----------------
|
||||||
|
|
||||||
- Change the MCU type in the makefile (so far
|
- Change the MCU type in the makefile (so far
|
||||||
ATmega16 has been tested, ATmega169, ATmega8
|
ATmega16 has been tested, ATmega169, ATmega8
|
||||||
and ATmega32 should be o.k. too.
|
and ATmega32 should be o.k. too.
|
||||||
|
|
||||||
- Change the boot(loader)-size in Makefile, this
|
- Change the boot(loader)-size in Makefile, this
|
||||||
bootloader is larger than 512 words (1024 bytes),
|
bootloader is larger than 512 words (1024 bytes),
|
||||||
so select at least _B1024!
|
so select at least _B1024!
|
||||||
|
|
||||||
- Change the XTAL in Makefile to the clock-frequency
|
- Change the XTAL in Makefile to the clock-frequency
|
||||||
of your board (keep BAUDRATE at 19200). See
|
of your board (keep BAUDRATE at 19200). See
|
||||||
the datasheet for frequencies with minimum
|
the datasheet for frequencies with minimum
|
||||||
error at 19200bps and select Crystal/Oscillator
|
error at 19200bps and select Crystal/Oscillator
|
||||||
to get minimum errors.
|
to get minimum errors.
|
||||||
|
|
||||||
- Change the start-condition in Makefile. Default
|
- Change the start-condition in Makefile. Default
|
||||||
is: enter bootloader if Pin A7 is connected to
|
is: enter bootloader if Pin A7 is connected to
|
||||||
GND during reset/startup
|
GND during reset/startup
|
||||||
|
|
||||||
- Please use at least avr-gcc 3.3.1/avr-libc 1.0
|
- Please use at least avr-gcc 3.3.1/avr-libc 1.0
|
||||||
or WINAVR Sept. 2003 or later to compile and link
|
or WINAVR Sept. 2003 or later to compile and link
|
||||||
the bootloader.
|
the bootloader.
|
||||||
|
|
||||||
- upload the hex-File to the AVR (STK500, STK200, SP12
|
- upload the hex-File to the AVR (STK500, STK200, SP12
|
||||||
etc.)
|
etc.)
|
||||||
|
|
||||||
- program the "Boot Flash section size" (BOOTSZ fuses)
|
- program the "Boot Flash section size" (BOOTSZ fuses)
|
||||||
according to the boot-size selected in main.c
|
according to the boot-size selected in main.c
|
||||||
i.e. BOOTSZ=00 for boot-size 1024 words on ATmega16
|
i.e. BOOTSZ=00 for boot-size 1024 words on ATmega16
|
||||||
|
|
||||||
- enable the BOOT Reset Vector (BOOTTRST=0)
|
- enable the BOOT Reset Vector (BOOTTRST=0)
|
||||||
|
|
||||||
- Set the lock bits to protect the bootloader from
|
- Set the lock bits to protect the bootloader from
|
||||||
SPM-writes (Boot Loader Protection Mode 2 in STK500-
|
SPM-writes (Boot Loader Protection Mode 2 in STK500-
|
||||||
plugin)
|
plugin)
|
||||||
|
|
||||||
- Connect the AVR UART Pins via level-shifter/inverter
|
- Connect the AVR UART Pins via level-shifter/inverter
|
||||||
(i.e. MAX232) to you PCs Com-Port.
|
(i.e. MAX232) to you PCs Com-Port.
|
||||||
|
|
||||||
- Reset the AVR while fullfilling the bootloader start-
|
- Reset the AVR while fullfilling the bootloader start-
|
||||||
condition. Which means connect PA7 to GND in the default
|
condition. Which means connect PA7 to GND in the default
|
||||||
config during reste/power-cycle. Keep the connection
|
config during reste/power-cycle. Keep the connection
|
||||||
or hold the key down until you see the AVRPROG dialog!
|
or hold the key down until you see the AVRPROG dialog!
|
||||||
|
|
||||||
- Start AVRPROG (AVRStuido/Tools or stand-alone) -
|
- Start AVRPROG (AVRStuido/Tools or stand-alone) -
|
||||||
keep PA7 grounded! (avrdude is supported too, check
|
keep PA7 grounded! (avrdude is supported too, check
|
||||||
the avrdude manual for command-line options).
|
the avrdude manual for command-line options).
|
||||||
|
|
||||||
- AVRPROG will detect the bootloader, you may release
|
- AVRPROG will detect the bootloader, you may release
|
||||||
PA7 now
|
PA7 now
|
||||||
|
|
||||||
- see AVRStuido online-help for more information how
|
- see AVRStuido online-help for more information how
|
||||||
to use AVRPROG
|
to use AVRPROG
|
||||||
|
|
||||||
- make sure to EXIT from AVRPROG (button) to start
|
- make sure to EXIT from AVRPROG (button) to start
|
||||||
your main-application (or toogle power/reset)
|
your main-application (or toogle power/reset)
|
||||||
|
|
||||||
good luck, feedback welcome.
|
good luck, feedback welcome.
|
||||||
Martin
|
Martin
|
||||||
|
302
uart.c
302
uart.c
@ -1,151 +1,151 @@
|
|||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
|
||||||
/* most of the definitions borrowed from Peter Fleury's UART-Library
|
/* most of the definitions borrowed from Peter Fleury's UART-Library
|
||||||
extende for control-register C and ATmega169 */
|
extende for control-register C and ATmega169 */
|
||||||
|
|
||||||
#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \
|
#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \
|
||||||
|| defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) \
|
|| defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) \
|
||||||
|| defined(__AVR_ATmega323__)
|
|| defined(__AVR_ATmega323__)
|
||||||
/* ATMega with one USART */
|
/* ATMega with one USART */
|
||||||
#define ATMEGA_USART
|
#define ATMEGA_USART
|
||||||
#define UART0_UBRR_HIGH UBRRH
|
#define UART0_UBRR_HIGH UBRRH
|
||||||
#define UART0_UBRR_LOW UBRRL
|
#define UART0_UBRR_LOW UBRRL
|
||||||
#define UART0_RECEIVE_INTERRUPT SIG_UART_RECV
|
#define UART0_RECEIVE_INTERRUPT SIG_UART_RECV
|
||||||
#define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA
|
#define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA
|
||||||
#define UART0_STATUS UCSRA
|
#define UART0_STATUS UCSRA
|
||||||
#define UART0_CONTROL UCSRB
|
#define UART0_CONTROL UCSRB
|
||||||
#define UART0_DATA UDR
|
#define UART0_DATA UDR
|
||||||
#define UART0_UDRIE UDRIE
|
#define UART0_UDRIE UDRIE
|
||||||
#elif defined(__AVR_ATmega162__)
|
#elif defined(__AVR_ATmega162__)
|
||||||
/* ATMega with two USART */
|
/* ATMega with two USART */
|
||||||
#define ATMEGA_USART0
|
#define ATMEGA_USART0
|
||||||
#define ATMEGA_USART1
|
#define ATMEGA_USART1
|
||||||
#define UART0_UBRR_HIGH UBRR0H
|
#define UART0_UBRR_HIGH UBRR0H
|
||||||
#define UART0_UBRR_LOW UBRR0L
|
#define UART0_UBRR_LOW UBRR0L
|
||||||
#define UART1_UBRR_HIGH UBRR1H
|
#define UART1_UBRR_HIGH UBRR1H
|
||||||
#define UART1_UBRR_LOW UBRR1L
|
#define UART1_UBRR_LOW UBRR1L
|
||||||
#define UART0_RECEIVE_INTERRUPT SIG_USART0_RECV
|
#define UART0_RECEIVE_INTERRUPT SIG_USART0_RECV
|
||||||
#define UART1_RECEIVE_INTERRUPT SIG_USART1_RECV
|
#define UART1_RECEIVE_INTERRUPT SIG_USART1_RECV
|
||||||
#define UART0_TRANSMIT_INTERRUPT SIG_USART0_DATA
|
#define UART0_TRANSMIT_INTERRUPT SIG_USART0_DATA
|
||||||
#define UART1_TRANSMIT_INTERRUPT SIG_USART1_DATA
|
#define UART1_TRANSMIT_INTERRUPT SIG_USART1_DATA
|
||||||
#define UART0_STATUS UCSR0A
|
#define UART0_STATUS UCSR0A
|
||||||
#define UART0_CONTROL UCSR0B
|
#define UART0_CONTROL UCSR0B
|
||||||
#define UART0_CONTROL2 UCSR0C
|
#define UART0_CONTROL2 UCSR0C
|
||||||
#define UART0_DATA UDR0
|
#define UART0_DATA UDR0
|
||||||
#define UART0_UDRIE UDRIE0
|
#define UART0_UDRIE UDRIE0
|
||||||
#define UART1_STATUS UCSR1A
|
#define UART1_STATUS UCSR1A
|
||||||
#define UART1_CONTROL UCSR1B
|
#define UART1_CONTROL UCSR1B
|
||||||
#define UART1_CONTROL2 UCSR1C
|
#define UART1_CONTROL2 UCSR1C
|
||||||
#define UART1_DATA UDR1
|
#define UART1_DATA UDR1
|
||||||
#define UART1_UDRIE UDRIE1
|
#define UART1_UDRIE UDRIE1
|
||||||
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) || defined(__AVR_AT90CAN128__)
|
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) || defined(__AVR_AT90CAN128__)
|
||||||
/* ATMega with two USART */
|
/* ATMega with two USART */
|
||||||
#define ATMEGA_USART0
|
#define ATMEGA_USART0
|
||||||
#define ATMEGA_USART1
|
#define ATMEGA_USART1
|
||||||
#define UART0_UBRR_HIGH UBRR0H
|
#define UART0_UBRR_HIGH UBRR0H
|
||||||
#define UART0_UBRR_LOW UBRR0L
|
#define UART0_UBRR_LOW UBRR0L
|
||||||
#define UART1_UBRR_HIGH UBRR1H
|
#define UART1_UBRR_HIGH UBRR1H
|
||||||
#define UART1_UBRR_LOW UBRR1L
|
#define UART1_UBRR_LOW UBRR1L
|
||||||
#define UART0_RECEIVE_INTERRUPT SIG_UART0_RECV
|
#define UART0_RECEIVE_INTERRUPT SIG_UART0_RECV
|
||||||
#define UART1_RECEIVE_INTERRUPT SIG_UART1_RECV
|
#define UART1_RECEIVE_INTERRUPT SIG_UART1_RECV
|
||||||
#define UART0_TRANSMIT_INTERRUPT SIG_UART0_DATA
|
#define UART0_TRANSMIT_INTERRUPT SIG_UART0_DATA
|
||||||
#define UART1_TRANSMIT_INTERRUPT SIG_UART1_DATA
|
#define UART1_TRANSMIT_INTERRUPT SIG_UART1_DATA
|
||||||
#define UART0_STATUS UCSR0A
|
#define UART0_STATUS UCSR0A
|
||||||
#define UART0_CONTROL UCSR0B
|
#define UART0_CONTROL UCSR0B
|
||||||
#define UART0_CONTROL2 UCSR0C
|
#define UART0_CONTROL2 UCSR0C
|
||||||
#define UART0_DATA UDR0
|
#define UART0_DATA UDR0
|
||||||
#define UART0_UDRIE UDRIE0
|
#define UART0_UDRIE UDRIE0
|
||||||
#define UART1_STATUS UCSR1A
|
#define UART1_STATUS UCSR1A
|
||||||
#define UART1_CONTROL UCSR1B
|
#define UART1_CONTROL UCSR1B
|
||||||
#define UART1_CONTROL2 UCSR1C
|
#define UART1_CONTROL2 UCSR1C
|
||||||
#define UART1_DATA UDR1
|
#define UART1_DATA UDR1
|
||||||
#define UART1_UDRIE UDRIE1
|
#define UART1_UDRIE UDRIE1
|
||||||
#elif defined(__AVR_ATmega169__)
|
#elif defined(__AVR_ATmega169__)
|
||||||
#define ATMEGA_USART
|
#define ATMEGA_USART
|
||||||
#define UART0_UBRR_HIGH UBRR0H
|
#define UART0_UBRR_HIGH UBRR0H
|
||||||
#define UART0_UBRR_LOW UBRR0L
|
#define UART0_UBRR_LOW UBRR0L
|
||||||
// TODO #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV
|
// TODO #define UART0_RECEIVE_INTERRUPT SIG_UART_RECV
|
||||||
// TODO #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA
|
// TODO #define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA
|
||||||
#define UART0_STATUS UCSR0A
|
#define UART0_STATUS UCSR0A
|
||||||
#define UART0_CONTROL UCSR0B
|
#define UART0_CONTROL UCSR0B
|
||||||
#define UART0_CONTROL2 UCSR0C
|
#define UART0_CONTROL2 UCSR0C
|
||||||
#define UART0_DATA UDR0
|
#define UART0_DATA UDR0
|
||||||
#define UART0_DOUBLEAVAIL
|
#define UART0_DOUBLEAVAIL
|
||||||
// TODO #define UART0_UDRIE UDRIE
|
// TODO #define UART0_UDRIE UDRIE
|
||||||
#else
|
#else
|
||||||
#error "Processor type not supported in uart.c !"
|
#error "Processor type not supported in uart.c !"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void USART_Init(unsigned int baudrate, unsigned char doublespeed)
|
void USART_Init(unsigned int baudrate, unsigned char doublespeed)
|
||||||
{
|
{
|
||||||
// Set baud rate
|
// Set baud rate
|
||||||
UART0_UBRR_HIGH = (unsigned char)(baudrate>>8);
|
UART0_UBRR_HIGH = (unsigned char)(baudrate>>8);
|
||||||
UART0_UBRR_LOW = (unsigned char)baudrate;
|
UART0_UBRR_LOW = (unsigned char)baudrate;
|
||||||
|
|
||||||
// Enable 2x speed - TODO adopt to all uCs
|
// Enable 2x speed - TODO adopt to all uCs
|
||||||
#ifdef UART0_DOUBLEAVAIL
|
#ifdef UART0_DOUBLEAVAIL
|
||||||
if (doublespeed) UCSR0A = (1<<U2X0);
|
if (doublespeed) UCSR0A = (1<<U2X0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (ATMEGA_USART)
|
#if defined (ATMEGA_USART)
|
||||||
/* Enable USART receiver and transmitter and disable interrupts */
|
/* Enable USART receiver and transmitter and disable interrupts */
|
||||||
UART0_CONTROL = (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<UDRIE);
|
UART0_CONTROL = (1<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<UDRIE);
|
||||||
/* Set frame format: asynchronous, 8data, no parity, 1stop bit */
|
/* Set frame format: asynchronous, 8data, no parity, 1stop bit */
|
||||||
#ifdef URSEL
|
#ifdef URSEL
|
||||||
UCSRC = (1<<URSEL)|(3<<UCSZ0);
|
UCSRC = (1<<URSEL)|(3<<UCSZ0);
|
||||||
#else
|
#else
|
||||||
UCSRC = (3<<UCSZ0);
|
UCSRC = (3<<UCSZ0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif defined (ATMEGA_USART0 )
|
#elif defined (ATMEGA_USART0 )
|
||||||
/* Enable USART receiver and transmitter and disable interrupts */
|
/* Enable USART receiver and transmitter and disable interrupts */
|
||||||
UART0_CONTROL = (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<UDRIE0);
|
UART0_CONTROL = (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<UDRIE0);
|
||||||
/* Set frame format: asynchronous, 8data, no parity, 1stop bit */
|
/* Set frame format: asynchronous, 8data, no parity, 1stop bit */
|
||||||
#ifdef URSEL0
|
#ifdef URSEL0
|
||||||
UCSR0C = (1<<URSEL0)|(3<<UCSZ00);
|
UCSR0C = (1<<URSEL0)|(3<<UCSZ00);
|
||||||
#else
|
#else
|
||||||
UCSR0C = (3<<UCSZ00);
|
UCSR0C = (3<<UCSZ00);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendchar(char data)
|
void sendchar(char data)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
UART0_DATA = data;
|
UART0_DATA = data;
|
||||||
|
|
||||||
if(SREG & 0x80)
|
if(SREG & 0x80)
|
||||||
{
|
{
|
||||||
while ( !(UART0_STATUS&0x40) && (i<10000) )
|
while ( !(UART0_STATUS&0x40) && (i<10000) )
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
while( !(UART0_STATUS&0x40) );
|
while( !(UART0_STATUS&0x40) );
|
||||||
|
|
||||||
UART0_STATUS=UART0_STATUS|0x40; //delete TXCflag
|
UART0_STATUS=UART0_STATUS|0x40; //delete TXCflag
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char recchar(void)
|
char recchar(void)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
if(SREG & 0x80)
|
if(SREG & 0x80)
|
||||||
{
|
{
|
||||||
// while (!(UART0_STATUS & (1<<RXC0)) && (i<10000))
|
// while (!(UART0_STATUS & (1<<RXC0)) && (i<10000))
|
||||||
while (!(UART0_STATUS & 0x80) && (i<10000))
|
while (!(UART0_STATUS & 0x80) && (i<10000))
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
// while(!(UART0_STATUS & (1<<RXC0)));
|
// while(!(UART0_STATUS & (1<<RXC0)));
|
||||||
while(!(UART0_STATUS & 0x80));
|
while(!(UART0_STATUS & 0x80));
|
||||||
|
|
||||||
return UART0_DATA ;
|
return UART0_DATA ;
|
||||||
}
|
}
|
||||||
|
26
uart.h
26
uart.h
@ -1,13 +1,13 @@
|
|||||||
#ifndef UART_H
|
#ifndef UART_H
|
||||||
#define UART_H
|
#define UART_H
|
||||||
|
|
||||||
#define UART_BAUD_SELECT(baudRate,xtalCpu) (((xtalCpu)+(baudRate*8))/((baudRate)*16)-1)
|
#define UART_BAUD_SELECT(baudRate,xtalCpu) (((xtalCpu)+(baudRate*8))/((baudRate)*16)-1)
|
||||||
|
|
||||||
#define UARTDOUBLE 1
|
#define UARTDOUBLE 1
|
||||||
#define UARTSINGLE 0
|
#define UARTSINGLE 0
|
||||||
|
|
||||||
void USART_Init(unsigned int, unsigned char);
|
void USART_Init(unsigned int, unsigned char);
|
||||||
void sendchar(char);
|
void sendchar(char);
|
||||||
char recchar(void);
|
char recchar(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user