diff options
| -rw-r--r-- | firmware/Makefile | 11 | ||||
| -rw-r--r-- | firmware/crt1.S | 102 | ||||
| -rw-r--r-- | firmware/main.c | 9 | 
3 files changed, 113 insertions, 9 deletions
| diff --git a/firmware/Makefile b/firmware/Makefile index 95a48e7..0905d0a 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -24,7 +24,7 @@ LOCKOPT = -U lock:w:0x2f:m  # - for the size of your device (8kb = 1024 * 8 = 8192) subtract above value 2124... = 6068  # - How many pages in is that? 6068 / 64 (tiny85 page size in bytes) = 94.8125  # - round that down to 94 - our new bootloader address is 94 * 64 = 6016, in hex = 1780 -BOOTLOADER_ADDRESS = 1800 +BOOTLOADER_ADDRESS = 1880  PROGRAMMER = -c USBasp  # PROGRAMMER contains AVRDUDE options to address your programmer @@ -149,10 +149,11 @@ CC = avr-gcc  DEFINES = -DBOOTLOADER_ADDRESS=0x$(BOOTLOADER_ADDRESS) #-DDEBUG_LEVEL=2  # Remove the -fno-* options when you use gcc 3, it does not understand them  #  -CFLAGS = -g2 -ffunction-sections -fdata-sections -fpack-struct -Wall -Os  -fno-inline-small-functions -fno-move-loop-invariants -fno-tree-scev-cprop  -I. -Ilibs-device -mmcu=$(DEVICE) -DF_CPU=$(F_CPU) $(DEFINES) -LDFLAGS = -Wl,--relax,--gc-sections -Wl,--section-start=.text=$(BOOTLOADER_ADDRESS),-Map=main.map +CFLAGS = -g2 -nostartfiles -ffunction-sections -fdata-sections -fpack-struct -Wall -Os  -fno-inline-small-functions -fno-move-loop-invariants -fno-tree-scev-cprop  -I. -Ilibs-device -mmcu=$(DEVICE) -DF_CPU=$(F_CPU) $(DEFINES) +LDFLAGS = -Wl,--relax,--section-start=.text=$(BOOTLOADER_ADDRESS),-Map=main.map,--section-start=.zerotable=0 -OBJECTS =  usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o + +OBJECTS =  crt1.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o   OBJECTS += libs-device/osccalASM.o  # symbolic targets:  all: main.hex @@ -197,7 +198,7 @@ main.bin:	$(OBJECTS)  main.hex:	main.bin  	rm -f main.hex main.eep.hex -	avr-objcopy -j .text -j .data -O ihex main.bin main.hex +	avr-objcopy -j .text -j .zerotable -j .data -O ihex main.bin main.hex  	avr-size main.hex  disasm:	main.bin diff --git a/firmware/crt1.S b/firmware/crt1.S new file mode 100644 index 0000000..bb7b8e0 --- /dev/null +++ b/firmware/crt1.S @@ -0,0 +1,102 @@ + +/* Copyright (c) 2002, Marek Michalkiewicz <marekm@amelek.gda.pl> +   Copyright (c) 2007, 2008 Eric B. Weddington +   All rights reserved. + +   Redistribution and use in source and binary forms, with or without +   modification, are permitted provided that the following conditions are met: + +   * Redistributions of source code must retain the above copyright +     notice, this list of conditions and the following disclaimer. + +   * Redistributions in binary form must reproduce the above copyright +     notice, this list of conditions and the following disclaimer in +     the documentation and/or other materials provided with the +     distribution. + +   * Neither the name of the copyright holders nor the names of +     contributors may be used to endorse or promote products derived +     from this software without specific prior written permission. + +   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +   POSSIBILITY OF SUCH DAMAGE. */ + +/* $Id$ */ + +#if (__GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 3) +#error "GCC version >= 3.3 required" +#endif +/* +#include IOSYMFILE + +#include "macros.inc" +*/ + +  #define XJMP rjmp +  #define XCALL rcall +   +	.macro	vector name +	.weak	\name +	.set	\name, __init +	XJMP	\name +	.endm + +	.section .vectors,"ax",@progbits +	.global	__vectors +	.global	__bad_interrupt +	.func	__vectors +__bad_interrupt:	 +__vectors: +	XJMP	__init +	vector	__vector_1 +	vector	__vector_2 +	vector	__vector_3 +	.endfunc + +	/* Handle unexpected interrupts (enabled and no handler), which +	   usually indicate a bug.  Jump to the __vector_default function +	   if defined by the user, otherwise jump to the reset address. + +	   This must be in a different section, otherwise the assembler +	   will resolve "rjmp" offsets and there will be no relocs.  */ + +	.section .init0,"ax",@progbits +	.weak	__init +;	.func	__init +__init: + +	.weak	__stack + +	/* By default, malloc() uses the current value of the stack pointer +	   minus __malloc_margin as the highest available address. + +	   In some applications with external SRAM, the stack can be below +	   the data section (in the internal SRAM - faster), and __heap_end +	   should be set to the highest address available for malloc().  */ +	.weak	__heap_end +	.set	__heap_end, 0 + +	.section .init2,"ax",@progbits +	clr		R1 +	out		0x3f,r1 + +	.section .init9,"ax",@progbits +	XJMP	main +;	.endfunc + + +	.section .zerotable,"ax",@progbits +zerovectors: +	XJMP	__init +	XJMP	__vector_1 +	XJMP	__vector_2 +	XJMP	__vector_3 diff --git a/firmware/main.c b/firmware/main.c index 8765c0c..be3ee04 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -215,7 +215,7 @@ static void writeWordToPageBuffer(uint16_t data) {  }  // fills the rest of this page with vectors - interrupt vector or tinyvector tables where needed -static void fillFlashWithVectors(void) { +static inline void fillFlashWithVectors(void) {      //int16_t i;      //      // fill all or remainder of page with 0xFFFF (as if unprogrammed) @@ -235,7 +235,7 @@ static void fillFlashWithVectors(void) {      } while (currentAddress % SPM_PAGESIZE);  #endif -    writeFlashPage(); +   // writeFlashPage(); // BUG! Page 0 was written twice!  }  /* ------------------------------------------------------------------------ */ @@ -331,6 +331,7 @@ static inline void initForUsbConnectivity(void) {      sei();  } +/*  static inline void tiny85FlashInit(void) {      // check for erased first page (no bootloader interrupt vectors), add vectors if missing      // this needs to happen for usb communication to work later - essential to first run after bootloader @@ -341,7 +342,7 @@ static inline void tiny85FlashInit(void) {      // TODO: necessary to reset currentAddress?      currentAddress = 0;  } - +*/  // Write page buffer to flash. May only be called for full pages. @@ -394,7 +395,7 @@ int main(void) {  	// MCUSR=0;    /* clean wdt reset bit if reset occured due to wdt */    //  wdt_disable();      wdt_enable(WDTO_1S);      /* enable watchdog and set to 500ms. */ -    tiny85FlashInit(); +  //  tiny85FlashInit();      bootLoaderInit();  #	if AUTO_EXIT_NO_USB_MS	 | 
