From d42da7a5822dfd963d83b3362a2e3aa65a940e09 Mon Sep 17 00:00:00 2001 From: Vladimir Burian Date: Sat, 28 May 2011 23:39:57 +0200 Subject: [PATCH] Support of mspgcc 4.5.2 Linker script has different structure. Meaning of "sfrb" and "sfrw" is also different - hardware header is rewritten. --- .../msp430/mach-openmsp430/defines/hardware.h | 20 +-- board/msp430/virtex2/ldscripts/Makefile.omk | 3 +- board/msp430/virtex2/ldscripts/memory.x | 19 +++ board/msp430/virtex2/ldscripts/openmsp430.ld | 152 +++++++----------- board/msp430/virtex2/ldscripts/periph.x | 11 ++ 5 files changed, 93 insertions(+), 112 deletions(-) create mode 100644 board/msp430/virtex2/ldscripts/memory.x create mode 100644 board/msp430/virtex2/ldscripts/periph.x diff --git a/arch/msp430/mach-openmsp430/defines/hardware.h b/arch/msp430/mach-openmsp430/defines/hardware.h index 3bd495f..68b6a43 100644 --- a/arch/msp430/mach-openmsp430/defines/hardware.h +++ b/arch/msp430/mach-openmsp430/defines/hardware.h @@ -1,23 +1,13 @@ #ifndef HARDWARE_H #define HARDWARE_H -#include - //HW UART registers -#define UART_OFFSET 0x0100 - -#define UBAUD_ UART_OFFSET + 00 -#define UTX_ UART_OFFSET + 02 -#define URX_ UART_OFFSET + 04 -#define USTAT_ UART_OFFSET + 06 -#define UIE_ UART_OFFSET + 07 - -sfrw(UBAUD, UBAUD_); -sfrb(UTX, UTX_); -sfrb(URX, URX_); -sfrb(USTAT, USTAT_); -sfrb(UIE, UIE_); +volatile unsigned int UBAUD asm("0x0100"); +volatile unsigned char UTX asm("0x0102"); +volatile unsigned char URX asm("0x0104"); +volatile unsigned char USTAT asm("0x0106"); +volatile unsigned char UIE asm("0x0107"); #endif diff --git a/board/msp430/virtex2/ldscripts/Makefile.omk b/board/msp430/virtex2/ldscripts/Makefile.omk index c3fb377..7a762b2 100644 --- a/board/msp430/virtex2/ldscripts/Makefile.omk +++ b/board/msp430/virtex2/ldscripts/Makefile.omk @@ -1 +1,2 @@ -lib_LDSCRIPTS = $(notdir $(wildcard $(SOURCES_DIR)/*.ld*)) \ No newline at end of file +lib_LDSCRIPTS = $(notdir $(wildcard $(SOURCES_DIR)/*.ld*)) +lib_LDSCRIPTS += $(notdir $(wildcard $(SOURCES_DIR)/*.x*)) diff --git a/board/msp430/virtex2/ldscripts/memory.x b/board/msp430/virtex2/ldscripts/memory.x new file mode 100644 index 0000000..ad8e525 --- /dev/null +++ b/board/msp430/virtex2/ldscripts/memory.x @@ -0,0 +1,19 @@ +MEMORY { + sfr : ORIGIN = 0x0000, LENGTH = 0x0010 /* END=0x0010, size 16 */ + peripheral_8bit : ORIGIN = 0x0010, LENGTH = 0x00f0 /* END=0x0100, size 240 */ + peripheral_16bit : ORIGIN = 0x0100, LENGTH = 0x0100 /* END=0x0200, size 256 */ + ram (wx) : ORIGIN = 0x0200, LENGTH = 0x2000 /* END=0x2100, size 8K */ + infomem : ORIGIN = 0x1000, LENGTH = 0x0100 /* END=0x1100, size 256 */ + infob : ORIGIN = 0x1000, LENGTH = 0x0080 /* END=0x1080, size 128 */ + infoa : ORIGIN = 0x1080, LENGTH = 0x0080 /* END=0x1100, size 128 */ + rom (rx) : ORIGIN = 0x8000, LENGTH = 0x7fe0 /* END=0xffe0, size 32K */ + vectors : ORIGIN = 0xffe0, LENGTH = 0x0020 /* END=0x10000, size 32 */ + /* Remaining banks are absent */ + bsl : ORIGIN = 0x0000, LENGTH = 0x0000 + infoc : ORIGIN = 0x0000, LENGTH = 0x0000 + infod : ORIGIN = 0x0000, LENGTH = 0x0000 + far_rom : ORIGIN = 0x00000000, LENGTH = 0x00000000 +} +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_FAR_ROM", far_rom); diff --git a/board/msp430/virtex2/ldscripts/openmsp430.ld b/board/msp430/virtex2/ldscripts/openmsp430.ld index c1c6c0a..3b2dae3 100644 --- a/board/msp430/virtex2/ldscripts/openmsp430.ld +++ b/board/msp430/virtex2/ldscripts/openmsp430.ld @@ -1,15 +1,8 @@ /* Default linker script, for normal executables */ -OUTPUT_FORMAT("elf32-msp430","elf32-msp430","elf32-msp430") -OUTPUT_ARCH(msp:42) -MEMORY -{ - text (rx) : ORIGIN = 0x8000, LENGTH = 0x7fe0 /* 32K */ - data (rwx) : ORIGIN = 0x0200, LENGTH = 0x2000 /* 8K */ - vectors (rw) : ORIGIN = 0xffe0, LENGTH = 32 - bootloader(rx) : ORIGIN = 0x0c00, LENGTH = 1K - infomem(rx) : ORIGIN = 0x1000, LENGTH = 256 - infomemnobits(rx) : ORIGIN = 0x1000, LENGTH = 256 -} +OUTPUT_FORMAT("elf32-msp430") +OUTPUT_ARCH("msp430") +INCLUDE memory.x +INCLUDE periph.x SECTIONS { /* Read-only sections, merged into text segment. */ @@ -72,101 +65,55 @@ SECTIONS /* Internal text space. */ .text : { - . = ALIGN(2); - *(.init) + . = ALIGN(2); KEEP(*(.init)) *(.init0) /* Start here after reset. */ - KEEP(*(.init0)) *(.init1) /* User definable. */ - KEEP(*(.init1)) *(.init2) /* Initialize stack. */ - KEEP(*(.init2)) *(.init3) /* Initialize hardware, user definable. */ - KEEP(*(.init3)) *(.init4) /* Copy data to .data, clear bss. */ - KEEP(*(.init4)) *(.init5) /* User definable. */ - KEEP(*(.init5)) *(.init6) /* C++ constructors. */ - KEEP(*(.init6)) *(.init7) /* User definable. */ - KEEP(*(.init7)) *(.init8) /* User definable. */ - KEEP(*(.init8)) *(.init9) /* Call main(). */ - KEEP(*(.init9)) - __ctors_start = . ; - *(.ctors) - KEEP(*(.ctors)) - __ctors_end = . ; - __dtors_start = . ; - *(.dtors) - KEEP(*(.dtors)) - __dtors_end = . ; - . = ALIGN(2); - *(.text) - . = ALIGN(2); - *(.text.*) - . = ALIGN(2); - *(.fini9) /* Jumps here after main(). User definable. */ - KEEP(*(.fini9)) + *(.fini9) /* Falls into here after main(). User definable. */ *(.fini8) /* User definable. */ - KEEP(*(.fini8)) *(.fini7) /* User definable. */ - KEEP(*(.fini7)) *(.fini6) /* C++ destructors. */ - KEEP(*(.fini6)) *(.fini5) /* User definable. */ - KEEP(*(.fini5)) *(.fini4) /* User definable. */ - KEEP(*(.fini4)) *(.fini3) /* User definable. */ - KEEP(*(.fini3)) *(.fini2) /* User definable. */ - KEEP(*(.fini2)) *(.fini1) /* User definable. */ - KEEP(*(.fini1)) *(.fini0) /* Infinite loop after program termination. */ - KEEP(*(.fini0)) - *(.fini) KEEP(*(.fini)) - _etext = .; - } > text + . = ALIGN(2); + __ctors_start = . ; + KEEP(*(.ctors)) + __ctors_end = . ; + __dtors_start = . ; + KEEP(*(.dtors)) + __dtors_end = . ; + . = ALIGN(2); + *(.text) + . = ALIGN(2); + *(.text.*) + _etext = .; + } > REGION_TEXT .data : { + . = ALIGN(2); PROVIDE (__data_start = .) ; - . = ALIGN(2); *(.data) *(SORT_BY_ALIGNMENT(.data.*)) - . = ALIGN(2); + . = ALIGN(2); *(.gnu.linkonce.d*) - . = ALIGN(2); + . = ALIGN(2); _edata = . ; - } > data AT > text + } > REGION_DATA AT > REGION_TEXT PROVIDE (__data_load_start = LOADADDR(.data) ); PROVIDE (__data_size = SIZEOF(.data) ); - /* Bootloader. */ - .bootloader : - { - PROVIDE (__boot_start = .) ; - *(.bootloader) - . = ALIGN(2); - *(.bootloader.*) - } > bootloader - /* Information memory. */ - .infomem : - { - *(.infomem) - . = ALIGN(2); - *(.infomem.*) - } > infomem - /* Information memory (not loaded into MPU). */ - .infomemnobits : - { - *(.infomemnobits) - . = ALIGN(2); - *(.infomemnobits.*) - } > infomemnobits .bss : { PROVIDE (__bss_start = .) ; @@ -175,7 +122,7 @@ SECTIONS *(COMMON) PROVIDE (__bss_end = .) ; _end = . ; - } > data + } > REGION_DATA PROVIDE (__bss_size = SIZEOF(.bss) ); .noinit : { @@ -185,14 +132,28 @@ SECTIONS *(COMMON) PROVIDE (__noinit_end = .) ; _end = . ; - } > data + } > REGION_DATA + /* Information memory. */ + .infomem : + { + *(.infomem) + . = ALIGN(2); + *(.infomem.*) + } > infomem .vectors : { PROVIDE (__vectors_start = .) ; - *(.vectors*) KEEP(*(.vectors*)) _vectors_end = . ; } > vectors + .fartext : + { + . = ALIGN(2); + *(.fartext) + . = ALIGN(2); + *(.fartext.*) + _efartext = .; + } > REGION_FAR_ROM /* Stabs for profiling information*/ .profiler 0 : { *(.profiler) } /* Stabs debugging sections. */ @@ -210,26 +171,25 @@ SECTIONS .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } + .debug_srcinfo 0 : { *(.debug_srcinfo .zdebug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames .zdebug_sfnames) } /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges .zdebug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames .zdebug_pubnames) } /* DWARF 2 */ - .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.* .zdebug_info) } + .debug_abbrev 0 : { *(.debug_abbrev .zdebug_abbrev) } + .debug_line 0 : { *(.debug_line .zdebug_line) } + .debug_frame 0 : { *(.debug_frame .zdebug_frame) } + .debug_str 0 : { *(.debug_str .zdebug_str) } + .debug_loc 0 : { *(.debug_loc .zdebug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo .zdebug_macinfo) } /* DWARF 3 */ .debug_pubtypes 0 : { *(.debug_pubtypes) } .debug_ranges 0 : { *(.debug_ranges) } - PROVIDE (__stack = ORIGIN(data) + LENGTH(data)) ; - PROVIDE (__data_start_rom = _etext) ; - PROVIDE (__data_end_rom = _etext + SIZEOF (.data)) ; - PROVIDE (__noinit_start_rom = _etext + SIZEOF (.data)) ; - PROVIDE (__noinit_end_rom = _etext + SIZEOF (.data) + SIZEOF (.noinit)) ; - PROVIDE (__subdevice_has_heap = 0) ; + PROVIDE (__stack = ORIGIN(ram) + LENGTH(ram)); + PROVIDE (__data_start_rom = _etext); + PROVIDE (__data_end_rom = _etext + SIZEOF (.data)); + PROVIDE (__noinit_start_rom = _etext + SIZEOF (.data)); + PROVIDE (__noinit_end_rom = _etext + SIZEOF (.data) + SIZEOF (.noinit)); } diff --git a/board/msp430/virtex2/ldscripts/periph.x b/board/msp430/virtex2/ldscripts/periph.x new file mode 100644 index 0000000..f9583e5 --- /dev/null +++ b/board/msp430/virtex2/ldscripts/periph.x @@ -0,0 +1,11 @@ +__IE1 = 0x0000; +__IFG1 = 0x0002; +__WDTCTL = 0x0120; +__MPY = 0x0130; +__MPYS = 0x0132; +__MAC = 0x0134; +__MACS = 0x0136; +__OP2 = 0x0138; +__RESLO = 0x013A; +__RESHI = 0x013C; +__SUMEXT = 0x013E; -- 2.39.2