diff options
Diffstat (limited to 'libopencm3/lib/lpc43xx/m4')
| -rw-r--r-- | libopencm3/lib/lpc43xx/m4/Makefile | 50 | ||||
| -rw-r--r-- | libopencm3/lib/lpc43xx/m4/libopencm3_lpc43xx.ld | 127 | ||||
| -rw-r--r-- | libopencm3/lib/lpc43xx/m4/libopencm3_lpc43xx_ram_only.ld | 139 | ||||
| -rw-r--r-- | libopencm3/lib/lpc43xx/m4/libopencm3_lpc43xx_rom_to_ram.ld | 128 | ||||
| -rw-r--r-- | libopencm3/lib/lpc43xx/m4/vector_chipset.c | 48 | 
5 files changed, 492 insertions, 0 deletions
diff --git a/libopencm3/lib/lpc43xx/m4/Makefile b/libopencm3/lib/lpc43xx/m4/Makefile new file mode 100644 index 0000000..a3d3b03 --- /dev/null +++ b/libopencm3/lib/lpc43xx/m4/Makefile @@ -0,0 +1,50 @@ +## +## This file is part of the libopencm3 project. +## +## Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de> +## Copyright (C) 2012 Michael Ossmann <mike@ossmann.com> +## Copyright (C) 2012 Benjamin Vernoux <titanmkd@gmail.com> +## Copyright (C) 2013 Alexandru Gagniuc <mr.nuke.me@gmail.com> +## +## This library is free software: you can redistribute it and/or modify +## it under the terms of the GNU Lesser General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +## GNU Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public License +## along with this library.  If not, see <http://www.gnu.org/licenses/>. +## + +LIBNAME		= libopencm3_lpc43xx +SRCLIBDIR	?= ../.. + +FP_FLAGS	?= -mfloat-abi=hard -mfpu=fpv4-sp-d16 +PREFIX		?= arm-none-eabi + +CC		= $(PREFIX)-gcc +AR		= $(PREFIX)-ar +CFLAGS		= -O2 -g3 \ +		  -Wall -Wextra -Wimplicit-function-declaration \ +		  -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes \ +		  -Wundef -Wshadow \ +		  -I../../../include -fno-common \ +		  -mcpu=cortex-m4 -mthumb -Wstrict-prototypes \ +		  -ffunction-sections -fdata-sections -MD \ +		  $(FP_FLAGS) -DLPC43XX -DLPC43XX_M4 + +ARFLAGS		= rcs + +# LPC43xx common files for M4 / M0 +OBJ_LPC43XX     = gpio.o scu.o i2c.o ssp.o uart.o timer.o + +#LPC43xx M4 specific file + Generic LPC43xx M4/M0 files +OBJS		= $(OBJ_LPC43XX) ipc.o + +VPATH += ../:../../cm3 + +include ../../Makefile.include diff --git a/libopencm3/lib/lpc43xx/m4/libopencm3_lpc43xx.ld b/libopencm3/lib/lpc43xx/m4/libopencm3_lpc43xx.ld new file mode 100644 index 0000000..c289b35 --- /dev/null +++ b/libopencm3/lib/lpc43xx/m4/libopencm3_lpc43xx.ld @@ -0,0 +1,127 @@ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de> + * Copyright (C) 2012 Michael Ossmann <mike@ossmann.com> + * Copyright (C) 2012 Benjamin Vernoux <titanmkd@gmail.com> + * Copyright (C) 2012 Jared Boone <jared@sharebrained.com> + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library.  If not, see <http://www.gnu.org/licenses/>. + */ + +/* Generic linker script for LPC43XX targets using libopencm3. */ + +/* Memory regions must be defined in the ld script which includes this one. */ + +/* Enforce emmition of the vector table. */ +EXTERN (vector_table) + +/* Define the entry point of the output file. */ +ENTRY(reset_handler) + +/* Define sections. */ +SECTIONS +{ +	.text : { +		. = ALIGN(0x400); +		_text_ram = 0; /* Start of Code in RAM NULL because Copy of Code from ROM to RAM disabled */ +		*(.vectors)	/* Vector table */ +		*(.text*)	/* Program code */ +		. = ALIGN(4); +		*(.rodata*)	/* Read-only data */ +		. = ALIGN(4); +	} >rom + +	/* C++ Static constructors/destructors, also used for __attribute__ +	 * ((constructor)) and the likes */ +	.preinit_array : { +		. = ALIGN(4); +		__preinit_array_start = .; +		KEEP (*(.preinit_array)) +		__preinit_array_end = .; +	} >rom +	.init_array : { +		. = ALIGN(4); +		__init_array_start = .; +		KEEP (*(SORT(.init_array.*))) +		KEEP (*(.init_array)) +		__init_array_end = .; +	} >rom +	.fini_array : { +		. = ALIGN(4); +		__fini_array_start = .; +		KEEP (*(.fini_array)) +		KEEP (*(SORT(.fini_array.*))) +		__fini_array_end = .; +	} >rom + +	/* +	 * Another section used by C++ stuff, appears when using newlib with +	 * 64bit (long long) printf support +	 */ +	.ARM.extab : { +		*(.ARM.extab*) +	} >rom +     +	/* exception index - required due to libgcc.a issuing /0 exceptions */ +	.ARM.exidx : { +		__exidx_start = .; +		*(.ARM.exidx*) +		__exidx_end = .; +	} >rom + +	. = ALIGN(4); +	_etext = .; +	_etext_ram = 0; /* Start of Code in RAM NULL because Copy of Code from ROM to RAM disabled */ +	_etext_rom = 0; /* Start of Code in RAM NULL because Copy of Code from ROM to RAM disabled */ + +	. = ORIGIN(ram_local2); + +	.data : { +		_data = .; +		*(.data*)	/* Read-write initialized data */ +		. = ALIGN(4); +		_edata = .; +	} >ram_local2 AT >rom +	_data_loadaddr = LOADADDR(.data); + +	_data_rom = LOADADDR (.data) + ORIGIN(rom); +	_edata_rom = _data_rom + SIZEOF (.data); + +	.bss : { +		_bss = .; +		*(.bss*)	/* Read-write zero initialized data */ +		*(COMMON) +		. = ALIGN(4); +		_ebss = .; +	} >ram_local2 + +	/* exception unwind data - required due to libgcc.a issuing /0 exceptions */ +	.ARM.extab : { +		*(.ARM.extab*) +	} >ram_local2 + +	/* +	 * The .eh_frame section appears to be used for C++ exception handling. +	 * You may need to fix this if you're using C++. +	 */ +	/DISCARD/ : { *(.eh_frame) } + +	. = ALIGN(4); +	end = .; + +	/* Leave room above stack for IAP to run. */ +	__StackTop = ORIGIN(ram_local2) + LENGTH(ram_local2) - 32; +	PROVIDE(_stack = __StackTop); +} diff --git a/libopencm3/lib/lpc43xx/m4/libopencm3_lpc43xx_ram_only.ld b/libopencm3/lib/lpc43xx/m4/libopencm3_lpc43xx_ram_only.ld new file mode 100644 index 0000000..5bcdea6 --- /dev/null +++ b/libopencm3/lib/lpc43xx/m4/libopencm3_lpc43xx_ram_only.ld @@ -0,0 +1,139 @@ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de> + * Copyright (C) 2012 Michael Ossmann <mike@ossmann.com> + * Copyright (C) 2012 Benjamin Vernoux <titanmkd@gmail.com> + * Copyright (C) 2012 Jared Boone <jared@sharebrained.com> + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library.  If not, see <http://www.gnu.org/licenses/>. + */ + +/* Generic linker script for LPC43XX targets using libopencm3. */ + +/* Memory regions must be defined in the ld script which includes this one. */ + +/* Enforce emmition of the vector table. */ +EXTERN (vector_table) + +/* Define the entry point of the output file. */ +ENTRY(reset_handler) + +/* Define sections. */ +SECTIONS +{ +	. = ORIGIN(ram_local1); + +	.text : { +		. = ALIGN(0x400); +		_text_ram = 0; /* Start of Code in RAM NULL because Copy of Code from ROM to RAM disabled */ +		*(.vectors)	/* Vector table */ +		*(.text*)	/* Program code */ +		. = ALIGN(4); +		*(.rodata*)	/* Read-only data */ +		. = ALIGN(4); +	} >ram_local1 + +	/* C++ Static constructors/destructors, also used for __attribute__ +	 * ((constructor)) and the likes */ +	.preinit_array : { +		. = ALIGN(4); +		__preinit_array_start = .; +		KEEP (*(.preinit_array)) +		__preinit_array_end = .; +	} >ram_local1 +	.init_array : { +		. = ALIGN(4); +		__init_array_start = .; +		KEEP (*(SORT(.init_array.*))) +		KEEP (*(.init_array)) +		__init_array_end = .; +	} >ram_local1 +	.fini_array : { +		. = ALIGN(4); +		__fini_array_start = .; +		KEEP (*(.fini_array)) +		KEEP (*(SORT(.fini_array.*))) +		__fini_array_end = .; +	} >ram_local1 + +	/* +	 * Another section used by C++ stuff, appears when using newlib with +	 * 64bit (long long) printf support +	 */ +	.ARM.extab : { +		*(.ARM.extab*) +	} >ram_local1 +     +	/* exception index - required due to libgcc.a issuing /0 exceptions */ +	__exidx_start = .; +	.ARM.exidx : { +		__exidx_start = .; +		*(.ARM.exidx*) +		__exidx_end = .; +	} > ram_local1 + +	. = ALIGN(4); +	_etext = .; +	_etext_ram = 0; /* Start of Code in RAM NULL because Copy of Code from ROM to RAM disabled */ +	_etext_rom = 0; /* Start of Code in RAM NULL because Copy of Code from ROM to RAM disabled */ + +	. = ORIGIN(ram_local2); + +	.data : { +		_data = .; +		*(.data*)	/* Read-write initialized data */ +		. = ALIGN(4); +		_edata = .; +	} >ram_local2 +	_data_loadaddr = LOADADDR(.data); + +   /* Running from RAM only, loading the .elf will initialize data for us. */ +	_data_rom = .; +	_edata_rom = .; + +	_data = .; +	_edata = .; + +	.bss : { +		_bss = .; +		*(.bss*)	/* Read-write zero initialized data */ +		*(COMMON) +		. = ALIGN(4); +		_ebss = .; +	} >ram_local2 + +	/* exception unwind data - required due to libgcc.a issuing /0 exceptions */ +	.ARM.extab : { +		*(.ARM.extab*) +	} >ram_local2 + +	/* +	 * The .eh_frame section appears to be used for C++ exception handling. +	 * You may need to fix this if you're using C++. +	 */ +	/DISCARD/ : { *(.eh_frame) } + +	/* +	 * Another section used by C++ stuff, appears when using newlib with +	 * 64bit (long long) printf support - discard it for now. +	 */ +	/DISCARD/ : { *(.ARM.exidx) } + +	end = .; + +	/* Leave room above stack for IAP to run. */ +	__StackTop = ORIGIN(ram_local2) + LENGTH(ram_local2) - 32; +	PROVIDE(_stack = __StackTop); +} diff --git a/libopencm3/lib/lpc43xx/m4/libopencm3_lpc43xx_rom_to_ram.ld b/libopencm3/lib/lpc43xx/m4/libopencm3_lpc43xx_rom_to_ram.ld new file mode 100644 index 0000000..e50040e --- /dev/null +++ b/libopencm3/lib/lpc43xx/m4/libopencm3_lpc43xx_rom_to_ram.ld @@ -0,0 +1,128 @@ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de> + * Copyright (C) 2012 Michael Ossmann <mike@ossmann.com> + * Copyright (C) 2012 Benjamin Vernoux <titanmkd@gmail.com> + * Copyright (C) 2012 Jared Boone <jared@sharebrained.com> + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library.  If not, see <http://www.gnu.org/licenses/>. + */ + +/* Generic linker script for LPC43XX targets using libopencm3. */ + +/* Memory regions must be defined in the ld script which includes this one. */ + +/* Enforce emmition of the vector table. */ +EXTERN (vector_table) + +/* Define the entry point of the output file. */ +ENTRY(reset_handler) + +/* Define sections. */ +SECTIONS +{ +	.text : { +		. = ALIGN(0x400); +		_text_ram = (. - ORIGIN(rom)) + ORIGIN(ram_local1); /* Start of Code in RAM */ + +		*(.vectors)	/* Vector table */ +		*(.text*)	/* Program code */ +		. = ALIGN(4); +		*(.rodata*)	/* Read-only data */ +		. = ALIGN(4); +	} >rom + +	/* C++ Static constructors/destructors, also used for __attribute__ +	 * ((constructor)) and the likes */ +	.preinit_array : { +		. = ALIGN(4); +		__preinit_array_start = .; +		KEEP (*(.preinit_array)) +		__preinit_array_end = .; +	} >rom +	.init_array : { +		. = ALIGN(4); +		__init_array_start = .; +		KEEP (*(SORT(.init_array.*))) +		KEEP (*(.init_array)) +		__init_array_end = .; +	} >rom +	.fini_array : { +		. = ALIGN(4); +		__fini_array_start = .; +		KEEP (*(.fini_array)) +		KEEP (*(SORT(.fini_array.*))) +		__fini_array_end = .; +	} >rom + +	/* +	 * Another section used by C++ stuff, appears when using newlib with +	 * 64bit (long long) printf support +	 */ +	.ARM.extab : { +		*(.ARM.extab*) +	} >rom +     +	/* exception index - required due to libgcc.a issuing /0 exceptions */ +	.ARM.exidx : { +		__exidx_start = .; +		*(.ARM.exidx*) +		__exidx_end = .; +	} >rom + +	. = ALIGN(4); +	_etext = .; +	_etext_ram = (. - ORIGIN(rom)) + ORIGIN(ram_local1); +	_etext_rom = (. - ORIGIN(rom)) + ORIGIN(rom_flash); + +	. = ORIGIN(ram_local2); + +	.data : { +		_data = .; +		*(.data*)	/* Read-write initialized data */ +		. = ALIGN(4); +		_edata = .; +	} >ram_local2 AT >rom +	_data_loadaddr = LOADADDR(.data); + +	_data_rom = LOADADDR (.data) + ORIGIN(rom_flash); +	_edata_rom = _data_rom + SIZEOF (.data); + +	.bss : { +		_bss = .; +		*(.bss*)	/* Read-write zero initialized data */ +		*(COMMON) +		. = ALIGN(4); +		_ebss = .; +	} >ram_local2 + +	/* exception unwind data - required due to libgcc.a issuing /0 exceptions */ +	.ARM.extab : { +		*(.ARM.extab*) +	} >ram_local2 + +	/* +	 * The .eh_frame section appears to be used for C++ exception handling. +	 * You may need to fix this if you're using C++. +	 */ +	/DISCARD/ : { *(.eh_frame) } + +	. = ALIGN(4); +	end = .; + +	/* Leave room above stack for IAP to run. */ +	__StackTop = ORIGIN(ram_local2) + LENGTH(ram_local2) - 32; +	PROVIDE(_stack = __StackTop); +} diff --git a/libopencm3/lib/lpc43xx/m4/vector_chipset.c b/libopencm3/lib/lpc43xx/m4/vector_chipset.c new file mode 100644 index 0000000..270e30e --- /dev/null +++ b/libopencm3/lib/lpc43xx/m4/vector_chipset.c @@ -0,0 +1,48 @@ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2010 Piotr Esden-Tempski <piotr@esden.net> + * Copyright (C) 2012 Michael Ossmann <mike@ossmann.com> + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <libopencm3/cm3/common.h> + +extern unsigned _etext_ram, _text_ram, _etext_rom; + +#define CREG_M4MEMMAP   MMIO32((0x40043000U + 0x100)) + +static void pre_main(void) +{ +	volatile unsigned *src, *dest; + +	/* Copy the code from ROM to Real RAM (if enabled) */ +	if ((&_etext_ram-&_text_ram) > 0) { +		src = &_etext_rom-(&_etext_ram-&_text_ram); +		/* Change Shadow memory to ROM (for Debug Purpose in case Boot +		 * has not set correctly the M4MEMMAP because of debug) +		 */ +		CREG_M4MEMMAP = (unsigned long)src; + +		for (dest = &_text_ram; dest < &_etext_ram; ) { +			*dest++ = *src++; +		} + +		/* Change Shadow memory to Real RAM */ +		CREG_M4MEMMAP = (unsigned long)&_text_ram; + +		/* Continue Execution in RAM */ +	} +}  | 
