summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcpldcpu <cpldcpu@gmail.com>2013-12-06 15:46:47 +0100
committercpldcpu <cpldcpu@gmail.com>2013-12-06 15:46:47 +0100
commit5eec4f6815221e78c06cc132df258f38d5b46cd8 (patch)
tree6d889eb28478fce751f75ec96edfd4f2b666d840
parent598ca1ed69747777b2df560f37529eb242b23c43 (diff)
downloadmicronucleus-5eec4f6815221e78c06cc132df258f38d5b46cd8.tar.gz
micronucleus-5eec4f6815221e78c06cc132df258f38d5b46cd8.tar.bz2
micronucleus-5eec4f6815221e78c06cc132df258f38d5b46cd8.zip
custom crt, remove tiny85flashinit, UNTESTED
-rw-r--r--firmware/Makefile11
-rw-r--r--firmware/crt1.S102
-rw-r--r--firmware/main.c9
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