From 51182dbccb6b8e5dd713873fd937a1fbfa703dfe Mon Sep 17 00:00:00 2001 From: Olaf Rempel Date: Fri, 19 May 2006 21:52:00 +0200 Subject: [PATCH] cleanup main.c - codingstyle - move functions to top (readable asm-listing) - pull lowlevel.c into main.c --- chipdef.h | 9 +- lowlevel.c | 27 --- lowlevel.h | 18 -- main.c | 491 +++++++++++++++++++++++++---------------------------- makefile | 2 +- 5 files changed, 241 insertions(+), 306 deletions(-) delete mode 100644 lowlevel.c delete mode 100644 lowlevel.h diff --git a/chipdef.h b/chipdef.h index 4c86cc9..9b10066 100644 --- a/chipdef.h +++ b/chipdef.h @@ -1,9 +1,16 @@ - #ifndef CHIPDEF_H #define CHIPDEF_H #include +#if defined (SPMCSR) +#define SPM_REG SPMCSR +#elif defined (SPMCR) +#define SPM_REG SPMCR +#else +#error "AVR processor does not provide bootloader support!" +#endif + // TODO: make use of RAMEND in the avr-libc io-files and // avoid a lot of by-device definitions here diff --git a/lowlevel.c b/lowlevel.c deleted file mode 100644 index ce715a9..0000000 --- a/lowlevel.c +++ /dev/null @@ -1,27 +0,0 @@ -// -// Low-level routines to read lock and fuse-bytes -// -// Copyright (C) 2/2005 Martin Thomas, Kaiserslautern, Germany -// - -#include "lowlevel.h" - -unsigned char read_fuse_lock(unsigned short addr, unsigned char mode) -{ - unsigned char retval; - - asm volatile - ( - "movw r30, %3\n\t" /* Z to addr */ \ - "sts %0, %2\n\t" /* set mode in SPM_REG */ \ - "lpm\n\t" /* load fuse/lock value into r0 */ \ - "mov %1,r0\n\t" /* save return value */ \ - : "=m" (SPM_REG), - "=r" (retval) - : "r" (mode), - "r" (addr) - : "r30", "r31", "r0" - ); - return retval; -} - diff --git a/lowlevel.h b/lowlevel.h deleted file mode 100644 index f268a56..0000000 --- a/lowlevel.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef LOWLEVEL_H -#define LOWLEVEL_H - -#include - -/* Check for SPM Control Register in processor. */ -#if defined (SPMCSR) -# define SPM_REG SPMCSR -#elif defined (SPMCR) -# define SPM_REG SPMCR -#else -# error AVR processor does not provide bootloader support! -#endif - -unsigned char read_fuse_lock(unsigned short addr, unsigned char mode); - - -#endif diff --git a/main.c b/main.c index 4f2e65f..7b5b7ed 100644 --- a/main.c +++ b/main.c @@ -67,8 +67,6 @@ #include #include #include -// function not found in boot.h to read lock/fuses -#include "lowlevel.h" #ifndef XTAL #warning "Set XTAL in Makefile" @@ -108,12 +106,129 @@ 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; +unsigned char BufferLoad(unsigned int size, unsigned char mem) +{ + unsigned int data, cnt; + uint32_t tempaddress; + + for (cnt = 0; cnt < UART_RX_BUFFER_SIZE; cnt++) { + if (cnt < size) + gBuffer[cnt] = recchar(); + else + gBuffer[cnt] = 0xFF; + } + cnt = 0; + + tempaddress = address; // Store address in page + + my_eeprom_busy_wait(); + + if (device == devtype) { + // Flash + if (mem == 'F') { + do { + data = gBuffer[cnt++]; + data |= (gBuffer[cnt++] << 8); + boot_page_fill(address, data); // call asm routine. + + address = address +2; // Select next word in memory + size -= 2; // Reduce number of bytes to write by two + } while(size); // Loop until all bytes written + + /* commented out since not compatible with mega8 - + secondary benefit: saves memory + tempaddress &= 0xFF80; // Ensure the address points to the first byte in the page + */ + + boot_page_write(tempaddress); + boot_spm_busy_wait(); + boot_rww_enable(); // Re-enable the RWW section + + /* commented out since not compatible with mega8 + if (address != (address & 0xFF80)) + { // Ensure that the address points to the beginning of the next page + address &= 0xFF80; + address += SPM_PAGESIZE; + } + */ + } // End FLASH + + // Start EEPROM + if (mem == 'E') { + address >>= 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 + } +} + +unsigned char read_fuse_lock(unsigned short addr, unsigned char mode) +{ + unsigned char retval; + + asm volatile + ( + "movw r30, %3\n\t" /* Z to addr */ \ + "sts %0, %2\n\t" /* set mode in SPM_REG */ \ + "lpm\n\t" /* load fuse/lock value into r0 */ \ + "mov %1,r0\n\t" /* save return value */ \ + : "=m" (SPM_REG), + "=r" (retval) + : "r" (mode), + "r" (addr) + : "r30", "r31", "r0" + ); + return retval; +} + void send_boot(void) { sendchar('A'); @@ -132,70 +247,66 @@ int main(void) unsigned tempi; char val; - #ifdef START_POWERSAVE +#ifdef START_POWERSAVE char OK = 1; - #endif +#endif cli(); - MCUCR = (1<= WAIT_VALUE){ - BLPORT &= ~(1<> 8) & 0xFF); - // Report buffer size in bytes + sendchar((UART_RX_BUFFER_SIZE >> 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 + // Start buffer load + } else if (val == 'B') { + 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 - } + sendchar (BufferLoad(tempi, val)); // Start downloading of buffer - else if(val == 'g') // Block read - { + // Block read + } else if (val == 'g') { tempi = (recchar() << 8) | recchar(); - val = recchar(); // Get memtype - BlockRead(tempi,val); // Perform the block read - } + BlockRead(tempi, val); // Perform the block read - else if(val=='e') //Chip erase - { - if (device == devtype) - { + // Chip erase + } else if (val == 'e') { + if (device == devtype) { // erase only main section (bootloader protection) address = 0; - while ( APP_END > address ) - { + while (APP_END > address) { boot_page_erase(address); // Perform page erase boot_spm_busy_wait(); // Wait until the memory is erased. address += SPM_PAGESIZE; @@ -306,215 +405,89 @@ int main(void) } boot_rww_enable(); sendchar('\r'); - } - else if(val=='E') //Exit upgrade - { + // Exit upgrade + } else if (val == 'E') { 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) - { +#ifdef WRITELOCKBITS +#warning "Extension 'WriteLockBits' enabled" + // TODO: does not work reliably + // write lockbits + } else if (val == 'l') { + 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 - { +#endif + // Enter programming mode + } else if (val == 'P') { sendchar('\r'); - } - else if(val=='L') // Leave programming mode - { + // Leave programming mode + } else if (val == 'L') { sendchar('\r'); - } - else if (val=='p') // return programmer type - { - sendchar('S'); // always serial programmer - } + // return programmer type + } else if (val == 'p') { + 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)) ); - } + // read "low" fuse bits + } else if (val == 'F') { + 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)) ); - } + // read lock bits + } else if (val == 'r') { + 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)) ); - } + // read high fuse bits + } else if (val == 'N') { + 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)) ); - } + // read extended fuse bits + } else if (val == 'Q') { + sendchar(read_fuse_lock(0x0002, _BV(BLBSET) | _BV(SPMEN))); #endif -// end of ENABLEREADFUSELOCK section - else if(val=='t') // Return device type - { + // Return device type + } else if (val == 't') { sendchar(devtype); sendchar(0); - } - else if ((val=='x')||(val=='y')) // clear and set LED ignored - { + // clear and set LED ignored + } else if ((val == 'x') || (val == 'y')) { recchar(); sendchar('\r'); - } - else if (val=='T') // set device - { + // set device + } else if (val == 'T') { device = recchar(); sendchar('\r'); - } - else if (val=='S') // Return software identifier - { + // Return software identifier + } else if (val == 'S') { send_boot(); - } - else if (val=='V') // Return Software Version - { + // Return Software Version + } else if (val == 'V') { sendchar(VERSION_HIGH); sendchar(VERSION_LOW); - } - else if (val=='s') // Return Signature Byte - { + // Return Signature Byte + } else if (val == 's') { sendchar(sig_byte1); sendchar(sig_byte2); sendchar(sig_byte3); - } - else if(val != 0x1b) /* ESC */ - { + /* ESC */ + } else if(val != 0x1b) { 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 6636253..929c2eb 100644 --- a/makefile +++ b/makefile @@ -123,7 +123,7 @@ TARGET = main # List C source files here. (C dependencies are automatically generated.) -SRC = $(TARGET).c uart.c lowlevel.c +SRC = $(TARGET).c uart.c # List Assembler source files here.