Add linker script

Also get rid of genbackupisr hack: We can achieve the same thing with
avr-objcopy which doesn't need additional software.
We use the new bootloader setting for irq-save area of 0x800.
This commit is contained in:
Ralf Schlatterbeck 2017-08-22 10:13:36 +02:00
parent edc7a59091
commit 406fb7ea44
6 changed files with 329 additions and 29 deletions

View file

@ -218,14 +218,3 @@ endif
symbols.c: symbols.c:
cp ${CONTIKI}/tools/empty-symbols.c symbols.c cp ${CONTIKI}/tools/empty-symbols.c symbols.c
cp ${CONTIKI}/tools/empty-symbols.h symbols.h cp ${CONTIKI}/tools/empty-symbols.h symbols.h
# Generic rules for .hex, .eep and .sz (size) file:
%.$(TARGET)$(CUSTOM_SUFFIX).hex: %.$(TARGET)$(CUSTOM_SUFFIX)
$(OBJCOPY) -j .text -j .data -O ihex $< $@
%.$(TARGET)$(CUSTOM_SUFFIX).eep: %.$(TARGET)$(CUSTOM_SUFFIX)
$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O ihex $< $@
%.$(TARGET)$(CUSTOM_SUFFIX).sz: %.$(TARGET)$(CUSTOM_SUFFIX)
$(ELF_SIZE) $<

View file

@ -4,3 +4,4 @@
*.osd-merkur-256 *.osd-merkur-256
*.osd-merkur-256.0 *.osd-merkur-256.0
*.osd-merkur-256.1 *.osd-merkur-256.1
*-combined

View file

@ -92,3 +92,24 @@ MODULES += core/net/mac core/net core/net/mac/sicslowmac \
# core/net/ipv6 core/net/ipv4 core/net/ip \ # core/net/ipv6 core/net/ipv4 core/net/ip \
# core/net/rime \ # core/net/rime \
# core/net/rpl \ # core/net/rpl \
# Generic rules for .hex, .eep and .sz (size) file:
%.$(TARGET)$(CUSTOM_SUFFIX).hex: %.$(TARGET)$(CUSTOM_SUFFIX)
$(OBJCOPY) -j .text -j .data -O ihex $< $@
%.$(TARGET)$(CUSTOM_SUFFIX).eep: %.$(TARGET)$(CUSTOM_SUFFIX)
$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O ihex $< $@
%.$(TARGET)$(CUSTOM_SUFFIX).sz: %.$(TARGET)$(CUSTOM_SUFFIX)
$(ELF_SIZE) $<
flash: $(EXE).$(TARGET)$(CUSTOM_SUFFIX).u
avr-size: $(EXE).$(TARGET)$(CUSTOM_SUFFIX).sz
.PHONY: flash avr-size
.PRECIOUS: %.$(TARGET)$(CUSTOM_SUFFIX) \
$(EXE).$(TARGET)$(CUSTOM_SUFFIX).hex \
$(EXE).$(TARGET)$(CUSTOM_SUFFIX).eep

View file

@ -37,6 +37,7 @@ CONTIKI_TARGET_SOURCEFILES += HardwareSerial.cpp HardwareSerial1.cpp
CONTIKI_TARGET_SOURCEFILES += sg-ready.c CONTIKI_TARGET_SOURCEFILES += sg-ready.c
CONTIKIAVR=$(CONTIKI)/cpu/avr CONTIKIAVR=$(CONTIKI)/cpu/avr
THISPLATFORM=$(CONTIKI)/platform/osd-merkur-256
CONTIKIBOARD=. CONTIKIBOARD=.
BOOTLOADER_START = 0x3E000 BOOTLOADER_START = 0x3E000
@ -93,12 +94,20 @@ BOOTLOADER_GET_BOOT_NEXT=0x0003ffac
BOOTLOADER_GET_CALLERS_PART=0x0003ffb0 BOOTLOADER_GET_CALLERS_PART=0x0003ffb0
BOOTLOADER_PARTITION=0 BOOTLOADER_PARTITION=0
TEXT_SECTION_LENGTH=0x1ef00
PART_IRQVEC_SIZE=$(shell echo $$((0x800)))
ifeq ($(BOOTLOADER_PARTITION),0) ifeq ($(BOOTLOADER_PARTITION),0)
TEXT_SECTION_START=0x0 TEXT_SECTION_START=0x0
LOW_PARTITIONS=--only-section=.customlowtext --only-section=.text
else else
TEXT_SECTION_START=0x1ef00 TEXT_SECTION_START=$(TEXT_SECTION_LENGTH)
LOW_PARTITIONS=--only-section=.customlowtext
endif endif
PART_IRQVEC_BACKUP_START:=$(shell printf "0x%x" \
$$(($(TEXT_SECTION_START) + $(TEXT_SECTION_LENGTH) - $(PART_IRQVEC_SIZE))))
CUSTOM_SUFFIX=.$(BOOTLOADER_PARTITION) CUSTOM_SUFFIX=.$(BOOTLOADER_PARTITION)
LDFLAGS += -Wl,--defsym,bootloader_get_mac=$(BOOTLOADER_GET_MAC) \ LDFLAGS += -Wl,--defsym,bootloader_get_mac=$(BOOTLOADER_GET_MAC) \
@ -114,7 +123,8 @@ LDFLAGS += -Wl,--defsym,bootloader_get_mac=$(BOOTLOADER_GET_MAC) \
-Wl,--defsym,bootloader_get_boot_default=$(BOOTLOADER_GET_BOOT_DEFAULT) \ -Wl,--defsym,bootloader_get_boot_default=$(BOOTLOADER_GET_BOOT_DEFAULT) \
-Wl,--defsym,bootloader_get_boot_next=$(BOOTLOADER_GET_BOOT_NEXT) \ -Wl,--defsym,bootloader_get_boot_next=$(BOOTLOADER_GET_BOOT_NEXT) \
-Wl,--defsym,bootloader_get_callers_part=$(BOOTLOADER_GET_CALLERS_PART) \ -Wl,--defsym,bootloader_get_callers_part=$(BOOTLOADER_GET_CALLERS_PART) \
-Wl,--section-start=.text=$(TEXT_SECTION_START) -Wl,--defsym,__TEXT_SECTION_OFFSET__=$(TEXT_SECTION_START) \
-T $(THISPLATFORM)/custom-avr6.xm
include $(CONTIKIAVR)/Makefile.avr include $(CONTIKIAVR)/Makefile.avr
@ -140,8 +150,31 @@ CUSTOM_RULE_LINK=1
%: %.$(TARGET)$(CUSTOM_SUFFIX) %: %.$(TARGET)$(CUSTOM_SUFFIX)
@ @
%.$(TARGET)$(CUSTOM_SUFFIX)-combined.hex: %.$(TARGET)$(CUSTOM_SUFFIX).hex # Generic rules for .hex, .eep and .sz (size) file:
$(CONTIKI)/tools/genbackupisr.py $< > $@ %.$(TARGET)$(CUSTOM_SUFFIX).hex: %.$(TARGET)$(CUSTOM_SUFFIX)
$(OBJCOPY) -j .customlowtext -j .text -j .data -O ihex $< $@
%.$(TARGET)$(CUSTOM_SUFFIX).eep: %.$(TARGET)$(CUSTOM_SUFFIX)
$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O ihex $< $@
%.$(TARGET)$(CUSTOM_SUFFIX).sz: %.$(TARGET)$(CUSTOM_SUFFIX)
$(ELF_SIZE) $<
%.$(TARGET)$(CUSTOM_SUFFIX)-combined: %.$(TARGET)$(CUSTOM_SUFFIX)
cp $< $@.tmp
$(OBJCOPY) -O binary $(LOW_PARTITIONS) $< tmp.bin
truncate -s $(PART_IRQVEC_SIZE) tmp.bin
$(OBJCOPY) --add-section .upperlowtext=tmp.bin \
--change-section-address .upperlowtext=$(PART_IRQVEC_BACKUP_START) \
--set-section-flags .upperlowtext=alloc,load,contents,readonly \
$@.tmp
mv $@.tmp $@
rm -f tmp.bin
%.$(TARGET)$(CUSTOM_SUFFIX)-combined.hex: %.$(TARGET)$(CUSTOM_SUFFIX)-combined
$(OBJCOPY) -j .upperlowtext -j .customlowtext -j .text -j .data \
-O ihex $< $@
flash: $(EXE).$(TARGET)$(CUSTOM_SUFFIX)-combined.u flash: $(EXE).$(TARGET)$(CUSTOM_SUFFIX)-combined.u
@ -152,4 +185,5 @@ avr-size: $(EXE).$(TARGET)$(CUSTOM_SUFFIX).sz
.PRECIOUS: %.$(TARGET)$(CUSTOM_SUFFIX) \ .PRECIOUS: %.$(TARGET)$(CUSTOM_SUFFIX) \
$(EXE).$(TARGET)$(CUSTOM_SUFFIX).hex \ $(EXE).$(TARGET)$(CUSTOM_SUFFIX).hex \
$(EXE).$(TARGET)$(CUSTOM_SUFFIX).eep \ $(EXE).$(TARGET)$(CUSTOM_SUFFIX).eep \
$(EXE).$(TARGET)$(CUSTOM_SUFFIX)-combined \
$(EXE).$(TARGET)$(CUSTOM_SUFFIX)-combined.hex $(EXE).$(TARGET)$(CUSTOM_SUFFIX)-combined.hex

View file

@ -0,0 +1,269 @@
/* Script for -n: mix text and data on same page */
/* Copyright (C) 2014-2015 Free Software Foundation, Inc.
Copying and distribution of this script, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. */
OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr")
OUTPUT_ARCH(avr:6)
__TEXT_SECTION_OFFSET__ = DEFINED(__TEXT_SECTION_OFFSET__) ? __TEXT_SECTION_OFFSET__ : 0x0;
__TEXT_REGION_LENGTH__ = DEFINED(__TEXT_REGION_LENGTH__) ? __TEXT_REGION_LENGTH__ : 1024K;
__DATA_REGION_LENGTH__ = DEFINED(__DATA_REGION_LENGTH__) ? __DATA_REGION_LENGTH__ : 0xfe00;
__EEPROM_REGION_LENGTH__ = DEFINED(__EEPROM_REGION_LENGTH__) ? __EEPROM_REGION_LENGTH__ : 64K;
__FUSE_REGION_LENGTH__ = DEFINED(__FUSE_REGION_LENGTH__) ? __FUSE_REGION_LENGTH__ : 1K;
__LOCK_REGION_LENGTH__ = DEFINED(__LOCK_REGION_LENGTH__) ? __LOCK_REGION_LENGTH__ : 1K;
__SIGNATURE_REGION_LENGTH__ = DEFINED(__SIGNATURE_REGION_LENGTH__) ? __SIGNATURE_REGION_LENGTH__ : 1K;
__USER_SIGNATURE_REGION_LENGTH__ = DEFINED(__USER_SIGNATURE_REGION_LENGTH__) ? __USER_SIGNATURE_REGION_LENGTH__ : 1K;
MEMORY
{
text (rx) : ORIGIN = 0, LENGTH = __TEXT_REGION_LENGTH__
data (rw!x) : ORIGIN = 0x800200, LENGTH = __DATA_REGION_LENGTH__
eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = __EEPROM_REGION_LENGTH__
fuse (rw!x) : ORIGIN = 0x820000, LENGTH = __FUSE_REGION_LENGTH__
lock (rw!x) : ORIGIN = 0x830000, LENGTH = __LOCK_REGION_LENGTH__
signature (rw!x) : ORIGIN = 0x840000, LENGTH = __SIGNATURE_REGION_LENGTH__
user_signatures (rw!x) : ORIGIN = 0x850000, LENGTH = __USER_SIGNATURE_REGION_LENGTH__
}
SECTIONS
{
/* Read-only sections, merged into text segment: */
.hash : { *(.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
.rel.init : { *(.rel.init) }
.rela.init : { *(.rela.init) }
.rel.text :
{
*(.rel.text)
*(.rel.text.*)
*(.rel.gnu.linkonce.t*)
}
.rela.text :
{
*(.rela.text)
*(.rela.text.*)
*(.rela.gnu.linkonce.t*)
}
.rel.fini : { *(.rel.fini) }
.rela.fini : { *(.rela.fini) }
.rel.rodata :
{
*(.rel.rodata)
*(.rel.rodata.*)
*(.rel.gnu.linkonce.r*)
}
.rela.rodata :
{
*(.rela.rodata)
*(.rela.rodata.*)
*(.rela.gnu.linkonce.r*)
}
.rel.data :
{
*(.rel.data)
*(.rel.data.*)
*(.rel.gnu.linkonce.d*)
}
.rela.data :
{
*(.rela.data)
*(.rela.data.*)
*(.rela.gnu.linkonce.d*)
}
.rel.ctors : { *(.rel.ctors) }
.rela.ctors : { *(.rela.ctors) }
.rel.dtors : { *(.rel.dtors) }
.rela.dtors : { *(.rela.dtors) }
.rel.got : { *(.rel.got) }
.rela.got : { *(.rela.got) }
.rel.bss : { *(.rel.bss) }
.rela.bss : { *(.rela.bss) }
.rel.plt : { *(.rel.plt) }
.rela.plt : { *(.rela.plt) }
/* Internal text space or external memory. */
.customlowtext : AT(__TEXT_SECTION_OFFSET__)
{
*(.vectors)
KEEP(*(.vectors))
/* For data that needs to reside in the lower 64k of progmem. */
*(.progmem.gcc*)
/* PR 13812: Placing the trampolines here gives a better chance
that they will be in range of the code that uses them. */
. = ALIGN(2);
__trampolines_start = . ;
/* The jump trampolines for the 16-bit limited relocs will reside here. */
*(.trampolines)
*(.trampolines*)
__trampolines_end = . ;
/* avr-libc expects these data to reside in lower 64K. */
*libprintf_flt.a:*(.progmem.data)
*libc.a:*(.progmem.data)
*(.progmem*)
. = ALIGN(2);
/* For future tablejump instruction arrays for 3 byte pc devices.
We don't relax jump/call instructions within these sections. */
*(.jumptables)
*(.jumptables*)
/* For code that needs to reside in the lower 128k progmem. */
*(.lowtext)
*(.lowtext*)
__ctors_start = . ;
*(.ctors)
__ctors_end = . ;
__dtors_start = . ;
*(.dtors)
__dtors_end = . ;
KEEP(SORT(*)(.ctors))
KEEP(SORT(*)(.dtors))
__custom_lowtext_end = . ;
} > text
.text __custom_lowtext_end + __TEXT_SECTION_OFFSET__ :
AT(__custom_lowtext_end + __TEXT_SECTION_OFFSET__)
{
__custom_lowtext_end_skip = . ;
/* From this point on, we don't bother about wether the insns are
below or above the 16 bits boundary. */
*(.init0) /* Start here after reset. */
KEEP (*(.init0))
*(.init1)
KEEP (*(.init1))
*(.init2) /* Clear __zero_reg__, set up stack pointer. */
KEEP (*(.init2))
*(.init3)
KEEP (*(.init3))
*(.init4) /* Initialize data and BSS. */
KEEP (*(.init4))
*(.init5)
KEEP (*(.init5))
*(.init6) /* C++ constructors. */
KEEP (*(.init6))
*(.init7)
KEEP (*(.init7))
*(.init8)
KEEP (*(.init8))
*(.init9) /* Call main(). */
KEEP (*(.init9))
*(.text)
. = ALIGN(2);
*(.text.*)
. = ALIGN(2);
*(.fini9) /* _exit() starts here. */
KEEP (*(.fini9))
*(.fini8)
KEEP (*(.fini8))
*(.fini7)
KEEP (*(.fini7))
*(.fini6) /* C++ destructors. */
KEEP (*(.fini6))
*(.fini5)
KEEP (*(.fini5))
*(.fini4)
KEEP (*(.fini4))
*(.fini3)
KEEP (*(.fini3))
*(.fini2)
KEEP (*(.fini2))
*(.fini1)
KEEP (*(.fini1))
*(.fini0) /* Infinite loop after program termination. */
KEEP (*(.fini0))
_etext = . ;
} > text
.data :
{
PROVIDE (__data_start = .) ;
*(.data)
*(.data*)
*(.rodata) /* We need to include .rodata here if gcc is used */
*(.rodata*) /* with -fdata-sections. */
*(.gnu.linkonce.d*)
. = ALIGN(2);
_edata = . ;
PROVIDE (__data_end = .) ;
} > data AT> text
.bss ADDR(.data) + SIZEOF (.data) : AT (ADDR (.bss))
{
PROVIDE (__bss_start = .) ;
*(.bss)
*(.bss*)
*(COMMON)
PROVIDE (__bss_end = .) ;
} > data
__data_load_start = LOADADDR(.data);
__data_load_end = __data_load_start + SIZEOF(.data);
/* Global data not cleared after reset. */
.noinit ADDR(.bss) + SIZEOF (.bss) : AT (ADDR (.noinit))
{
PROVIDE (__noinit_start = .) ;
*(.noinit*)
PROVIDE (__noinit_end = .) ;
_end = . ;
PROVIDE (__heap_start = .) ;
} > data
.eeprom :
{
/* See .data above... */
KEEP(*(.eeprom*))
__eeprom_end = . ;
} > eeprom
.fuse :
{
KEEP(*(.fuse))
KEEP(*(.lfuse))
KEEP(*(.hfuse))
KEEP(*(.efuse))
} > fuse
.lock :
{
KEEP(*(.lock*))
} > lock
.signature :
{
KEEP(*(.signature*))
} > signature
.user_signatures :
{
KEEP(*(.user_signatures*))
} > user_signatures
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
.note.gnu.build-id : { *(.note.gnu.build-id) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
/* DWARF 3 */
.debug_pubtypes 0 : { *(.debug_pubtypes) }
.debug_ranges 0 : { *(.debug_ranges) }
/* DWARF Extension. */
.debug_macro 0 : { *(.debug_macro) }
}

View file

@ -1,14 +0,0 @@
#!/usr/bin/python
""" Generate backup ISR table from given .hex file
Output is written to out.hex
"""
import sys
import intelhex
ihex = intelhex.IntelHex (sys.argv [1])
bin = ihex.tobinstr () [:0x200]
ihex.puts (0x1ed00, bin)
ihex.tofile (sys.stdout, format="hex")