From 722e6d5d68ccbe3f5a3b45d4492fbedbbb50d84d Mon Sep 17 00:00:00 2001 From: Olaf Rempel Date: Mon, 1 May 2006 19:19:59 +0200 Subject: [PATCH] Version 0.74 --- bin/avrprog_boot_mega32_3_6MHz.hex | 93 --- chipdef.h | 30 +- main.c | 962 ++++++++++++++--------------- makefile | 84 ++- readme.txt | 23 +- uart.c | 2 +- uart.h | 2 +- 7 files changed, 575 insertions(+), 621 deletions(-) delete mode 100644 bin/avrprog_boot_mega32_3_6MHz.hex diff --git a/bin/avrprog_boot_mega32_3_6MHz.hex b/bin/avrprog_boot_mega32_3_6MHz.hex deleted file mode 100644 index 256a50c..0000000 --- a/bin/avrprog_boot_mega32_3_6MHz.hex +++ /dev/null @@ -1,93 +0,0 @@ -:107800000C942A3C0C94453C0C94453C0C94453C0F -:107810000C94453C0C94453C0C94453C0C94453CE4 -:107820000C94453C0C94453C0C94453C0C94453CD4 -:107830000C94453C0C94453C0C94453C0C94453CC4 -:107840000C94453C0C94453C0C94453C0C94453CB4 -:107850000C94453C11241FBECFE5D8E0DEBFCDBF60 -:1078600010E0A0E6B0E0EEEAFDE702C005900D9260 -:10787000A036B107D9F710E0A0E6B0E001C01D9234 -:10788000A73EB107E1F70C94803D0C94003C81E4E5 -:107890000E94A73E86E50E94A73E82E50E94A73E81 -:1078A00082E40E94A73E8FE40E94A73E8FE40E94DC -:1078B000A73E84E50E94A73E0895BF92CF92DF9233 -:1078C000EF92FF920F931F93CF93DF938C01B62E0D -:1078D00020E030E0E901CE59DF4F79010894E11C46 -:1078E000F11C2017310718F40E94BC3E01C08FEF35 -:1078F000888397012038310568F320E030E0C0909C -:10790000E200D090E300E090E400F090E5008CB35A -:10791000992796958795AC014170507080FDF7CFFF -:107920008091E600833709F08EC086E4B81609F02E -:1079300048C041E0C2E6D0E08991282F33278991E1 -:107940009927982F8827282B392B07B600FCFDCFC5 -:10795000E199FECF8091E2009091E3000901FC01E2 -:1079600040935700E89511248091E2009091E30044 -:10797000A091E400B091E5000296A11DB11D809395 -:10798000E2009093E300A093E400B093E50002507E -:10799000104091F607B600FCFDCFE199FECF85E0DF -:1079A000F60180935700E89507B600FCFDCF07B6B7 -:1079B00000FCFDCFE199FECF81E180935700E8956F -:1079C0003FC085E4B816E1F58091E2009091E300B4 -:1079D000A091E400B091E500B695A795979587959D -:1079E0008093E2009093E300A093E400B093E5005D -:1079F000F901EF59FF4F8091E2008EBB8091E200C8 -:107A00009091E300A091E400B091E500292F3A2F76 -:107A10004B2F55272FBB0196A11DB11D8093E2006E -:107A20009093E300A093E400B093E5003196808149 -:107A30008DBBE29AE19AE199FECF01501040D9F650 -:107A40008DE090E001C0CA01DF91CF911F910F91AD -:107A5000FF90EF90DF90CF90BF9008950F931F930A -:107A6000CF93DF93EC01E199FECF653411F580915E -:107A7000E2008EBB8091E2009091E300A091E400CF -:107A8000B091E500292F3A2F4B2F55272FBB019698 -:107A9000A11DB11D8093E2009093E300A093E40048 -:107AA000B093E500E09A8DB30E94A73E2197F9F6C6 -:107AB00022C0E091E200F091E30005911491802F43 -:107AC0000E94A73E812F99270E94A73E8091E20045 -:107AD0009091E300A091E400B091E5000296A11D11 -:107AE000B11D8093E2009093E300A093E400B09373 -:107AF000E5002297F1F6DF91CF911F910F91089544 -:107B0000CFE5D8E0DEBFCDBFF89401E005BF82E04D -:107B100085BF60E08BE090E00E949D3EA098A89A0F -:107B2000989B08C0A89805BF15BEE0916000F09131 -:107B3000610009950E94BC3E682F813611F489E5E9 -:107B4000F9C0813439F50E94BC3E9927AA27BB278A -:107B50008093E2009093E300A093E400B093E500EB -:107B6000EE24F82E092F1A2F0E94BC3E9927AA272F -:107B7000BB27E82AF92A0A2B1B2BEE0CFF1C001F3F -:107B8000111FE092E200F092E3000093E4001093F2 -:107B9000E50072C0823641F489E50E94A73E80E08C -:107BA0000E94A73E80E8C6C0823489F40E94BC3E91 -:107BB0009927182F00270E94BC3E9927082B192BC4 -:107BC0000E94BC3E682FC8010E945D3CB3C087364E -:107BD00089F40E94BC3E9927182F00270E94BC3EC2 -:107BE0009927082B192B0E94BC3E682FC8010E94C0 -:107BF0002E3DA0CF853609F041C08091E600833745 -:107C000091F51092E2001092E3001092E4001092BD -:107C1000E50023E007B600FCFDCFE199FECF80919F -:107C2000E2009091E300FC0120935700E89507B62D -:107C300000FCFDCF8091E2009091E300A091E40070 -:107C4000B091E50080589F4FAF4FBF4F8093E20047 -:107C50009093E300A093E400B093E5008050984730 -:107C6000A040B040B8F207B600FCFDCFE199FECFCE -:107C700081E180935700E8958DE05CC0853451F434 -:107C800088E190E028E00FB6F894A89581BD0FBE7A -:107C900021BDF2CF803581F38C3471F3803711F43C -:107CA00083E548C0863421F469E080E090E005C0B7 -:107CB000823731F469E081E090E00E94D03E3AC022 -:107CC0008E3421F469E083E090E0F7CF813521F430 -:107CD00069E082E090E0F1CF843729F483E70E94E5 -:107CE000A73E80E027C08857823018F40E94BC3E2F -:107CF000C3CF643529F40E94BC3E8093E600BCCF1C -:107D0000633519F40E94473C15CF663529F480E3AA -:107D10000E94A73E87E30EC0633741F482E00E94D1 -:107D2000A73E85E90E94A73E8EE104C06B3109F4AD -:107D300001CF8FE30E94A73EFDCE9C01832F9927A0 -:107D400080BD29B988E18AB986E880BD089520E020 -:107D500030E08CB90FB607FE0BC05E990BC02F5FE9 -:107D60003F4F5E9907C087E220313807C4F302C055 -:107D70005E9BFECF5E9A089580E090E00FB607FE0E -:107D80000AC05F990AC001965F9907C027E2803157 -:107D90009207CCF302C05F9BFECF8CB19927089568 -:0E7DA000FC0160935700C895802D9927089527 -:040000030000780081 -:00000001FF diff --git a/chipdef.h b/chipdef.h index 896a953..6a58686 100644 --- a/chipdef.h +++ b/chipdef.h @@ -133,7 +133,35 @@ #define sig_byte2 0x97 #define sig_byte1 0x02 - #define devtype 0x44 // Mega128 device code + #define devtype 0x44 // + +// #define PAGESIZE 128 // Size in Bytes + + #ifdef _B512 + #define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE )) + #define APP_END APP_PAGES * SPM_PAGESIZE + #endif + #ifdef _B1024 + #define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE )) + #define APP_END APP_PAGES * SPM_PAGESIZE + #endif + #ifdef _B2048 + #define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*2048 / SPM_PAGESIZE )) + #define APP_END APP_PAGES * SPM_PAGESIZE + #endif + #ifdef _B4096 + #define APP_PAGES ((2*65536UL / SPM_PAGESIZE)- (2*4096 / SPM_PAGESIZE )) + #define APP_END APP_PAGES * SPM_PAGESIZE + #endif + +#elif defined(__AVR_AT90CAN128__) + + #define sig_byte3 0x1E + #define sig_byte2 0x97 + #define sig_byte1 0x81 + + #define devtype 0x43 /* Dummy device code for now, must be same as + used in avrdude.conf */ // #define PAGESIZE 128 // Size in Bytes diff --git a/main.c b/main.c index 15d4e05..7631a37 100644 --- a/main.c +++ b/main.c @@ -1,497 +1,467 @@ -/***************************************************************************** -* -* AVRPROG compatible boot-loader -* Version : 0.7 (Feb. 2005) -* Compiler : avr-gcc 3.4.1 / avr-libc 1.0.2 -* size : depends on features and startup ( minmal features < 512 words) -* by : Martin Thomas, Kaiserslautern, Germany -* eversmith@heizung-thomas.de -* -* License : Copyright (c) 2005 Martin Thomas -* Free to use. You have to mention the copyright -* owners in source-code and documentation of derived -* work. No warranty. -* -* Tested with ATmega8, ATmega16, ATmega32, ATmega128 -* -* - based on the Butterfly Bootloader-Code -* Copyright (C) 1996-1998 Atmel Corporation -* Author(s) : BBrandal, PKastnes, ARodland, LHM -* The orignal code has been made available by ATMEL together with the -* Butterfly application code. Since ATMEL.NO had no problem with -* 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 -* "skeleton" is still in this code. Make sure to keep the copyright notice -* in derived work to avoid trouble. -* -* - based on boot.h from the avr-libc (c) Eric Weddington -* -**************************************************************************** -* -* The boot interrupt vector is included (this bootloader is completly in -* ".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 -* 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 -* 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- -* libc's avr/boot.h documentation and the makefile for further details. -* -* See the makefile for information how to adopt the linker-settings to -* the selected Boot Size (_Bxxx below) -* -* With BOOT_SIMPLE this bootloader has 0x3DE bytes size and should fit -* into a 512word bootloader-section. -* -* Set AVR clock-frequency and the baudrate below, set MCU-type in -* makefile. -* -****************************************************************************/ -/* - Does not work reliably so far: - - lock bits set -*/ - -// programmers-notepad tabsize 4 -#define VERSION_HIGH '0' -#define VERSION_LOW '7' - -#include -#include -#include -#include -#include -#include -// function not found in boot.h to read lock/fuses -#include "lowlevel.h" - -/* Pin "BLPNUM" on port "BLPORT" in this port has to grounded - (active low) to start the bootloader */ -#define BLPORT PORTC -#define BLDDR DDRC -#define BLPIN PINC -#define BLPNUM PINC0 - -/* - Select startup-mode - * SIMPLE-Mode - Jump to bootloader main BL-loop if key is - pressed (Pin grounded) "during" reset or jump to the - application if the pin is not grounded (=pulled up by - internal pull-up-resistor) - * POWERSAVE-Mode - Startup is separated in two loops - which makes power-saving a little easier if no firmware - is on the chip. Needs more memory - * BOOTICE-Mode - to flash the JTAGICE upgrade.ebn file. - No startup-sequence in this mode. Jump directly to the - parser-loop on reset - XTAL in BOOTICEMODE must be 7372800 Hz to be compatible - with the org. JTAGICE-Firmware */ -#define START_SIMPLE -//#define START_POWERSAVE -//#define START_BOOTICE - -#ifndef START_BOOTICE -#define XTAL 3686400 -// #define XTAL 8000000UL -#else -#warning "BOOTICE mode - External Crystal/Oszillator must be 7,3728 MHz" -#define XTAL 7372800 -#endif - -// UART handling - some definitions from P. Fleury's Library - thanks -#define BAUDRATE 19200 -#include "uart.h" - -/* enable/disable readout of fuse and lock-bits - (will not work for Mega169 since not supported by AVRPROG 1.37 */ -#define ENABLEREADFUSELOCK - -/* 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 - with a bootloader as far as I know) - Keep this undefined! - */ -// #define WRITELOCKBITS - -/* Select Boot Size (select one, comment out the others) */ -// NO! #define _B128 -// NO! #define _B256 -// MAYBE: #define _B512 -#define _B1024 -//#define _B2048 - -#include "chipdef.h" - -#define UART_RX_BUFFER_SIZE SPM_PAGESIZE -unsigned char gBuffer[UART_RX_BUFFER_SIZE]; - -#define eeprom_is_ready() bit_is_clear(EECR, EEWE) -#define my_eeprom_busy_wait() do{}while(!eeprom_is_ready()) - -unsigned char BufferLoad(unsigned int , unsigned char ) ; -void BlockRead(unsigned int , unsigned char ) ; - -uint32_t address; -unsigned char device; - -void send_boot(void) -{ - sendchar('A'); - sendchar('V'); - sendchar('R'); - sendchar('B'); - sendchar('O'); - sendchar('O'); - sendchar('T'); -} - -void (*jump_to_app)(void) = 0x0000; - -int main(void) -{ - unsigned tempi; - char val; - - #ifdef START_POWERSAVE - char OK = 1; - #endif - - cli(); - - MCUCR = (1<> 8) & 0xFF); - // Report buffer size in bytes - sendchar(UART_RX_BUFFER_SIZE & 0xFF); - } - - else if(val=='B') // Start buffer load - { - tempi = recchar() << 8; // Load high byte of buffersize - tempi |= recchar(); // Load low byte of buffersize - val = recchar(); // Load memory type ('E' or 'F') - sendchar (BufferLoad(tempi,val)); - // Start downloading of buffer - } - - else if(val == 'g') // Block read - { - tempi = (recchar() << 8) | recchar(); - - val = recchar(); // Get memtype - BlockRead(tempi,val); // Perform the block read - } - - else if(val=='e') //Chip erase - { - if (device == devtype) - { - // erase only main section (bootloader protection) - address = 0; - while ( APP_END > address ) - { +/***************************************************************************** +* +* AVRPROG compatible boot-loader +* Version : 0.7 (Feb. 2005) +* Compiler : avr-gcc 3.4.1 / avr-libc 1.0.2 +* size : depends on features and startup ( minmal features < 512 words) +* by : Martin Thomas, Kaiserslautern, Germany +* eversmith@heizung-thomas.de +* +* License : Copyright (c) 2005 Martin Thomas +* Free to use. You have to mention the copyright +* owners in source-code and documentation of derived +* work. No warranty. +* +* Tested with ATmega8, ATmega16, ATmega32, ATmega128 +* +* - based on the Butterfly Bootloader-Code +* Copyright (C) 1996-1998 Atmel Corporation +* Author(s) : BBrandal, PKastnes, ARodland, LHM +* The orignal code has been made available by ATMEL together with the +* Butterfly application code. Since ATMEL.NO had no problem with +* 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 +* "skeleton" is still in this code. Make sure to keep the copyright notice +* in derived work to avoid trouble. +* +* - based on boot.h from the avr-libc (c) Eric Weddington +* +**************************************************************************** +* +* The boot interrupt vector is included (this bootloader is completly in +* ".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 +* 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 +* 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- +* libc's avr/boot.h documentation and the makefile for further details. +* +* See the makefile for information how to adopt the linker-settings to +* the selected Boot Size (_Bxxx below) +* +* With BOOT_SIMPLE this bootloader has 0x3DE bytes size and should fit +* into a 512word bootloader-section. +* +* Set AVR clock-frequency and the baudrate below, set MCU-type in +* makefile. +* +****************************************************************************/ +/* + Does not work reliably so far: + - lock bits set +*/ + +// programmers-notepad tabsize 4 +#define VERSION_HIGH '0' +#define VERSION_LOW '7' + +#include +#include +#include +#include +#include +#include +// function not found in boot.h to read lock/fuses +#include "lowlevel.h" + +#ifndef XTAL +#warning "Set XTAL in Makefile" +#endif + +#ifdef START_BOOTICE +#warning "Using START_BOOTICE" +#if XTAL == 7372800 +#else +#warning "BOOTICE mode - External Crystal/Oszillator must be 7,3728 MHz" +#undef XTAL +#define XTAL 7372800 +#endif +#endif + +// UART handling - some definitions from P. Fleury's Library - thanks +#include "uart.h" + +/* enable/disable readout of fuse and lock-bits + (will not work for Mega169 since not supported by AVRPROG 1.37 */ +#define ENABLEREADFUSELOCK + +/* 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 + with a bootloader as far as I know) + Keep this undefined! + */ +// #define WRITELOCKBITS + +#include "chipdef.h" + +#define UART_RX_BUFFER_SIZE SPM_PAGESIZE +unsigned char gBuffer[UART_RX_BUFFER_SIZE]; + +#define eeprom_is_ready() bit_is_clear(EECR, EEWE) +#define my_eeprom_busy_wait() do{}while(!eeprom_is_ready()) + +unsigned char BufferLoad(unsigned int , unsigned char ) ; +void BlockRead(unsigned int , unsigned char ) ; + +uint32_t address; +unsigned char device; + +void send_boot(void) +{ + sendchar('A'); + sendchar('V'); + sendchar('R'); + sendchar('B'); + sendchar('O'); + sendchar('O'); + sendchar('T'); +} + +void (*jump_to_app)(void) = 0x0000; + +int main(void) +{ + unsigned tempi; + char val; + + #ifdef START_POWERSAVE + char OK = 1; + #endif + + cli(); + + MCUCR = (1<> 8) & 0xFF); + // Report buffer size in bytes + sendchar(UART_RX_BUFFER_SIZE & 0xFF); + } + + else if(val=='B') // Start buffer load + { + tempi = recchar() << 8; // Load high byte of buffersize + tempi |= recchar(); // Load low byte of buffersize + val = recchar(); // Load memory type ('E' or 'F') + sendchar (BufferLoad(tempi,val)); + // Start downloading of buffer + } + + else if(val == 'g') // Block read + { + tempi = (recchar() << 8) | recchar(); + + val = recchar(); // Get memtype + BlockRead(tempi,val); // Perform the block read + } + + else if(val=='e') //Chip erase + { + if (device == devtype) + { + // erase only main section (bootloader protection) + address = 0; + while ( APP_END > address ) + { boot_page_erase(address); // Perform page erase - boot_spm_busy_wait(); // Wait until the memory is erased. - address += SPM_PAGESIZE; - } - } - boot_rww_enable(); - sendchar('\r'); - } - - else if(val=='E') //Exit upgrade - { - wdt_enable(WDTO_15MS); // Enable Watchdog Timer to give reset - sendchar('\r'); - } - - #ifdef WRITELOCKBITS - #warning "Extension 'WriteLockBits' enabled" - // TODO: does not work reliably - else if(val=='l') // write lockbits - { - if (device == devtype) - { - // write_lock_bits(recchar()); - boot_lock_bits_set(recchar()); // boot.h takes care of mask - boot_spm_busy_wait(); - } - sendchar('\r'); - } - #endif - - else if(val=='P') // Enter programming mode - { - sendchar('\r'); - } - - else if(val=='L') // Leave programming mode - { - sendchar('\r'); - } - - else if (val=='p') // return programmer type - { - sendchar('S'); // always serial programmer - } - -#ifdef ENABLEREADFUSELOCK -#warning "Extension 'ReadFuseLock' enabled" - else if(val=='F') // read "low" fuse bits - { - sendchar( read_fuse_lock(0x0000, _BV(BLBSET)|_BV(SPMEN)) ); - } - - else if(val=='r') // read lock bits - { - sendchar( read_fuse_lock(0x0001, _BV(BLBSET)|_BV(SPMEN)) ); - } - - else if(val=='N') // read high fuse bits - { - sendchar( read_fuse_lock(0x0003,_BV(BLBSET)|_BV(SPMEN)) ); - } - - else if(val=='Q') // read extended fuse bits - { - sendchar( read_fuse_lock(0x0002,_BV(BLBSET)|_BV(SPMEN)) ); - } -#endif -// end of ENABLEREADFUSELOCK section - - else if(val=='t') // Return device type - { - sendchar(devtype); - sendchar(0); - } - - else if ((val=='x')||(val=='y')) // clear and set LED ignored - { - recchar(); - sendchar('\r'); - } - - else if (val=='T') // set device - { - device = recchar(); - sendchar('\r'); - } - - else if (val=='S') // Return software identifier - { - send_boot(); - } - - else if (val=='V') // Return Software Version - { - sendchar(VERSION_HIGH); - sendchar(VERSION_LOW); - } - - else if (val=='s') // Return Signature Byte - { - sendchar(sig_byte1); - sendchar(sig_byte2); - sendchar(sig_byte3); - } - - else if(val != 0x1b) /* ESC */ - { - sendchar('?'); - } - } // end of "parser" for-loop - - return 0; -} - - -unsigned char BufferLoad(unsigned int size, unsigned char mem) -{ - unsigned int data, cnt; - uint32_t tempaddress; - - for (cnt=0; cnt>=1; - do { - EEARL = address; // Setup EEPROM address - EEARH = (address >> 8); - address++; // Select next byte - EEDR=gBuffer[cnt++]; - - EECR |= (1<>=1; // not needed here - hmm, somehow inconsistant TODO - do { - EEARL = address; // Setup EEPROM address - EEARH = (address >> 8); - address++; // Select next EEPROM byte - EECR |= (1<> 8)); //send MSB - address += 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 - } -} + boot_spm_busy_wait(); // Wait until the memory is erased. + address += SPM_PAGESIZE; + } + } + boot_rww_enable(); + sendchar('\r'); + } + + else if(val=='E') //Exit upgrade + { + wdt_enable(WDTO_15MS); // Enable Watchdog Timer to give reset + sendchar('\r'); + } + + #ifdef WRITELOCKBITS + #warning "Extension 'WriteLockBits' enabled" + // TODO: does not work reliably + else if(val=='l') // write lockbits + { + if (device == devtype) + { + // write_lock_bits(recchar()); + boot_lock_bits_set(recchar()); // boot.h takes care of mask + boot_spm_busy_wait(); + } + sendchar('\r'); + } + #endif + + else if(val=='P') // Enter programming mode + { + sendchar('\r'); + } + + else if(val=='L') // Leave programming mode + { + sendchar('\r'); + } + + else if (val=='p') // return programmer type + { + sendchar('S'); // always serial programmer + } + +#ifdef ENABLEREADFUSELOCK +#warning "Extension 'ReadFuseLock' enabled" + else if(val=='F') // read "low" fuse bits + { + sendchar( read_fuse_lock(0x0000, _BV(BLBSET)|_BV(SPMEN)) ); + } + + else if(val=='r') // read lock bits + { + sendchar( read_fuse_lock(0x0001, _BV(BLBSET)|_BV(SPMEN)) ); + } + + else if(val=='N') // read high fuse bits + { + sendchar( read_fuse_lock(0x0003,_BV(BLBSET)|_BV(SPMEN)) ); + } + + else if(val=='Q') // read extended fuse bits + { + sendchar( read_fuse_lock(0x0002,_BV(BLBSET)|_BV(SPMEN)) ); + } +#endif +// end of ENABLEREADFUSELOCK section + + else if(val=='t') // Return device type + { + sendchar(devtype); + sendchar(0); + } + + else if ((val=='x')||(val=='y')) // clear and set LED ignored + { + recchar(); + sendchar('\r'); + } + + else if (val=='T') // set device + { + device = recchar(); + sendchar('\r'); + } + + else if (val=='S') // Return software identifier + { + send_boot(); + } + + else if (val=='V') // Return Software Version + { + sendchar(VERSION_HIGH); + sendchar(VERSION_LOW); + } + + else if (val=='s') // Return Signature Byte + { + sendchar(sig_byte1); + sendchar(sig_byte2); + sendchar(sig_byte3); + } + + else if(val != 0x1b) /* ESC */ + { + sendchar('?'); + } + } // end of "parser" for-loop + + return 0; +} + + +unsigned char BufferLoad(unsigned int size, unsigned char mem) +{ + unsigned int data, cnt; + uint32_t tempaddress; + + for (cnt=0; cnt>=1; + do { + EEARL = address; // Setup EEPROM address + EEARH = (address >> 8); + address++; // Select next byte + EEDR=gBuffer[cnt++]; + + EECR |= (1<>=1; // not needed here - hmm, somehow inconsistant TODO + do { + EEARL = address; // Setup EEPROM address + EEARH = (address >> 8); + address++; // Select next EEPROM byte + EECR |= (1<> 8)); //send MSB + address += 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 + } +} diff --git a/makefile b/makefile index 4cbc91f..94989ea 100644 --- a/makefile +++ b/makefile @@ -31,12 +31,49 @@ # To rebuild project do "make clean" then "make all". # +# user defined values # MCU name ## MCU = atmega16 ## MCU = atmega8 -MCU = atmega32 -## MCU = atmega128 +## MCU = atmega32 +MCU = at90can128 + +XTAL=16000000 + +BAUDRATE=115200 + +#Pin "STARTPIN" on port "STARTPORT" in this port has to grounded +# (active low) to start the bootloader +BLPORT = PORTB +BLDDR = DDRB +BLPIN = PINB +BLPNUM = PINB0 + +# Select startup-mode +# * SIMPLE-Mode - Jump to bootloader main BL-loop if key is +# pressed (Pin grounded) "during" reset or jump to the +# application if the pin is not grounded (=pulled up by +# internal pull-up-resistor) +# * POWERSAVE-Mode - Startup is separated in two loops +# which makes power-saving a little easier if no firmware +# is on the chip. Needs more memory +# * BOOTICE-Mode - to flash the JTAGICE upgrade.ebn file. +# No startup-sequence in this mode. Jump directly to the +# parser-loop on reset +# XTAL in BOOTICEMODE must be 7372800 Hz to be compatible +# with the org. JTAGICE-Firmware */ +STARTMODE=START_SIMPLE +##STARTMODE=START_POWERSAVE +##STARTMODE=START_BOOTICE + +#/* Select Boot Size in Words (select one, comment out the others) */ +## NO! BOOTSIZE=_B128 +## NO! BOOTSIZE=_B256 +## MAYBE: BOOTSIZE=_B512 +BOOTSIZE=_B1024 +##BOOTSIZE=_B2048 + ################## BOOTLOADER ###################### # mt: Boot loader support. So far not done with a separate section @@ -46,20 +83,33 @@ MCU = atmega32 # (see LDFLAGS further down) # 0x1C00*2=0x3800 for ATmega16 1024 words Boot Size -## MT_BOOTLOADER_ADDRESS = 3800 +ifeq ($(MCU), atmega16) + MT_BOOTLOADER_ADDRESS = 3800 +endif # 0x0C00*2=0x1800 for ATmega8 1024 words Boot Size -## MT_BOOTLOADER_ADDRESS = 1800 +ifeq ($(MCU), atmega8) + MT_BOOTLOADER_ADDRESS = 1800 +endif # 0x3C00*2=0x7800 for ATmega32 1024 words Boot Size -MT_BOOTLOADER_ADDRESS = 7800 +ifeq ($(MCU), atmega32) + MT_BOOTLOADER_ADDRESS = 7800 +endif # 0xFC00*2=0x1F800 for ATmega128 1024 words Boot Size -##MT_BOOTLOADER_ADDRESS = 1F800 +ifeq ($(MCU), atmega128) + MT_BOOTLOADER_ADDRESS = 1F800 +endif + +# 0xFC00*2=0x1F800 for AT90Can128 1024 words Boot Size +ifeq ($(MCU), at90can128) + MT_BOOTLOADER_ADDRESS = 1f800 +endif # Output format. (can be srec, ihex, binary) -FORMAT = ihex +FORMAT = srec # Target file name (without extension). TARGET = main @@ -103,8 +153,11 @@ EXTRAINCDIRS = CSTANDARD = -std=gnu99 # Place -D or -U options here -CDEFS = - +CDEFS = -DBLPORT=$(BLPORT) -DBLDDR=$(BLDDR) -DBLPIN=$(BLPIN) -DBLPNUM=$(BLPNUM) +CDEFS += -D$(STARTMODE) -D$(BOOTSIZE) -DBAUDRATE=$(BAUDRATE) +ifdef XTAL + CDEFS += -DXTAL=$(XTAL) +endif # Place -I options here CINCS = @@ -196,7 +249,8 @@ LDFLAGS += -Wl,--section-start=.text=$(MT_BOOTLOADER_ADDRESS) AVRDUDE_PROGRAMMER = stk500v2 # com1 = serial port. Use lpt1 to connect to parallel port. -AVRDUDE_PORT = com1 # programmer connected to serial device +#AVRDUDE_PORT = com1 # programmer connected to serial device +AVRDUDE_PORT = /dev/ttyS1 # programmer connected to serial device AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex #AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep @@ -235,11 +289,11 @@ DIRLIB = $(DIRAVR)/avr/lib # Define programs and commands. SHELL = sh -CC = avr-gcc -OBJCOPY = avr-objcopy -OBJDUMP = avr-objdump -SIZE = avr-size -NM = avr-nm +CC = env WINEDLLOVERRIDES=msvcrt=n /spare/bon/wine/wine/wine c:/WinAVR/bin/avr-gcc +OBJCOPY = env WINEDLLOVERRIDES=msvcrt=n /spare/bon/wine/wine/wine c:/WinAVR/bin/avr-objcopy +OBJDUMP = env WINEDLLOVERRIDES=msvcrt=n /spare/bon/wine/wine/wine c:/WinAVR/bin/avr-objdump +SIZE = env WINEDLLOVERRIDES=msvcrt=n /spare/bon/wine/wine/wine c:/WinAVR/bin/avr-size +NM = env WINEDLLOVERRIDES=msvcrt=n /spare/bon/wine/wine/wine c:/WinAVR/bin/avr-nm AVRDUDE = avrdude REMOVE = rm -f COPY = cp diff --git a/readme.txt b/readme.txt index 4e9346a..7a6e829 100644 --- a/readme.txt +++ b/readme.txt @@ -12,6 +12,12 @@ ====================================================== + +18. Aug. 2005 - Version 0.74 + +* AT90CAN128 support contributed by Uwe Bonnes +* Makefile modifications contributed by Uwe Bonnes + 23. Feb. 2005 - Version 0.7 * (Version 0.6 has never been available on the web-page) @@ -98,31 +104,20 @@ not enabled (TODO). ATmega16 has been tested, ATmega169, ATmega8 and ATmega32 should be o.k. too. -- Change the boot(loader)-size in main.c, this +- Change the boot(loader)-size in Makefile, this bootloader is larger than 512 words (1024 bytes), so select at least _B1024! -- Change the XTAL in main.c to the clock-frequency +- Change the XTAL in Makefile to the clock-frequency of your board (keep BAUDRATE at 19200). See the datasheet for frequencies with minimum error at 19200bps and select Crystal/Oscillator to get minimum errors. -- Change the start-condition in main.c. Default +- Change the start-condition in Makefile. Default is: enter bootloader if Pin A7 is connected to GND during reset/startup -- Edit the value MT_BOOTLOADER_ADDRESS in the - makefile according to the selected bootloader - size. Keep in mind that this value has to be - given in bytes (not words) in the linker options. - - i.e. ATMega16, boot-size 1024 words, see - datasheet and find "Boot Reset Adress" for - "Boot Size" 1024 words is 1C00. 1C00 is given - in words, so set MT_BOOTLOADER_ADDRESS to - 3800 (=2*1C00) - - Please use at least avr-gcc 3.3.1/avr-libc 1.0 or WINAVR Sept. 2003 or later to compile and link the bootloader. diff --git a/uart.c b/uart.c index 2bb991c..7aad949 100644 --- a/uart.c +++ b/uart.c @@ -39,7 +39,7 @@ #define UART1_CONTROL2 UCSR1C #define UART1_DATA UDR1 #define UART1_UDRIE UDRIE1 -#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) +#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) || defined(__AVR_AT90CAN128__) /* ATMega with two USART */ #define ATMEGA_USART0 #define ATMEGA_USART1 diff --git a/uart.h b/uart.h index f968505..9c64561 100644 --- a/uart.h +++ b/uart.h @@ -1,7 +1,7 @@ #ifndef UART_H #define UART_H -#define UART_BAUD_SELECT(baudRate,xtalCpu) ((xtalCpu)/((baudRate)*16L)-1) +#define UART_BAUD_SELECT(baudRate,xtalCpu) (((xtalCpu)+(baudRate*8))/((baudRate)*16)-1) #define UARTDOUBLE 1 #define UARTSINGLE 0