From 5eec4f6815221e78c06cc132df258f38d5b46cd8 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Fri, 6 Dec 2013 15:46:47 +0100 Subject: custom crt, remove tiny85flashinit, UNTESTED --- firmware/Makefile | 11 +++--- firmware/crt1.S | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ firmware/main.c | 9 ++--- 3 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 firmware/crt1.S 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 + 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 -- cgit v1.2.3